检查直线和旋转矩形之间的交点

时间:2013-11-27 13:35:31

标签: c# algorithm xna collision-detection

我没有找到好的解决办法尝试了很多事情,所以我在这里 在我的游戏(2D)中,我必须检查与我Rotated Rectangle内的所有物体(房屋,车库......)之间的碰撞,在Point APoint B之间的光线。< / p>

我正在使用Xna并且有一些代码:

public void Update(List<Obstacle> Lob, DragObj Ldo)
{
    bool inter = false;
    Point A;
    Point B;

    A = new Point((int)pos.X, (int)pos.Y);
    B = new Point((int)Ldo.Position.X, (int)Ldo.Position.Y);
    for (int j = 0; j < Lob.Count(); j++) 
    {
        if (inter = interclass.LineIntersectsRect(A, B, Lob[j].Shape)) // I have this for the moment, Shape is the rectangle but not rotated )
        {
            inter = true;
            islight = false;
        }
        else
        {
            inter = false;
        }
    }
}

所以为了解决我的问题,我是否找到了一个解决方案,让rotatedRectangle对象有一个方法来检查与线的冲突。是否完全不同,也许只检查yy笔直和每个旋转矩形轴之间的碰撞?

感谢您的建议。

3 个答案:

答案 0 :(得分:0)

我通过检查我的直线和旋转的矩形的每一边之间的交点来解决这个问题(我必须先旋转矩形的每一个直线边)。 我很快就会发布小算法。

答案 1 :(得分:0)

我不知道C#,但是... 有一种算法可以从某个点获得线上的最近点。 (请注意,closestPointOnLine函数不是我的代码)

var closestPointOnLine = function(line1, point1)
{ 
    var A1 = line1.y2 - line1.y1;
    var B1 = line1.x1 - line1.x2;

    var C1 =  A1 * line1.x1 + B1 * line1.y1;
    var C2 = -B1 * point1.x + A1 * point1.y;

    var det = A1 * A1 + B1 * B1;

    var cx = 0;
    var cy = 0;

    if(det !== 0)
    { 
        cx = ((A1 * C1 - B1 * C2) / det);
        cy = ((A1 * C2 + B1 * C1) / det);
    }else{
        cx = point1.x;
        cy = point1.y;
    }

    return {
        x : constrain(cx, Math.min(line1.x1, line1.x2), Math.max(line1.x1, line1.x2)),
        y : constrain(cy, Math.min(line1.y1, line1.y2), Math.max(line1.y1, line1.y2)),
    }; 
};

在进一步介绍之前,我们先明确一下: 我们的行是:

var lineToTest = {
    x1: someNumber
    y1: someNumber,
    x2: someNumber,
    y2: someNumber
};

我们的旋转矩形包含:

var rectToTest = {
    points: [
       {
          x : someNumber,
          y : someNumber,
       },
       {
          x : someNumber,
          y : someNumber,
       },
       {
          x : someNumber,
          y : someNumber,
       },
       {
          x : someNumber,
          y : someNumber,
       },
    ],
};

然后我们以lineToTest为起点,并开始使用closestPointOnLinerectToTest的直线上得到一个点, 然后,我们检查该点是否在碰触lineToTest,如果矩形中的其他行没有重复该点。

现在,我实际上并不知道用于检查点是否在接触线的代码: 但这可能是这样的:

function isLineTouchingPoint(line1, point)
{
     //Other code here
     //You'll have to use trigonometry for this one though

     return boolean;
}

现在您可以将此代码转换为C#以使其正常工作。

答案 2 :(得分:-1)

这里有一个类似的问题。主要建议是使用已有的库来执行此操作

How to intersect two polygons?