29 _color = sf::Color{255, 0, 0, 255};
32 for (
auto point : points) {
33 _points.push_back(Vector2f{point.x, point.y});
47 return {_position.x, _position.y};
53 _position = sf::Vector2f{float(position.x), float(position.y)};
57 return Color{_color.r, _color.g, _color.b, _color.a};
61 _color = sf::Color{color.r, color.g, color.b, color.a};
62 for (
size_t i = 0; i < _vertices.getVertexCount(); i++)
63 _vertices[i].color = _color;
82 static bool is_convex(Vector2f A, Vector2f B, Vector2f C) {
83 const Vector2f BA = {A.x - B.x, A.y - B.y};
84 const Vector2f BC = {C.x - B.x, C.y - B.y};
85 const double cross = BA.cross(BC);
87 return (std::abs(cross) < epsilond) ? false : (cross < 0);
90 float polygon_area(
const std::vector<Vector2f>& pts) {
92 for (
size_t i = 0; i < pts.size(); ++i) {
93 const Vector2f& a = pts[i];
94 const Vector2f& b = pts[(i + 1) % pts.size()];
95 area += (a.x * b.y - b.x * a.y);
101 std::vector<Vector2f> tmp = _points;
103 if (polygon_area(tmp) < 0)
104 std::reverse(tmp.begin(), tmp.end());
106 while (tmp.size() >= 3) {
107 bool earFound =
false;
109 for (
size_t i = 0; i < tmp.size(); i++) {
111 Vector2f B = tmp[(i + 1) % tmp.size()];
112 Vector2f C = tmp[(i + 2) % tmp.size()];
113 Triangle<double> t = Triangle<double>{A, B, C};
115 if (is_convex(A, B, C)) {
117 for (
size_t j = 0; j < tmp.size(); j++) {
118 if (j == i || j == (i + 1) % tmp.size() || j == (i + 2) % tmp.size())
continue;
119 if (t.isInside(tmp[j])) {
126 _triangles.push_back(Triangle<double>{A, B, C});
127 size_t earIndex = (i + 1) % tmp.size();
128 tmp.erase(tmp.begin() + earIndex);
142 void buildVertices() {
143 _vertices.setPrimitiveType(sf::PrimitiveType::Triangles);
144 _vertices.resize(_triangles.size() * 3);
147 for (
const Triangle<double> &t : _triangles) {
148 _vertices[i].position = {float(t.p1.x), float(t.p1.y)};
149 _vertices[i++].color = _color;
150 _vertices[i].position = {float(t.p2.x), float(t.p2.y)};
151 _vertices[i++].color = _color;
152 _vertices[i].position = {float(t.p3.x), float(t.p3.y)};
153 _vertices[i++].color = _color;
158 sf::Vector2f _position;
159 sf::VertexArray _vertices;
161 std::vector<Vector2f> _points;
162 std::vector<Triangle<double>> _triangles;