在矩形内生成随机点'区域均匀(某些矩形可能重叠)

时间:2018-04-04 15:46:49

标签: algorithm math random probability uniform-distribution

假设它给出了一组具有不同区域的矩形,并且一些矩形可能重叠。 目标是在矩形之间生成一个统一的随机点。领域

矩形被定义为一对两点:

  • (x1,y1) - 最左下角;
  • (x2,y2) - 最右上角。

我在不重叠矩形之间均匀分布随机点的策略是, - 根据区域(existing solution)随机选择一个矩形:

   for(int i = 0; i < rectangles.length; i++) {
      int area = (rectangles[i].x2 - rectangles[i].x1) * 
                 (rectangles[i].y1 - rectangles[i].y2);
         if(rand.nextInt(total + area) >= total) {
             selected = i;
             break;
         }
         total += area;
   }

然后在矩形内生成任意点:

  • x1 +(1 /(x2-x1))* rand(0,(x2-x1-1)),
  • y1 +(1 /(y2-y1))* rand(0,(y2-y1-1))。

但如果一些矩形可以重叠怎么办呢?

2 个答案:

答案 0 :(得分:2)

如果第一个预处理步骤足够快(假设矩形是小于1000的整数坐标),这是一个简单而快速的解决方案:

squares = set()
for rect in rects:
    for oneByOneSquare in rect:
        squares.add(oneByOneSquare)

squares = list(squares)
while True:
    randomSquare = random.choice(squares)
    randomPoint = randomPointInsideSquare(randomSquare)

这个想法是将矩形划分为正方形。然后随机选择正方形并在该正方形内随机生成一个点。

答案 1 :(得分:2)

工业级解决方案

  1. 将所有矩形合并为正交多边形。这些多边形不重叠。
  2. 将步骤1中获得的多边形分解为非重叠矩形。
  3. 在这些不重叠的矩形中均匀选择您的点。
  4. 这种方法适用于任何可能重叠多边形的输入,如果用任何类型的三角测量(如梯形分解后跟三角测量)替换第二步,然后从最后一组三角形中选择点。