Copy h = ( 1 + Math.Sqrt ( 5 )) / 2 - 1 ;
phd01 = Dictionary.ByKeysValues ([ "Tetrahedron" , "Hexahedron" , "Octahedron" , "Dodecahedron" , "Icosahedron" ] ,
[[ 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 ] ,
[ 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 ,
- 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 ] ,
[ 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 ]]);
xyz01 = List.Transpose ( List.Chop ( phd01.ValueAtKey (p) , 3 ));
pnt01 = Point.ByCoordinates (xyz01[ 0 ] , xyz01[ 1 ] , xyz01[ 2 ]);
phd02 = Dictionary.ByKeysValues ([ "Tetrahedron" , "Hexahedron" , "Octahedron" , "Dodecahedron" , "Icosahedron" ] , [[ 3 , 4 ] , [ 4 , 6 ] , [ 3 , 8 ] , [ 5 , 16 ] , [ 3 , 20 ]]);
pnt02 = List.Combinations (pnt01 , phd02.ValueAtKey (p)[ 0 ] , false );
bln01 = List.AllTrue ( pnt02.DoesIntersect ( Circle.ByBestFitThroughPoints (pnt02)) < 1 > );
pnt03 = List.FilterByBoolMask (pnt02 , bln01)[ "in" ];
rad01 = Math.Round ( Circle.ByBestFitThroughPoints (pnt03).Radius , 6 );
pnt04 = List.GroupByKey (pnt03 , rad01);
pnt05 = List.FirstItem ( List.SortByKey (pnt04[ "groups" ] , pnt04[ "unique keys" ])[ "sortedList" ]);
pln01 = Plane.ByBestFitThroughPoints (pnt05);
dir01 = Vector.ByTwoPoints (pln01.Origin , pnt05);
ang01 = Math.Round ( dir01.AngleAboutAxis (pln01.XAxis , pln01.Normal) , 3 );
srf01 = List.SortByKey (pnt05 < 1 >, ang01 < 1 > )[ "sortedList" ];
sld01 = PolySurface.ByJoinedSurfaces ( Surface.ByPerimeterPoints (srf01)) .ExtractSolids ();
Copy h = ( 1 + Math.Sqrt ( 5 )) / 2 - 1 ;
phd01 = Dictionary.ByKeysValues ([ "Tetrahedron" , "Hexahedron" , "Octahedron" , "Dodecahedron" , "Icosahedron" ] ,
[[ 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 ] ,
[ 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 ,
- 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 ] ,
[ 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 ]]);
xyz01 = List.Transpose ( List.Chop ( phd01.ValueAtKey (p) , 3 ));
pnt01 = Point.ByCoordinates (xyz01[ 0 ] , xyz01[ 1 ] , xyz01[ 2 ]);
pnt02 = List.Combinations (pnt01 , 2 , false );
dst01 = Math.Round ( List.FirstItem (pnt02 < 1 > ) .DistanceTo ( List.LastItem (pnt02 < 1 > )) , 3 );
pnt03 = List.SortByKey (pnt02 , dst01);
pnt04 = List.GroupByKey (pnt03[ "sortedList" ] , pnt03[ "sortedKeys" ])[ "groups" ];
edg01 = Line.ByBestFitThroughPoints ( List.FirstItem (pnt04));