不規則なしみのある形状を描くアルゴリズムのアイデアが必要


8

X、Yグリッドに不規則な形状を描きたいのですが、可能であれば、シンプルで高速な方法を考えたいと思います。これまでの私の唯一のアイデアは、互いに非常に近いランダムなサイズの円の束を描画し、多かれ少なかれ中心座標からランダムな距離で離してから、空白スペースを埋めることです。私はこれが不格好で洗練されていない方法であることを理解しています。うまくいけば、私が撮影している丸みを帯びた、ランダムなしみのある形状の種類の大まかなアイデアが得られるでしょう。これを達成するための方法を提案してください。私はコードにはあまり興味がありません。私はその部分を自分でヌードルにすることができます。ありがとう!


2
このような形状の例をいくつか添付していただければ助かりますが、私が理解したことから、マーチングスクエアアルゴリズムがあなたが探しているものかもしれません。
Alexander Konstantinov

たとえば、すべての深刻さにおいて、肝臓の斑点を考えます。
Yttermayn 2013

6
このmathematica.SEの投稿には、興味深いと 思われる例がいくつかあります:mathematica.stackexchange.com/questions/3345/…一番上の答えは、基本的にあなたがやっていることです。もう1つは、ランダムな点の凸包を見つけ、それを介してスプラインを補間しますが、少し複雑に見えます...
Jemmy

ご回答ありがとうございます!残念ながら、少し頭の中に入っているかもしれません。他のことを考えなければならないかもしれません。
Yttermayn 2013

4
目的のサイズに近い円から始め、次にパーリンノイズを使用して順列を変更するのはどうでしょうか。選択したピクセルを移動するか、円をフェード/エクステンションします。
floAr 2013

回答:


1

いくつかの点を選択し、各点でベクトルを選択して、それらを通るスプラインを描くことができます。3次スプライン(別名Irwin-Hallスプライン)の簡単な説明については、このウィキペディアのページを参照してください。使って久しぶりですが、覚えていればこれが一番わかりやすく使いやすいと思いました。フォトショップのペンツールを知っている場合、これは非常によく似ています(フォトショップもスプラインを使用していると確信していますが、それが3次スプラインかどうかはわかりません)。

興味がある場合は、さらに多くのスプラインがあります。たとえば、ベジェスプラインやBスプラインが興味深いです。

もう1つ頭に浮かぶのはレベルセットですが、(要件を満たす関数を見つけるために)おそらくもう少し調査が必要になります。

レベルセットは、
f(x、y)= c という形式の不等式
です。ここで、fは関数で、cは定数です。
これは非常に一般的な説明です。いくつかの形状に記入し、
f(x、y)<= cのすべてのピクセル
をいくつかの色で描画することができます。たとえば、完全に丸い2D形状の場合、よく知られている方程式があります
。x^ 2 + y ^ 2 <= r ^ 2
xおよびyコンポーネントをスケーリングして、楕円体を取得できます。少しの実験と研究で、いくつかのファンキーな形状を見つけることができるでしょう(私はそう思います)。

編集:wolframalpha.comにほとんどの実験が私に与えたこれを。(コマンド 'plot abs((x + sin(x)* y / 3)^ 3)+ y ^ 2 <= 7'で作成)。これがあなたの望むものかどうかはわかりませんが、それは単にあなたにアイデアを与えることです。


1

別の簡単なアプローチは、独自の低周波ノイズを使用して極座標で図を描画(または定義)することです。

平均半径1の原点を中心としたブロブが必要だとします。これは簡単に拡大縮小して他の位置やサイズに変換できます。単純な方程式r = 1で想像してください。これは、原点に半径1の円を定義します。それにはほとんど変化を追加するには、正弦波状に半径を変更することができます- wの形の用語を追加する1つの(θ+θ*罪1)、wはどこ1とθ 1定数である私はビットに戻って取得します。1つの罪の用語で大きな違いが生じることはありませんが、異なる周波数のいくつかの異なる正弦を持つことで、あなたが望んでいると思われる一種の「ソフト」な変化を正確に追加し始めるでしょう。全体的な形は、r = 1 + Wの線に沿ってであろう1つの * SIN(θ+θ 1)+ W2 *罪(2θ+θ 2)+ W 3 *罪(3θ+θ 3)+ W 4 *罪(4θ+θ 4)ワット+ 5 *罪(5θ+θ 5) -以上の条件あなたがしたい場合は、もちろん。

だから、どのように我々はWの値を選んでくださいI、θ Iを?さて、θは(0,2π)からランダムに選択する必要があります。つまり、表面の形状の各「波」は、形状の周囲の異なるポイントで開始する必要があります。wについては、いくつかの異なる選択肢があります。(0、w)からランダムにw iを選択する(形状を与えるための「全体的な変動」を表すいくつかの固定wの場合。私はw = 0.25で開始するが、w = 0.1で実験する)すべてのiについて、ホワイトノイズと呼ばれます。すべての周波数が同じ重みを持っています。これは、すべての周波数で変動が大きく、「最も奇妙な」ものです。(0、w *(1 / i))からランダムにw iを選択する—言い換えると、重量が後ずさりするノイズですが、ゆっくりです。これは1 / fノイズとも呼ばれ、最も有名な「フラクタル」ノイズです。最後に、(0、w *(1 / i ^ 2))からランダムに重みを選択すると(つまり、各ランダムな重みをi ^ 2で割ると)、ブラウンノイズが発生します。これは、3つの中で最も柔らかい円からの変化が最小-通常は楕円形の形状になります。

ここ= 0.25 W「総重量を」の使用、およびWのランダムな値の同じセットを使用して3の例であるとは、θ iはから引き出さrandom.org

「ホワイトノイズ」ブロブ: ホワイトノイズで作られたブロブ

「ピンクノイズ」ブロブ: ピンクノイズで作られたブロブ

「ブラウンノイズ」ブロブ: ブラウンノイズで作られたブロブ

これらのblobは完全ではないことに注意してください。特に、彼らが自分自身に反るのは不可能です(すべてのθについて、つまり、原点からのすべての角度について、単一のr値があるため)。重みを正しく選択しない場合、それらは自己交差する(rが負になることを許可されている場合)。しかし、彼らは説得力のあるようにずんぐりしているというまともな仕事をしており、ほとんどのゲームアプリケーションではユーザーは問題に気付かないでしょう。


(また、これらの形状が対称に非常に近いという事実は、(a)2番目と4番目の高調波の係数が非常に小さいこと、(b)1番目、3番目、5番目の高調波の位相 -シータ値を置き換えます-.468、.464、および.443で非常に近いため、ほとんどの「ブロブ」はそれらについて
これほど

0

他の回答とは別に、丸い減衰を備えたPerlinノイズを使用できます。設定を少し調整すると、簡単に変化するさまざまな形状を簡単に作成できます。

コードを高速にしたい場合は、ノイズ生成ライブラリであるlibnoise(c ++を使用している場合)などのノイズ生成ライブラリを使用できます。これにより、ノードが提供されるため、同様のタスクが非常に簡単になります。ベースの手続き型生成に関するアプローチ。他の言語へのバインディングもあります。

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