Что вы имеете в виду "упорядочено по размеру" - длина или площадь?Я предполагаю, что это должно быть отсортировано по максимальной длине.
Как вы "находите край, ближайший к началу координат, в котором есть место для прямоугольника"?Насколько я понимаю задачу, у вас есть прямоугольники, отсортированные по длине их длинной стороны.Вы помещаете самый длинный в начало координат.
<Loop>
Затем вы берете самый длинный из оставшихся прямоугольников и размещаете его на длинной стороне первого / самого длинного края стопки прямоугольников.Вероятно, вы разместите его не в середине края, а с одним углом второго на один угол первого прямоугольника.
Как правило, я предлагаю всегда использовать западный или северный край самого длинного оставшегося края (как вам нравится).Возможно, еще лучше всегда выбирать угол с более длинным краем.
Таким образом, вы получаете новое ребро, которое выравнивает угол, к которому был прикреплен прямоугольник, который теперь может быть самым длинным оставшимся ребром.</Loop>
Это то, что вы делаете?И в чем проблема?У вас есть изображение нежелательного результата?
Хорошо, увидев ваш пример, вот какой-то псевдопифон:
class Point(object):
x, y: Integer
class Rectangle(object):
"""Assuming that the orientation doesn't matter, length>=width"""
length, width: Integer
class Edge(object):
from, to: Point
length: Integer
class Pile_Of_Rectangles(object):
edges: list of Edges #clockwise
def add_rectangle(r):
search longest edge "e1"
search the longer of the two adjacent edges "e2"
attach r with its longer side to "e1" at the end, where it adjoins to "e2":
adjust "e1" so that e1.length = e1.length - r.length
insert the new edges with length r.width, r.length and r.width into self.edges
connect the last edge with "e2"
Надеюсь, это сделает мои рассуждения более прозрачными.Такой подход не должен давать вам никаких пробелов и столкновений, поскольку я считаю, что он дает более или менее выпуклую форму (не уверен).