/// <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; } } }
/// <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(); } }
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; } }