从原点向外产生最大边数为3的边和顶点的算法


11

我正在为一个网站创建2D游戏,在该网站上,宇宙可以变得非常大(基本上是无限大)。最初,宇宙由6个与原点(0,0)等距离的恒星组成。我的任务是能够生成更多的恒星,这些恒星将具有相互连接的“路径”(边缘)。如何设计满足以下限制的算法:

  1. 恒星是向外随机产生的。(例如,新星的(x,y)坐标将在所有方向上从(0,0)缓慢向外移动,最好采用螺旋格式)
  2. 边缘不会交叉。
  3. 尽管应该有一些差异,但新星不应与其他星相距太远或太近。(例如必须有一个最小半径)
  4. 星星/点的倍数不得超过3。
  5. 鉴于所有这些都将存储在数据库中,该算法不会太昂贵。换句话说,我很想达到O(n)的复杂度(我不知道这是否可行)。

本质上,我要寻找的是一个螺旋状的星系,其中的恒星是图形上的点,恒星之间的行进由这些恒星之间的边缘描绘。

我需要解决的特定步骤是:

  1. 在尚未重合3的其他恒星附近随机产生一个点。
  2. 查找尚未有多重度3且不会产生边缘冲突的第一颗恒星。
  3. 如果星形距离最小x单位,则在两点之间创建一条边。

我尝试寻找解决方案,但是我的数学技能(以及关于图论的知识)需要大量工作。此外,将不胜感激与此问题有关的任何资源/链接。

这是我在想的一些伪代码,但是我不确定这是否还能奏效,并且我确定在经过10,000次等运算后,它的性能将无法令人满意。

newStar = randomly generated (x, y) within radius of last star from origin
while(newStar has not been connected):
    for (star in the known universe):
        if(distance between newStar and star > x units):
            if(star has < 3 multiplicity):
                if(path from newStar to star does not intersect another path):
                    connect the star to the other star
                    break;

    newStar = new random (x, y) coordinate

另外,如果有人对如何将其存储在MySQL数据库上有任何建议,我也将不胜感激。

最后,万一上面没有什么意义,我在下面提供了我想要实现的图像:等等,很多星星...


1
这个宇宙的旅行者可能会朝一个方向移动,这意味着如果您用完了恒星,则必须从原点向各个方向生成恒星。换句话说,一个无聊的用户可能会破坏您的数据库。您是否考虑过这种可能性(假设可能是一个问题)?
尼尔

2
还有另一个想法,星星的位置不需要记住。如果使用可再生的恒星生成,则可以生成用户可以看到的恒星,以便将来以相同的方式生成这些恒星。意思是,您的数据库只需要在星号上保存信息。它的位置就是它的身份。
尼尔

1
如果每个生成的恒星正好具有3的倍数,那么步骤1将失败?为什么您的图片中的点是4的倍数,这是错误吗?
布朗

1
不。如果您可以以可预测的方式产生恒星,那么离开并返回时就好像它们一直在那里一样。只是算法和种子不会改变。
尼尔

2
@JF看见没有人的天空。这家伙从字面上产生了一个宇宙。他只保存玩家访问过的行星,而现有的行星仍保留在各自的位置。这一切都基于使用适当的种子来生成随机数。
尼尔

Answers:


2

建议:保持内部Universe网络的有序,算法化和相对简单。仅当Universe 在用户屏幕上显示时,它才看起来是随机。仅对星号位置应用随机偏移以供用户显示。

问题:最明显的方法是为每颗恒星计算一个随机偏移量,并不能很好地隐藏潜在的真实结构。您只能对星星进行少量随机化,然后再进行冒险,以免彼此碰撞或交叉。

解决方案:如果应用协调的非局部随机性,则可以应用较大的随机畸变,并获得更具随机性和趣味性的Universe。想象一下将星星放置在橡胶板上,然后想象随机拉伸和挤压橡胶板的不同部分。这样可以将整个恒星群移动很远的距离。它们不会碰撞或交叉,因为附近的恒星彼此相对伸展和挤压。

怎么做:查找分形地形生成器。有很多免费的开放代码。您只需要为地图上的每个点生成高度值的基本代码。我们将以其他方式使用它。使用该代码生成两个独立的地形高度图。从星星的真实X,Y位置开始,在每个地图上查看该位置,使用一个地图值偏移星星的X显示位置,并使用另一个地图值偏移星星的Y显示位置。您必须使用一些缩放因子,但这可以为您带来随机扭曲的橡胶板效果。星号位置的大变化应该完全隐藏潜在的有序位置。随机性的分形性质会产生非常自然的效果,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.