如何检查一条线的任意点(或部分)是否在矩形内部或接触矩形。

9

我想要检查一条线段(或者线段上的任意一点)是否在一个矩形内或与矩形相交。

我有线段的起点和终点坐标(x0, y0)和(x1, y1)。 还有矩形的左上角和右下角坐标(ax, ay)和(bx, by)。

举个例子:

     ____________
    |            |
 ---|-----       |    Result: true
    |            |
    |____________|

    /
  _/__________
 |/           |
 /            |      Result: true
/|            |
 |____________|


     ____________
    |            |
    |   -------- |   Result: true
    |            |
    |____________|    ----------     Result: false

有人能建议如何做到这一点吗?我不想知道哪个点是那个点,我只想知道它是否存在。

非常感谢您的帮助。


7
感谢您对清晰的ASCII艺术表示的支持。 - alex
一个快速的谷歌搜索“Cohen Sutherland”应该会让你朝着正确的方向开始。 - Jerry Coffin
将每条边视为自己的线段。然后只需确定线段交叉以及完全包含的情况即可。当然,这只是一个快速的观察结果,可能不是解决此类交叉的理想方式(这也是一个非常常见的交叉 - 如果这是一个原始问题,我会非常惊讶;-) - user166390
1个回答

5
第一和第三种情况很简单——如果线的任一端点在矩形内(即ax >,ay < bx和by),则返回true。
第二种情况会出现问题——我们不能再依赖于线的端点了。在这种情况下,我们将不得不测试线段与矩形的每条边。
我们线的方程将是(x1 - x0)*x + (y1 - y0)*y + x0*y0 - x1*y1 = 0,我们可以使用角落构造类似的方程来代表矩形的每一面。然后,将矩形边缘的方程代入我们的线路将给我们交点。
最后,我们检查确保该点在矩形的边界内,并且在考虑的线段内。
此讨论中有更详细的介绍。

2
  1. 对我来说似乎不太对。例如,以单位正方形(0,0到1,1)和线段(-1,0)-(1,3)为例。
- Jimmy
你说得对!那会产生一个错误的结果。我会更新我的答案。 - Andy Mikula

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