public Polygon2DTriangulator(Polygon2DAdorner a, Polygon2DAdorner b) { Polygon2DEditor polygonEditor = null; if (!a.polygon.isSimple || !b.polygon.isSimple) { throw (new ArgumentException()); } if (a.polygon.PointDirection != b.polygon.PointDirection) { polygonEditor = new Polygon2DEditor(a.polygon); polygonEditor.Invert(); } Debug.Assert(a.polygon.PointDirection == b.polygon.PointDirection); FirstPolygon = a; SecondPolygon = b; Diviser = new Polygon2DDiviser(a.Count); ghostPoint = new GhostPoint2DCollection(); ghostTriangle = new GhostTriangle2DCollection(); polygonEditor = new Polygon2DEditor(this.FirstPolygon.polygon); polygonEditor.Clear(); polygonEditor = new Polygon2DEditor(this.SecondPolygon.polygon); polygonEditor.Clear(); }
public void Clear() { this.ghostTriangle = new GhostTriangle2DCollection(); Polygon2DEditor polygonEditor = new Polygon2DEditor(this.FirstPolygon.polygon); polygonEditor.Clear(); polygonEditor = new Polygon2DEditor(this.SecondPolygon.polygon); polygonEditor.Clear(); this.FirstPolygon.ApplyGhostTriangles(this.ghostTriangle); this.SecondPolygon.ApplyGhostTriangles(this.ghostTriangle); }
public void Clear() { Polygon2DEditor polygonEditor = new Polygon2DEditor(this.polygon); polygonEditor.Clear(); this.ghostTriangles.Clear(); this.lineSegments.Clear(); this.triangles.Clear(); if (this.child != null) { this.child.Clear(); } }
public void FastTriangluation() { int from = 0; int to = 2; Polygon2DEditor polygonEditor = new Polygon2DEditor(this.FirstPolygons.Parent); polygonEditor.Clear(); polygonEditor = new Polygon2DEditor(this.SecondPolygons.Parent); polygonEditor.Clear(); this.InitLinkDistance(); for (int i = 0; i < FirstPolygons.SubDivision.Count; i++) { int vertexCount = FirstPolygons.SubDivision[i].VertexCount; Polygon2D firstPolygon = FirstPolygons.SubDivision[i]; Polygon2D secondPolygon = SecondPolygons.SubDivision[i]; if (vertexCount <= 3) { continue; } int dist = MAX_DIST; for (int j = 0; j < vertexCount; j++) { for (int k = j + 2; k < vertexCount; k++) { if (j == k || Math.Abs(j - k) == 1 || Math.Abs(j - k) == vertexCount - 1) { continue; } LineSegment2D testLine = new LineSegment2D(firstPolygon.GetPoint(j), firstPolygon.GetPoint(k)); if (firstPolygon.InflectsEdge(testLine)) { continue; } testLine = new LineSegment2D(secondPolygon.GetPoint(j), secondPolygon.GetPoint(k)); if (secondPolygon.InflectsEdge(testLine)) { continue; } LinkDistance link = this.linkDistance.Contains(this.FirstPolygons.GetParentIndex(j, i), this.FirstPolygons.GetParentIndex(k, i), 0); int d; if (link != null) { d = link.linkDistance; } else { FirstTarget = new Polygon2DLinkMaker(firstPolygon, j, k); SecondTarget = new Polygon2DLinkMaker(secondPolygon, j, k); FirstTarget.Divide(); SecondTarget.Divide(); d = Math.Max(FirstTarget.LinkDistance, SecondTarget.LinkDistance); link = new LinkDistance(this.FirstPolygons.GetParentIndex(j, i), this.FirstPolygons.GetParentIndex(k, i), 0, d); } if (dist > d) { dist = d; from = j; to = k; } else if (dist == d) { if (Math.Abs(vertexCount / 2 - Math.Abs(j - k)) > Math.Abs(vertexCount / 2 - Math.Abs(from - to))) { from = j; to = k; } } } } FirstTarget = new Polygon2DLinkMaker(firstPolygon, from, to); SecondTarget = new Polygon2DLinkMaker(secondPolygon, from, to); FirstTarget.Divide(); FirstTarget.BuildPath(); SecondTarget.Divide(); SecondTarget.BuildPath(); if (dist != Math.Max(FirstTarget.LinkDistance, SecondTarget.LinkDistance)) { dist = Math.Max(FirstTarget.LinkDistance, SecondTarget.LinkDistance); this.linkDistance.Set(this.FirstPolygons.GetParentIndex(from, i), this.FirstPolygons.GetParentIndex(to, i), 0, dist); } int Extra = dist - FirstTarget.LinkDistance; if (Extra > 0) { FirstTarget.LinkDivisers.Extend(Extra); } Extra = dist - SecondTarget.LinkDistance; if (Extra > 0) { SecondTarget.LinkDivisers.Extend(Extra); } FirstPolygons.DividedBy(FirstTarget.LinkDivisers, firstPolygon); SecondPolygons.DividedBy(SecondTarget.LinkDivisers, secondPolygon); } GetResult(); BuildGhostTriangle(); }