Python 如何检查矩形中的点,反之亦然?

Python 如何检查矩形中的点,反之亦然?,python,algorithm,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

如果标题不清楚,很抱歉

下面是更详细的情况。
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中实现这一点,那将是最好的。
谢谢

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


补遗 定向曲面允许您在知道任何多边形的坐标时计算其面积。多边形必须以描述轮廓的特定顺序定义为一组点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],[D,A]),该公式允许我们计算由一对点和轴原点形成的三角形的面积。该曲面根据旋转方向(顺时针或逆时针)定向,即它具有正值或负值。在下图中,三角形(OAB)和(OBC)以及(ODA)将具有负面积,而三角形(OCD)将具有正面积。通过添加所有这些面积,可以注意到结果将是多边形(A、B、C、D)的面积,这是负数,因为它是顺时针绘制的

计算 您可以在这里找到一个清晰的计算示例,并尝试以下几点:。为了完成我的例子,我在这个网站上画了一个类似(但不完全相同)的多边形,结果如下:-22

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

下面是网站上的一个例子。第一个多边形是初始多边形,第二个定义不正确,最后一个定义正确

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

笔记
  • 如果原始点集的顺序不正确,则必须按照上文所述对其重新排序
  • 在Python中,必须使用有序对象,如列表
  • 要检查每个矩形内部是否至少有一个点,您必须对照所有矩形检查每个点,并维护一个描述哪个点在哪个矩形内部的字典
  • 补充:我还意识到,由于矩形是凸的,所以只需按顺序(ABP)(BCP)(CDP)和(DAP)检查四个定向三角形区域,就可以知道点P是否在内部。如果这四个区域具有相同的符号,则P位于矩形(ABCD)内部,否则P位于外部

到目前为止你做了什么?我建议你读一本关于计算几何的书,这本书将提供你需要的各种算法和数据结构。你也可以使用该点作为第五个点进行测试,如果获得的面积小于矩形,则表示该点位于矩形内。我想这将需要重新排序的点,以最大限度地扩大面积。在计算定向曲面时,顺序很重要。注意:始终对答案进行评分,并指出是否接受