如何检查一条直线与一个矩形的相交?

12

标题已经说明了一切,我一直在寻找一个简单明了的方法,但是找不到。如何检查具有点 (x1,y1) 和 (x2, y2) 的一条线段与矩形 (xR,yR) 之间的相交?我在 Line2D包中看到了一些相交方法,但不确定如何设置它们。有人可以向我展示正确的设置方式以检查是否相交(碰撞)吗?


"谢谢Dan"。不要在问题中包含签名。Area对象之间的碰撞可以相对容易地完成。这里有一个例子 - Andrew Thompson
1
警告。 因为您可以通用地使用Java的Area类对几乎所有Java 2D图形对象进行碰撞/相交检测,因此很容易就会认为它可用于所有图形对象。 但是事实并非如此-因为如果您为“线”构建区域,则该线本身的区域始终为空。 因此,即使该线跨越到您的其他区域中,它与任何其他区域的相交始终返回空。 您已经被警告了! - Tony Eastwood
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));

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


谢谢,我不需要知道在哪里,只需要知道他们是否这样做。 - Code Doggo

5
如果两条线不相交,返回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;
}

1
这是线与线的交点,而不是矩形与线的交点。 - zihadrizkyef
这可能是我找到的获取交点的最佳答案。只需测试矩形的每一边。我用它来找到矩形内线段的中点。我太懒了,不想自己去解决。这是一个简单的解决方案。谢谢。 - user1819780

5

一个矩形由4条线组成。你可以计算出你的直线与矩形的4条线之间的交点。

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

y = m1x + b1 y = m2x + b2

解方程应该得到:

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

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

然后,由于你正在处理的是线段而不是无限长的直线,请检查交点是否在你的线段内(检查X和Y是否在每个线段的边界内)。


我会尝试使用你的答案 :) 谢谢 - Code Doggo
这比较棘手 - y = mx + c 的表示方法无法处理垂直线。 - aaronsnoswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接