# Shortest distance between a Line and a Point in a 3-D plane

• Difficulty Level : Easy
• Last Updated : 08 Aug, 2022

Given a line passing through two points A and B and an arbitrary point C in a 3-D plane, the task is to find the shortest distance between the point C and the line passing through the points A and B.
Examples:

```Input: A = (5, 2, 1), B = (3, 1, -1), C = (0, 2, 3)
Output: Shortest Distance is 5

Input: A = (4, 2, 1), B = (3, 2, 1), C = (0, 2, 0)
Output: Shortest Distance is 1```

Consider a point C and a line that passes through A and B as shown in the below figure.

Now Consider the vectors, AB and AC and the shortest distance as CD. The Shortest Distance is always the perpendicular distance. The point D is taken on AB such that CD is perpendicular to AB.

Construct BP and CP as shown in the figure to form a Parallelogram. Now C is a vertex of parallelogram ABPC and CD is perpendicular to Side AB. Hence CD is the height of the parallelogram.

Note: In the case when D does not fall on line segment AB there will be a point D’ such that PD’ is perpendicular to AB and D’ lies on line segment AB with CD = PD’.
The magnitude of cross product AB and AC gives the Area of the parallelogram. Also, the area of a parallelogram is Base * Height = AB * CD. So,

`CD = |ABxAC| / |AB|`

Below is the CPP program to find the shortest distance:

## CPP

 `// C++ program to find the Shortest``// Distance Between A line and a``// Given point.``#include``using` `namespace` `std;` `class` `Vector {``private``:``    ``int` `x, y, z;``    ``// 3D Coordinates of the Vector` `public``:``    ``Vector(``int` `x, ``int` `y, ``int` `z)``    ``{``        ``// Constructor``        ``this``->x = x;``        ``this``->y = y;``        ``this``->z = z;``    ``}``    ``Vector operator+(Vector v); ``// ADD 2 Vectors``    ``Vector operator-(Vector v); ``// Subtraction``    ``int` `operator^(Vector v); ``// Dot Product``    ``Vector operator*(Vector v); ``// Cross Product``    ``float` `magnitude()``    ``{``        ``return` `sqrt``(``pow``(x, 2) + ``pow``(y, 2) + ``pow``(z, 2));``    ``}``    ``friend` `ostream& operator<<(ostream& out, ``const` `Vector& v);``    ``// To output the Vector``};` `// ADD 2 Vectors``Vector Vector::operator+(Vector v)``{``    ``int` `x1, y1, z1;``    ``x1 = x + v.x;``    ``y1 = y + v.y;``    ``z1 = z + v.z;``    ``return` `Vector(x1, y1, z1);``}` `// Subtract 2 vectors``Vector Vector::operator-(Vector v)``{``    ``int` `x1, y1, z1;``    ``x1 = x - v.x;``    ``y1 = y - v.y;``    ``z1 = z - v.z;``    ``return` `Vector(x1, y1, z1);``}` `// Dot product of 2 vectors``int` `Vector::operator^(Vector v)``{``    ``int` `x1, y1, z1;``    ``x1 = x * v.x;``    ``y1 = y * v.y;``    ``z1 = z * v.z;``    ``return` `(x1 + y1 + z1);``}` `// Cross product of 2 vectors``Vector Vector::operator*(Vector v)``{``    ``int` `x1, y1, z1;``    ``x1 = y * v.z - z * v.y;``    ``y1 = z * v.x - x * v.z;``    ``z1 = x * v.y - y * v.x;``    ``return` `Vector(x1, y1, z1);``}` `// Display Vector``ostream& operator<<(ostream& out,``                    ``const` `Vector& v)``{``    ``out << v.x << ``"i "``;``    ``if` `(v.y >= 0)``        ``out << ``"+ "``;``    ``out << v.y << ``"j "``;``    ``if` `(v.z >= 0)``        ``out << ``"+ "``;``    ``out << v.z << ``"k"` `<< endl;``    ``return` `out;``}` `// calculate shortest dist. from point to line``float` `shortDistance(Vector line_point1, Vector line_point2,``                    ``Vector point)``{``    ``Vector AB = line_point2 - line_point1;``    ``Vector AC = point - line_point1;``    ``float` `area = Vector(AB * AC).magnitude();``    ``float` `CD = area / AB.magnitude();``    ``return` `CD;``}` `// Driver program``int` `main()``{``    ``// Taking point C as (2, 2, 2)``    ``// Line Passes through A(4, 2, 1)``    ``// and B(8, 4, 2).``    ``Vector line_point1(4, 2, 1), line_point2(8, 4, 2);``    ``Vector point(2, 2, 2);` `    ``cout << ``"Shortest Distance is : "``         ``<< shortDistance(line_point1, line_point2, point);` `  ``return` `0;``}`

