public static Intersection QuadraticBezierLineSegmentIntersection0( double p1X, double p1Y, double p2X, double p2Y, double p3X, double p3Y, double a1X, double a1Y, double a2X, double a2Y, double epsilon = Epsilon) { var min = MinPointTests.MinPoint(a1X, a1Y, a2X, a2Y); var max = MaxPointTests.MaxPoint(a1X, a1Y, a2X, a2Y); var result = new Intersection(IntersectionStates.NoIntersection); var a = new Vector2D(p2X, p2Y) * (-2); var c2 = new Vector2D(p1X, p1Y) + (a + new Vector2D(p3X, p3Y)); a = new Vector2D(p1X, p1Y) * (-2); var b = new Vector2D(p2X, p2Y) * 2; var c1 = a + b; var c0 = new Point2D(p1X, p1Y); var n = new Point2D(a1Y - a2Y, a2X - a1X); var cl = (a1X * a2Y) - (a2X * a1Y); var roots = QuadraticRootsTests.QuadraticRoots( DotProduct2Vector2DTests.DotProduct2D(n.X, n.Y, c2.I, c2.J), DotProduct2Vector2DTests.DotProduct2D(n.X, n.Y, c1.I, c1.J), DotProduct2Vector2DTests.DotProduct2D(n.X, n.Y, c0.X + cl, c0.Y + cl), epsilon); for (var i = 0; i < roots.Count; i++) { var t = roots[i]; if (0 <= t && t <= 1) { var p4 = InterpolateLinear2DTests.LinearInterpolate2D(t, p1X, p1Y, p2X, p2Y); var p5 = InterpolateLinear2DTests.LinearInterpolate2D(t, p2X, p2Y, p3X, p3Y); var p6 = InterpolateLinear2DTests.LinearInterpolate2D(t, p4.X, p4.Y, p5.X, p5.Y); if (a1X == a2X) { if (min.Y <= p6.Y && p6.Y <= max.Y) { result.State = IntersectionStates.Intersection; result.AppendPoint(p6); } } else if (a1Y == a2Y) { if (min.X <= p6.X && p6.X <= max.X) { result.State = IntersectionStates.Intersection; result.AppendPoint(p6); } } else if (GreaterThanOrEqualTests.GreaterThanOrEqual(p6.X, p6.Y, min.X, min.Y) && LessThanOrEqualTests.LessThanOrEqual(p6.X, p6.Y, max.X, max.Y)) { result.State = IntersectionStates.Intersection; result.AppendPoint(p6); } } } return(result); }
public static Intersection CubicBezierLineIntersection0( double p1X, double p1Y, double p2X, double p2Y, double p3X, double p3Y, double p4X, double p4Y, double a1X, double a1Y, double a2X, double a2Y, double epsilon = Epsilon) { Vector2D a, b, c, d; Vector2D c3, c2, c1, c0; double cl; Vector2D n; var min = MinPointTests.MinPoint(a1X, a1Y, a2X, a2Y); var max = MaxPointTests.MaxPoint(a1X, a1Y, a2X, a2Y); var result = new Intersection(IntersectionStates.NoIntersection); a = new Vector2D(p1X, p1Y) * (-1); b = new Vector2D(p2X, p2Y) * 3; c = new Vector2D(p3X, p3Y) * (-3); d = a + (b + (c + new Vector2D(p4X, p4Y))); c3 = new Vector2D(d.I, d.J); a = new Vector2D(p1X, p1Y) * 3; b = new Vector2D(p2X, p2Y) * (-6); c = new Vector2D(p3X, p3Y) * 3; d = a + (b + c); c2 = new Vector2D(d.I, d.J); a = new Vector2D(p1X, p1Y) * (-3); b = new Vector2D(p2X, p2Y) * 3; c = a + b; c1 = new Vector2D(c.I, c.J); c0 = new Vector2D(p1X, p1Y); n = new Vector2D(a1Y - a2Y, a2X - a1X); cl = (a1X * a2Y) - (a2X * a1Y); var roots = CubicRootsTests.CubicRoots( DotProduct2Vector2DTests.DotProduct2D(n.I, n.J, c3.I, c3.J), DotProduct2Vector2DTests.DotProduct2D(n.I, n.J, c2.I, c2.J), DotProduct2Vector2DTests.DotProduct2D(n.I, n.J, c1.I, c1.J), DotProduct2Vector2DTests.DotProduct2D(n.I, n.J, c0.I + cl, c0.J + cl), epsilon); for (var i = 0; i < roots.Count; i++) { var t = roots[i]; if (0 <= t && t <= 1) { var p5 = InterpolateLinear2DTests.LinearInterpolate2D(t, p1X, p1Y, p2X, p2Y); var p6 = InterpolateLinear2DTests.LinearInterpolate2D(t, p2X, p2Y, p3X, p3Y); var p7 = InterpolateLinear2DTests.LinearInterpolate2D(t, p3X, p3Y, p4X, p4Y); var p8 = InterpolateLinear2DTests.LinearInterpolate2D(t, p5.X, p5.Y, p6.X, p6.Y); var p9 = InterpolateLinear2DTests.LinearInterpolate2D(t, p6.X, p6.Y, p7.X, p7.Y); var p10 = InterpolateLinear2DTests.LinearInterpolate2D(t, p8.X, p8.Y, p9.X, p9.Y); if (a1X == a2X) { result.State = IntersectionStates.Intersection; result.AppendPoint(p10); } else if (a1Y == a2Y) { result.State = IntersectionStates.Intersection; result.AppendPoint(p10); } else if (GreaterThanOrEqualTests.GreaterThanOrEqual(p10.X, p10.Y, min.X, min.Y) && LessThanOrEqualTests.LessThanOrEqual(p10.X, p10.Y, max.X, max.Y)) { result.State = IntersectionStates.Intersection; result.AppendPoint(p10); } } } return(result); }