二维平面内边与边相交情况讨论
要判断边是否相交,首先需要讨论边的包围盒是否相交,如果包围盒不相交,边一点不相交,如果边的包围盒相交,则边有可能相交。以下讨论基于边的包围盒已经相交。
1.直边与直边
1.1 直边与直边求交方法:
a. 直接计算:求解两直线的方程,连理方程组求解,然后判断交点是否在两条直线上。
设:l1:AB 起点 A(x1,y1),终点B(x2,y2);
l2:CD 起点C(x3,y3),终点D(x4,y4);
如果AB与CD有交点,交点为E(x,y);
当l1与l2不平行于坐标轴时,则满足
{
A
E
A
B
=
y
−
y
1
y
2
−
y
1
=
x
−
x
1
x
2
−
x
1
=
m
①
C
E
C
D
=
y
−
y
3
y
4
−
y
3
=
x
−
x
3
x
4
−
x
3
=
n
②
\begin{cases} \frac{AE}{AB}=\frac{y-y1}{y2-y1}=\frac{x-x1}{x2-x1} = m\quad①\\[2ex] \frac{CE}{CD}=\frac{y-y3}{y4-y3}=\frac{x-x3}{x4-x3} = n\quad② \\[2ex] \end{cases}
⎩
⎨
⎧ABAE=y2−y1y−y1=x2−x1x−x1=m①CDCE=y4−y3y−y3=x4−x3x−x3=n②
如果E在AB上,则
0
≤
m
≤
1
0\leq m \leq 1
0≤m≤1
同理:如果E在CD上,则:
0
≤
n
≤
1
0\leq n \leq 1
0≤n≤1
连理①,②可知
x
=
(
x
2
y
1
−
x
1
y
2
)
(
x
4
−
x
3
)
−
(
x
4
y
3
−
x
3
y
4
)
(
x
2
−
x
1
)
(
y
4
−
y
3
)
(
x
2
−
x
1
)
−
(
y
2
−
y
1
)
(
x
4
−
x
3
)
y
=
(
x
2
y
1
−
x
1
y
2
)
(
y
4
−
y
3
)
−
(
x
4
y
3
−
x
3
y
4
)
(
y
2
−
y
1
)
(
y
4
−
y
3
)
(
x
2
−
x
1
)
−
(
y
2
−
y
1
)
(
x
4
−
x
3
)
x =\frac{(x2y1-x1y2)(x4-x3)-(x4y3-x3y4)(x2-x1)}{(y4-y3)(x2-x1)-(y2-y1)(x4-x3)} \\[2ex] y =\frac{(x2y1-x1y2)(y4-y3)-(x4y3-x3y4)(y2-y1)}{(y4-y3)(x2-x1)-(y2-y1)(x4-x3)}
x=(y4−y3)(x2−x1)−(y2−y1)(x4−x3)(x2y1−x1y2)(x4−x3)−(x4y3−x3y4)(x2−x1)y=(y4−y3)(x2−x1)−(y2−y1)(x4−x3)(x2y1−x1y2)(y4−y3)−(x4y3−x3y4)(y2−y1)
如果
(
y
4
−
y
3
)
(
x
2
−
x
1
)
−
(
y
2
−
y
1
)
(
x
4
−
x
3
)
=
0
(y4-y3)(x2-x1)-(y2-y1)(x4-x3) = 0
(y4−y3)(x2−x1)−(y2−y1)(x4−x3)=0
则表达式无意义,说明交点不存在
否则,带入交点,计算m和n的值,如果满足
m
,
n
∈
[
0
,
1
]
m,n\in[0,1]
m,n∈[0,1]
则交点在线段上。
如果 AB,CD 分别平行于x轴和y轴(假设AB平行于x轴,CD平行于y轴)
交点
P
=
(
x
C
D
,
y
A
B
)
P = (x_{CD},y_{AB})
P=(xCD,yAB)
如果 AB,CD中只有一条线平行于x轴(假设AB平行于x轴,CD不平行于坐标轴)
则交点纵坐标
y
=
y
A
B
③
y=y_{AB}\quad③
y=yAB③
同时②式成立,将③带入②可计算得到x坐标
x
=
(
y
−
y
3
)
(
x
4
−
x
3
)
y
4
−
y
3
+
x
3
x = \frac{(y-y3)(x4-x3)}{y4-y3}+x3
x=y4−y3(y−y3)(x4−x3)+x3
如果 AB,CD中只有一条线平行于y轴(假设AB平行于y轴,CD不平行于坐标轴)
则交点横坐标
x
=
x
A
B
④
x=x_{AB} \quad④
x=xAB④
同时①成立,将④带入①可计算得到y坐标
y
=
(
x
−
x
3
)
(
y
4
−
y
3
)
x
4
−
x
3
+
y
3
y=\frac{(x-x3)(y4-y3)}{x4-x3}+y3
y=x4−x3(x−x3)(y4−y3)+y3
b. 几何求解:
如图:已知AB和CD,求交点O,分别过A和B做CD的垂线,分别交CD于M,N。
在▲ACD中
S
a
c
d
=
(
C
D
∗
A
M
)
/
2
=
(
A
C
⃗
×
A
D
⃗
)
/
2
Sacd=(CD*AM)/2 \\ =(\vec{AC}×\vec{AD})/2
Sacd=(CD∗AM)/2=(AC×AD)/2
所以
A
M
=
(
A
C
⃗
×
A
D
⃗
)
/
C
D
AM =(\vec{AC}×\vec{AD})/CD
AM=(AC×AD)/CD
同理,在▲BCD中
S
b
c
d
=
(
C
D
∗
B
N
)
/
2
=
(
B
C
⃗
×
B
D
⃗
)
/
2
Sbcd=(CD*BN)/2 \\ =(\vec{BC}×\vec{BD})/2
Sbcd=(CD∗BN)/2=(BC×BD)/2
所以
B
N
=
(
B
C
⃗
×
B
D
⃗
)
/
C
D
BN=(\vec{BC}×\vec{BD})/CD
BN=(BC×BD)/CD
在▲AOM和▲BON中,∠AOM=∠BON(对顶角),∠AMO=∠BNO=90°,所以▲AOM与▲BON相似。
所以
A
O
/
B
O
=
A
M
/
B
N
=
(
A
C
⃗
×
A
D
⃗
)
/
(
B
C
⃗
×
B
D
⃗
)
=
k
(
k
为常量
)
AO/BO=AM/BN=(\vec{AC}×\vec{AD})/(\vec{BC}×\vec{BD}) = k(k为常量)
AO/BO=AM/BN=(AC×AD)/(BC×BD)=k(k为常量)
所以
A
B
/
B
O
=
(
A
O
+
B
O
)
/
B
O
=
k
+
1
B
A
⃗
/
B
O
⃗
=
k
+
1
B
O
⃗
=
B
A
⃗
/
(
k
+
1
)
O
=
B
+
B
O
⃗
AB/BO=(AO+BO)/BO=k+1\\ \vec{BA}/\vec{BO}=k+1\\ \vec{BO}=\vec{BA}/(k+1) \\ O=B+\vec{BO}
AB/BO=(AO+BO)/BO=k+1BA/BO=k+1BO=BA/(k+1)O=B+BO
2.弧边与直边
2.1 计算直边与圆弧对应圆心的距离,如果距离大于圆弧所在圆的半径,则直边与弧边不可能相交。
2.2 如果距离小于半径则,圆弧所在的圆与直边所在的直线一定相交,直边与弧边有可能相交。
2.3 当圆弧所在的圆与直边所在的直线相交时,求圆与直线的交点,如果至少有一个交点同时满足在直边和弧边上,则直边与弧边相交。
2.3.1 圆与直线求交方法:
a. 直接计算:计算圆与直线的方程,连理两个方程求解。
b.几何求解:
如图:已知圆心为O(x0,y0)半径为r的圆,以及已知直线上两点M(x1,y1),N(x2,y2)(M,N与A,B同向)。P为圆心在直线上的投影点,求交点A,B。
由MN两点可以得到直线单位向量
a
⃗
=
M
N
⃗
/
∣
M
N
∣
\vec{a} = \vec{MN}/|MN|
a=MN/∣MN∣
P点时圆心O在AB上的投影,已知OA=OB=r,OP为点O到直线AB的距离,记作dis,所以在三角形中
∣
A
P
∣
=
∣
B
P
∣
=
r
2
−
d
i
s
2
|AP|=|BP|=\sqrt{r^2-dis^2}
∣AP∣=∣BP∣=r2−dis2
根据向量运算可知
P
A
⃗
=
−
a
⃗
∗
∣
A
P
∣
P
B
⃗
=
a
⃗
∗
∣
B
P
∣
\vec{PA} = -\vec{a}*|AP| \\ \vec{PB} = \vec{a}*|BP|
PA=−a∗∣AP∣PB=a∗∣BP∣
所以
A
=
P
+
P
A
⃗
B
=
P
+
P
B
⃗
A= P+\vec{PA} \\ B=P+\vec{PB}
A=P+PAB=P+PB
3.弧边与弧边
3.1 计算两圆弧所在圆圆心距,如果圆心距大于两圆半径之和,则两弧边不可能相交。
3.2 如果圆心距小于半径之和,则两圆弧有可能相交。
3.3 计算两圆的交点,如果至少有一个交点同时满足在两弧边之上,则弧边与弧边相交。
3.3.1 计算两圆交点方法
a. 直接计算,连理解方程组
b. 几何方法求解:
如图:已知圆O1和圆O2,半径分别为r1和r2,如图两圆交于AB两点,AB与O1O2交点为P,x为O1A和O1B的夹角。
上图简化为:
由O1和O2可得到方向向量a:
a
⃗
=
O
1
O
2
⃗
/
∣
O
1
O
2
⃗
∣
\vec{a}= \vec{O1O2}/|\vec{O1O2}|
a=O1O2/∣O1O2∣
a向量绕O1旋转x/2 和 -x/2 可以得到O1A,和O1B的单位向量,分别为b和c
b
⃗
=
r
o
t
a
t
e
(
a
⃗
,
x
/
2
)
c
⃗
=
r
o
t
a
t
e
(
a
⃗
,
−
x
/
2
)
\vec{b}=rotate(\vec{a},x/2) \\ \vec{c}=rotate(\vec{a},-x/2)
b=rotate(a,x/2)c=rotate(a,−x/2)
O1A,和O1B向量分别可以用r1和b,c得到。
O
1
A
⃗
=
b
⃗
∗
r
1
O
1
B
⃗
=
c
⃗
∗
r
1
\vec{O1A}=\vec{b}*r1 \\ \vec{O1B}=\vec{c}*r1
O1A=b∗r1O1B=c∗r1
所以A、B两个点的坐标可以由O1加上O1A向量,和O1加上O1B向量得到:
A
=
O
1
+
O
1
A
⃗
B
=
O
1
+
O
1
B
⃗
A=O1+\vec{O1A} \\ B=O1+\vec{O1B}
A=O1+O1AB=O1+O1B
解毕