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)