文章目录
一、直线与直线
1.两直线定义:
P 0 + s d 0 ⃗ P_0+s\vec{d_0} P0+sd0和 P 1 + t d 1 ⃗ P_1+t\vec{d_1} P1+td1
2.定义一种二维叉积运算:
K
R
(
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
)
=
x
0
y
1
−
x
1
y
0
KR((x_0,y_0),(x_1,y_1))=x_0y_1-x_1y_0
KR((x0,y0),(x1,y1))=x0y1−x1y0
该运算与三维相关,
(
x
0
,
y
0
,
0
)
×
(
x
1
,
y
1
,
0
)
=
(
0
,
0
,
K
R
(
(
x
0
,
y
0
)
,
(
x
1
,
y
1
)
)
)
(x_0,y_0,0)\times (x_1,y_1,0)=(0,0,KR((x_0,y_0),(x_1,y_1)))
(x0,y0,0)×(x1,y1,0)=(0,0,KR((x0,y0),(x1,y1))),
具有交换性:
K
R
(
u
⃗
,
v
⃗
)
=
−
K
R
(
v
⃗
,
u
⃗
)
KR(\vec{u},\vec{v})=-KR(\vec{v},\vec{u})
KR(u,v)=−KR(v,u)
3.交点存在判断
使用KC可以判断两直线是否平行,
K
R
(
u
⃗
,
v
⃗
)
=
=
0
KR(\vec{u},\vec{v})==0
KR(u,v)==0则说明两直线是平行(叉积性质),当然得可以考虑数值计算公差问题,一般
∣
∣
K
R
(
u
⃗
,
v
⃗
)
∣
∣
≤
ε
||KR(\vec{u},\vec{v})|| \le\varepsilon
∣∣KR(u,v)∣∣≤ε,我们就认为两直线是平行的没有交点。但这是一种绝对误差的检查平行方法,
K
R
(
u
⃗
,
v
⃗
)
KR(\vec{u},\vec{v})
KR(u,v)的值与向量的取值有很大关系,因此,一般用正弦值做平行检测,即:
∣
∣
K
R
(
u
⃗
,
v
⃗
)
∣
∣
/
(
∥
u
⃗
∥
∥
v
⃗
∥
)
=
∣
sin
θ
∣
≤
ε
||KR(\vec{u},\vec{v})||/(\left \| \vec{u} \right \|\left \| \vec{v} \right \|)=|\sin\theta|\le\varepsilon
∣∣KR(u,v)∣∣/(∥u∥∥v∥)=∣sinθ∣≤ε。
最后,为避免除法和平方根计算(这两种运算计算耗时长),我们可以使用下式做平行检查判断:
∣
∣
K
R
(
u
⃗
,
v
⃗
)
∣
∣
2
≤
∥
u
⃗
∥
2
∥
v
⃗
∥
2
∣
ε
2
||KR(\vec{u},\vec{v})||^2\le\left \| \vec{u} \right \|^2\left \| \vec{v} \right \|^2|\varepsilon^2
∣∣KR(u,v)∣∣2≤∥u∥2∥v∥2∣ε2
满足该条件则说明两直线平行没有交点。
4.交点计算公式
分别求出s和t后,就可以得到其交点。联立两个方程可得:
s
d
0
⃗
−
t
d
1
⃗
=
P
1
−
P
0
s\vec{d_0}-t\vec{d_1}=P_1-P_0
sd0−td1=P1−P0
令
Δ
=
P
1
−
P
0
\Delta=P_1-P_0
Δ=P1−P0,由克莱姆定理则
s
=
K
R
(
Δ
,
d
1
⃗
)
/
K
R
(
d
0
⃗
,
d
1
⃗
)
,
t
=
K
R
(
Δ
,
d
0
⃗
)
/
K
R
(
d
0
⃗
,
d
1
⃗
)
s=KR(\Delta,\vec{d_1})/KR(\vec{d_0},\vec{d_1}),t=KR(\Delta,\vec{d_0})/KR(\vec{d_0},\vec{d_1})
s=KR(Δ,d1)/KR(d0,d1),t=KR(Δ,d0)/KR(d0,d1)
二、直线与射线
1.方程 直线 P 0 + s d 0 ⃗ , s ∈ R P_0+s\vec{d_0},s\in R P0+sd0,s∈R和射线 P 1 + t d 1 ⃗ , t ∈ [ 0 , + ∞ ] P_1+t\vec{d_1},t\in[0,+\infty ] P1+td1,t∈[0,+∞]
2.平行判断,这里同1.3一样做平行判断
3.交点计算
同1.4,求出t,判断t是否在定义域 t ∈ [ 0 , + ∞ ] t\in[0,+\infty ] t∈[0,+∞],t在定义域内时,两者相交,交点同1.4。