## C#

 `// C# program to find the Shortest``// Distance Between A line and a``// Given point.` `using` `System;``using` `System.Collections.Generic;` `class` `Vector {``    ``public` `int` `x, y, z;``    ``// 3D Coordinates of the Vector` `    ``public` `Vector(``int` `x1, ``int` `y1, ``int` `z1)``    ``{``        ``// Constructor``        ``x = x1;``        ``y = y1;``        ``z = z1;``    ``}` `    ``public` `double` `magnitude()``    ``{``        ``return` `Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2)``                         ``+ Math.Pow(z, 2));``    ``}` `    ``// To output the Vector` `    ``// ADD 2 Vectors``    ``public` `static` `Vector ``operator` `+ (Vector v1, Vector v)``    ``{``        ``int` `x1, y1, z1;``        ``x1 = v1.x + v.x;``        ``y1 = v1.y + v.y;``        ``z1 = v1.z + v.z;``        ``return` `new` `Vector(x1, y1, z1);``    ``}` `    ``// Subtract 2 vectors``    ``public` `static` `Vector ``operator` `- (Vector v1, Vector v)``    ``{``        ``int` `x1, y1, z1;``        ``x1 = v1.x - v.x;``        ``y1 = v1.y - v.y;``        ``z1 = v1.z - v.z;``        ``return` `new` `Vector(x1, y1, z1);``    ``}` `    ``// Cross product of 2 vectors``    ``public` `static` `Vector ``operator``*(Vector v, Vector v1)``    ``{``        ``int` `x1, y1, z1;``        ``x1 = v1.y * v.z - v1.z * v.y;``        ``y1 = v1.z * v.x - v1.x * v.z;``        ``z1 = v1.x * v.y - v1.y * v.x;``        ``return` `new` `Vector(x1, y1, z1);``    ``}``}` `class` `GFG {``    ``// calculate shortest dist. from point to line``    ``static` `double` `shortDistance(Vector line_point1,``                                ``Vector line_point2,``                                ``Vector point)``    ``{``        ``Vector AB = line_point2 - line_point1;``        ``Vector AC = point - line_point1;``        ``double` `area = (AB * AC).magnitude();``        ``double` `CD = area / AB.magnitude();``        ``return` `CD;``    ``}``    ``// Driver program``    ``public` `static` `void` `Main(``string``[] args)``    ``{``        ``// Taking point C as (2, 2, 2)``        ``// Line Passes through A(4, 2, 1)``        ``// and B(8, 4, 2).``        ``Vector line_point1 = ``new` `Vector(4, 2, 1);``        ``Vector line_point2 = ``new` `Vector(8, 4, 2);``        ``Vector point = ``new` `Vector(2, 2, 2);` `        ``Console.WriteLine(``"Shortest Distance is : "``                          ``+ shortDistance(line_point1,``                                          ``line_point2,``                                          ``point));``    ``}``}` `// This code is contributed by phasing17`

Output:

`Shortest Distance is : 1.63299`

Time Complexity: O(1)

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up