随机放置轨道上的对象

时间:2013-08-15 11:46:18

标签: 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()

这种非常天真的方法体现了我的需求:在nodes的随机位置实例化大量track。我还尝试将xy作为track范围内的随机数,但track将是一个随机,复杂,互连的系列行,例如数字8,蛇形线,小方块,一系列“岛屿”或整个场地。节点无法在轨道外实例化。

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

3 个答案:

答案 0 :(得分:1)

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

例如,您可以定义以下曲目片段:

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

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

因此,使用上面的示例轨迹,您将生成0到300之间的随机数。例如,如果它出现105,那么您将查找它在Arc段中并根据弧的定义将确定它正好在弧线的b点之外。

如果一些基本的示例代码可以帮助我可以尝试在今天的某个时刻开始工作,但现在不能。

答案 1 :(得分:1)

这一切都取决于你的曲目的表现方式。我们假设它表示为“行”列表,并且这些行实际上是矩形。另外,假设您希望按区域均匀放置对象。这是你可以做的:

Compute the area of all lines, just sum up width * height for all lines.
x = a random number between 0 and the total area.
For each line:
    if x < area of current line:
        place it in current line
        exit loop
    x = x - area of current line

这将告诉你它应该进入哪一行。然后你可以使用你现有的算法。

如果它表示为位图,您可以只计算可遍历的像素数,然后选择0到0之间的数字,并将对象放在该像素上。通过“可穿越”,你需要能够在那里放置一个5x5的物体,即中心的5x5像素需要全部为“道路”。

答案 2 :(得分:1)

首先,最好使用单个变量对轨道进行参数化,假设Node.position_along_the_track,根据该参数选择“随机”节点的位置,然后从Node.position_along_the_track中导出坐标Node.x和Node.y

其次,你必须在你的案例中定义“随机”的含义。不同的模拟需要不同的分布。例如,如果要在轨道上的连续对象之间实现随机距离,则应替换

Node.x = rand() 

Node.position_along_the_track = (rand() + PreviousNode.position_along_the_track) 
                                   % length_of_the_track