【问题标题】:Break up a square or rectangle into a large number of randomly sized squares or rectangles将一个正方形或长方形分解成大量随机大小的正方形或长方形
【发布时间】:2011-12-06 22:42:54
【问题描述】:
【问题讨论】:
标签:
java
actionscript-3
algorithm
bin
【解决方案1】:
解决方案是尝试“分而治之”技术。在迭代 1 中,您有一个矩形。将矩形分成两个较小的矩形。一种方法如下。假设矩形是 100x50。在 0-100(矩形的长度)之间选择一个随机数。假设随机数是 20。然后你可以将你的矩形分成两个较小的大小为 20x50 和 80x50 的矩形。对于这 2 个新矩形,递归地应用相同的过程。(因此在第 2 次迭代中,您将有 4 个矩形)。这样做 n 次,你将有 2^n 个矩形。
此外,在每次迭代中,您可以随机选择是否应按每个矩形的长度(垂直)或宽度(水平)进行吐痰。
希望对你有帮助!
【解决方案2】:
提供的代码创建一个k-d tree。您可以使用它在矩形上绘制线条,将其划分为较小的矩形。在你得到你的树之后,你可以使用它来将你的区域划分为这些矩形:
- 选择树根处的节点。
- 通过该点画一条垂直线。
- 选择它的左孩子,在你刚刚通过它的父母画的线的左侧画一条水平线(这条线停在你刚刚画的线处)。
- 选择它的右子节点,在您刚刚通过其父节点绘制的线的右侧画一条水平线(这条线也停在您通过父节点绘制的线处)。
- 以递归方式执行此操作,在树的每一级在垂直线和水平线之间切换。
代码:
int MAX_HEIGHT = 100;
int MAX_WIDTH = 100;
int NUM_POINTS = 6;
// Generate random list of points
List<Point> pointList = new List<Point>();
Random rand = new Random();
for(int i = 0; i < NUM_POINTS ; i++)
{
pointList.add(new Point(rand.nextInt(MAX_HEIGHT), rand.nextInt(MAX_WIDTH));
}
BinaryTree tree = CreateKDTree(pointList, 0);
// Recursive function for creating a K-D Tree from a list of points
// This tree can be used to draw lines that divide the space up
// into rectangles.
public BinaryTree CreateKDTree(List<Point> pointList, int depth)
{
// Have to create the PointComparator class that just selects the
// specified coordinate and sorts based on that
Coordinate coord= depth % 2 == 0 ? X_COORDINATE : Y_COORDINATE
Collections.sort(pointList, new PointComparator(coord));
int median = pointList.size() / 2;
// unfortunately Java doesn't have a BinaryTree structure so
// you have to create this too
BinaryTree node = new BinaryTree(pointList[median]);
if(pointList.size() == 1) return node;
if(median > 0)
node.left(CreateKDTree(pointList.subList(0, median), depth + 1);
if(median + 1 < subList.size())
node.right(CreateKDTree(pointList.subList(median + 1, subList.size()), depth + 1);
return node;
}
【解决方案3】:
将长度随机分成x份
现在,将每个较小的矩形随机分成 y 个部分
这是一些 ActionScript 代码(用记事本编写,您必须检查错误)。它获取输入矩形的宽度和高度,并返回一个包含分割矩形顶点的数组
private function divRect(w:Number, h:Number):Array {
var rw:Number=0, rh:Number=0;
var wa:Array=[0], rv:Array=[];
while(rw < w) {
var r:Number=Math.random() * (w-rw);
wa.push(r+rw);
rw+=r;
}
for(var i:int=1; i<wa.length; i++) {
while(rh < h) {
var o:Object={x: wa[i-1], x2: wa[i]};
var s:Number=Math.random() * (h-rh);
o.y=rh;
rh+=s;
o.y2=rh;
rv.push(o);
}
}
}