private void Divide() { int Count = FirstPolygon.internalSegments.Count; Vector2DCollection v = FirstPolygon.internalSegments; for (int i = 0; i < Count; i++) { Diviser.DividedBy((int)(v[i].X), (int)(v[i].Y)); } Count = SecondPolygon.internalSegments.Count; v = SecondPolygon.internalSegments; for (int i = 0; i < Count; i++) { Diviser.DividedBy((int)(v[i].X), (int)(v[i].Y)); } }
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(); }
public void Divide() { UpdateStatus(this, "Dividing..."); targetDiviser.UpdateStatus += new Microsoft.VS.Akira.Triangulations.TargetDiviser.ShowStatus(UpdateStatus); targetDiviser.Divide(); Polygon2D poly = this.firstPolygon; this.firstPolygonCollection.Add(this.firstPolygon); this.secondPolygonCollection.Add(this.secondPolygon); UpdateStatus(this, "Mapping..."); for (int i = 0; i < targetDiviser.Divisers.Count; i++) { int first_index = this.secondPolygon.GetPointIndex(targetDiviser.Divisers[i].FirstPoint); int second_index = this.secondPolygon.GetPointIndex(targetDiviser.Divisers[i].LastPoint); LineSegment2D line = new LineSegment2D(this.firstPolygon.GetPoint(first_index), this.firstPolygon.GetPoint(second_index)); for (int j = 0; j < this.firstPolygonCollection.Count; j++) { if (this.firstPolygonCollection[j].HasVertex(line.FirstPoint) != Polygon2D.NoSuchPoint && this.firstPolygonCollection[j].HasVertex(line.LastPoint) != Polygon2D.NoSuchPoint) { poly = this.firstPolygonCollection[j]; this.firstPolygonCollection.Remove(j); break; } } int from = 0; int to = 0; from = poly.GetPointIndex(line.FirstPoint); to = poly.GetPointIndex(line.LastPoint); linkMaker = new Polygon2DLinkMaker(poly, from, to); linkMaker.Divide(); int extraPoints = linkMaker.LinkDistance - 1; linkMaker.BuildPath(); Polygon2DDiviser pd = new Polygon2DDiviser(poly); pd.DividedBy(linkMaker.LinkDivisers, poly); this.firstPolygonCollection.Add(pd.SubDivision[1]); this.firstPolygonCollection.Add(pd.SubDivision[2]); //divide target polygon line = targetDiviser.Divisers[i]; for (int j = 0; j < this.secondPolygonCollection.Count; j++) { if (this.secondPolygonCollection[j].HasVertex(line.FirstPoint) != Polygon2D.NoSuchPoint && this.secondPolygonCollection[j].HasVertex(line.LastPoint) != Polygon2D.NoSuchPoint) { poly = this.secondPolygonCollection[j]; this.secondPolygonCollection.Remove(j); break; } } from = poly.GetPointIndex(line.FirstPoint); to = poly.GetPointIndex(line.LastPoint); Point2DCollection path = line.ToPath(extraPoints); pd = new Polygon2DDiviser(poly); pd.DividedBy(path, poly); this.secondPolygonCollection.Add(pd.SubDivision[1]); this.secondPolygonCollection.Add(pd.SubDivision[2]); } }