我有一堆可变大小的矩形,我需要将它们大致组合成一个圆圈,大概是中心区域最大的矩形。
NB。圆圈的大小不是固定的 - 这只是我追求的整体形状。
这更像是我想象一个懒惰的人类包装(一旦一件就位,它就会停留。)
它们已按其宽度和高度的最大值排序,最大值。
理想情况下 - 我认为订购可以保证这一点 - 根本没有差距。
我正在努力的算法是:
for each rectangle:
if first:
place rectangle at origin
add all edges to edge list
else:
for each edge in edge list:
if edge is long enough to accomodate rectangle (length <= width or height depending on orientation):
if rectangle placed on this edge does not collide with any other edges:
calculate edge score (distance of mid-point from origin)
use edge with lowest edge score
place rectangle on edge
for each of this rectangles edges:
if edge overlaps one already in the edge list:
merge or remove edge
else:
add to edge list
remove used edge from edge list
add unused sections of this edge into edge list
这适用于前几个矩形,但边缘合并非常多毛,而我目前选择使用边缘部分(一端或另一端)的方法往往会留下很多间隙。
虽然我认为我最终会让这种方法运行得相当令人满意,但感觉就像我缺少一种更优雅(图形?)的算法。
答案 0 :(得分:2)
你的意思是“按大小排序” - 长度或面积?我想它必须按最大长度排序。
你如何“找到最接近原点的边缘,这个边缘有矩形空间”?据我所知,你有长方形长度排序的矩形。你把最长的一个放在原点。
<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"
我希望,这使我的推理更加透明。这种方法应该没有间隙,也没有碰撞,因为我认为它会产生一个或多或少凸起的形状(不确定)。
答案 1 :(得分:0)
请您详细说明 1.在中心周围均匀分布? 2.目标是什么?即你想最大化适合的矩形数量,或者你知道所有矩形都适合你想要最大限度地减少空间的浪费吗?
我不确定一个懒惰的人会怎么打包。但如果我想优化包装,我会从角落开始,然后到达中心。