浮动间隔交叉点

时间:2014-03-22 16:58:19

标签: python

我有两个矩形。我需要看看它们是否/在哪里重叠。

方法1: 1)单独考虑每个领域和范围。 2)使用类似于数学公式的公式:

x1 < a < x2

我在Python中写道:

if x1[0] > x2[0] and x1[0] < x2[1] or x1[1] > x2[0] and x1[1] < x2[1]: return True

问题: 这应该是检测任何一圈,它通过比较边界来做到这一点。但是它假设x1的边界点将在x2中。如果x1 [0],x1 [1]的边界虽然大于x2 [0] [1],那么它将返回false,这表示没有重叠,而实际上这两个点之间的间隔将是交叉。

方法2: 使用set()数据类型及其内置函数:

   def containsRectangle(self,Rectangle):
        x1 = range(self.x_interval[0],self.x_interval[1])
        x2 = range(Rectangle.x_interval[0],Rectangle.x_interval[1])
        set_x1 = set(x1)
        set_x2 = set(x2)
        if set_x1.intersection(x2):
            return True

问题: 我必须使用浮点数,因为我需要精确计算。 Python不允许我迭代浮点数。

我都是出于想法的人。任何帮助将非常感谢伙伴!

1 个答案:

答案 0 :(得分:1)

嗯,不,你的第二种方法是正确的。但是,在某种程度上,您必须在集合中具有离散值。如果您想要连续,那么比较交叉点的极值将会起作用,就像您在第一个例子中所做的那样。

确定2个矩形的交集是多边形后,您可以使用任何points inside polygon方法:

def point_inside_polygon(x,y,poly):
    """ Assume poly is the intersection of the two rectangles and (x,y) is the point to check 
    """
    n = len(poly)
    inside =False

    p1x,p1y = poly[0]
    for i in range(n+1):
        p2x,p2y = poly[i % n]
        if y > min(p1y,p2y):
            if y <= max(p1y,p2y):
                if x <= max(p1x,p2x):
                    if p1y != p2y:
                        xinters = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
                    if p1x == p2x or x <= xinters:
                        inside = not inside
        p1x,p1y = p2x,p2y
    return inside