Esempio n. 1
0
        /// <summary>
        /// Perform the necessary actions once the sweep line reach a seed event (meets a seed)
        /// </summary>
        /// <param name="seedEvent"></param>
        private void ProcessSeedEvent(SeedEvent seedEvent)
        {
            var node = Events.GetNearest(this, Events.Root, seedEvent, MaximumEdgeLimit);

            if (node is null || node is BreakpointNode)
            {
                return;
            }

            if (Math.Abs(node.X - seedEvent.X) < EPSILON_DOUBLE &&
                Math.Abs(node.Y - seedEvent.Y) < EPSILON_DOUBLE)
            {
                return;
            }

            if (node is Leaf closestLeafNode)
            {
                if (closestLeafNode.DisappearEvent != null)
                {
                    PriorityQueue.Delete(closestLeafNode.DisappearEvent.Handle);
                    closestLeafNode.DisappearEvent = null;
                }

                foreach (var circleEvent in Events.AddSeedEvent(closestLeafNode, new TreeItem(seedEvent.Vertex)))
                {
                    C5.IPriorityQueueHandle <IEvent> h = null;
                    PriorityQueue.Add(ref h, circleEvent);
                    circleEvent.Handle = h;
                }
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Add the seed events for each seed in the diagram (known prior to the diagram generation)
 /// </summary>
 private void AddSeedEvents()
 {
     for (var i = 0; i < Seeds.Length; i++)
     {
         var se = new SeedEvent(Seeds[i]);
         VoronoiVertices[i] = se.Vertex;
         C5.IPriorityQueueHandle <IEvent> h = null;
         PriorityQueue.Add(ref h, se);
         se.Handle = h;
     }
 }
 private void Start()
 {
     if (this.onSuccessSeed == null)
     {
         this.onSuccessSeed = new SeedEvent();
     }
     if (this.onSuccessMorph == null)
     {
         this.onSuccessMorph = new MorphEvent();
     }
     if (this.onFailSeed == null)
     {
         this.onFailSeed = new SeedEvent();
     }
 }
Esempio n. 4
0
        public IBinaryNode GetNearest(Builder builder, IBinaryNode current, SeedEvent seedEvent, double edgeLimit)
        {
            while (true)
            {
                var x = seedEvent.X;
                var y = seedEvent.Y;

                if ((int)y == (int)MaxY)
                {
                    var le   = new TreeItem(seedEvent.Vertex);
                    var evt  = new Leaf(le);
                    var next = Root;

                    while (next.GetNextLeaf() != null)
                    {
                        next = next.GetNextLeaf();
                    }

                    if (!(next is Leaf nextLeaf))
                    {
                        return(null);
                    }

                    var h1 = new PartialLine(nextLeaf.ListItem.Point);
                    var h2 = new PartialLine(le.Point);

                    h1.Twin = h2;
                    h2.Twin = h1;
                    PartialLines.Add(h1);
                    PartialLines.Add(h2);

                    if (nextLeaf.ListItem.Point.PartialLine == null)
                    {
                        nextLeaf.ListItem.Point.PartialLine = h1;
                    }
                    else
                    {
                        var n = nextLeaf.ListItem.Point.PartialLine;

                        while (n.Next != null)
                        {
                            n = n.Next;
                        }

                        n.Next = h1;
                    }

                    nextLeaf.ListItem.PartialLine = h1;
                    le.PartialLine = h1;

                    le.Point.PartialLine = h2;

                    var b0      = new Breakpoint(nextLeaf.ListItem, evt.ListItem);
                    var bpNode0 = new BreakpointNode(b0);
                    nextLeaf.BreakpointNode = bpNode0;

                    if (next == Root)
                    {
                        next.Parent   = bpNode0;
                        Root          = bpNode0;
                        bpNode0.Left  = next;
                        bpNode0.Right = evt;
                        evt.Parent    = bpNode0;
                    }
                    else
                    {
                        var parent = next.Parent;
                        parent.Right   = bpNode0;
                        bpNode0.Parent = parent;
                        bpNode0.Left   = next;
                        next.Parent    = bpNode0;
                        bpNode0.Right  = evt;
                        evt.Parent     = bpNode0;
                    }

                    b0.InitializeBreakpoint(y);
                    b0.X = (x + next.X) / 2;
                    b0.Y = y + edgeLimit;

                    var ce = new CircleEvent(b0.X, b0.Y);

                    h1.CircleEvent = ce;
                    ce.PartialLine = h1;

                    return(null);
                }

                current.CalculateInnerBreakpoint(y - 0.0001);

                if (Math.Abs(x - current.X) < EPSILON_DOUBLE)
                {
                    return(current);
                }

                var child = x > current.X ? current.Right : current.Left;
                if (child is null)
                {
                    return(current);
                }

                current = child;
            }
        }