我需要一种算法将一组 N 个矩形放置在半径为 R 的圆内,以便将它们放大到不超过圆边界的最大可能大小。我仍在努力,所以如果我找到答案,我会在这里发布......
问问题
720 次
1 回答
2
如果我这样做,我可能会通过使用函数测试问题对于给定的 N、R 和 rectangle_scale 是否可解决的二分搜索来完成。
测试功能可能应该是这样的:
测试函数(R,rectangle_scale)
- 沿直径拟合尽可能多的矩形
- 尽可能多地安装在与直径顶部的矩形相邻的直径之上(例如 2*R/rectangle_scale*side 或类似的东西)
- 重复(放置在您刚刚放置的矩形上方。这样做直到不再适合矩形
- 返回适合的矩形数量
然后二进制搜索将是标准的:
while(upperbound-lowerbound > limit) {
new_bound = (upperbound+lowerbound) / 2;
num_fit = testfunction(N, R, new_bound);
if(num_fit > N) {
upperbound = new_bound;
} else {
lowerbound = new_bound;
}
}
理想情况下,您当然希望以数学方式执行此操作。如果近似值适合您,您可以通过区域进行。近似值是 (rectangle_area*scale*N = pi*R^2) => scale = scale = pi*R^2 / N / rectangle_area。
但是,如果您需要准确性,我只会使用面积近似值以智能方式设置初始下限/上限。
希望这可以帮助!
于 2011-09-09T19:43:52.270 回答