如何确定一个点是否位于矩形内?

时间:2011-05-18 15:30:48

标签: c++ c algorithm computational-geometry

  

可能重复:
  Finding whether a point lies inside a rectangle or not

有一个采访问题,“如何确定一个点是否位于矩形内”

请注意,矩形也可以旋转。因此,检查矩形内部点的简单解决方案在这里无效......

请分享您对这个问题的想法..

我在互联网上找到了一个链接,并试图理解它,但失败了......请问这里的任何一个机构能否提供完整的计算机图形逻辑解决方案,因为我已经忘记了所有的基础... 。 How to determine if a point is inside rectangle.

8 个答案:

答案 0 :(得分:15)

选择一个绝对位于矩形之外的点。然后创建从该点到相关点的段。求解该段与构成矩形的段之间的交点的线性方程。如果您只得到一个交点,则该点位于矩形内。否则(0或2个交叉点),它在外面。

这基本上可以扩展到任何多边形 - 奇数个交叉点意味着该点在多边形内部,偶数表示它在外面。

编辑:可能不是很明显,所以我要强调我们在矩形(多边形)之外选取的点完全是任意的。我们可以选择我们想要的任何点,只要我们确定它在多边形之外。为了简化计算,我们通常会选择(P x ,无穷大)(其中P x 是点P的x坐标,我们是测试) - 也就是说,我们正在创建的是一个垂直射线。这简化了测试,因为我们只需要针对一个端点进行测试以找到交叉点。它还简化了线性方程的求解,使其几乎无法识别为求解线性方程。我们真的只需要在P x 处计算线的Y坐标,看它是否大于P y 。因此,求解线性方程可分解为:

  1. 检查X值是否在段
  2. 的X值范围内
  3. 如果是,则将X值插入行的等式
  4. 测试得到的Y值是否大于P y
  5. 如果那些通过,我们有一个交集。另请注意,测试可以并行执行(如果我们在像GPU这样的并行硬件上执行此操作,也很方便。)

答案 1 :(得分:7)

在凸多面体的N维中有效的简单解决方案,其中二维矩形是​​一种特殊情况:

  1. 将多面体表示为半空间的交集,每个半空间由单位法向量和表面超平面与法线沿原点的距离定义。
  2. 对于这些半空间中的每一个,将相关点的点积与定义的法向量相乘。当且仅当点积小于[或等于]定义距离时,该点在半空间中。
  3. 该点位于多面体内部,当且仅当它位于每个半空间中时。
  4. 对于定义为逆时针序列边缘的矩形,步骤1相当于顺时针旋转边缘90度以获得法线,然后将法线与包含边缘的线相交以找到距离的边缘。原点。

    假设步骤1完成,测试一个点最多需要8次乘法,4次加法和4次比较。

    如果你愿意,你可以稍微优化一下这个过程,因为你有矩形(因此相对的边具有相反的法线)。现在你只看到2个法线而不是4个,以及一系列点积值,它们表示位于相对边之间的点。所以现在你可以进行4次乘法,2次加法和4次比较。

    如果您做的第一个测试显示该点在矩形之外,您也可以获得幸运,在这种情况下,它只需要2次乘法,1次加法和1-2次比较。

答案 2 :(得分:3)

这远不是最佳解决方案......但如果您有连续顺序的积分,请将其称为abcd在x和ay字段中,您可以使用点p与每个连续对之间的向量的叉积。

如果你总是得到相同的结果符号(即所有都是正数或全部都是负数)那么你就在矩形内;否则,你在外面。

答案 3 :(得分:2)

定义一个新的坐标系,其中两个矩形边作为单位矢量,并将点的坐标转换为新的坐标系。如果两个坐标都在0和1之间,那么它就在里面。

在方程式中(假设A,B,C,D是矩形的角,P是点,_x和_y是x和y分量):

P_x = A_x + x * (B_x - A_x) + y * (D_x - A_x)
P_y = A_y + x * (B_y - A_y) + y * (D_y - A_y)

求解x和y并检查它们是否介于0和1之间

写成线性方程组(A,B,C,D,P是长度为2的向量):

[    |    ]   [x]   [   ]
[B-A | D-A] * [ ] = [P-A]
[    |    ]   [y]   [   ]

解决很容易,因为它只有两个维度,你可以确定你不是单数。

答案 4 :(得分:0)

由于可以旋转矩形,您可能需要考虑用于确定是否a point is interior to a convex polygon的算法。

您还可以计算矩形的旋转角度,然后将矩形和点变换为轴向对齐矩形。然后检查变换点是否在轴向对齐的矩形内。

答案 5 :(得分:0)

您可以旋转和移动参考系统,使其与矩形的位置和旋转相匹配。现在只需在坐标之间进行简单比较即可。这是一种数学方式,所以不是最快的(铃声@Platinum Azure')

答案 6 :(得分:0)

查找点是否位于像矩形这样的有界区域内是经典裁剪算法的一部分。请参阅ClippingLine Clipping上的维基百科文章,了解有关它的更多信息。

答案 7 :(得分:0)

遵循@Jerry Coffin的精神:从矩形角到相关点创建线段。求解线性方程组。斜率为tan(a)。总结所有seq arctangents diff,如果它是2 * PI并且每个差异< PI - 点在矩形内。

编辑可能只需检查每个顺序差异<裨...