我正在进行一项模拟,需要将任意数量的物体(超过 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()
这种非常幼稚的方法举例说明了我所需要的:大量节点
将在轨道
上的随机位置实例化。我还尝试让 x
和 y
成为 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/