【问题标题】:Ray to Line Segment Intersection射线到线段的交点
【发布时间】: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;
}

Source

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

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

有没有更好的方法来解决这个问题,或者上面缺少的长度函数可以解决这个问题吗?

这是我预期会发生的事情的粗略图,以及我认为正在发生的事情:

Drawing

【问题讨论】:

    标签: lua intersection segment


    【解决方案1】:

    几年前,我在我的简单drawig 项目中使用了这个。我已经找到了这个算法并根据我的需要进行了调整。我希望它能以某种方式帮助你。

                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;
                }
    

    这是我认为的来源 - http://alienryderflex.com/polygon/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-07-03
        • 2014-07-27
        • 1970-01-01
        • 2016-12-22
        • 2015-03-25
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多