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; } }