33// Constructor
44DelaunayTriangulation::DelaunayTriangulation (std::vector<Point>& points, M5Canvas& canvas)
55 : points(points), canvas(canvas) {
6+ // Pre-allocate triangle cache to avoid frequent reallocations
7+ triangleCache.reserve (60 ); // Estimate: ~2x MAX_POINTS
68}
79
810// Find all Delaunay triangles from the current set of points
9- std::vector<Triangle> DelaunayTriangulation::findDelaunayTriangles () {
10- std::vector<Triangle> delaunayTriangles;
11+ void DelaunayTriangulation::findDelaunayTriangles () {
12+ // Clear previous triangles but keep capacity
13+ triangleCache.clear ();
1114
1215 // Need at least 3 points to form a triangle
1316 if (points.size () < 3 ) {
14- return delaunayTriangles ;
17+ return ;
1518 }
1619
20+ size_t n = points.size ();
21+
1722 // Check all possible triangles
18- for (size_t i = 0 ; i < points. size () - 2 ; i++) {
19- for (size_t j = i + 1 ; j < points. size () - 1 ; j++) {
20- for (size_t k = j + 1 ; k < points. size () ; k++) {
23+ for (size_t i = 0 ; i < n - 2 ; i++) {
24+ for (size_t j = i + 1 ; j < n - 1 ; j++) {
25+ for (size_t k = j + 1 ; k < n ; k++) {
2126 Triangle tri (&points[i], &points[j], &points[k]);
2227
2328 // Check if no other points are inside this triangle's circumcircle
2429 bool isDelaunay = true ;
25- for (size_t l = 0 ; l < points. size () ; l++) {
30+ for (size_t l = 0 ; l < n ; l++) {
2631 if (l != i && l != j && l != k) {
2732 if (tri.isPointInCircumcircle (points[l])) {
2833 isDelaunay = false ;
@@ -31,15 +36,13 @@ std::vector<Triangle> DelaunayTriangulation::findDelaunayTriangles() {
3136 }
3237 }
3338
34- // Add to list if it satisfies Delaunay condition
39+ // Add to cache if it satisfies Delaunay condition
3540 if (isDelaunay) {
36- delaunayTriangles .push_back (tri);
41+ triangleCache .push_back (tri);
3742 }
3843 }
3944 }
4045 }
41-
42- return delaunayTriangles;
4346}
4447
4548// Calculate and draw the Delaunay triangulation
@@ -49,10 +52,11 @@ void DelaunayTriangulation::calculateAndDraw() {
4952
5053 // If we have enough points, find and draw triangles
5154 if (points.size () >= 3 ) {
52- std::vector<Triangle> triangles = findDelaunayTriangles ();
55+ // Find triangles (fills triangleCache)
56+ findDelaunayTriangles ();
5357
54- // Draw each triangle
55- for (const auto & triangle : triangles ) {
58+ // Draw each triangle from cache
59+ for (const auto & triangle : triangleCache ) {
5660 uint16_t color = ColorUtils::generatePastelColor (triangle.getColorSeed ());
5761 drawTriangle (triangle, color);
5862 }
@@ -68,15 +72,19 @@ void DelaunayTriangulation::calculateAndDraw() {
6872// Draw a single triangle with the specified color
6973void DelaunayTriangulation::drawTriangle (const Triangle& triangle, uint16_t color) {
7074 // Draw each line with the specified thickness
71- for (int i = 0 ; i < DisplayConstants::LINE_THICKNESS ; i++) {
72- canvas.drawLine (triangle.p1 ->x + i, triangle.p1 ->y ,
73- triangle.p2 ->x + i, triangle.p2 ->y , color);
74-
75- canvas.drawLine (triangle.p2 ->x + i, triangle.p2 ->y ,
76- triangle.p3 ->x + i, triangle.p3 ->y , color);
77-
78- canvas.drawLine (triangle.p3 ->x + i, triangle.p3 ->y ,
79- triangle.p1 ->x + i, triangle.p1 ->y , color);
75+ // Draw offset in both x and y directions for more uniform thickness
76+ int thickness = DisplayConstants::LINE_THICKNESS ;
77+ for (int dx = 0 ; dx < thickness; dx++) {
78+ for (int dy = 0 ; dy < thickness; dy++) {
79+ canvas.drawLine (triangle.p1 ->x + dx, triangle.p1 ->y + dy,
80+ triangle.p2 ->x + dx, triangle.p2 ->y + dy, color);
81+
82+ canvas.drawLine (triangle.p2 ->x + dx, triangle.p2 ->y + dy,
83+ triangle.p3 ->x + dx, triangle.p3 ->y + dy, color);
84+
85+ canvas.drawLine (triangle.p3 ->x + dx, triangle.p3 ->y + dy,
86+ triangle.p1 ->x + dx, triangle.p1 ->y + dy, color);
87+ }
8088 }
8189}
8290
0 commit comments