class Point:
def __init__(self, xcoord=0, ycoord=0):
self.x = xcoord
self.y = ycoord
class Rectangle:
def __init__(self, bottom_left, top_right, colour):
self.bottom_left = bottom_left
self.top_right = top_right
self.colour = colour
def intersects(self, other):
我试图看看是否两个矩形相交的基础上,右上角和左下角,但当我使函数:
def intersects(self, other):
return self.top_right.x>=other.top_right.x>=self.bottom_left.x and self.top_right.x>=other.bottom_left.x>=self.bottom_left.x and self.top_right.y>=other.top_right.y>=self.bottom_left.y and self.top_right.x>=other.bottom_left.x>=self.bottom_left.x
函数在输入以下内容时返回false:
r1=Rectangle(Point(1,1), Point(2,2), 'blue')
r3=Rectangle(Point(1.5,0), Point(1.7,3), 'red')
r1.intersects(r3)
进入壳内。
7条答案
按热度按时间rqenqsqc1#
您可以使用Separating Axis Theorem的一个简单版本来测试相交。如果两个矩形不相交,那么至少有一个右边会在另一个矩形左边的左边(即它将是一个分隔轴),反之亦然,或者一个上边会在另一个矩形下边的下面,反之亦然。
因此,更改测试以检查它们是否不相交:
这段代码假设“top”的y值大于“bottom”(y值在屏幕上向下递减),因为你的例子看起来就是这样的,如果你使用另一种约定,那么你只需要翻转y比较的符号。
2cmtqfgy2#
我最近遇到了这个问题,今天又遇到了命名元组,所以我想试试看:
shstlldc3#
也可以使用shapely中的多边形(例如,具有[x0,y0,x1,y1]的矩形)完成此操作
iovurdzv4#
下面是您在编写代码之前可以做的事情:1.考虑两个矩形不重叠的情况2.首先选择每种颜色编码x和y的配对比较。例如,比较rectangle.A.X1并将其与Rectangle.B.X2进行比较
下面是代码
tv6aics15#
比较我找到的所有答案,@samgak answer是最好的。
slhcrj9b6#
我所做的就是找出哪个矩形在顶部,哪个在底部;还有哪个在左边,哪个在右边。最后,我们讨论的是我们正在比较的两个相同的矩形。但是获得右/左和上/下有助于简化条件。一旦我们获得了右/左和上/下,我们就可以比较重叠、非重叠和包含。
基本上,如果左矩形的左下x值加上其宽度小于右矩形的左下x值,则它是不重叠的。如果左矩形的左下x值加上其宽度小于或等于右矩形的左下x值加上其宽度,则右矩形与左矩形完全重叠。除此之外,这就是交集。上下比较,然后合并起来,你就能找到交集。
7vux5j2d7#
这里有很棒的解决方案,但我还没有看到任何以模式(top_x,top_y)作为左上角点和(bottom_x,bottom_y)作为边界框右下角点的解决方案。我想分享一个分析该模式的解决方案,尽管您可以从该模式中推断出右上角和左下角点,并使用上述解决方案。
下面是代码: