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

线段与射线相交检测代码异常:方向不同结果不符求助

问题原因与修改方案

核心错误:射线方向向量计算错误

你的代码里错误地将射线的终点ray[1]当成了方向向量,导致后续垂直向量v3的计算完全偏离了几何意义,这是出现矛盾结果的根本原因。

数学原理梳理

先明确线段与射线的参数方程定义:

  • 线段line:端点为L0(line[0])、L1(line[1]),参数方程为 L(t2) = L0 + t2*(L1-L0),其中t2 ∈ [0,1](t2在0到1之间时,点在线段上)
  • 射线ray:起点为R0(ray[0]),方向向量应为Rd = ray[1] - ray[0](从起点指向终点的向量),参数方程为 R(t1) = R0 + t1*Rd,其中t1 ≥ 0(t1≥0时,点在射线的正向延伸区域)

代码中t1的意义是射线参数方程的参数,t1≥0表示交点在射线的正向区域(从起点出发的方向),t1<0则表示交点在起点的反方向(射线未覆盖的区域)。原代码因为方向向量用错,导致t1的计算完全失去了这个几何意义,才出现视觉上相交但返回false的情况。

修改后的代码

func do_lines_intersect(line: Array[Vector2], ray: Array[Vector2]) -> bool:
    var L0 = line[0]
    var L1 = line[1]
    var R0 = ray[0]
    var Rd = ray[1] - ray[0]  # 正确计算射线的方向向量

    var v1 = R0 - L0
    var v2 = L1 - L0
    var v3 = Vector2(-Rd.y, Rd.x)  # 基于正确的方向向量计算垂直向量

    var dot = v2.dot(v3)
    if abs(dot) < 0.000001:
        return false  # 线段与射线平行,无有效交点

    var t1 = v2.cross(v1) / dot
    var t2 = v1.dot(v3) / dot

    # 同时满足:交点在射线正向,且在线段范围内
    return t1 >= 0.0 and t2 >= 0.0 and t2 <= 1.0

验证测试案例1

修改后重新计算测试案例1:

  • 射线方向向量Rd = (159.0,107.585) - (159.0,132.585) = (0,-25)
  • 垂直向量v3 = (-(-25), 0) = (25, 0)
  • 计算得t1 ≈ 0.0316 ≥ 0,t2 ≈ 0.51 ∈ [0,1],函数返回true,符合视觉相交的预期。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:14:52