c++ - 在轨道上随机放置对象

标签 c++ algorithm random language-agnostic scalability

我正在进行一项模拟,需要将任意数量的物体(超过 100,000 个)沿着任意形状的轨道随机放置。

在最简单的实现中,我开始使用 C++ 并编写了一个非常简单的函数来沿着 Track 放置一个节点。在这种情况下,Track 是一条尺寸为 25 x 500 的水平线。node 仅由 X/Y 组成 坐标并且尺寸为 5 x 5,所以我写了类似...

Node.x = rand()
Node.y = rand()
while (Node.x is not on the Track)
    Node.x = rand()
while (Node.y is not on the Track)
    Node.y = rand()

这种非常幼稚的方法举例说明了我所需要的:大量节点将在轨道上的随机位置实例化。我还尝试让 xy 成为 track 范围内的随机数,但 track 将是随机、复杂、相互连接的一系列线条,例如 8 字形、蛇形线、小正方形、一系列“岛屿”或整个 field 。节点不能在轨道外实例化。

我可以使用哪些现有算法/方法来实例化轨道上的这些节点?

最佳答案

我认为最好以将绝对位置映射到轨道上某个点的方式预处理您的轨道。这可能意味着获取每一段轨道,并根据它的定义方式,为该段轨道分配一个整数范围。

例如,您可以定义以下轨道段:

  • 从 a 点到 b 点的直线(位置 0 到 100)
  • 从b点到c点的弧线(位置101到200)
  • 从c点到a点的线(位置201到300)

当您创建随机数时,您会找出它落在轨道的哪一段,然后根据该段的定义方式找出它落在该段的哪个位置。如果您的所有段都具有唯一的、不重叠的范围,那么您还可以根据随机数保留一个已放置节点的列表,以确定是否已将某些东西放置在给定位置。这也将支持分支轨道,因为它完全基于沿段的整数范围。

所以使用上面的示例轨迹,您将生成一个介于 0 和 300 之间的随机数。例如,如果它出现 105,那么您将查找它在弧线段中,并根据您对弧线的定义将确定它刚好沿着弧线离开点 b。

如果一些基本的示例代码有帮助,我可以尝试在今天白天的某个时候进行处理,但现在不能。

关于c++ - 在轨道上随机放置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252026/

相关文章:

c++ - 服务器证书验证失败。 CAfile : ca. pem CRL 文件:无

c++ - 如何在不更改其键的情况下增加哈希表的特定值?

c++ - 使用 Assembly 和 C++ 调用一个函数两次

javascript - 使用 javascript 在 html 中制作一个重定向按钮

c# - 为什么for语句中的随机方法返回相同的结果?

c++ - 为什么我不能转换为 B*?

algorithm - 如何识别文本中的一组关键词

algorithm - 快速确定数字是否整除集合中的任何元素

algorithm - 每次按键后进行文本比较的工具/算法

c++ - C++中出现随机数重复