2 using System.Collections.Generic;
 
    5 using System.Threading.Tasks;
 
   18             _facets = 
new List<Facet>();
 
   21         private List<Facet> _facets; 
 
   23         public IEnumerable<Facet> 
Facets 
   25             get { _facets.RemoveAll(f => f.Head == null);
 
   32             get { 
return Facets.ToArray(); }
 
   39                 return ML[
"List"].Bracket(
 
   40                     ML[
"List"].Bracket(Facets.Select(f => f.Graphics)).Eval()
 
   47             get { 
return Facets.SelectMany(f => f.HalfEdges); }
 
   57             _facets.AddRange(facets);
 
   62             _facets.AddRange(facets);
 
   69                 return HalfEdges.Where(he => he.Next.Start != he.End);
 
   77                 return ML[
"List"].Bracket(
 
   78                     ML[
"List"].Bracket(HalfEdges.Select(he => he.Graphics).Where(g => g != null)).Eval()
 
   85             return (from f1 in _facets
 
   87                         where (_facets.IndexOf(f1) > _facets.IndexOf(f2))
 
   88                         select 
new[] {f1, f2})
 
   90                             fp[0].CheckIntersectSlow(fp[1]) ||
 
   91                             fp[1].CheckIntersectSlow(fp[0])
 
   97             if (!
Facets.All(f => f.Convex))
 
   99                 throw new Exception(
"Only run this when all the facets are convex!");
 
  102             return (from f1 in _facets
 
  104                     where (_facets.IndexOf(f1) > _facets.IndexOf(f2))
 
  105                     select 
new[] { f1, f2 })
 
  107                             fp[0].CheckIntersectSlow(fp[1]) ||
 
  108                             fp[1].CheckIntersectSlow(fp[0])
 
  114             var newFacets = Facets.SelectMany(f => f.Triangulate()).ToList();
 
  115             _facets.AddRange(newFacets);
 
  120             var prs = HalfEdges.Select(he => he.Start).Distinct();
 
  121             foreach (var pointRef 
in prs)
 
  123                 pointRef.Expr = 
ML[
"N"].Bracket(pointRef.Expr).Eval();
 
  132             var cloneDex = 
new Dictionary<HalfEdge, HalfEdge>();
 
  134             foreach (var facet 
in Facets)
 
  136                 var f = facet.CloneWithAllHalfEdgesCloned;
 
  138                 var originalClonePairs = facet.HalfEdges
 
  140                                               (orignal, clone) => 
new KeyValuePair<HalfEdge, HalfEdge>(orignal, clone));
 
  142                 foreach (var pair 
in originalClonePairs)
 
  144                     cloneDex.Add(pair.Key, pair.Value);
 
  147                 clonePoly.AddFacet(f);
 
  150             foreach (var kvp 
in cloneDex)
 
  152                 var oppositeClone = cloneDex[kvp.Key.Opposite];
 
  153                 kvp.Value.Opposite = oppositeClone;
 
  164                 f.ForceHalfEdgesToReferenceThis();
 
  171             get { 
return Labelize((i, f) => f.NormalGraphics); }
 
  176             get { 
return Labelize((i, f) => f.ClipLabel(i)); }
 
  181             get { 
return Labelize((i, f) => f.InsetLabel(i)); }
 
  186             var facetIndices = Enumerable.Range(1, int.MaxValue)
 
  187                 .NetZip(
Facets, (i, f) => 
new Tuple<int, Facet>(i,f));
 
  188             foreach (var fi 
in facetIndices)
 
  190                 fi.Item2.Tag = fi.Item1.ToString();
 
  195         public Expr 
Labelize(Func<int, Facet, Expr> labelizer)
 
  197             var labels = Enumerable.Range(1, int.MaxValue).NetZip(
Facets, labelizer);
 
  220                                 .Bracket(f.InsetLabel(i), f.HELabels)
 
  228             return PickFacet(fNumber).PickHalfEdge(hNumber);
 
  237             var masters = 
new Dictionary<string, PointRef>();
 
  242                 if (!masters.ContainsKey(halfEdge.Start.Expr.ToString()))
 
  244                     masters[halfEdge.Start.Expr.ToString()] = halfEdge.Start;
 
  246                 if (!masters.ContainsKey(halfEdge.End.Expr.ToString()))
 
  248                     masters[halfEdge.End.Expr.ToString()] = halfEdge.End;
 
  254                 halfEdge.Start = masters[halfEdge.Start.Expr.ToString()];
 
  255                 halfEdge.End = masters[halfEdge.End.Expr.ToString()];
 
  261             get { 
return HalfEdges.Where(he => he.Torn); }
 
IEnumerable< Facet[]> ConvexAssumingInteresectionTest()
 
IEnumerable< HalfEdge > TornHalfEdges
 
IEnumerable< Facet > Facets
 
IEnumerable< Facet[]> SlowDangerousIntersectionTest()
 
IEnumerable< HalfEdge > OutOfOrderHalfEdges
 
HalfEdge PickHalfEdge(int fNumber, int hNumber)
 
void ForceHalfEdgesToReferenceFacets()
 
IEnumerable< HalfEdge > HalfEdges
 
The building blocks of a geometric model, a HalfEdge consists of a reference to a start and end point...
 
void AddFacets(IEnumerable< Facet > facets)
 
Facets are little more than a link to a HalfEdge, but they provide a convenient interface for manipul...
 
A polyhedron! It contains a list of facets. 
 
Expr Labelize(Func< int, Facet, Expr > labelizer)
 
void FusePoints()
Forces HalfEdges to share PointRefs when their PointRefs already refer the same point in space...
 
void AddFacets(Facet[] facets)