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

8 浏览
0 Comments

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

这是一个关于如何判断一个点是否在矩形内的面试问题。需要注意到这个矩形可能会有旋转,所以简单的检查点是否在矩形内的方法在这里不适用。请分享您对这个问题的想法。

我在互联网上找到了一个链接,试图理解它,但是失败了... 如果有人能够用一些计算机图形学的逻辑给出完整的解决方案,那就太好了,因为我已经忘记了所有的基础知识...

如何确定一个点是否在矩形内。

0
0 Comments

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

确定一个点是否位于矩形内部的方法是通过求解线性方程组来判断。首先,选择一个确定位于矩形外部的点。然后,从该点到待判断的点创建一条线段。解决线段与构成矩形的线段之间的交点的线性方程组。如果得到的交点恰好为一个,那么该点位于矩形内部。否则(0个或2个交点),该点位于矩形外部。

这种方法同样适用于几乎任何多边形。奇数个交点意味着点位于多边形内部,偶数个交点意味着点位于多边形外部。

需要强调的是,所选择的位于矩形(或多边形)外部的点是完全任意的。只要确保该点位于多边形外部即可。为了简化计算,通常会选择(Px,无穷大)(其中Px是待测试点P的x坐标)- 也就是说,我们创建的是一条垂直射线。这样做可以简化测试,因为我们只需要针对一个端点进行测试以找到交点。这也简化了解线性方程组的过程,以至于几乎无法辨认出它是在解线性方程组。实际上,我们只需要计算线段在Px处的Y坐标,并判断它是否大于Py。因此,解线性方程组的过程可以分解为以下几步:

1. 检查该X值是否在线段的X值范围内;

2. 如果是,将该X值代入线段方程;

3. 检查计算得到的Y值是否大于Py

如果上述步骤通过,说明存在交点。还需注意的是,这些测试可以并行进行(如果在并行硬件上进行,例如GPU,会非常方便)。

当线段经过矩形的一个角时,问题就变得复杂起来。线段可能进入矩形内部,也可能留在外部(只在一个点上“触碰”矩形),很难判断它们之间的关系。

对于任意多边形来说,这是一个很好的方法!但对于简单的矩形来说,我的答案提供了一个更简单的解决方案,只需解一组线性方程。

然而,我认为你可以简化代码,即使是从“更典型”的表示方式转换过来,然后只需一个有意义的函数名和一个注释就足够不需要查看内部代码了,除非不理解几何。

如果你只是在UI中测试点击位置,可能不需要进行优化,但如果涉及模拟/游戏物理等内容,它很可能成为一个主要瓶颈。我认为将矩形存储为方向向量(x,y)(带有第二个隐含的法线(-y,x))和沿着这些向量的间隔,在大多数情况下并不令人困惑或不常见。它在大小(4个数字)和计算大多数感兴趣的点/谓词等方面性能最优。

0
0 Comments

如何确定一个点是否在矩形内部?

这个问题的出现是因为在给定一个矩形和一个点的情况下,需要确定该点是否在矩形的内部。

解决方法如下:如果有四个连续的点,分别称为a、b、c和d,并且每个点都有x和y坐标,可以使用点p和每对连续点之间的向量的叉乘。如果结果始终具有相同的符号(即全部为正数或全部为负数),那么该点就在矩形内部;否则,该点就在矩形外部。这种方法只适用于凸四边形,但是假设是矩形的话,这个方法也是可行的。

在这段对话中,还有一些其他的讨论。首先,有人询问是否可以给出一个例子来支持这个答案,另一个人回答说这个方法适用于任何凸多边形。还有一个人考虑删除这个答案,并提供了另一个更好的答案的链接。最后,有人注意到与这个问题相似的问题在同一时间出现,提到了一个相似问题的答案的链接。

通过计算点与连续点形成的向量的叉乘,并判断结果的符号,可以确定一个点是否在矩形内部。这种方法适用于凸多边形,并且在这个具体的问题中,假设矩形是凸的,所以这个方法是可行的。

0
0 Comments

如何确定一个点是否在矩形内部?

问题的出现原因:在二维平面中,如何确定一个点是否在一个给定的矩形内部?

解决方法:

1. 将矩形表示为由半空间的交集组成,每个半空间由一个单位法向量和沿法向量方向从原点到表面超平面的距离来定义。

2. 对于每个半空间,将待确定的点与定义的法向量进行点积运算。当且仅当点积小于(或等于)定义的距离时,该点在半空间内。

3. 如果点在每个半空间内,则表明该点在矩形内部。

对于一个由顺时针顺序的边定义的矩形,步骤1需要将每条边逆时针旋转90度以获得法向量,然后将法向量与包含边的直线相交,以求得距离原点的距离。

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

如果愿意的话,可以对这个过程进行优化,因为矩形的边是对称的(因此相对的边具有相反的法向量)。现在只需要考虑2个法向量而不是4个,以及一系列点积值,这些值表示位于相对边之间的点。因此,现在只需要4次乘法、2次加法和4次比较。

如果第一次测试就显示点在矩形外部,那么只需要2次乘法、1次加法和1-2次比较。

这是一个非常优雅的解决方案,尽管我确实需要弄清楚你所说的“半空间”是什么意思。

半空间就是满足对于某个固定的向量v和常数c,有x·v < c(或≤,根据个人喜好)的所有x的集合。

0