38 SdlPolygon(std::vector<Vector2f> points) : _points(points) {
45 bool isReady()
const override {
return !_vertices.empty(); }
48 void setPosition(Vector2f position)
override { _position = position; }
50 Color
getColor()
const override {
return _color; }
54 for (SDL_Vertex &vertex : _vertices)
55 vertex.color = SDL_Color{color.r, color.g, color.b, color.a};
58 std::vector<Vector2f>
getPoints()
const override {
return _points; }
69 static bool is_convex(Vector2f A, Vector2f B, Vector2f C) {
70 const Vector2f BA = {A.x - B.x, A.y - B.y};
71 const Vector2f BC = {C.x - B.x, C.y - B.y};
72 const double cross = BA.cross(BC);
74 return (std::abs(cross) < epsilond) ? false : (cross < 0);
77 static float polygon_area(
const std::vector<Vector2f> &pts) {
80 for (
size_t i = 0; i < pts.size(); ++i) {
81 const Vector2f &a = pts[i];
82 const Vector2f &b = pts[(i + 1) % pts.size()];
84 area += (a.x * b.y - b.x * a.y);
90 std::vector<Vector2f> tmp = _points;
92 if (polygon_area(tmp) < 0)
93 std::reverse(tmp.begin(), tmp.end());
95 while (tmp.size() >= 3) {
96 bool earFound =
false;
98 for (
size_t i = 0; i < tmp.size(); i++) {
100 Vector2f B = tmp[(i + 1) % tmp.size()];
101 Vector2f C = tmp[(i + 2) % tmp.size()];
102 Triangle<double> t = Triangle<double>{A, B, C};
104 if (is_convex(A, B, C)) {
107 for (
size_t j = 0; j < tmp.size(); j++) {
108 if (j == i || j == (i + 1) % tmp.size() || j == (i + 2) % tmp.size())
continue;
109 if (t.isInside(tmp[j])) {
116 _triangles.push_back(Triangle<double>{A, B, C});
117 tmp.erase(tmp.begin() + (i + 1) % tmp.size());
132 void buildVertices() {
133 const SDL_Color color{_color.r, _color.g, _color.b, _color.a};
135 _vertices.reserve(_triangles.size() * 3);
136 for (
const Triangle<double> &t : _triangles)
137 for (const Vector2f &point : {t.p1, t.p2, t.p3})
138 _vertices.push_back(SDL_Vertex{
139 SDL_FPoint{
static_cast<float>(point.x),
static_cast<float>(point.y)},
141 SDL_FPoint{0.f, 0.f}});
142 _screen.resize(_vertices.size());
145 Color _color{255, 0, 0, 255};
146 Vector2f _position{0, 0};
148 std::vector<Vector2f> _points;
149 std::vector<Triangle<double>> _triangles;
151 std::vector<SDL_Vertex> _vertices;
152 std::vector<SDL_Vertex> _screen;