如何检查线段与从水平角度的点发出的线光线之间的交点?

Paa*_*pan 16 graphics geometry

给定线段,即两个点(x1,y1)和(x2,y2),一个点P(x,y)和角度θ.我们如何找到这条线段和从水平方向θ角度θ发出的线光线是否相交?如果它们相交,如何找到交点?

Gar*_*ees 22

让我们标记点q =(x1,y1)和q + s =(x2,y2).因此s =(x2 - x1,y2 - y1).然后问题看起来像这样:

r =(cosθ,sinθ).然后通过对射线的任何点p可表示为p + - [R (为一个标量参数0≤ )和该线段上的任何点可表示为q + Ü 小号(为≤一个标量参数0 Ü ≤1).

如果我们能找到tu使得p + t r = q + u s,则两条线相交:

请参阅此答案以了解如何找到这一点(或确定没有这一点).

然后,如果0≤t且0≤u≤1,则线段与光线相交.


ezo*_*tko 7

以下是其他答案中给出的算法的C#代码:

    /// <summary>
    /// Returns the distance from the ray origin to the intersection point or null if there is no intersection.
    /// </summary>
    public double? GetRayToLineSegmentIntersection(Point rayOrigin, Vector rayDirection, Point point1, Point point2)
    {
        var v1 = rayOrigin - point1;
        var v2 = point2 - point1;
        var v3 = new Vector(-rayDirection.Y, rayDirection.X);


        var dot = v2 * v3;
        if (Math.Abs(dot) < 0.000001)
            return null;

        var t1 = Vector.CrossProduct(v2, v1) / dot;
        var t2 = (v1 * v3) / dot;

        if (t1 >= 0.0 && (t2 >= 0.0 && t2 <= 1.0))
            return t1;

        return null;
    }
Run Code Online (Sandbox Code Playgroud)

  • @ezolotko 不幸的是,这仍然不够。在这种情况下,如果射线原点和线段端点共线,它们可以相交(另请注意,射线原点实际上可能在线段内部)。解决计算几何中的特殊情况很有趣:) (2认同)