将一个正方形或矩形分割成许多大小随机的小正方形或小矩形。

5
我正在尝试将正方形或矩形分解成许多随机大小的正方形或矩形,以便它们不重叠。
当然,其他人也提出了这个问题,我发现最好的帖子是如何用较小的正方形/矩形填充一个正方形? 解决方案似乎可以通过装箱或某种树图来实现。
但我要找的是Java、Javascript、ActionScript甚至C中的实际算法。
3个回答

4
一个解决方案是尝试“分而治之”技术。在迭代1中,您有一个矩形。将矩形分成两个较小的矩形。一种方法是选择随机数。假设矩形是100x50。在0-100(矩形长度)之间选择一个随机数。假设随机数为20。然后,您可以将您的矩形分成大小为20x50和80x50的两个较小的矩形。对于这两个新矩形,递归地应用相同的过程。(因此,在迭代2中,您将有4个矩形)。重复n次,您将拥有2^n个矩形。此外,在每次迭代中,您可以随机选择是否按每个矩形的长度(垂直)或宽度(水平)进行分割。希望对您有所帮助!

1
提供的代码创建了一个k-d树。您可以使用它来在矩形上绘制线条,将其分成更小的矩形。在获得树之后,您可以按以下方式将区域划分为这些矩形:
  1. 选择树的根节点。
  2. 通过此点绘制一条垂直线。
  3. 选择其左子节点,在您刚刚通过其父节点绘制的线的左侧通过此点绘制一条水平线(此线停在您刚刚绘制的线上)。
  4. 选择其右子节点,在您刚刚通过其父节点绘制的线的右侧通过此点绘制一条水平线(此线也停在您通过父节点绘制的线上)。
  5. 递归执行此操作,在树的每个级别之间切换垂直和水平线。
代码:
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; 
}

1

随机将长度分成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);
        }

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接