From e47a8bb40587df88859dd63b9420acca50902adb Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Fri, 16 Apr 2021 18:29:37 +0800 Subject: [PATCH] add tri_delaunay2voronoi --- .../_impl/_tri_delaunay2voronoi_impl.scad | 23 +++++++++ .../demo/tri_delaunay2voronoi_demo.scad | 22 +++++++++ src/experimental/tri_delaunay2voronoi.scad | 47 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 src/experimental/_impl/_tri_delaunay2voronoi_impl.scad create mode 100644 src/experimental/demo/tri_delaunay2voronoi_demo.scad create mode 100644 src/experimental/tri_delaunay2voronoi.scad diff --git a/src/experimental/_impl/_tri_delaunay2voronoi_impl.scad b/src/experimental/_impl/_tri_delaunay2voronoi_impl.scad new file mode 100644 index 00000000..799ccf88 --- /dev/null +++ b/src/experimental/_impl/_tri_delaunay2voronoi_impl.scad @@ -0,0 +1,23 @@ +use ; +use ; +use ; + +function delaunay_coords(d) = d[0]; +function delaunay_triangles(d) = d[1]; +function delaunay_circles(d) = d[2]; + +function indicesOfCell(iTris, triIndices) = + let( + vi = iTris[0][0], + indices = [], + leng = len(iTris) + ) + _indicesOfCell(iTris, triIndices, leng, indices, vi); + +function _indicesOfCell(iTris, triIndices, leng, indices, vi, i = 0) = + i == leng ? indices : + let( + t = iTris[find_index(iTris, function(t) t[0] == vi)], + nIndices = concat(indices, hashmap_get(triIndices, t)) + ) + _indicesOfCell(iTris, triIndices, leng, nIndices, t[1], i + 1); diff --git a/src/experimental/demo/tri_delaunay2voronoi_demo.scad b/src/experimental/demo/tri_delaunay2voronoi_demo.scad new file mode 100644 index 00000000..ad0e0e6e --- /dev/null +++ b/src/experimental/demo/tri_delaunay2voronoi_demo.scad @@ -0,0 +1,22 @@ +use ; +use ; +use ; + +points = [for(i = [0:20]) rands(-100, 100, 2)]; + +color("black") +for(p = points) { + translate(p) + circle(2); +} + +%draw(tri_delaunay(points)); + +d = tri_delaunay(points, ret = "DELAUNAY"); +#draw(tri_delaunay2voronoi(d)); + +module draw(pointsOfTriangles) { + for(t = pointsOfTriangles) { + hull_polyline2d(concat(t, [t[0]])); + } +} \ No newline at end of file diff --git a/src/experimental/tri_delaunay2voronoi.scad b/src/experimental/tri_delaunay2voronoi.scad new file mode 100644 index 00000000..8296a741 --- /dev/null +++ b/src/experimental/tri_delaunay2voronoi.scad @@ -0,0 +1,47 @@ +use ; +use ; +use ; +use ; + +function tri_delaunay2voronoi(d) = + let( + coords = delaunay_coords(d), + coords_leng = len(coords), + circles = delaunay_circles(d), + tris = hashmap_keys(delaunay_triangles(d)), + // circumcircle centers + vertices = [for(t = tris) hashmap_get(circles, t)[0]], + i_rts = [ + for(i = [0:len(tris) - 1]) + let( + a = tris[i][0], + b = tris[i][1], + c = tris[i][2], + rt1 = [b, c, a], + rt2 = [c, a, b], + rt3 = [a, b, c] + ) + each [[a, rt1], [b, rt2], [c, rt3]] + ], + connectedTris = [ + for(i = [0:coords_leng - 1]) + [for(i_rt = i_rts) if(i_rt[0] == i) i_rt[1]] + ], + triIndices = hashmap([ + for(i = [0:len(tris) - 1]) + let( + a = tris[i][0], + b = tris[i][1], + c = tris[i][2], + rt1 = [b, c, a], + rt2 = [c, a, b], + rt3 = [a, b, c] + ) + each [[rt1, i], [rt2, i], [rt3, i]] + ]), + cells = [ + for(i = [4:coords_leng - 1]) + indicesOfCell(connectedTris[i], triIndices) + ] + ) + [for(cell = cells) [for(i = cell) vertices[i]]];