C ++ se da cuenta de encontrar el punto de intersección de dos líneas rectas y encontrar el pie vertical en un punto fuera de la línea recta conocida

Se conocen dos puntos en la línea conocida o la pendiente y la intersección de la línea conocida para encontrar el punto de intersección y el pie vertical.
Los dos casos provienen del hecho de que en la solución real, se pueden encontrar dos puntos en el límite para enumerar la ecuación de una línea recta, o se puede usar un método más preciso para obtener múltiples puntos que se ajusten a una línea recta.

1. Encuentra el punto de intersección de dos líneas rectas (fórmula de dos puntos)

inserte la descripción de la imagen aquí

La ecuación de la recta L1 es:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 \frac{y - y_1}{y_2 - y_1} = \frac{x - x_1}{x_2 -x_1}y2y1yy1=X2X1XX1
La ecuación de la recta L2 es:
y − y 3 y 4 − y 3 = x − x 3 x 4 − x 3 = t \frac{y - y_3}{y_4 - y_3} =\frac{x - x_3} {x_4 - x_3} =ty4y3yy3=X4X3XX3=t
可得:
y = ( y 4 − y 3 ) ∗ t + y 3 x = ( x 4 − x 3 ) ∗ t + x 3 y = (y_4 -y_3)*t+y_3\\ x = (x_4 - x_3)*t+x_3y=( y4y3)t+y3X=( X4X3)t+X3
Sustituye la ecuación x, y anterior en la ecuación de la línea recta L1:
( y 4 − y 3 ) ∗ t + ( y 3 − y 1 ) y 2 − y 1 = ( x 4 − x 3 ) ∗ t + ( x 3 − x 1 ) x 2 − x 1 \frac{(y_4 - y_3)*t+(y_3-y_1)}{y_2 - y_1} =\frac{(x_4 - x_3)*t+(x_3-x_1)}{ x_2 - x_1}y2y1( y4y3)t+( y3y1)=X2X1( X4X3)t+( X3X1)

a 1 = y 4 − y 3 , a 2 = y 3 − y 1 , a 3 = y 2 − y 1 b 1 = x 4 − x 3 , b 2 = x 3 − x 1 , b 3 = x 2 − x 1 a_1 = y_4-y_3,a_2 =y_3-y_1,a_3 =y_2-y_1\\ b_1 = x_4-x_3,b_2 =x_3-x_1,b_3 =x_2-x_1 a1=y4y3,a2=y3y1,a3=y2y1b1=X4X3,b2=X3X1,b3=X2X1
可得
a 1 t + a 2 a 3 = segundo 1 t + segundo 2 segundo 3 t = un 3 segundo 2 − un 2 segundo 3 un 1 segundo 3 − un 3 segundo 1 \frac{a_1t+a_2}{a_3} = \frac{b_1t+b_2}{b_3}\\ t = \frac{a_3b_2-a_2b_3}{a_1b_3-a_3b_1}a3a1t+a2=b3b1t+b2t=a1b3a3b1a3b2a2b3
Vuelva a sustituir t en la fórmula x, y original para obtener las coordenadas del punto de intersección.

Implementación en C++:

	Point p1,p2,p3,p4;//对应的四个点,根据实际应用场景赋值
	double a1, a2, a3, b1, b2, b3;
	double t;
	Point pp1, pp2;
	a1 = p4.y - p3.y;
	a2 = p3.y - p1.y;
	a3 = p2.y - p1.y;
	b1 = p4.x - p3.x;
	b2 = p3.x - p1.x;
	b3 = p2.x - p1.x;
	t = (a3 * b2 - a2 * b3) / (a1 * b3 - a3 * b1);
	pp1.x = (p4.x - p3.x) * t + p3.x;
	pp1.y = (p4.y - p3.y) * t + p3.y;

2. Encuentra el punto de intersección de dos líneas rectas (tipo de intersección oblicua)

inserte la descripción de la imagen aquí

La ecuación de la recta L1 es:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 = t \frac{y - y_1}{y_2 - y_1} = \frac{x - x_1} {x_2 - x_1}=ty2y1yy1=X2X1XX1=La ecuación de la línea t
L2 es
y = kx + by=kx+by=k x+b
se puede obtener de la ecuación de L1:
x = ( x 2 − x 1 ) ∗ t + x 1 y = ( y 2 − y 1 ) ∗ t + y 1 x = (x_2-x_1)*t+x_1\ \ y = (y_2-y_1)*t+y_1X=( X2X1)t+X1y=( y2y1)t+y1
代入L2的方程可得:
( y 2 − y 1 ) ∗ t + y 1 = k ( ( x 2 − x 1 ) ∗ t + x 1 ) + bt = ( kx 1 + b − y 1 ) ( y 2 − y 1 ) − k ( x 2 − x 1 ) (y_2-y_1)*t+y_1=k((x_2-x_1)*t+x_1)+b\\ t=\frac{(kx_1+b-y_1 )}{(y_2 - y_1)-k(x_2-x_1)}( y2y1)t+y1=k (( x2X1)t+X1)+bt=( y2y1)k ( x2X1)( k x1+by1)
Vuelva a sustituir t en la fórmula x, y original para obtener las coordenadas del punto de intersección.

