11

标题说明了一切,我一直在四处寻找,找不到任何直截了当的东西。我如何用点 (x1,y1) & (x2, y2) 画一条线并检查它在矩形 (xR,yR) 之间的交点?我在 Line2D 包中看到有一些交集方法,但不知道如何设置它们。有人可以告诉我设置它以检查交叉口(碰撞)的正确方法吗?

4

3 回答 3

11

使用 2D 图形 API 中的可用类。

Rectangle r1 = new Rectangle(100, 100, 100, 100);
Line2D l1 = new Line2D.Float(0, 200, 200, 0);
System.out.println("l1.intsects(r1) = " + l1.intersects(r1));

这并没有告诉你,在哪里......

于 2013-03-20T04:06:32.327 回答
4

一个矩形是 4 条线。您可以计算您的线与矩形的 4 条线之间的相交。

给定两条线的方程,当 x 和 y 相等时,它们将相交。

y = m1x + b1 y = m2x + b2

求解你应该得到的方程:

x = b2 - b1 / (m1 - m2);

请注意,如果 m1 == m2,线是平行的并且永远不会相交,在这种情况下要注意除以 0。

然后,由于您正在处理比无限线更响的线段,请检查相交是否在您的线段内脱落(检查 X 和 Y 是否都在每个线段的边界内)。

于 2013-03-20T04:05:01.383 回答
4

如果线不相交,则返回 null。从对类似问题的另一个响应中修改了一些 c 代码以使其成为 Java。没有费心去研究它是如何/为什么工作的,但是我需要它来完成工作。

static Point get_line_intersection(Line2D.Double pLine1, Line2D.Double pLine2)
{
    Point
        result = null;

    double
        s1_x = pLine1.x2 - pLine1.x1,
        s1_y = pLine1.y2 - pLine1.y1,

        s2_x = pLine2.x2 - pLine2.x1,
        s2_y = pLine2.y2 - pLine2.y1,

        s = (-s1_y * (pLine1.x1 - pLine2.x1) + s1_x * (pLine1.y1 - pLine2.y1)) / (-s2_x * s1_y + s1_x * s2_y),
        t = ( s2_x * (pLine1.y1 - pLine2.y1) - s2_y * (pLine1.x1 - pLine2.x1)) / (-s2_x * s1_y + s1_x * s2_y);

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
    {
        // Collision detected
        result = new Point(
            (int) (pLine1.x1 + (t * s1_x)),
            (int) (pLine1.y1 + (t * s1_y)));
    }   // end if

    return result;
}
于 2013-10-13T06:16:39.990 回答