【问题标题】:generate a random point within rectangles' areas uniformly (some rectangles could overlap)在矩形区域内均匀生成一个随机点(某些矩形可能重叠)
【发布时间】:2018-09-14 06:29:15
【问题描述】:

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

矩形被定义为一对两点:

  • (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))。

但是如果某些矩形可以重叠怎么办?

【问题讨论】:

  • 如果点包含在多个重叠的矩形中,为什么对您很重要?
  • 因为它打破了统一性。
  • 您必须更好地解释这一点。什么的均匀性?
  • @JimMischel 目标是在矩形区域之间均匀生成一个随机点。
  • 统一选择边界矩形中的一个点,重复直到它在其中一个矩形内。

标签: algorithm math random probability uniform-distribution


【解决方案1】:

工业级解决方案是

  1. 将所有矩形合并成正交多边形。这些多边形不重叠。
  2. 将步骤 1 中获得的多边形分解为不重叠的矩形。
  3. 在这些不重叠的矩形中均匀地选择您的点。

此方法适用于可能重叠多边形的任何输入,如果您将第二步替换为任何类型的三角剖分(如梯形分解后三角剖分),然后从最终的一组三角形中选择点。

【讨论】:

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

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

    【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多