矩形外壳(Python3)

时间:2013-10-28 20:39:02

标签: python

我正在尝试为这个问题创建一个解决方案,我的代码专注于循环(for和while):

  

让参数Q为“矩形”列表,由宽度,高度指定,   和(x,y) - 左下角的位置。附件(Q)返回   包含Q中每个矩形的最小矩形。的方式   矩形由元组(x,y,宽度,高度)表示。

到目前为止,这是我的代码:

def Enclosure(Q):
    c = []
    d = []
    for (x,y,width,height) in sorted(Q):
        c.append(x)
        d.append(y)
    print(c)
    print(min(c))
    e=tuple([min(c)]+[min(d)])
    print(e)

忽略print语句,这些仅用于调试目的。我的代码到这一点创建了一个包含矩形左下角(x,y)坐标的元组,我试图获得程序形式。但在此之后,我完全不知道如何找到封闭矩形的(高度,宽度)。我怎么能这样做?

此外,这是程序运行时应该执行的示例:

R1 = (10,20,5,100) #R1,R2,R3 are each rectangles
R2 = (15,5,30,150) #layout of the tuple:(x,y,width,height)
R3 = (-4,30,20,17)
Enclosure([R1,R2,R3])
(-4, 5, 49, 150) #rectangle that encloses R1,R2,R3

2 个答案:

答案 0 :(得分:0)

试试这个:

def Enclosure(Q):
    c = []
    d = []
    x2 = []
    y2 = []
    for (x,y,width,height) in sorted(Q):
        c.append(x)
        d.append(y)
        x2.append(width + x)
        y2.append(height + y)
    e = tuple([min(c)]+[min(d)] + [max(x2) - min(c)] + [max(y2) - min(d)])
    print(e)

您可以将e = tuple...替换为:

e=(min(c), min(d), max(x2) - min(c), max(y2) - min(d)) # This makes a tuple directly

避免首先列出一个列表,然后将其转换为元组。

答案 1 :(得分:-2)

确保您可以解释为什么使用了继承,否则您的老师会知道您在作弊:

class Geometry(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Point(Geometry):
    def __repr__(self):
        return "<Point at {s.x},{s.y}>".format(s=self)


class Rectangle(Geometry):
    def __init__(self, x, y, width, height):
        super(Rectangle, self).__init__(x, y)
        self.width = width
        self.height = height

    @property
    def oposite_corner(self):
        return Point(self.x + self.width, self.y + self.height)

    def __repr__(self):
        return "<Rectange of {s.width}x{s.height} at {s.x},{s.y}>".format(s=self)


def enclosing_rectangle(rect_list):
    x1, y1, x2, y2 = (
        min([r.x for r in rect_list]),
        min([r.y for r in rect_list]),
        max([r.oposite_corner.x for r in rect_list]),
        max([r.oposite_corner.y for r in rect_list]),
    )
    return Rectangle(x1, y1, x2 - x1, y2 - y1)

请自行测试并修复任何错误(提示:super已更改):

>>> l = [Rectangle(1, 2, 3, 4), Rectangle(-1, -1, 1, 1), Rectangle(3, 4, 1, 1)]
>>> enclosing_rectangle(l)
<Rectangle of 5x7 at -1,-1>

[更新]

什么?!?删除投票?用这个答案解释什么是如此令人反感?