// Split a bezier at a particular point into two beziers. Returns false if the point // isn't within error of the bezier. public bool SplitAtPoint(PointF point, float error, out Bezier bez1, out Bezier bez2) { bez1 = bez2 = new Bezier(); float t = FindCoefficient(point, error); if (float.IsNaN(t)) return false; SplitAtCoefficient(t, out bez1, out bez2); return true; }
// Split a bezier at a particular value of t into two beziers of each half public void SplitAtCoefficient(float t, out Bezier bez1, out Bezier bez2) { float s = 1 - t; PointF f00t, f01t, f11t, f0tt, f1tt, fttt; f00t = f01t = f11t = f0tt = f1tt = fttt = new PointF(); f00t.X = s * end1.X + t * control1.X; f00t.Y = s * end1.Y + t * control1.Y; f01t.X = s * control1.X + t * control2.X; f01t.Y = s * control1.Y + t * control2.Y; f11t.X = s * control2.X + t * end2.X; f11t.Y = s * control2.Y + t * end2.Y; f0tt.X = s * f00t.X + t * f01t.X; f0tt.Y = s * f00t.Y + t * f01t.Y; f1tt.X = s * f01t.X + t * f11t.X; f1tt.Y = s * f01t.Y + t * f11t.Y; fttt.X = s * f0tt.X + t * f1tt.X; fttt.Y = s * f0tt.Y + t * f1tt.Y; bez1 = new Bezier(end1, f00t, f0tt, fttt); bez2 = new Bezier(fttt, f1tt, f11t, end2); }