private SegmentGraphVertex <EdgeInfo> AddVertex(Vector2 pt) { SegmentGraphVertex <EdgeInfo> vert = new SegmentGraphVertex <EdgeInfo>(pt); vertices.Add(vert); return(vert); }
public void AddSegment(SegmentGraphVertex <EdgeInfo> aVert, SegmentGraphVertex <EdgeInfo> bVert, EdgeInfo info) { SegmentGraphSegment <EdgeInfo> newSegment = new SegmentGraphSegment <EdgeInfo>(aVert, bVert, info); segments.Add(newSegment); aVert.AddConnection(newSegment); bVert.AddConnection(newSegment); }
private void SubdivSegment(SegmentGraphSegment <EdgeInfo> segment, SegmentGraphVertex <EdgeInfo> midPoint) { SegmentGraphVertex <EdgeInfo> aVert = segment.aVert; SegmentGraphVertex <EdgeInfo> bVert = segment.bVert; RemoveSegment(segment, false); AddSegment(aVert, midPoint, segment.info); AddSegment(bVert, midPoint, segment.info); }
public SegmentGraphSegment(SegmentGraphVertex <EdgeInfo> aVert, SegmentGraphVertex <EdgeInfo> bVert, EdgeInfo info) : base() { this.aVert = aVert; this.bVert = bVert; //loose connection. If aVert or bVert changes its position this won't changes //that's why segmentGraphVertex has immutable position a = aVert.position; b = bVert.position; this.info = info; precalcBounds = ExpandedBounds(0.001f); }
public void AddSegment(Vector2 a, Vector2 b, EdgeInfo info) { SegmentGraphVertex <EdgeInfo> aVert = hasVertex(a); SegmentGraphVertex <EdgeInfo> bVert = hasVertex(b); if (aVert == null) { aVert = AddVertex(a); } if (bVert == null) { bVert = AddVertex(b); } //use for checking intersections Segment testingSegment = Segment.SegmentWithPoints(a, b); Rect testingSegBounds = testingSegment.ExpandedBounds(VERT_MERGE_DIST_SQR); List <SegmentGraphVertex <EdgeInfo> > intersectionVertices = new List <SegmentGraphVertex <EdgeInfo> >(); intersectionVertices.Add(aVert);//these will be sorted later intersectionVertices.Add(bVert); SegmentGraphSegment <EdgeInfo>[] segmentsCpy = new SegmentGraphSegment <EdgeInfo> [segments.Count]; segments.CopyTo(segmentsCpy); //check if new vertices are on another line foreach (SegmentGraphSegment <EdgeInfo> seg in segmentsCpy) { if (!seg.precalcBounds.Overlaps(testingSegBounds)) { continue; } if (seg.ContainsPoint(a, VERT_MERGE_DIST_SQR)) { SubdivSegment(seg, aVert); } else if (seg.ContainsPoint(b, VERT_MERGE_DIST_SQR)) { SubdivSegment(seg, bVert); } else if (testingSegment.ContainsPoint(seg.a)) { intersectionVertices.Add(seg.aVert); } else if (testingSegment.ContainsPoint(seg.b)) { intersectionVertices.Add(seg.bVert); } else { Vector2 intersectionPoint = Vector2.zero; if (seg.IntersectionWithSegment(testingSegment, out intersectionPoint)) { SegmentGraphVertex <EdgeInfo> midPtVert = AddVertex(intersectionPoint); SubdivSegment(seg, midPtVert); intersectionVertices.Add(midPtVert); } } } Vector2 sortDirection = b - a; intersectionVertices.Sort((first, second) => (first.position - a).sqrMagnitude.CompareTo( (second.position - a).sqrMagnitude)); for (int i = 0; i < intersectionVertices.Count - 1; i++) { AddSegment(intersectionVertices[i], intersectionVertices[i + 1], info); } }
private void RemoveVertex(SegmentGraphVertex <EdgeInfo> vert) { vertices.Remove(vert); }