Platonic Solids
Regular Polyhedron
Platonic solid, any of the five geometric solids whose faces are all identical, regular polygons meeting at the same three-dimensional angles. Also known as the five regular polyhedra, they consist of the tetrahedron (or pyramid), hexahedron (or cube), octahedron, dodecahedron, and icosahedron.
Platonic Solids
1
h = (1+Math.Sqrt(5))/2-1;
2
phd01 = Dictionary.ByKeysValues(["Tetrahedron","Hexahedron","Octahedron","Dodecahedron","Icosahedron"],
3
[[1,1,1,1,-1,-1,-1,1,-1,-1,-1,1],[1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1],
4
[0,0,1,0,0,-1,0,1,0,0,-1,0,1,0,0,-1,0,0],[0,h,1/h,0,h,-1/h,0,-h,1/h,0,-h,-1/h,h,1/h,0,h,-1/h,0,-h,1/h,0,
5
-h,-1/h,0,1/h,0,h,1/h,0,-h,-1/h,0,h,-1/h,0,-h,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1],
6
[0,1,1/h,0,1,-1/h,0,-1,1/h,0,-1,-1/h,1,1/h,0,1,-1/h,0,-1,1/h,0,-1,-1/h,0,1/h,0,1,1/h,0,-1,-1/h,0,1,-1/h,0,-1]]);
7
8
xyz01 = List.Transpose(List.Chop(phd01.ValueAtKey(p),3));
9
pnt01 = Point.ByCoordinates(xyz01[0],xyz01[1],xyz01[2]);
10
phd02 = Dictionary.ByKeysValues(["Tetrahedron","Hexahedron","Octahedron","Dodecahedron","Icosahedron"],[[3,4],[4,6],[3,8],[5,16],[3,20]]);
11
pnt02 = List.Combinations(pnt01,phd02.ValueAtKey(p)[0],false);
12
bln01 = List.AllTrue(pnt02.DoesIntersect(Circle.ByBestFitThroughPoints(pnt02))<1>);
13
pnt03 = List.FilterByBoolMask(pnt02,bln01)["in"];
14
rad01 = Math.Round(Circle.ByBestFitThroughPoints(pnt03).Radius,6);
15
pnt04 = List.GroupByKey(pnt03,rad01);
16
pnt05 = List.FirstItem(List.SortByKey(pnt04["groups"],pnt04["unique keys"])["sortedList"]);
17
pln01 = Plane.ByBestFitThroughPoints(pnt05);
18
dir01 = Vector.ByTwoPoints(pln01.Origin,pnt05);
19
ang01 = Math.Round(dir01.AngleAboutAxis(pln01.XAxis,pln01.Normal),3);
20
srf01 = List.SortByKey(pnt05<1>,ang01<1>)["sortedList"];
21
sld01 = PolySurface.ByJoinedSurfaces(Surface.ByPerimeterPoints(srf01)).ExtractSolids();
Copied!
Only edges are obtained with a slightly altered approach
Platonic Solid Frame
1
h = (1+Math.Sqrt(5))/2-1;
2
phd01 = Dictionary.ByKeysValues(["Tetrahedron","Hexahedron","Octahedron","Dodecahedron","Icosahedron"],
3
[[1,1,1,1,-1,-1,-1,1,-1,-1,-1,1],[1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1],
4
[0,0,1,0,0,-1,0,1,0,0,-1,0,1,0,0,-1,0,0],[0,h,1/h,0,h,-1/h,0,-h,1/h,0,-h,-1/h,h,1/h,0,h,-1/h,0,-h,1/h,0,
5
-h,-1/h,0,1/h,0,h,1/h,0,-h,-1/h,0,h,-1/h,0,-h,1,1,1,1,1,-1,1,-1,1,1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,-1],
6
[0,1,1/h,0,1,-1/h,0,-1,1/h,0,-1,-1/h,1,1/h,0,1,-1/h,0,-1,1/h,0,-1,-1/h,0,1/h,0,1,1/h,0,-1,-1/h,0,1,-1/h,0,-1]]);
7
8
xyz01 = List.Transpose(List.Chop(phd01.ValueAtKey(p),3));
9
pnt01 = Point.ByCoordinates(xyz01[0],xyz01[1],xyz01[2]);
10
pnt02 = List.Combinations(pnt01,2,false);
11
dst01 = Math.Round(List.FirstItem(pnt02<1>).DistanceTo(List.LastItem(pnt02<1>)),3);
12
pnt03 = List.SortByKey(pnt02,dst01);
13
pnt04 = List.GroupByKey(pnt03["sortedList"],pnt03["sortedKeys"])["groups"];
14
edg01 = Line.ByBestFitThroughPoints(List.FirstItem(pnt04));
Copied!
Last modified 10mo ago
Copy link