Cálculo de coordenadas verticales de punto a línea.

        Supongamos que las coordenadas de un punto O en el espacio son (Xo, Yo, Zo), y las coordenadas de dos puntos A y B en una línea recta en el espacio son (X1, Y1, Z1), (X2, Y2, Z2) Sea el punto O en El pie vertical de la recta AB es el punto N, y sus coordenadas son (Xn, Yn, Zn). El proceso de cálculo de las coordenadas del punto N es el siguiente:

Primero encuentre los siguientes vectores:

Insertar descripción de la imagen aquí

De la relación vertical de los vectores, si dos vectores son perpendiculares, entonces el producto escalar (producto escalar, producto vectorial) de los dos vectores es 0, que se puede derivar.

Insertar descripción de la imagen aquí(1)

El punto N está en la recta AB, según el teorema de colinealidad vectorial:

Insertar descripción de la imagen aquí(2)

Se entiende por k la proporción de la distancia entre el punto del pie vertical y el punto de partida, que es un coeficiente proporcional.

 De (2) obtenemos

Insertar descripción de la imagen aquí(3)

 Sustituyendo la fórmula (3) en la fórmula (1), solo hay un número desconocido k en la fórmula, organícelo y simplifique para resolver k:

Insertar descripción de la imagen aquí

Sustituya la ecuación (4) en la ecuación (3) para obtener las coordenadas del pie vertical N.

Así es como se implementa en C:

// 二维空间点到直线的垂足
struct Point
{
  double x,y;
}
Point GetFootOfPerpendicular(
	const Point &pt,     // 直线外一点
	const Point &begin,  // 直线开始点
	const Point &end)   // 直线结束点
{
	Point retVal;
 
	double dx = begin.x - end.x;
	double dy = begin.y - end.y;
	if(abs(dx) < 0.00000001 && abs(dy) < 0.00000001 )
	{
		retVal = begin;
		return retVal;
	}
 
	double u = (pt.x - begin.x)*(begin.x - end.x) +
		(pt.y - begin.y)*(begin.y - end.y);
	u = u/((dx*dx)+(dy*dy));
 
	retVal.x = begin.x + u*dx;
	retVal.y = begin.y + u*dy;
 
	return retVal;
}
// 三维空间点到直线的垂足
struct Point
{
  double x,y,z;
}
Point GetFootOfPerpendicular(
	const Point &pt,     // 直线外一点
	const Point &begin,  // 直线开始点
	const Point &end)   // 直线结束点
{
	Point retVal;
 
	double dx = begin.x - end.x;
	double dy = begin.y - end.y;
  double dz = begin.z - end.z;
	if(abs(dx) < 0.00000001 && abs(dy) < 0.00000001 && abs(dz) < 0.00000001 )
	{
		retVal = begin;
		return retVal;
	}
 
	double u = (pt.x - begin.x)*(begin.x - end.x) +
		(pt.y - begin.y)*(begin.y - end.y) + (pt.z - begin.z)*(begin.z - end.z);
	u = u/((dx*dx)+(dy*dy)+(dz*dz));
 
	retVal.x = begin.x + u*dx;
	retVal.y = begin.y + u*dy;
  retVal.y = begin.z + u*dz;
  
	return retVal;
}

Supongo que te gusta

Origin blog.csdn.net/qq_34761779/article/details/129464738
Recomendado
Clasificación