【问题标题】:In c++, how do I create point locations arbitrarily?在 C++ 中,如何任意创建点位置?
【发布时间】:2015-03-31 07:42:14
【问题描述】:

我正在尝试编写模拟程序。本来我会随机创建这样的点......

for (int c = 0; c < number; c++){  
    for(int d = 0; d < 3; d++){  
        coordinate[c][d] = randomrange(low, high);
    }
}   

其中 randomrange() 是任意范围随机化器,number 是创建点的数量,d 表示 x,y,z 坐标。它有效,但是我想更进一步。我将如何定义一个已知的形状?假设我想要一个圆的圆周上的 80 个点,或者形成立方体边缘的 500 个点。我可以在纸上很好地解释,但是在将过程描述为编码时遇到了问题。这与问题无关,但我最终将点带到 txt 文件,然后使用 matlab、scatter3 绘制点。创建“形状”点是我的问题。

【问题讨论】:

  • 你想要它真的随机吗?或者你可以在立方体的每个面上随机分配 83 个点吗?另外,请查看标准 C++ &lt;random&gt;。我认为您不熟悉,因为您的 randomrange 看起来像 std::uniform_real_distribution
  • 那里的函数只是一个虚构的例子。我正在使用带有随机函数的 C 标头。它是 r1273 或类似的东西。我不一定需要它们随机。事实上,我更喜欢统一分配积分。从那里,如果我需要对形状进行一些随机性,我只需为每个 x、y、z 分量添加一个较小的随机值。

标签: c++ arrays simulation point cartesian


【解决方案1】:

圆集和立方体边集都是一维集,因此您可以将它们表示为实数区间。对于一个圆,它很简单:使用一个区间 (0, 2pi) 并将一个随机值 phi 从区间转换为一个点:

xcentre + R cos(phi), ycentre + R sin(phi)

对于一个立方体,您有 12 个段,因此使用区间 (0, 12) 并将区间中的随机数拆分为整数部分和分数。然后用整数作为边号,分数作为边内的位置。

【讨论】:

  • 或者不要理会分裂,使用两个分布:std::uniform_int_distribution 选择边缘,std::uniform_real_distribution 沿着边缘。
  • 是的,这比我写的要简单。然而,伪随机生成器可能会显示连续结果之间的一些相关性,在这种情况下,最好使用单个结果进行定位(除非您必须使用多个结果,例如在多维空间中定位时,如圆形或立方体的内部)。
  • 我不会担心&lt;random&gt;,包含的RNG足够强大。我也不担心单个结果中位之间的相关性,这是使用单个结果的问题。不,对于多维空间,您不一定需要多个结果。如果您的 RNG 生成 64 位结果,并且每个维度具有 32 位分辨率,那么单个结果就足够了。 OTOH,如果每个维度使用 64 位双精度,而您的 RNG 仅产生 32 位,那么每个维度需要 2 个结果。您无法关联所需的维度和结果。
【解决方案2】:

简单的变体:
首先考虑最小/最大 x/y 值(单独;以减少下面步骤的错误值),生成一些与该范围匹配的坐标,然后检查它是否满足例如。 a^2+b^2=r^2(圈)
如果没有,请再试一次。

更好,但仅适用于某些形状:
生成 (0-max) 和角度 (0-360) 之间的半径
(或者如果它应该在圆形边界上,则只是一个角度)
并使用一些数学(正弦/余弦...)将其转换为 x 和 y。
http://en.wikipedia.org/wiki/Polar_coordinate_system

【讨论】:

  • 我相信我尝试了你的建议。我尝试了一个 pi 旋转的螺旋线作为样本。将 x 创建为一系列均匀位移的值,使 y = square(rad^2-x^2),然后将 z 提高一些。 for (int c = 0; c
  • 随机半径将使圆盘(整圆)不仅仅是圆的边缘。另外,应该对 R 使用非均匀分布,以避免生成的点集中在圆心周围。
  • @CaptainMorgan 这看起来太复杂了......你到底想用这段代码计算什么?
  • 应该取 r_of_a_point=R_of_a_circle*sqrt(X) 其中 X 是从 (0,1) 区间中随机选择的,具有均匀分布(加上 0 和 2*pi 之间的均匀角度分布)以获得均匀分布圆形区域上的点分布。
  • 这有点过头了。我会尝试极地方法。我正在考虑一个 for 循环来增加预期的样本大小,并且在每个步骤中我将生成一个从 0 到 2pi 的 theta。从那里我将把这个 theta 赋值为 x=costheta,y=sintheta,z=blah。应该这样做。
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 2023-04-04
  • 2012-11-12
  • 1970-01-01
  • 2012-05-09
  • 2012-11-06
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多