Exemplo n.º 1
0
    public void AddArc(Vector2 newSite)
    {
        if (root == null)
        {
            root = new VoronoiArcNode(newSite);
        }
        else
        {
            VoronoiArcNode newArc = new VoronoiArcNode(newSite);

            VoronoiArcNode underNew = GetParabolaUnderNew(newArc.mFocus.x);

            if (underNew.squeezeEvent != null)
            {
                removed.Add(underNew.squeezeEvent);
                underNew.squeezeEvent = null;
            }

            Vector2 startPoint = new Vector2(newSite.x, GetYCoord(underNew.mFocus, newSite.x));

            VoronoiArcNode  leftArc   = new VoronoiArcNode(underNew.mFocus);
            VoronoiArcNode  rightArc  = new VoronoiArcNode(underNew.mFocus);
            VoronoiEdgeNode rightEdge = new VoronoiEdgeNode(startPoint, new Vector2(), underNew.mFocus, newSite);
            VoronoiEdgeNode leftEdge  = new VoronoiEdgeNode(startPoint, new Vector2(), newSite, underNew.mFocus);

            leftEdge.pair = rightEdge;
            //*******
            //edges.Add(leftEdge);
            newArc.mParent = rightEdge;

            rightEdge.mLeft   = newArc;
            rightEdge.mRight  = rightArc;
            rightEdge.mParent = leftEdge;

            leftEdge.mLeft   = leftArc;
            leftEdge.mRight  = rightEdge;
            leftEdge.mParent = underNew.mParent;

            leftArc.mParent  = leftEdge;
            rightArc.mParent = rightEdge;

            if (underNew == root)
            {
                root = leftEdge;
            }
            else if (underNew.mParent.mLeft == underNew)
            {
                underNew.mParent.mLeft = leftEdge;
            }
            else if (underNew.mParent.mRight == underNew)
            {
                underNew.mParent.mRight = leftEdge;
            }
            else
            {
                Debug.Log("Invalid Tree");
            }

            SqueezeEvent(leftArc);
            SqueezeEvent(rightArc);
        }
    }
Exemplo n.º 2
0
    public void RemoveArc(SqueezeEvent vEvent)
    {
        VoronoiArcNode removeNode = vEvent.mArcToRemove;

        VoronoiEdgeNode leftEdge  = VoronoiNode.GetLeftParentEdge(removeNode);
        VoronoiEdgeNode rightEdge = VoronoiNode.GetRightParentEdge(removeNode);

        VoronoiArcNode leftArc  = VoronoiNode.GetLeftChildArc(leftEdge);
        VoronoiArcNode rightArc = VoronoiNode.GetRightChildArc(rightEdge);

        if (leftArc.squeezeEvent != null)
        {
            removed.Add(leftArc.squeezeEvent);
            leftArc.squeezeEvent = null;
        }
        if (rightArc.squeezeEvent != null)
        {
            removed.Add(rightArc.squeezeEvent);
            rightArc.squeezeEvent = null;
        }

        Vector2 point = new Vector2(vEvent.mIntersectionPoint.x, GetYCoord(removeNode.mFocus, vEvent.mIntersectionPoint.x));

        leftEdge.mEndVertex  = point;
        rightEdge.mEndVertex = point;

        VoronoiNode h;
        VoronoiNode tempNode = removeNode;

        while (tempNode != root)
        {
            tempNode = tempNode.mParent;
            if (tempNode == leftEdge)
            {
                h = leftEdge;
            }
            if (tempNode == rightEdge)
            {
                h = rightEdge;
            }
        }
        h = new VoronoiEdgeNode(point, new Vector2(), leftArc.mFocus, rightArc.mFocus); //*******
        //edges.Add((VoronoiEdgeNode)h);



        VoronoiNode removeNodeGrandparent = removeNode.mParent.mParent;

        if (removeNode.mParent.mLeft == removeNode)
        {
            if (removeNodeGrandparent.mLeft == removeNode.mParent)
            {
                removeNodeGrandparent.mLeft       = removeNode.mParent.mRight;
                removeNode.mParent.mRight.mParent = removeNodeGrandparent;
            }
            if (removeNodeGrandparent.mRight == removeNode.mParent)
            {
                removeNodeGrandparent.mRight      = removeNode.mParent.mRight;
                removeNode.mParent.mRight.mParent = removeNodeGrandparent;
            }
        }
        else
        {
            if (removeNodeGrandparent.mLeft == removeNode.mParent)
            {
                removeNodeGrandparent.mLeft      = removeNode.mParent.mLeft;
                removeNode.mParent.mLeft.mParent = removeNodeGrandparent;
            }
            if (removeNodeGrandparent.mRight == removeNode.mParent)
            {
                removeNodeGrandparent.mRight     = removeNode.mParent.mLeft;
                removeNode.mParent.mLeft.mParent = removeNodeGrandparent;
            }
        }



        SqueezeEvent(leftArc);
        SqueezeEvent(rightArc);
    }