线段与射线相交检测代码异常:方向不同结果不符求助
问题原因与修改方案
核心错误:射线方向向量计算错误
你的代码里错误地将射线的终点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
相关产品推荐
相关产品推荐

