对不起,标题不清楚。
这是更详细的情况。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中执行此操作。 谢谢!
答案 0 :(得分:1)
我认为您可以使用我相信的数学家高斯创建的所谓的定向曲面。这使您可以计算任何多边形面积。使用要测试的点作为第五点,使用另一个矩形点作为第六点(重复),可以为该新的六边多边形计算一个新面积。根据与矩形相比的点位置,您将获得相同或更大的区域。
通过定向的曲面,您可以在知道多边形的坐标时计算它们的面积。多边形必须按照描述轮廓的特定顺序定义为一组点P(Xp,Yp)。连续的两个点将通过一条线连接。
在下面的图片中,多边形可以定义为集合[A,B,C,D],也可以定义为[C,D,A,B]或[B,A,D,C]。
它不能定义为[A,C,B,D],因为这将定义一个像蝴蝶翅膀一样的多边形,如下所示。
对于每两个有序连续点-例如,对于定义的集合[A,B,C,D]表示[A,B],[B,C],[C,D],[D,A] -该公式允许我们计算由一对和轴原点形成的三角形的面积。该表面根据旋转方向(顺时针或逆时针)定向-表示其值为正值或负值。在下图中,三角形(OAB),(OBC)和(ODA)将具有负面积,而三角形(OCD)将具有正面积。通过添加所有这些面积,您可以注意到结果将是多边形(A,B,C,D)的面积,该面积为负数,因为它是顺时针绘制的。
您可以找到一个清晰的计算示例,并在此处尝试一些操作:https://www.mathopenref.com/coordpolygonarea.html。为了完成我的示例,我在该网站上绘制了一个与上面相似(但不相同)的多边形,结果如下:-22
添加点(即要测试的点)时,将获得5点多边形。您要做的第一件事是将其以正确的顺序放置,以免段交叉。为此,您可以创建循环,将新点P依次放置在集合中的不同位置-依次是(PABCD),(APBCD)等,直到(ABCDP)-,然后为每个区域进行计算。可以提供最大绝对面积的集合就是您保留的集合。
这是来自网站https://rechneronline.de/pi/simple-polygon.php的示例。第一个多边形是初始多边形,第二个多边形定义不正确,最后一个多边形定义正确。
可以看到,如果添加的点在原始多边形之外,则面积会增加。相反,如果添加的点在原始多边形内,则面积减小: