public void Add(Vertex v) { if (startVertex == null) { startVertex = v; } else { endVertex.SetNextVertex(v); v.SetPrevVertex(endVertex); v.SetNextVertex(startVertex); } length++; endVertex = v; if(!startVertex.Equals(endVertex)) startVertex.SetPrevVertex(endVertex); }
public void Insert(Vertex newVertex, Vertex prevVertex, Vertex nextVertex) { Vertex prev = prevVertex.GetPrevVertex(); Vertex next = nextVertex.GetNextVertex(); prev.SetNextVertex(newVertex); newVertex.SetPrevVertex(prev); next.SetPrevVertex(newVertex); newVertex.SetNextVertex(next); if (prevVertex.Equals(this.startVertex)) startVertex = newVertex; if (nextVertex.Equals(this.startVertex)) startVertex = nextVertex.GetNextVertex(); if (nextVertex.Equals(this.endVertex)) endVertex = newVertex; length--; }
public void TestLineSegmentEdges() { Vertex v1 = new Vertex(0, 1); Vertex v2 = new Vertex(0, 0); Vertex v3 = new Vertex(1, 0); Assert.IsNull(v2.PrevLineSegment); Assert.IsNull(v2.NextLineSegment); v2.SetPrevVertex(v1); v2.SetNextVertex(v3); Assert.AreEqual(new LineSegment(v1, v2), v2.PrevLineSegment); Assert.AreEqual(new LineSegment(v2, v3), v2.NextLineSegment); }
public void TestSetNextVertex() { Vertex v1 = new Vertex(0, 1); Vertex v2 = new Vertex(1, 1); Assert.IsNull(v1.GetNextVertex()); v1.SetNextVertex(v2); Assert.AreEqual(v2, v1.GetNextVertex()); }
public void TestSetLineSegmentEdges() { Vertex v1 = new Vertex(0, 1); Vertex v2 = new Vertex(0, 0); Vertex v3 = new Vertex(1, 0); LineSegment ls1 = new LineSegment(new Vertex(1, 1), new Vertex(3, 3)); LineSegment ls2 = new LineSegment(new Vertex(10, 10), new Vertex(30, 30)); Assert.IsNull(v2.PrevLineSegment); Assert.IsNull(v2.NextLineSegment); v2.SetPrevVertex(v1); v2.SetNextVertex(v3); Assert.AreEqual(new LineSegment(v1, v2), v2.PrevLineSegment); Assert.AreEqual(new LineSegment(v2, v3), v2.NextLineSegment); v2.PrevLineSegment = ls1; v2.NextLineSegment = ls2; Assert.AreEqual(ls1, v2.PrevLineSegment); Assert.AreEqual(ls2, v2.NextLineSegment); }
public void BreakAndCreateNew(Vertex v, int lavIndex) { LAV lav = this.Get(lavIndex); Vertex nextVertex = null; Vertex intersection = null; foreach (Vertex currentVertex in lav) { nextVertex = currentVertex.GetNextVertex(); if (currentVertex.Equals(v) || nextVertex.Equals(v)) continue; intersection = MathLibrary.GetIntersectionPoint(new LineSegment(currentVertex, currentVertex.AngleBisector), new LineSegment(nextVertex, nextVertex.AngleBisector)); //IF THE BISECTORS DON'T INTERSECT, OR INTERSECT BEHIND THE LINE, IT MUST BE A QUADRALATERAL if ((currentVertex.GetX() < nextVertex.GetX() && (intersection.GetY() < currentVertex.GetY() && intersection.GetY() < nextVertex.GetY())) || (currentVertex.GetX() > nextVertex.GetX() && (intersection.GetY() > currentVertex.GetY() && intersection.GetY() > nextVertex.GetY())) || double.IsInfinity(intersection.GetX())) { double distanceCurrent = MathLibrary.GetDistanceBetweenVertices(currentVertex, v); double distanceNext = MathLibrary.GetDistanceBetweenVertices(nextVertex, v); double maxDistance = 0; if (distanceCurrent >= distanceNext) maxDistance = distanceCurrent * 10; //MAKE IT A LITTLE BIGGER JUST TO BE SURE else maxDistance = distanceNext * 10; //MAKE IT A LITTLE BIGGER JUST TO BE SURE LineEquation line1 = MathLibrary.GetLineEquation(currentVertex, currentVertex.AngleBisector); LineEquation line2 = MathLibrary.GetLineEquation(nextVertex, nextVertex.AngleBisector); Vertex rectCurrent = new Vertex(line1.GetX(maxDistance + currentVertex.GetY()), maxDistance + currentVertex.GetY()); Vertex rectNext = new Vertex(line2.GetX(maxDistance + nextVertex.GetY()), maxDistance + nextVertex.GetY()); if (MathLibrary.QuadrilateralContainsPoint(currentVertex, nextVertex, rectNext, rectCurrent, v)) { Vertex splitVertex = null; Vertex referenceVertex = null; Vertex counterVertex = lav.GetStart(); while (splitVertex == null && !(counterVertex.GetNextVertex().Equals(lav.GetStart()))) { if (counterVertex.Equals(v)) splitVertex = counterVertex; else if (counterVertex.Equals(currentVertex)) referenceVertex = counterVertex; counterVertex = counterVertex.GetNextVertex(); } counterVertex = lav.GetStart(); while (referenceVertex == null && !(counterVertex.GetNextVertex().Equals(lav.GetStart()))) { if (counterVertex.Equals(v)) splitVertex = counterVertex; else if (counterVertex.Equals(currentVertex)) referenceVertex = counterVertex; counterVertex = counterVertex.GetNextVertex(); } Vertex splitNext = splitVertex.GetNextVertex(); Vertex splitPrev = splitVertex.GetPrevVertex(); Vertex refNext = referenceVertex.GetNextVertex(); Vertex refPrev = referenceVertex.GetPrevVertex(); Vertex newVertex1 = new Vertex(v.AngleBisector.GetX(), v.AngleBisector.GetY()); newVertex1.SetNextVertex(splitNext); newVertex1.SetPrevVertex(referenceVertex); referenceVertex.SetNextVertex(newVertex1); splitVertex.GetNextVertex().SetPrevVertex(newVertex1); SSLOperations.SetVertexType(newVertex1); newVertex1.AngleBisector = MathLibrary.GetAngleBisectorVertex(newVertex1.PrevLineSegment, newVertex1.NextLineSegment); Vertex newVertex2 = new Vertex(v.AngleBisector.GetX(), v.AngleBisector.GetY()); newVertex2.SetNextVertex(refNext); newVertex2.SetPrevVertex(splitPrev); splitVertex.GetPrevVertex().SetNextVertex(newVertex2); referenceVertex.GetNextVertex().SetPrevVertex(newVertex2); SSLOperations.SetVertexType(newVertex2); newVertex2.AngleBisector = MathLibrary.GetAngleBisectorVertex(newVertex2.PrevLineSegment, newVertex2.NextLineSegment); //CREATE NEW LAV this.Insert(newVertex2, lavIndex + 1); Vertex counterVertex2 = newVertex2.GetNextVertex(); while (!counterVertex2.Equals(newVertex2)) { this.Insert(counterVertex2, lavIndex + 1); counterVertex2 = counterVertex2.GetNextVertex(); } break; } } else { if (MathLibrary.TriangleContainsPoint(currentVertex, nextVertex, intersection, v.AngleBisector)) { bool matchFound = false; foreach (Vertex matchVertex in lav) { if (matchFound) { this.Insert(matchVertex, lavIndex + 1); } if (matchVertex.Equals(v)) { Vertex newVertex = new Vertex(v.AngleBisector.GetX(), v.AngleBisector.GetY()); newVertex.SetPrevVertex(matchVertex.GetPrevVertex()); newVertex.SetNextVertex(nextVertex); matchVertex.GetPrevVertex().SetNextVertex(newVertex); SSLOperations.SetVertexType(newVertex); newVertex.AngleBisector = MathLibrary.GetAngleBisectorVertex(newVertex.PrevLineSegment, newVertex.NextLineSegment); this.Insert(newVertex, lavIndex + 1); matchFound = true; } } break; } } } }