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

08 Feb, 2021
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<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 VectorsVector 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 vectorsVector 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 vectorsint 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 vectorsVector 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 Vectorostream& 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 linefloat 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 programint 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;}
Shortest Distance is : 1.63299
 
Time Complexity: O(1)
Auxiliary Space: O(1)
ujjwalgoel1103
cpp-class
C++ Programs
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
C++ Program for QuickSort
Shallow Copy and Deep Copy in C++
cin in C++
Passing a function as a parameter in C++
Generics in C++
Closest Pair of Points using Divide and Conquer algorithm
How to check if a given point lies inside or outside a polygon?
How to check if two given line segments intersect?
Find if two rectangles overlap
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)