C++ 圆内方框外的随机位置

C++ 圆内方框外的随机位置,c++,random,C++,Random,我需要找到一个随机位置在一个盒子外面,但在一个圆里面。 基本上是盒子和圆之间的随机位置 我想做的是在一个圆内对一个位置进行rand(),然后检查该位置是否在框外,基本上是进行碰撞检查 有比这种方法更有效的方法吗?假设长方体和圆的中心重合,一种有效的方法是这样做,只需生成两次随机数: 随机化从圆原点投影的角度[0,2pi] 根据在步骤1中生成的角度与长方体相交的圆中心的几何光线的位置,计算可以生成的最小允许半径 生成一个随机数[0,(cirlce的半径-步骤2中的半径)] 这可以使用%或fmod

我需要找到一个随机位置在一个盒子外面,但在一个圆里面。 基本上是盒子和圆之间的随机位置

我想做的是在一个圆内对一个位置进行rand(),然后检查该位置是否在框外,基本上是进行碰撞检查


有比这种方法更有效的方法吗?

假设长方体和圆的中心重合,一种有效的方法是这样做,只需生成两次随机数:

  • 随机化从圆原点投影的角度[0,2pi]
  • 根据在步骤1中生成的角度与长方体相交的圆中心的几何光线的位置,计算可以生成的最小允许半径
  • 生成一个随机数[0,(cirlce的半径-步骤2中的半径)]
    • 这可以使用
      %
      fmod
  • 如果形状中心不重合,可以通过将步骤2分为两个步骤来稍微修改此点:

  • 计算与长方体的第一个交点(如果存在)
  • 计算与长方体的第二个交点(如果存在)
  • 将步骤3分为两个步骤

  • 如果发现两个交点,则生成一个随机数[0,1]以选择第一个或第二个有效范围(中心到第一个交点或第二个交点到圆边)

  • 在所选范围内生成一个随机数


  • 希望这有帮助

    我会关注这些解决方案的职位分配。例如,如果选择的随机角度具有均匀分布,则沿矩形角附近的直线的结果分布将更加密集,沿矩形边中心附近的直线的结果分布将更加稀疏。请详细说明一下,好吗?如果发现两个交点,这将给出两个可能的线段。你应该选择哪一个,根据它们的长度来衡量可能性。否则,一个伟大的算法。@ PIPScEAK考虑在一些分辨率的角度均匀的样本,让我们简单地说,8个可能的线方向,每100个精确的样本。因此,直线将包含沿线段的100个点,该线段从矩形的边缘延伸到圆的边缘。轴对齐的四条线将把这些点分散在一个较长的段上(从正方形边缘到圆周长的距离较长),而穿过角的线将把这些100点分散在一个较短的段上。因此靠近拐角处的密度会更高。@PipSqueak不,对不起。事实上,要在复杂形状中获得均匀分布,而不从更简单的区域采样,是相当棘手的。如果分布不重要的话,你的解决方案很好,我只是想指出一个可能的限制。请不要关闭这个-这不是一个“为我编写代码”的问题,这是一个算法问题。圆圈和正方形的相对大小是多少?如果圆内的正方形是圆面积的一半,则平均而言,碰撞方法会使操作数加倍