Distancia más corta entre una línea y un punto en un plano 3D

Dada una línea que pasa por dos puntos A y B y un punto C arbitrario en un plano tridimensional, la tarea es encontrar la distancia más corta entre el punto C y la línea que pasa por los puntos A y B.
Ejemplos: 

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

Considere un punto C y una línea que pasa por A y B como se muestra en la siguiente figura.  

Ahora considere los vectores AB y AC y la distancia más corta como CD. La distancia más corta es siempre la distancia perpendicular. El punto D se toma sobre AB tal que CD es perpendicular a AB. 

Construya BP y CP como se muestra en la figura para formar un paralelogramo. Ahora C es un vértice del paralelogramo ABPC y CD es perpendicular al Lado AB. Por lo tanto, CD es la altura del paralelogramo.

Nota: En el caso de que D no caiga sobre el segmento de línea AB habrá un punto D’ tal que PD’ sea perpendicular a AB y D’ esté sobre el segmento de línea AB con CD = PD’.
La magnitud del producto vectorial AB y AC da el área del paralelogramo. Además, el área de un paralelogramo es Base * Altura = AB * CD . Asi que, 

CD = |ABxAC| / |AB|

A continuación se muestra el programa CPP para encontrar la distancia más corta:  

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;
}
Producción: 

Shortest Distance is : 1.63299

 

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por KartikArora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *