2 using System.Collections.Generic;
 
    5 using System.Threading.Tasks;
 
   10     public static class PolyIO
 
   12         public static Polyhedron PolyFromName(Expr name)
 
   16                 "PolyhedronData[{0}][[1]][[1]]," +
 
   17                 "Map[# - 1 &, PolyhedronData[{0}][[1]][[2]][[1]], {{2}}]" +
 
   24         public static Polyhedron PolyFromExpr(Expr polyData)
 
   26             var pointsExpr = polyData.Part(1);
 
   27             var facetsExpr = polyData.Part(2);
 
   30             var pointList = pointsExpr.Parts().Select(e => 
new PointRef(e)).ToList();
 
   34             var facetList = facetsExpr.Parts().Select(fe => FacetFromExpr(pointList, fe)).ToList();
 
   36             var poly = 
new Polyhedron();
 
   38             foreach (var facet 
in facetList)
 
   44             var halfEdges = facetList.SelectMany(f => f.HalfEdges).ToList();
 
   46             var dict = halfEdges.ToDictionary(halfEdge => halfEdge.EndPointPacket);
 
   48             foreach (var halfEdge 
in halfEdges)
 
   50                 halfEdge.Opposite = dict[halfEdge.OppositesEndPointPacket];
 
   51                 halfEdge.Start = halfEdge.Opposite.End;
 
   52                 halfEdge.End = halfEdge.Opposite.Start;
 
   57         public static Facet FacetFromExpr(IList<PointRef> points, Expr f)
 
   59             var pointIndices = f.Parts()
 
   60                               .Select(p => (
int) p.AsInt64()); 
 
   64             var halfEdges = pointIndices
 
   65                               .Select(i => points[i])
 
   67                               .Select(pair => new HalfEdge(pair[0], pair[1]))
 
   73             foreach (var halfEdgePair in halfEdges.CircularTuples(2))
 
   75                 halfEdgePair[0].LinkNext(halfEdgePair[1]);
 
   77             return new Facet(halfEdges.First());
 
   80         public static Polyhedron TestTriangle
 
   84                 var tetrahedron = PolyFromName(
"\"Tetrahedron\"".MsEvalWith());
 
   85                 var triangle = 
new Polyhedron();
 
   86                 triangle.AddFacet(tetrahedron.Facets.Skip(1).First().CloneWithAllHalfEdgesCloned);