Implementación en C++:

	Point p1,p2;//对应的两个点,根据实际应用场景赋值
	vector<Point> points;//用来拟合直线的点
	Vec4f line;
	fitLine(points, line, DIST_L2, 0, 0.01, 0.01);//拟合得到直线,具体求解根据实际情况
	double cos_theta = line[0];
	double sin_theta = line[1];
	double x0 = line[2], y0 = line[3];
	double k = sin_theta / cos_theta;
	double b = y0 - k * x0;
	t = (k * p1.x + b - p1.y) / (p2.y - p1.y - k * (p2.x - p1.x));
	Point pp1;
	pp1.x = (p2.x - p1.x) * t + p1.x;
	pp1.y = (p2.y - p1.y) * t + p1.y;

3. Pregunta por el pie vertical (estilo de dos puntos)

inserte la descripción de la imagen aquí

La ecuación de la recta L es:
y − y 1 y 2 − y 1 = x − x 1 x 2 − x 1 \frac{y - y_1}{y_2 - y_1} = \frac{x - x_1}{x_2 -x_1}y2y1yy1=X2X1XX1
El vector director de L es:
( a , b ) = ( x 2 − x 1 , y 2 − y 1 ) (a,b) = (x_2-x_1,y_2-y_1)( un ,segundo )=( X2X1,y2y1)
entonces el vector director de la recta vertical perpendicular a L es:
( − b , a ) = ( y 1 − y 2 , x 2 − x 1 ) (-b,a) = (y_1-y_2,x_2-x_1)( - segundo ,un )=( y1y2,X2X1)
que pasa por el punto (x3,y3) es:
x − x 3 − b = y − y 3 a = t \frac{x-x_3}{-b} = \frac{y-y_3} {a} = t- segundoXX3=ayy3=t
可得
x = − bt + x 3 y = at + y 3 x = -bt+x_3\\ y=at+y_3X=- segundo _+X3y=una t+y3
Sustituyendo en la ecuación de la línea recta L se puede encontrar t:
t = a ( y 1 − y 3 ) + b ( x 3 − x 1 ) a 2 + b 2 t = \frac{a(y_1 - y_3)+b (x_3-x_1)}{a^2 + b^2}t=a2+b2a(y1y3)+b ( x3X1)
Reemplazando t en la fórmula original x, y se puede obtener el pie.

Implementación en C++:

	Point p1,p2;//对应的两个点,根据实际应用场景赋值	
	int a = p2.x - p1.x;
	int b = p2.y - p1.y;
	double t = (a * (p1.y - p3.y) + b * (p3.x - p1.x));
	t = t / (a * a + b * b);//分两步计算,直接一步实现会由于精度问题导致结果出错
	Point p;
	p.x = -b * t + p3.x;
	p.y = a * t + p3.y;

4. Encuentra el pie vertical (tipo de intercepción oblicua)

inserte la descripción de la imagen aquí

La ecuación de la recta L es:
y = k 1 x + b 1 y=k_1x+b_1y=k1X+b1
Supongamos que la ecuación de la recta vertical es:
y = k 2 x + b 2 y=k_2x+b_2y=k2X+b2
Las pendientes de dos rectas perpendiculares entre sí cumplen la siguiente relación (si la pendiente no existe, debes encontrarla por separado):
k 2 = − 1 k 1 k_2 = -\frac{1}{k_1}k2=k11
De (x3,y3) en la línea vertical,
b 2 = y 3 − k 2 x 3 b_2 = y_3-k_2x_3b2=y3k2X3
Ecuaciones simultáneas
y = k 1 x + b 1 y = k 2 x + b 2 y = k_1x+b_1\\ y = k_2x+b_2y=k1X+b1y=k2X+b2
Obtener
x = segundo 2 − segundo 1 k 1 − k 2 x=\frac{b_2-b_1}{k_1-k_2}X=k1k2b2b1
Sustituye x en cualquiera de las ecuaciones lineales anteriores para obtener y, es decir, para obtener el pie (x, y).

Implementación en C++:

	Point p3;//直线外一点
    vector<Point> points;//用来拟合直线的点
	Vec4f pline;
	fitLine(points, pline, DIST_L2, 0, 0.01, 0.01);
	cos_theta = pline[0];
	sin_theta = pline[1];
	x0 = pline[2], y0 = pline[3];
	double k1 = sin_theta / cos_theta;
	double b1 = y0 - k1 * x0;
	double b2 = 0;
	double k2 = -1 / k1;
	b2 = p3.y - k2 * p3.x ;
	pp1.x = (b2 - b1) / (k1 - k2);
	pp1.y = k2 * pp1.x + b2;

5. La pendiente no existe

Si la línea es horizontal, es decir, la ecuación de la línea es y=c, entonces la y del pie vertical que se encuentra en un punto fuera de la línea es c, y la x es la misma que la x en un punto fuera de la línea. línea. La vertical es la misma, así que no entraré en detalles.

Supongo que te gusta

Origin blog.csdn.net/Lianhaiyan_zero/article/details/130582747
Recomendado
Clasificación