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

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 5Input: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<bits/stdc++.h>` `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)