コード例 #1
0
    private SegmentGraphVertex <EdgeInfo> AddVertex(Vector2 pt)
    {
        SegmentGraphVertex <EdgeInfo> vert = new SegmentGraphVertex <EdgeInfo>(pt);

        vertices.Add(vert);
        return(vert);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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);
    }
コード例 #4
0
    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);
    }
コード例 #5
0
    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);
        }
    }
コード例 #6
0
 private void RemoveVertex(SegmentGraphVertex <EdgeInfo> vert)
 {
     vertices.Remove(vert);
 }