【问题标题】:Break up a square or rectangle into a large number of randomly sized squares or rectangles将一个正方形或长方形分解成大量随机大小的正方形或长方形
【发布时间】:2011-12-06 22:42:54
【问题描述】:

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

好吧,当然其他人问这个我发现的最好的线程是 How to fill a square with smaller squares/rectangles?

解决方案似乎是通过装箱或某种树图。

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

【问题讨论】:

    标签: java actionscript-3 algorithm bin


    【解决方案1】:

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

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      提供的代码创建一个k-d tree。您可以使用它在矩形上绘制线条,将其划分为较小的矩形。在你得到你的树之后,你可以使用它来将你的区域划分为这些矩形:

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

      【讨论】:

        【解决方案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);
                }
        
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-04
          • 1970-01-01
          • 1970-01-01
          • 2010-12-23
          相关资源
          最近更新 更多