【发布时间】:2015-05-17 01:44:13
【问题描述】:
我在射线到线段的交叉点上遇到问题。我正在使用 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;
}
但是,我不确定作者所说的长度是什么意思,因为注释只是定义了叉积,并且没有定义函数长度。
我的实现是类似的,但由于我不知道他所说的长度是什么意思,我只是在那里取叉积。问题是线段似乎被视为射线,因为我得到的交叉点是不可能的,除非我与射线相交。例如,一条直线穿过矩形中心的光线报告与其他矩形的交点(我现在循环通过线),它不应该相交。
有没有更好的方法来解决这个问题,或者上面缺少的长度函数可以解决这个问题吗?
这是我预期会发生的事情的粗略图,以及我认为正在发生的事情:
【问题讨论】:
标签: lua intersection segment