public static bool Intersects(Segment2I a, Segment2I b) { Vector2I delta1 = a.GetDelta(); Vector2I delta2 = b.GetDelta(); long num1 = (long)(delta1.X * delta2.Y - delta1.Y * delta2.X); if (num1 == 0L) { Segment2I.Struct2 struct2_1 = new Segment2I.Struct2(a.start, a.end, delta1); Segment2I.Struct2 struct2_2 = new Segment2I.Struct2(b.start, b.end, delta2); if ((struct2_1.long_0 > struct2_2.long_0 ? (!struct2_1.method_0(b.start) ? 0 : (struct2_1.method_0(b.End) ? 1 : 0)) : (struct2_2.long_0 == 0L || !struct2_2.method_0(a.start) ? 0 : (struct2_2.method_0(a.end) ? 1 : 0))) != 0) { if (struct2_1.method_1(b.start)) { if (struct2_1.method_1(b.end) || struct2_2.method_1(a.start) || struct2_2.method_1(a.End)) { return(true); } } else if (struct2_1.method_1(b.end)) { if (struct2_2.method_1(a.start) || struct2_2.method_1(a.End)) { return(true); } } else if (struct2_2.method_1(a.start)) { return(true); } } return(false); } long num2 = (long)((b.Start.X - a.Start.X) * delta2.Y - (b.Start.Y - a.Start.Y) * delta2.X); if (num1 > 0L) { if (num2 < 0L || num2 > num1) { return(false); } } else if (num2 > 0L || num2 < num1) { return(false); } long num3 = (long)((b.Start.X - a.Start.X) * delta1.Y - (b.Start.Y - a.Start.Y) * delta1.X); if (num1 > 0L) { if (num3 < 0L || num3 > num1) { return(false); } } else if (num3 > 0L || num3 < num1) { return(false); } return(true); }
public static bool GetIntersectionParameters( Segment2I a, Segment2I b, out Point2D[] intersections, out LongRational[] pArray, out LongRational[] qArray) { Vector2I delta1 = a.GetDelta(); Vector2I delta2 = b.GetDelta(); long denominator = (long)(delta1.X * delta2.Y - delta1.Y * delta2.X); if (denominator == 0L) { Segment2I.Struct2 struct2_1 = new Segment2I.Struct2(a.start, a.end, delta1); Segment2I.Struct2 struct2_2 = new Segment2I.Struct2(b.start, b.end, delta2); if ((struct2_1.long_0 > struct2_2.long_0 ? (!struct2_1.method_0(b.start) ? 0 : (struct2_1.method_0(b.End) ? 1 : 0)) : (struct2_2.long_0 == 0L || !struct2_2.method_0(a.start) ? 0 : (struct2_2.method_0(a.end) ? 1 : 0))) != 0) { if (struct2_1.method_1(b.start)) { if (struct2_1.method_1(b.end)) { intersections = new Point2D[2] { (Point2D)b.start, (Point2D)b.end }; pArray = new LongRational[2] { a.GetNormalizedProjection(b.start).Value, a.GetNormalizedProjection(b.end).Value }; qArray = new LongRational[2] { LongRational.Zero, LongRational.One }; return(true); } if (struct2_2.method_1(a.start)) { intersections = new Point2D[2] { (Point2D)a.start, (Point2D)b.start }; pArray = new LongRational[2] { LongRational.Zero, a.GetNormalizedProjection(b.start).Value }; qArray = new LongRational[2] { b.GetNormalizedProjection(a.start).Value, LongRational.Zero }; return(true); } if (struct2_2.method_1(a.End)) { intersections = new Point2D[2] { (Point2D)b.start, (Point2D)a.end }; pArray = new LongRational[2] { a.GetNormalizedProjection(b.start).Value, LongRational.One }; qArray = new LongRational[2] { LongRational.Zero, b.GetNormalizedProjection(a.end).Value }; return(true); } } else if (struct2_1.method_1(b.end)) { if (struct2_2.method_1(a.start)) { if (struct2_2.method_1(a.End)) { intersections = new Point2D[2] { (Point2D)a.start, (Point2D)a.end }; pArray = new LongRational[2] { LongRational.Zero, LongRational.One }; qArray = new LongRational[2] { b.GetNormalizedProjection(a.start).Value, b.GetNormalizedProjection(a.end).Value }; } else { intersections = new Point2D[2] { (Point2D)a.start, (Point2D)b.end }; pArray = new LongRational[2] { LongRational.Zero, a.GetNormalizedProjection(b.end).Value }; qArray = new LongRational[2] { b.GetNormalizedProjection(a.start).Value, LongRational.One }; } return(true); } if (struct2_2.method_1(a.End)) { intersections = new Point2D[2] { (Point2D)a.end, (Point2D)b.end }; pArray = new LongRational[2] { LongRational.One, a.GetNormalizedProjection(b.end).Value }; qArray = new LongRational[2] { b.GetNormalizedProjection(a.end).Value, LongRational.One }; return(true); } } else if (struct2_2.method_1(a.start)) { intersections = new Point2D[2] { (Point2D)a.start, (Point2D)a.end }; pArray = new LongRational[2] { LongRational.Zero, LongRational.One }; qArray = new LongRational[2] { b.GetNormalizedProjection(a.start).Value, b.GetNormalizedProjection(a.end).Value }; return(true); } } intersections = (Point2D[])null; pArray = (LongRational[])null; qArray = (LongRational[])null; return(false); } long numerator1 = (long)((b.Start.X - a.Start.X) * delta2.Y - (b.Start.Y - a.Start.Y) * delta2.X); if (denominator > 0L) { if (numerator1 < 0L || numerator1 > denominator) { intersections = (Point2D[])null; pArray = (LongRational[])null; qArray = (LongRational[])null; return(false); } } else if (numerator1 > 0L || numerator1 < denominator) { intersections = (Point2D[])null; pArray = (LongRational[])null; qArray = (LongRational[])null; return(false); } long numerator2 = (long)((b.Start.X - a.Start.X) * delta1.Y - (b.Start.Y - a.Start.Y) * delta1.X); if (denominator > 0L) { if (numerator2 < 0L || numerator2 > denominator) { intersections = (Point2D[])null; pArray = (LongRational[])null; qArray = (LongRational[])null; return(false); } } else if (numerator2 > 0L || numerator2 < denominator) { intersections = (Point2D[])null; pArray = (LongRational[])null; qArray = (LongRational[])null; return(false); } LongRational longRational1 = LongRational.Create(numerator1, denominator); LongRational longRational2 = LongRational.Create(numerator2, denominator); intersections = new Point2D[1] { new Point2D((double)a.start.X + (double)longRational1.Numerator * (double)delta1.X / (double)longRational1.Denominator, (double)a.start.Y + (double)longRational1.Numerator * (double)delta1.Y / (double)longRational1.Denominator) }; pArray = new LongRational[1] { longRational1 }; qArray = new LongRational[1] { longRational2 }; return(true); }
public static int GetIntersections( Segment2I a, Segment2I b, out Point2D intersection1, out Point2D intersection2) { Vector2I delta1 = a.GetDelta(); Vector2I delta2 = b.GetDelta(); long num1 = (long)delta1.X * (long)delta2.Y - (long)delta1.Y * (long)delta2.X; if (num1 == 0L) { Segment2I.Struct2 struct2_1 = new Segment2I.Struct2(a.start, a.end, delta1); Segment2I.Struct2 struct2_2 = new Segment2I.Struct2(b.start, b.end, delta2); if ((struct2_1.long_0 > struct2_2.long_0 ? (!struct2_1.method_0(b.start) ? 0 : (struct2_1.method_0(b.End) ? 1 : 0)) : (struct2_2.long_0 == 0L || !struct2_2.method_0(a.start) ? 0 : (struct2_2.method_0(a.end) ? 1 : 0))) != 0) { if (struct2_1.method_1(b.start)) { if (struct2_1.method_1(b.end)) { intersection1 = (Point2D)b.start; intersection2 = (Point2D)b.end; return(2); } if (struct2_2.method_1(a.start)) { intersection1 = (Point2D)a.start; intersection2 = (Point2D)b.start; return(2); } if (struct2_2.method_1(a.End)) { intersection1 = (Point2D)b.start; intersection2 = (Point2D)a.end; return(2); } } else if (struct2_1.method_1(b.end)) { if (struct2_2.method_1(a.start)) { if (struct2_2.method_1(a.End)) { intersection1 = (Point2D)a.start; intersection2 = (Point2D)a.end; } else { intersection1 = (Point2D)a.start; intersection2 = (Point2D)b.end; } return(2); } if (struct2_2.method_1(a.End)) { intersection1 = (Point2D)a.end; intersection2 = (Point2D)b.end; return(2); } } else if (struct2_2.method_1(a.start)) { intersection1 = (Point2D)a.start; intersection2 = (Point2D)a.end; return(2); } } intersection1 = Point2D.NaN; intersection2 = Point2D.NaN; return(0); } long num2 = ((long)b.Start.X - (long)a.Start.X) * (long)delta2.Y - ((long)b.Start.Y - (long)a.Start.Y) * (long)delta2.X; if (num1 > 0L) { if (num2 < 0L || num2 > num1) { intersection1 = Point2D.NaN; intersection2 = Point2D.NaN; return(0); } } else if (num2 > 0L || num2 < num1) { intersection1 = Point2D.NaN; intersection2 = Point2D.NaN; return(0); } long num3 = ((long)b.Start.X - (long)a.Start.X) * (long)delta1.Y - ((long)b.Start.Y - (long)a.Start.Y) * (long)delta1.X; if (num1 > 0L) { if (num3 < 0L || num3 > num1) { intersection1 = Point2D.NaN; intersection2 = Point2D.NaN; return(0); } } else if (num3 > 0L || num3 < num1) { intersection1 = Point2D.NaN; intersection2 = Point2D.NaN; return(0); } intersection1 = new Point2D((double)a.start.X + (double)num2 * (double)delta1.X / (double)num1, (double)a.start.Y + (double)num2 * (double)delta1.Y / (double)num1); intersection2 = Point2D.NaN; return(1); }