// Find the point of intersection between // the lines p1 --> p2 and p3 --> p4. public static PointF?FindIntersection(PointF p1, PointF p2, PointF p3, PointF p4) { // Get the segments' parameters. float dx12 = p2.X - p1.X; float dy12 = p2.Y - p1.Y; float dx34 = p4.X - p3.X; float dy34 = p4.Y - p3.Y; // Solve for t1 and t2 float denominator = (dy12 * dx34 - dx12 * dy34); float t1 = ((p1.X - p3.X) * dy34 + (p3.Y - p1.Y) * dx34) / denominator; if (float.IsInfinity(t1)) { // The lines are parallel (or close enough to it). return(null); } float t2 = ((p3.X - p1.X) * dy12 + (p1.Y - p3.Y) * dx12) / -denominator; // The segments intersect if t1 and t2 are between 0 and 1. var segments_intersect = ((t1 >= 0) && (t1 <= 1) && (t2 >= 0) && (t2 <= 1)); // Find the point of intersection. if (segments_intersect) { return(new PointF(p1.X + dx12 * t1, p1.Y + dy12 * t1)); } return(null); }
// Find the point of intersection between // the lines p1 --> p2 and p3 --> p4. // Находит пересечение отрезков, если точно известно, что они пересекаются public static PointF Intersection(PointF p1, PointF p2, PointF p3, PointF p4) { // Get the segments' parameters. float dx12 = p2.X - p1.X; float dy12 = p2.Y - p1.Y; float dx34 = p4.X - p3.X; float dy34 = p4.Y - p3.Y; // Solve for t1 and t2 float denominator = (dy12 * dx34 - dx12 * dy34); float t1 = ((p1.X - p3.X) * dy34 + (p3.Y - p1.Y) * dx34) / denominator; // Find the point of intersection. return(new PointF(p1.X + dx12 * t1, p1.Y + dy12 * t1)); }
// Find the point of intersection between // the lines p1 --> p2 and p3 --> p4. public static void FindIntersection( PointF p1, PointF p2, PointF p3, PointF p4, out bool lines_intersect, out bool segments_intersect, out PointF intersection, out PointF close_p1, out PointF close_p2) { // Get the segments' parameters. float dx12 = p2.X - p1.X; float dy12 = p2.Y - p1.Y; float dx34 = p4.X - p3.X; float dy34 = p4.Y - p3.Y; // Solve for t1 and t2 float denominator = (dy12 * dx34 - dx12 * dy34); float t1 = ((p1.X - p3.X) * dy34 + (p3.Y - p1.Y) * dx34) / denominator; if (float.IsInfinity(t1)) { // The lines are parallel (or close enough to it). lines_intersect = false; segments_intersect = false; intersection = new PointF(float.NaN, float.NaN); close_p1 = new PointF(float.NaN, float.NaN); close_p2 = new PointF(float.NaN, float.NaN); return; } lines_intersect = true; float t2 = ((p3.X - p1.X) * dy12 + (p1.Y - p3.Y) * dx12) / -denominator; // Find the point of intersection. intersection = new PointF(p1.X + dx12 * t1, p1.Y + dy12 * t1); // The segments intersect if t1 and t2 are between 0 and 1. segments_intersect = ((t1 >= 0) && (t1 <= 1) && (t2 >= 0) && (t2 <= 1)); // Find the closest points on the segments. if (t1 < 0) { t1 = 0; } else if (t1 > 1) { t1 = 1; } if (t2 < 0) { t2 = 0; } else if (t2 > 1) { t2 = 1; } close_p1 = new PointF(p1.X + dx12 * t1, p1.Y + dy12 * t1); close_p2 = new PointF(p3.X + dx34 * t2, p3.Y + dy34 * t2); }