public static VCircleEvent CircleCheckDataNode(VDataNode n, double ys) { var l = LeftDataNode(n); var r = RightDataNode(n); if (l == null || r == null || l.DataPoint.Equals(r.DataPoint) || l.DataPoint.Equals(n.DataPoint) || n.DataPoint.Equals(r.DataPoint)) { return(null); } if (Fortune.Ccw(l.DataPoint[0], l.DataPoint[1], n.DataPoint[0], n.DataPoint[1], r.DataPoint[0], r.DataPoint[1], false) <= 0) { return(null); } var center = Fortune.CircumCircleCenter(l.DataPoint, n.DataPoint, r.DataPoint); var vc = new VCircleEvent { NodeN = n, NodeL = l, NodeR = r, CenterX = center[0], CenterY = center[1], Valid = true }; if (vc.Y > ys || Math.Abs(vc.Y - ys) < 1e-10) { return(vc); } return(null); }