3の最大多重度で原点から外側にエッジと頂点を生成するアルゴリズム


11

私は、宇宙が非常に大きくなる(基本的には無限に大きくなる)Webサイト用の2Dゲームを作成しています。最初は、宇宙は原点(0、0)から等しい距離にある6つの星で構成されています。私のタスクは、相互に接続する「パス」(エッジ)を持つより多くの星を生成できるようにすることです。これらの制限を満たすアルゴリズムをどのように設計できますか:

  1. 星は外側にランダムに生成されます。(たとえば、新しい星の(x、y)座標は、(0、0)からすべての方向にゆっくりと外側に移動し、できれば螺旋状になります)
  2. エッジは交差しません。
  3. 多少の違いはあるはずですが、新しい星は他の星に近すぎたり近すぎたりしてはなりません。(たとえば、最小半径が必要です)
  4. スター/ポイントの多重度が3を超えることはできません。
  5. このすべてがデータベースに保存されることを考えると、アルゴリズムのコストが高すぎることはありません。言い換えれば、O(n)の複雑さを実現したいと考えています(これが実現可能かどうかはわかりません)。

基本的に、私が目指しているのは、星がグラフ上の点であり、星間の移動がそれらの星の間のエッジで描かれている渦巻き状の銀河です。

解決する必要がある特定の手順は次のとおりです。

  1. まだ3の多重度を持たない他の星の近隣に点をランダムに生成します。
  2. エッジの競合を生成しない3の多重度をまだ持たない最初の星を見つけます。
  3. 星がx単位の最小距離にある場合、2点間にエッジを作成します。

解決策を探してみましたが、数学のスキル(およびグラフ理論の知識)には多くの作業が必要です。また、この問題に関するリソース/リンクは大歓迎です。

ここに私が考えていたいくつかの擬似コードがありますが、これがうまくいくかどうかはわかりません。

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つのポイントがあるのですか、それはエラーですか?
Doc Brown

1
いいえ。予測可能な方法で星を生成できる場合、出発してから戻ったときに星が常にそこにあったかのようになります。変更されないのはアルゴリズムとシードのみです。
ニール

2
@JF See No Man's Sky。男は文字通り宇宙を生成します。彼はプレイヤーが訪れた惑星のみを保存しますが、既存の惑星はそれぞれの同じ場所に残ります。それはすべて、乱数の生成に使用される適切なシードの使用に基づいています。
ニール

回答:


2

提案:内部ユニバースネットワークを完全に順序付けし、アルゴリズムを使用し、比較的単純にしてください。ユニバースがユーザー画面に表示されたときにランダム見えるようにするだけです。ユーザー表示のために星の位置にランダムなオフセットのみを適用します。

問題:各星のランダムオフセットを計算する最も明白なアプローチでは、基礎となる真の構造を非表示にすることはできません。星同士が衝突したり、パスを横切ったりするリスクが生じる前に、星を少しだけランダム化できます。

解決策:調整された非局所的なランダム性を適用すると、大きなランダムな歪みを適用し、よりランダムで興味深い外観の宇宙を取得できます。星をゴムシートの上に置いて、シートのさまざまな部分をランダムに伸ばして押しつぶすことを想像してください。これにより、星のグループ全体が長距離移動します。近くの星がお互いに関連して伸びたり縮んだりするため、衝突や交差はありません。

方法:フラクタルテレインジェネレーターを検索します。自由でオープンなコードがたくさんあります。マップ上の各ポイントの高さ値を生成する基本的なコードのみが必要です。別の方法で使用します。そのコードを使用して、2つの独立した地形高さマップを生成します。星の真のX、Y位置から始め、各マップのその位置を見て、1つのマップ値を使用して星のX表示位置をオフセットし、他のマップ値を使用して星のY表示位置をオフセットします。いくつかのスケーリングファクターを試す必要がありますが、ランダムに歪んだラバーシート効果が得られる可能性があります。星の位置の大きな変化は、基礎となる順序付けられた位置を完全に隠すはずです。ランダム性のフラクタル性は、非常に自然に見える効果を与えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.