【问题标题】:c++, Generate diamond or triangular holes in uniform distribution in a 2D spacec++,在二维空间中生成均匀分布的菱形或三角形孔
【发布时间】:2014-06-22 21:42:30
【问题描述】:

如何使用均匀随机分布在二维空间中生成粒子,使其内部有三角形或菱形孔?

【问题讨论】:

  • 如果你使用随机粒子系统,粒子之间的“洞”很可能是随机的。也许您正在寻找的是分形 (en.wikipedia.org/wiki/Sierpinski_carpet)?
  • random 是这篇文章的好标签!这对于 Stack Overflow 来说并不是一个很好的匹配,因为它不够具体(也许到目前为止添加您的代码或尝试 Programmers 堆栈交换?) - 无论如何,让您开始:您可以使用任意数量的 monte-carlo 方法来实现这一点。本质上,您选择随机点,检查它们是否适合您的分布,如果不适合,则丢弃并选择另一个随机点。非常简单,但效率不高。更多信息在这里:en.wikipedia.org/wiki/Monte_Carlo_method
  • 我实际上想做一些与此相反的事情。 stackoverflow.com/questions/14021381/…
  • 我建议的方法可以实现。选择一个二维点,如果它在您想要的区域中,则接受它,否则拒绝它。正如@pjs 所提到的,实际上可能需要多次尝试才能获得所需的样本数量(这就是它效率不高的原因),但它完全符合您的需要。

标签: c++ random


【解决方案1】:

Acceptance/Rejection - 定义切口区域,在二维空间上均匀生成点,如果结果落在切口中,则拒绝它并重试。接受的概率为p(accept) = 1 - Area(cutouts) / Area(2-d_generating_space),而预期的尝试次数将与此相反。例如,如果孔占您空间的 80%,那么对于给定的试验,p(accept) = 0.2 平均需要 5 次尝试才能获得可接受的分数。

【讨论】:

  • 如何为已知顶点和中心的菱形定义切割区域?实际上,剪纸不是随机的。我知道他们的立场。
  • 如果你知道顶点,你可以推导出四条线,它们是菱形的边界。为了在菱形中,一个点必须在右上和左上线之下,并且在左下线和右下线之上。只有同时满足所有四个边界时,一个点才在菱形中。
  • 例如,如果您的顶点是{(1,0), (0,1), (-1,0), (0,-1)},那么您对(x,y) 对落在该菱形内的约束将是y >= -x - 1y >= x - 1y <= 1 - x 和@ 987654329@.
【解决方案2】:

我将从三角形外壳开始,因为菱形外壳实际上与具有两个三角形相同。

下面是对pjs算法的另一种解释:

  1. 根据 x-min、x-max、y-min、y-max 定义二维空间。
  2. 根据 triangle1[point1, point2, point3] ... triangle_n[point1, point2, point3] 定义一组要从中切割的三角形。
  3. 选择要生成的点数,调用此 numberOfPoints。
  4. 迭代 numberOfPoints。
    1. 在您的 x 范围内选择一个随机值(从 x-min 到 x-max)
    2. 在您的 y 范围内(从 y-min 到 y-max)选择一个随机值。
    3. 这是新随机点的 x,y 位置。
    4. 检查这是否适合您的任何切割三角形(您将在此处有另一个循环)并且可以使用this 或其他遏制测试。
    5. 如果它在切割三角形之一内,请将其扔掉,不要增加计数器。否则,您已成功添加一个点。

有一些方法可以更有效地做到这一点,而不是根据每个切割三角形检查每个点。对于没有太多三角形的情况,这是一种不错的首选方法。

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2012-06-26
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多