1

我正在做一个模拟,该模拟需要沿任意形状的轨道随机放置任意大量的对象(100,000+)。

在其最简单的实现中,我开始使用 C++ 并编写了一个非常简单的函数来沿Track. 在这种情况下,Track是一条尺寸为 25 x 500 的水平线。 Anode仅由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 字形、蛇形线、小正方形、一系列“岛屿”,或整个领域。节点不能在轨道之外实例化。

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

4

3 回答 3

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
于 2013-08-15T20:51:29.427 回答
1

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

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

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

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

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

如果一些基本的示例代码会有所帮助,我可以尝试在今天的某个时间点进行一些工作,但现在不能。

于 2013-08-15T12:12:55.813 回答
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 和那个之间的数字,并将对象放置在该像素处。通过“可遍历”,您需要能够在那里放置一个 5x5 的对象,即以那里为中心的 5x5 像素都需要是“道路”。

于 2013-08-15T12:23:23.097 回答