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)
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}y2−y1y−y1=X2−X1X−X1
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} =ty4−y3y−y3=X4−X3X−X3=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=( y4−y3)∗t+y3X=( X4−X3)∗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}y2−y1( y4−y3)∗t+( y3−y1)=X2−X1( X4−X3)∗t+( X3−X1)
令
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=y4−y3,a2=y3−y1,a3=y2−y1b1=X4−X3,b2=X3−X1,b3=X2−X1
可得
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=a1b3−a3b1a3b2−a2b3
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)
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}=ty2−y1y−y1=X2−X1X−X1=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=( X2−X1)∗t+X1y=( y2−y1)∗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)}( y2−y1)∗t+y1=k (( x2−X1)∗t+X1)+bt=( y2−y1)−k ( x2−X1)( k x1+b−y1)
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)
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}y2−y1y−y1=X2−X1X−X1
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 )=( X2−X1,y2−y1)
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 )=( y1−y2,X2−X1)
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- segundoX−X3=ay−y3=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(y1−y3)+b ( x3−X1)
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)
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=y3−k2X3
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=k1−k2b2−b1
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.