|
@@ -7,6 +7,9 @@
|
|
|
#include "utils/Random.h"
|
|
|
|
|
|
bool Game::Point::operator<(const Point& other) {
|
|
|
+ if(std::abs(x - other.x) < 0.0001f) {
|
|
|
+ return y < other.y;
|
|
|
+ }
|
|
|
return x < other.x;
|
|
|
}
|
|
|
|
|
@@ -14,8 +17,12 @@ Game::Game(Keys& keys) : keys(keys), keyNext(keys.add(GLFW_KEY_N)), active(0) {
|
|
|
std::cout << "register on " << keys.add(GLFW_KEY_W) << "\n";
|
|
|
|
|
|
Random r(6476);
|
|
|
- for(int i = 0; i < 1000; i++) {
|
|
|
+ for(int i = 0; i < 25; i++) {
|
|
|
data.push_back({r.nextFloat() * 1.9f - 0.95f, r.nextFloat() * 1.9f - 0.95f});
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
std::cout << data.size() << "\n";
|
|
@@ -81,20 +88,14 @@ void Game::split() {
|
|
|
v.push_back(data[index++]);
|
|
|
float f = det(groups[active].back()[0], groups[active].back()[1], groups[active].back()[2]);
|
|
|
if(std::abs(f) < 0.0001f) {
|
|
|
- float minX = v[0].x;
|
|
|
- float maxX = v[2].x;
|
|
|
- if(std::abs(minX - maxX) < 0.0001f) {
|
|
|
- float minY = std::min(v[0].y, std::min(v[1].y, v[2].y));
|
|
|
- float maxY = std::max(v[0].y, std::max(v[1].y, v[2].y));
|
|
|
- if(minY < v[0].y && v[0].y < maxY) {
|
|
|
- v.erase(v.begin());
|
|
|
- } else if(minY < v[1].y && v[1].y < maxY) {
|
|
|
- v.erase(v.begin() + 1);
|
|
|
- } else {
|
|
|
- v.pop_back();
|
|
|
- }
|
|
|
+ if(std::abs(v[0].y - v[1].y) > 0.0001f || std::abs(v[1].y - v[2].y) > 0.0001f) {
|
|
|
+ v[0].x = (std::abs(v[0].x) < 0.0001f) ? 0.001f : v[0].x * 1.001f;
|
|
|
} else {
|
|
|
- v.erase(v.begin() + 1);
|
|
|
+ v[0].y = (std::abs(v[0].y) < 0.0001f) ? 0.001f : v[0].y * 1.001f;
|
|
|
+ }
|
|
|
+ f = det(groups[active].back()[0], groups[active].back()[1], groups[active].back()[2]);
|
|
|
+ if(f > 0.0f) {
|
|
|
+ std::swap(groups[active].back()[1], groups[active].back()[2]);
|
|
|
}
|
|
|
} else if(f > 0.0f) {
|
|
|
std::swap(groups[active].back()[1], groups[active].back()[2]);
|
|
@@ -113,7 +114,7 @@ void Game::split() {
|
|
|
bool Game::isLowerTangent(const Point& a, const Point& b, const std::vector<Point>& hull) const {
|
|
|
for(const Point& p : hull) {
|
|
|
float det = (a.x - p.x) * (b.y - p.y) - (b.x - p.x) * (a.y - p.y);
|
|
|
- if(det < 0.0f) {
|
|
|
+ if(det < -0.00001f) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -123,7 +124,7 @@ bool Game::isLowerTangent(const Point& a, const Point& b, const std::vector<Poin
|
|
|
bool Game::isUpperTangent(const Point& a, const Point& b, const std::vector<Point>& hull) const {
|
|
|
for(const Point& p : hull) {
|
|
|
float det = (a.x - p.x) * (b.y - p.y) - (b.x - p.x) * (a.y - p.y);
|
|
|
- if(det > 0.0f) {
|
|
|
+ if(det > 0.00001f) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|