0

この問題の解決策を作成しようとしています。私のコードはループ (for と while) に焦点を当てています。

パラメータ Q を、幅、高さ、および左下隅の (x,y) 位置で指定される「長方形」のリストとします。Enclosure(Q) は、 Q 内の各四角形を含む最小の四角形を返します。長方形はタプル (x,y,width,height) で表されます。

これまでの私のコードは次のとおりです。

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
4

2 に答える 2

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

最初にリストを作成し、それをタプルに変換するのを避けるために。

于 2013-10-28T20:47:14.767 に答える
-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>

[アップデート]

何?!?削除票?この回答で何が不快なのか説明してください。

于 2013-10-28T20:56:03.987 に答える