一、点、面问题
1.已知点和任意平面,求投影点坐标
1.1 问题描述
已知,点
P
(
x
0
,
y
0
,
z
0
)
P(x_0 , y_0,z_0)
P(x0,y0,z0) , 任意平面
Γ
\Gamma
Γ一般方程
:
A
x
+
B
y
+
C
z
+
D
=
0
: Ax+By+Cz+D=0
:Ax+By+Cz+D=0 ,求:点
P
P
P在平面
Γ
\Gamma
Γ 上的投影点坐标
P
′
(
x
1
,
y
1
,
z
1
)
P'(x_1 , y_1,z_1)
P′(x1,y1,z1)。
1.2 原理公式推导
因为投影点到已知点与平面垂直,根据垂直约束条件,易知
y
1
=
B
(
x
1
−
x
0
)
A
+
y
0
y_1=\frac{B(x_1-x_0)}{A}+y_0
y1=AB(x1−x0)+y0
z
1
=
C
(
x
1
−
x
0
)
A
+
z
0
z_1=\frac{C(x_1-x_0)}{A}+z_0
z1=AC(x1−x0)+z0
代入平面
Γ
\Gamma
Γ 一般方程,可以解得:
x
1
=
(
B
2
+
C
2
)
x
0
−
A
(
B
y
0
+
C
z
0
+
D
)
A
2
+
B
2
+
C
2
x_1=\frac{(B^2+C^2)x_0-A(By_0+Cz_0+D)}{A^2+B^2+C^2}
x1=A2+B2+C2(B2+C2)x0−A(By0+Cz0+D)
将上式代回垂直约束条件的两个公式可得:
y
1
=
(
A
2
+
C
2
)
y
0
−
B
(
A
x
0
+
C
z
0
+
D
)
A
2
+
B
2
+
C
2
y_1=\frac{(A^2+C^2)y_0-B(Ax_0+Cz_0+D)}{A^2+B^2+C^2}
y1=A2+B2+C2(A2+C2)y0−B(Ax0+Cz0+D)
z
1
=
(
A
2
+
B
2
)
z
0
−
C
(
A
x
0
+
B
y
0
+
D
)
A
2
+
B
2
+
C
2
z_1=\frac{(A^2+B^2)z_0-C(Ax_0+By_0+D)}{A^2+B^2+C^2}
z1=A2+B2+C2(A2+B2)z0−C(Ax0+By0+D)
由此解得空间三维点到平面的投影点坐标 P ′ ( x 1 , y 1 , z 1 ) P'(x_1 , y_1,z_1) P′(x1,y1,z1)。
1.3 代码实现
//拟合平面的系数 AX+BY+CZ+D=0; 其中A,B,C,是法向量
double A = coefficients->values[0];
double B = coefficients->values[1];
double C = coefficients->values[2];
double D = coefficients->values[3];
//平面外一点 x0 y0 z0
double x0 = cloud->points[i].x;
double y0 = cloud->points[i].y;
double z0 = cloud->points[i].z;
//平面上一点 x1 y1 z1
double x1 = ((B * B + C * C) * x0 - A * (B * y0 + C * z0 + D)) / (A * A + B * B + C * C);
double y1 = ((A * A + C * C) * y0 - B * (A * x0 + C * z0 + D)) / (A * A + B * B + C * C);
double z1 = ((A * A + B * B) * z0 - C * (A * x0 + B * y0 + D)) / (A * A + B * B + C * C);
二、点、线问题
1.已知点和任意直线(点法式),求投影点坐标
1.1 问题描述
已知,点
P
(
x
0
,
y
0
,
z
0
)
P(x_0 , y_0,z_0)
P(x0,y0,z0) , 任意直线 L 点法式方程
:
x
−
a
d
=
y
−
b
e
=
z
−
c
f
:\frac{x-a}{d}=\frac{y-b}{e}=\frac{z-c}{f}
:dx−a=ey−b=fz−c ,求:点
P
P
P在直线L 上的投影点坐标
P
′
(
x
1
,
y
1
,
z
1
)
P'(x_1 , y_1,z_1)
P′(x1,y1,z1)。
1.2 原理公式推导
直线L的参数方程为:
t
=
x
−
a
d
=
y
−
b
e
=
z
−
c
f
t=\frac{x-a}{d}=\frac{y-b}{e}=\frac{z-c}{f}
t=dx−a=ey−b=fz−c
投影点坐标
P
′
(
x
1
,
y
1
,
z
1
)
P'(x_1 , y_1,z_1)
P′(x1,y1,z1)为:
x
1
=
d
t
+
a
x_1=dt+a
x1=dt+a
y
1
=
e
t
+
b
y_1=et+b
y1=et+b
z
1
=
f
t
+
c
z_1=ft+c
z1=ft+c
1.3 代码实现
2.已知点和任意直线(斜截式),求投影点坐标
2.1 问题描述
已知,点
P
(
x
0
,
y
0
,
z
0
)
P(x_0 , y_0,z_0)
P(x0,y0,z0) , 任意直线 L 点法式方程
:
x
−
a
d
=
y
−
b
e
=
z
−
c
f
:\frac{x-a}{d}=\frac{y-b}{e}=\frac{z-c}{f}
:dx−a=ey−b=fz−c ,求:点
P
P
P在直线L 上的投影点坐标
P
′
(
x
1
,
y
1
,
z
1
)
P'(x_1 , y_1,z_1)
P′(x1,y1,z1)。
2.2 原理公式推导
直线L的参数方程为:
t
=
x
−
a
d
=
y
−
b
e
=
z
−
c
f
t=\frac{x-a}{d}=\frac{y-b}{e}=\frac{z-c}{f}
t=dx−a=ey−b=fz−c
投影点坐标
P
′
(
x
1
,
y
1
,
z
1
)
P'(x_1 , y_1,z_1)
P′(x1,y1,z1)为:
x
1
=
d
t
+
a
x_1=dt+a
x1=dt+a
y
1
=
e
t
+
b
y_1=et+b
y1=et+b
z
1
=
f
t
+
c
z_1=ft+c
z1=ft+c
2.3 代码实现
三、线、面问题
1.已知任意直线和任意平面,求交点坐标
1.1 问题描述
已知, 任意直线 L上一点 A ( x a , y a , z a ) A(x_a , y_a,z_a) A(xa,ya,za),其方向向量为 s ⃗ ( d , e , f ) \vec s (d , e,f) s(d,e,f) 。任意平面 Γ \Gamma Γ上的一点 B ( x b , y b , z b ) B(x_b , y_b,z_b) B(xb,yb,zb),其法向量为 n ⃗ ( i , j , k ) \vec n (i, j,k) n(i,j,k)求:直线 L在平面 Γ \Gamma Γ上的交点坐标 C ( x c , y c , z c ) C(x_c , y_c,z_c) C(xc,yc,zc)。
1.2 原理公式推导
参数 t 为:
t
=
(
x
b
−
x
a
)
∗
i
+
(
y
b
−
y
a
)
∗
j
+
(
z
b
−
z
a
)
∗
k
i
∗
d
+
j
∗
e
+
k
∗
f
t=\frac{(x_b-x_a)*i+(y_b-y_a)*j+(z_b-z_a)*k}{i * d + j*e +k*f}
t=i∗d+j∗e+k∗f(xb−xa)∗i+(yb−ya)∗j+(zb−za)∗k
交点坐标
C
(
x
c
,
y
c
,
z
c
)
C(x_c , y_c,z_c)
C(xc,yc,zc)为:
x
c
=
d
t
+
x
a
x_c=dt+x_a
xc=dt+xa
y
c
=
e
t
+
y
b
y_c=et+y_b
yc=et+yb
z
c
=
f
t
+
z
c
z_c=ft+z_c
zc=ft+zc
1.3 代码实现
//保证 (i* d+ j* e+ k* f) 不为 0 ,即直线与平面不平行,一定相交
if( (i* d+ j* e+ k* f) == 0 )
{
cout << "平面平行于直线,不存在交点" <<endl;
}
double t = (( xb-xa )*i+(yb-ya)*j+(zb-za)*k)/(i* d+ j* e+ k* f);
double xc=xa+dt;
double yc=ya+et;
double zc=za+ft;
//交点坐标 (x_c,y_c,z_c)