2D几何中:如何判断从圆中心出发的射线是否与另一圆相交?
射线与圆相交的判断方案
已知条件梳理
- 射线:起点为圆O₁的圆心
(X,Y),方向指向点(Xr,Yr);若未指定终点,则从起点出发沿任意方向延伸至距圆心100单位处(本质为起点固定、方向固定的射线,参数范围t≥0)。 - 目标圆O₂:圆心
(a,b),半径c。
判断逻辑推导
- 射线参数方程
将射线用参数t(t≥0,t=0对应起点,t增大沿射线方向延伸)表示:
x = X + t * dx y = Y + t * dy
其中 dx = Xr - X,dy = Yr - Y;若未指定(Xr,Yr),可任选方向(如取dx=100, dy=0,对应沿x轴正方向延伸100单位的射线)。
- 代入圆方程求解
将射线的x、y代入圆O₂的方程(x - a)² + (y - b)² = c²,整理得到关于t的一元二次方程:
A*t² + B*t + C = 0
其中:
A = dx² + dy²B = 2 * [dx*(X - a) + dy*(Y - b)]C = (X - a)² + (Y - b)² - c²
- 根据方程根的情况判断相交性
计算判别式Δ = B² - 4*A*C,结合t≥0的条件分析:
- Δ < 0:方程无实根,射线与圆不相交。
- Δ = 0:方程有唯一实根
t₀ = -B/(2A),若t₀≥0则射线与圆相切(属于相交),否则不相交。 - Δ > 0:方程有两个实根
t₁ ≤ t₂:- 若
t₂ < 0:两个交点均在射线的反方向,不相交。 - 若
t₁ ≤ 0 ≤ t₂:射线起点在圆内/圆上,射线必然穿出圆,相交。 - 若
t₁ ≥ 0:两个交点均在射线上,相交。
- 若
特殊情况处理
- 若射线方向向量为零(即
Xr=X且Yr=Y):射线退化为点,只需判断该点是否在圆O₂内/圆上,即(X - a)² + (Y - b)² ≤ c²。 - 若两圆圆心重合:射线从圆心出发,只要
c>0,必然与圆相交。
代码示例(Python)
import math def ray_intersects_circle(X, Y, Xr, Yr, a, b, c): dx = Xr - X dy = Yr - Y A = dx**2 + dy**2 # 射线退化为点的情况 if A == 0: dist_sq = (X - a)**2 + (Y - b)**2 return dist_sq <= c**2 B = 2 * (dx * (X - a) + dy * (Y - b)) C = (X - a)**2 + (Y - b)**2 - c**2 delta = B**2 - 4 * A * C if delta < 0: return False elif delta == 0: t = -B / (2 * A) return t >= 0 else: sqrt_delta = math.sqrt(delta) t2 = (-B + sqrt_delta) / (2 * A) # 只需判断较大的根是否非负,即可覆盖所有相交情况 return t2 >= 0 # 未指定终点时的调用示例:沿x轴正方向延伸100单位 # ray_intersects_circle(X, Y, X+100, Y, a, b, c)
内容的提问来源于stack exchange,提问作者Casper
相关产品推荐
相关产品推荐

