将正方形或矩形分成大量随机大小的正方形或矩形

时间:2011-10-13 12:43:37

标签: java actionscript-3 algorithm bin

我正在尝试将正方形或矩形分成大量随机大小的正方形或矩形,以便没有重叠。

当然,其他人已经问过我找到的最好的主题是 How to fill a square with smaller squares/rectangles?

解决方案似乎是通过bin打包或某种树形图。

但我正在寻找的是Java,Javacript,actionscript甚至C中的实际算法。

3 个答案:

答案 0 :(得分:4)

解决方案是尝试“分而治之”技术。在迭代1中,您有一个矩形。将矩形分成两个较小的矩形。一种方法是这样做。让我们说矩形是100x50。选择0-100之间的随机数(矩形的长度)。让我们说随机数是20.然后你可以把你的矩形吐成两个尺寸为20x50和80x50的小矩形。对于这两个新的矩形递归地应用相同的过程。(因此在迭代2中你将有4个矩形)。这样做n次,你将有2 ^ n个矩形。 同样在每次迭代中,你可以随机选择吐痰是否应该按每个矩形的长度(垂直)或宽度(水平)来完成。

希望它有所帮助!

答案 1 :(得分:1)

提供的代码会创建k-d tree。您可以使用它在矩形上绘制线条,将其划分为更小的矩形。获得树后,您可以按照以下方式将区域划分为这些矩形:

  1. 选择树根处的节点。
  2. 在此处画一条垂直线。
  3. 选择它的左子,在刚刚通过它的父线绘制的线左侧的这一点画一条水平线(这条线停在你画的线上)。
  4. 选择它是正确的孩子,在刚刚通过它的父母的线的右侧的这一点画一条水平线(这条线也停在你画过父母的线上)。
  5. 以递归方式执行此操作,在树的每个级别切换垂直和水平线。
  6. 代码:

    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; 
    }
    

答案 2 :(得分: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);
        }

    }

}