如何检查点是否落在矩形中,反之亦然?

时间:2018-12-07 15:43:30

标签: python algorithm

对不起,标题不清楚。

这是更详细的情况。
Given n dots and n rectangles.
Rectangles can overlap.
Dots are represented as (x,y) 
Rectangles are represented as (x,y,w,h)
x,y refer to location in x and y axes, respectively 
w,h refer to width and height, respectively 
How do i check if the following two conditions are met simultaneously:
each dot falls in a certain rectangle (doesn't matter which)
AND
each rectangle contains at least one dot.

有没有比遍历每个点和每个矩形更好的方法了? 最好是可以告诉我如何在python中执行此操作。 谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您可以使用我相信的数学家高斯创建的所谓的定向曲面。这使您可以计算任何多边形面积。使用要测试的点作为第五点,使用另一个矩形点作为第六点(重复),可以为该新的六边多边形计算一个新面积。根据与矩形相比的点位置,您将获得相同或更大的区域。


附录

通过定向的曲面,您可以在知道多边形的坐标时计算它们的面积。多边形必须按照描述轮廓的特定顺序定义为一组点P(Xp,Yp)。连续的两个点将通过一条线连接。

在下面的图片中,多边形可以定义为集合[A,B,C,D],也可以定义为[C,D,A,B]或[B,A,D,C]。

enter image description here

它不能定义为[A,C,B,D],因为这将定义一个像蝴蝶翅膀一样的多边形,如下所示。

enter image description here

定向表面

对于每两个有序连续点-例如,对于定义的集合[A,B,C,D]表示[A,B],[B,C],[C,D],[D,A] -该公式允许我们计算由一对和轴原点形成的三角形的面积。该表面根据旋转方向(顺时针或逆时针)定向-表示其值为正值或负值。在下图中,三角形(OAB),(OBC)和(ODA)将具有负面积,而三角形(OCD)将具有正面积。通过添加所有这些面积,您可以注意到结果将是多边形(A,B,C,D)的面积,该面积为负数,因为它是顺时针绘制的。

enter image description here

计算

您可以找到一个清晰的计算示例,并在此处尝试一些操作:https://www.mathopenref.com/coordpolygonarea.html。为了完成我的示例,我在该网站上绘制了一个与上面相似(但不相同)的多边形,结果如下:-22

enter image description here

添加点

添加点(即要测试的点)时,将获得5点多边形。您要做的第一件事是将其以正确的顺序放置,以免段交叉。为此,您可以创建循环,将新点P依次放置在集合中的不同位置-依次是(PABCD),(APBCD)等,直到(ABCDP)-,然后为每个区域进行计算。可以提供最大绝对面积的集合就是您保留的集合。

这是来自网站https://rechneronline.de/pi/simple-polygon.php的示例。第一个多边形是初始多边形,第二个多边形定义不正确,最后一个多边形定义正确。

enter image description here enter image description here enter image description here

可以看到,如果添加的点在原始多边形之外,则面积会增加。相反,如果添加的点在原始多边形内,则面积减小:

enter image description here enter image description here enter image description here

注意

  • 如果原始点集的排序不正确,则必须如上所述重新排序
  • 在Python中,您将必须使用有序对象(例如列表)
  • 要检查每个矩形的内部至少有一个点,您将必须对照所有矩形检查每个点,并维护一个字典来描述哪个点在哪个矩形内
  • 添加:我还意识到,由于矩形是凸形的,因此仅通过依次检查四个定向的三角形区域(ABP)(BCP),CDP和(DAP)就可以知道点P是否在内部。如果这四个区域的符号相同,则P在矩形(ABCD)内,否则在矩形外。