文章目录
1.直线与二次曲线交点
1.1 方程
二次曲线:
X
T
A
X
+
B
T
X
+
c
=
0
⋯
(
1
)
X^TAX+B^TX+c = 0\cdots (1)
XTAX+BTX+c=0⋯(1),
直线:
X
(
t
)
=
P
+
t
d
⃗
⋯
(
2
)
X(t) = P+t \vec{d}\cdots(2)
X(t)=P+td⋯(2)
1.2 交点
直接将(2)直接带入(1)可得:
X
(
t
)
T
A
X
(
t
)
+
B
T
X
(
t
)
+
c
=
0
X(t)^TAX(t)+B^TX(t)+c = 0
X(t)TAX(t)+BTX(t)+c=0
=
>
(
d
⃗
T
A
d
⃗
)
t
2
+
d
⃗
T
(
2
A
P
+
B
)
t
+
(
P
T
A
P
+
B
T
+
c
)
=
0
=>(\vec{d}^TA\vec{d})t^2+\vec{d}^T(2AP+B)t+(P^TAP+B^T+c) = 0
=>(dTAd)t2+dT(2AP+B)t+(PTAP+BT+c)=0
=
>
e
2
t
2
+
e
1
t
+
e
0
=
0
=>e_2t^2+e_1t+e_0 = 0
=>e2t2+e1t+e0=0
此时,通过对二次根判别式进行求解,当然如果只是要做根判别计算的话,可以免去平方根计算,提高计算效率。
1.3 关于射线,线段
同理1.2 我们可以在考虑定以域后自行去推理。
2.直线与圆交点计算
2.1方程
Circle:
∥
X
−
C
∥
2
=
r
2
⋯
(
1
)
\left \| X-C\right \|^2=r^2 \cdots(1)
∥X−C∥2=r2⋯(1)
Line :
X
(
t
)
=
P
+
t
d
⃗
⋯
(
2
)
X(t)=P+t \vec{d}\cdots(2)
X(t)=P+td⋯(2)
2.2 交点
将(2) 带入(1) 可得:
∥
d
⃗
∥
2
t
2
+
2
∥
d
⃗
∥
△
⃗
t
+
∥
△
⃗
∥
2
−
r
2
=
0
\left \| \vec{d}\right \|^2t^2+2\left \| \vec{d}\right \| \vec{\bigtriangleup }t+\left \| \vec{\bigtriangleup}\right \|^2-r^2=0
d
2t2+2
d
△t+
△
2−r2=0
其中
△
⃗
=
P
−
C
\vec{\bigtriangleup}=P-C
△=P−C。
可以通过二次求根公式求出交点:
t
=
−
d
⃗
⋅
△
⃗
±
(
d
⃗
⋅
△
⃗
)
2
−
∥
△
⃗
∥
2
(
∥
△
⃗
∥
2
−
r
2
)
∥
d
⃗
∥
2
t= \frac{-\vec{d}\cdot\vec{\bigtriangleup}\pm \sqrt{(\vec{d}\cdot\vec{\bigtriangleup})^2-\left \| \vec{\bigtriangleup}\right \|^2(\left \| \vec{\bigtriangleup}\right \|^2-r^2)}} {\left \|\vec{d}\right \|^2}
t=
d
2−d⋅△±(d⋅△)2−
△
2(
△
2−r2)
令
δ
=
(
d
⃗
⋅
△
⃗
)
2
−
∥
△
⃗
∥
2
(
∥
△
⃗
∥
2
−
r
2
)
\delta =(\vec{d}\cdot\vec{\bigtriangleup})^2-\left \| \vec{\bigtriangleup}\right \|^2(\left \| \vec{\bigtriangleup}\right \|^2-r^2)
δ=(d⋅△)2−
△
2(
△
2−r2)。若
δ
<
0
\delta<0
δ<0,则不相交;若等于0,则有一个交点;若大于0,则有2个交点。
2.3 考虑直线为射线的情况
在我们求出t值后,需要做t>0判断即可。
2.4 考虑直线为线段情况
线段方程: P 0 + t d ⃗ = 0 , d ⃗ = P 1 − P 0 P_0+t\vec{d}=0,\vec{d}=P_1-P_0 P0+td=0,d=P1−P0,判断 t ∈ [ 0 , 1 ] t\in[0,1] t∈[0,1]
2.5 考虑圆为圆弧的case
若有交点K,弧线AB应与K在直线AB的同一侧,如下:
判断依据为:
K
R
(
K
−
A
,
B
−
A
)
≥
0
KR(K-A,B-A)\ge0
KR(K−A,B−A)≥0,KR定义参照。