You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2D几何中:如何判断从圆中心出发的射线是否与另一圆相交?

射线与圆相交的判断方案

已知条件梳理

  • 射线:起点为圆O₁的圆心 (X,Y),方向指向点 (Xr,Yr);若未指定终点,则从起点出发沿任意方向延伸至距圆心100单位处(本质为起点固定、方向固定的射线,参数范围 t≥0)。
  • 目标圆O₂:圆心 (a,b),半径 c。

判断逻辑推导

  1. 射线参数方程
    将射线用参数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单位的射线)。

  1. 代入圆方程求解
    将射线的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²
  1. 根据方程根的情况判断相交性
    计算判别式 Δ = 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:22:50