Lua 射线与线段相交

Lua 射线与线段相交,lua,intersection,segment,Lua,Intersection,Segment,我在光线与线段相交时遇到问题。我用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 );

我在光线与线段相交时遇到问题。我用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;
}
bool光线分段相交(常数向量2&o、常数向量2&d、常数向量2&a、常数向量2&b)
{
vec2正交(-d.y,d.x);
vec2-aToO(o-a);
vec2-aToB(b-a);
浮点数=点(aToB,正交);
//这里是查看denom是否为零的好时机,在这种情况下,线段和
//光线平行。
//这个叉积的长度也可以写成aToB.x*aToO.y-aToO.x*aToB.y。
float t1=长度(交叉(aToB,aToO))/denom;
浮点t2=点(原子,正交)/denom;
返回t2>=0&&t2=0;
}

但是,我不确定作者所说的长度是什么意思,因为注释只是定义了叉积,没有定义函数长度

我的实现是类似的,但是因为我不知道他所说的长度是什么意思,所以我只是简单地取叉积。问题是线段似乎被视为光线,因为我得到的交点不应该是可能的,除非我与光线相交。例如,一条直线穿过一个矩形中心的光线报告了它不应该穿过的其他矩形的交点(我现在循环穿过直线)

是否有更好的方法来解决这个问题,或者缺失的长度函数是否可以解决这个问题

以下是我预期会发生的事情以及我认为正在发生的事情的粗略描述:


几年前,我在我的简单绘图项目中使用了这个。我找到了这个算法,并根据我的需要进行了调整。我希望它能对你有所帮助

            public virtual bool IsPointInPolygon(PointF[] polygon, PointF point)
            {
                bool isInside = false;
                for (int i = 0, j = polygon.Length - 1; i < polygon.Length; j = i++)
                {
                    if (((polygon[i].Y > point.Y) != (polygon[j].Y > point.Y)) &&
                    (point.X < (polygon[j].X - polygon[i].X) * (point.Y - polygon[i].Y) / (polygon[j].Y - polygon[i].Y) + polygon[i].X))
                    {
                        isInside = !isInside;
                    }
                }
                return isInside;
            }
公共虚拟对象IsPointInPolygon(PointF[]多边形,PointF点)
{
bool-isInside=false;
对于(inti=0,j=polygon.Length-1;i点.Y)!=(多边形[j].Y>点.Y))&&
(点.X<(多边形[j].X-多边形[i].X)*(点.Y-多边形[i].Y)/(多边形[j].Y-多边形[i].Y)+多边形[i].X))
{
isInside=!isInside;
}
}
返回isInside;
}

这就是我认为的源代码-

事实证明,问题不在于算法,而在于我代码中其他地方的错误。我花了一段时间才弄明白,但一旦我弄明白了,算法就完美地工作了