我遇到了射线与线段相交的问题。我的编程语言是Lua,但任何语言的示例都会很有用。
这个星期大部分时间我都在寻找算法或现有函数来参考,前几天我找到了这个:
这个星期大部分时间我都在寻找算法或现有函数来参考,前几天我找到了这个:
bool RayLineSegmentIntersection( const vec2 &o, const vec2 &d, const vec2 &a, const vec2 &b )
{
vec2 ortho( -d.y, d.x );
vec2 aToO( o - a );
vec2 aToB( b - a );
float denom = dot( aToB, ortho );
// Here would be a good time to see if denom is zero in which case the line segment and
// the ray are parallel.
// The length of this cross product can also be written as aToB.x * aToO.y - aToO.x * aToB.y.
float t1 = length( cross( aToB, aToO ) ) / denom;
float t2 = dot( aToO, ortho ) / denom;
return t2 >= 0 && t2 <= 1 && t1 >= 0;
}
然而,我不确定作者在这里所说的长度是什么意思,因为评论只是定义了叉积,并没有定义长度函数。
我的实现方式类似,但由于我不知道他所说的长度是什么意思,所以我只是在那里进行叉积运算。问题是,线段似乎被视为射线,因为我得到了不应该出现的交点,除非我正在相交射线。例如,一条穿过矩形中心的射线会报告通过其他矩形(我现在循环遍历线)的交点,它不应该与之相交。
有更好的方法来解决这个问题吗?或者缺失的长度函数是否可以解决这个问题?
这是我期望发生的事情和我认为正在发生的事情的粗略图示: