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);