public class LineIntersectionTests
public void GetIntersectionPoint_IntersectingLines_ReturnsIntersectionPoint()
(double x, double y) p1 = (1, 2);
(double a, double b) v1 = (1, 1);
(double x, double y) p2 = (3, 1);
(double a, double b) v2 = (-1, 1);
(double x, double y) expected = (2, 3);
var result = LineIntersection.GetIntersectionPoint(p1, v1, p2, v2);
Assert.That(result, Is.EqualTo(expected));
public void GetIntersectionPoint_ParallelLines_ReturnsNull()
(double x, double y) p1 = (1, 2);
(double a, double b) v1 = (1, 1);
(double x, double y) p2 = (3, 4);
(double a, double b) v2 = (1, 1);
var result = LineIntersection.GetIntersectionPoint(p1, v1, p2, v2);
Assert.That(result, Is.Null);
public class LineIntersection
public static (double x, double y)? GetIntersectionPoint(
(double x, double y) p1, (double a, double b) v1,
(double x, double y) p2, (double a, double b) v2)
double det = v1.a * v2.b - v1.b * v2.a;
if (Math.Abs(det) < 1e-6)
double t = ((p2.x - p1.x) * v2.b - (p2.y - p1.y) * v2.a) / det;
double x = p1.x + t * v1.a;
double y = p1.y + t * v1.b;
public static void Main(string[] args)
(double x, double y) p1 = (1, 2);
(double a, double b) v1 = (1, 1);
(double x, double y) p2 = (3, 1);
(double a, double b) v2 = (-1, 1);
var intersection = GetIntersectionPoint(p1, v1, p2, v2);
if (intersection.HasValue)
Console.WriteLine($"Intersection point: ({intersection.Value.x}, {intersection.Value.y})");
Console.WriteLine("Lines are parallel.");