二维平面内边与边相交情况

二维平面内边与边相交情况讨论

要判断边是否相交,首先需要讨论边的包围盒是否相交,如果包围盒不相交,边一点不相交,如果边的包围盒相交,则边有可能相交。以下讨论基于边的包围盒已经相交。

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=y2y1yy1=x2x1xx1=mCDCE=y4y3yy3=x4x3xx3=n
如果E在AB上,则
0 ≤ m ≤ 1 0\leq m \leq 1 0m1
同理:如果E在CD上,则:
0 ≤ n ≤ 1 0\leq n \leq 1 0n1
连理①,②可知
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=(y4y3)(x2x1)(y2y1)(x4x3)(x2y1x1y2)(x4x3)(x4y3x3y4)(x2x1)y=(y4y3)(x2x1)(y2y1)(x4x3)(x2y1x1y2)(y4y3)(x4y3x3y4)(y2y1)
如果
( 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 (y4y3)(x2x1)(y2y1)(x4x3)=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=y4y3(yy3)(x4x3)+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=x4x3(xx3)(y4y3)+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=(CDAM)/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=(CDBN)/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=r2dis2
根据向量运算可知
P A ⃗ = − a ⃗ ∗ ∣ A P ∣ P B ⃗ = a ⃗ ∗ ∣ B P ∣ \vec{PA} = -\vec{a}*|AP| \\ \vec{PB} = \vec{a}*|BP| PA =a APPB =a BP
所以
A = P + P A ⃗ B = P + P B ⃗ A= P+\vec{PA} \\ B=P+\vec{PB} A=P+PA B=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+O1A B=O1+O1B

解毕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值