public static void SetVertexType(Vertex v) { Vertex next = null; Vertex prev = null; double nextX = 0; double nextY = 0; double prevX = 0; double prevY = 0; double myX = 0; double myY = 0; myX = v.GetX(); myY = v.GetY(); next = v.GetNextVertex(); prev = v.GetPrevVertex(); nextX = next.GetX(); nextY = next.GetY(); prevX = prev.GetX(); prevY = prev.GetY(); if (nextX == myX) { nextX += 0.01; } if (nextY == myY) { nextY -= 0.01; } if (prevX == myX) { prevX -= 0.01; } if (prevY == myY) { prevY -= 0.01; } if ((prevY < myY && prevX < myX) && (nextY < myY && myX < nextX)) //PEAK { v.Type = Vertex.VertexType.Split; } else if ((prevY > myY && myX < prevX) && (nextY > myY && nextX < myX)) //VALLEY { v.Type = Vertex.VertexType.Split; } else if ((prevY > myY && myX > prevX) && (myY > nextY && myX > nextX)) //> { v.Type = Vertex.VertexType.Split; } else if ((prevY < myY && prevX > myX) && (myY < nextY && nextX > myX)) //< { v.Type = Vertex.VertexType.Split; } else { v.Type = Vertex.VertexType.Edge; } }
public static Intersection GetClosestIntersection(Vertex v) { Vertex next = v.GetNextVertex(); Vertex prev = v.GetPrevVertex(); Vertex nextIntersection = MathLibrary.GetIntersectionPoint(new LineSegment(next, next.AngleBisector), new LineSegment(v, v.AngleBisector)); Vertex prevIntersection = MathLibrary.GetIntersectionPoint(new LineSegment(prev, prev.AngleBisector), new LineSegment(v, v.AngleBisector)); Vertex.VertexType type = Vertex.VertexType.Undefined; if (MathLibrary.GetDistanceBetweenLineAndVertex(v, next, nextIntersection) < MathLibrary.GetDistanceBetweenLineAndVertex(v, prev, prevIntersection)) { if (v.Type == Vertex.VertexType.Split || next.Type == Vertex.VertexType.Split) type = Vertex.VertexType.Split; else type = Vertex.VertexType.Edge; Intersection i = new Intersection(nextIntersection.GetX(), nextIntersection.GetY(), next, v, type, next.NextLineSegment, v.PrevLineSegment); return i; } else { if (v.Type == Vertex.VertexType.Split || prev.Type == Vertex.VertexType.Split) type = Vertex.VertexType.Split; else type = Vertex.VertexType.Edge; Intersection i = new Intersection(prevIntersection.GetX(), prevIntersection.GetY(), v, prev, type, prev.PrevLineSegment, v.NextLineSegment); return i; } }
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 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 TestNullPrevAndNextNeighbor() { Vertex v = new Vertex(0, 1); Assert.IsNull(v.GetPrevVertex()); Assert.IsNull(v.GetNextVertex()); }
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; } } } }