2013-01-02 17 views
5

誰も私のプロフィール写真と同じようにランダムに花を生成するリンク、アイデア、アルゴリズムを提案できますか?プロファイルpic花は10 x 10グリッドしかなく、アルゴリズムは本当にランダムではありません。私はまた、新しいアルゴリズムが約500 x 500以上のグリッドを使用することを望み、ユーザーがグリッドのサイズを選ぶことを可能にします。ランダムな花を生成するアルゴリズムのアイデア

[工場では、[] [] int型工場として宣言されている[10] [10];]

public void generateSimpleSky(){ 

    for(int w2=0;w2<10;w2++) 
     for(int w3=0;w3<10;w3++) 
      plant[w2][w3]=5; 

} 

public void generateSimpleSoil(){ 

    for(int q=0;q<10;q++) 
     plant[q][9]=1; 

} 

public void generateSimpleStem(){ 

    int ry=rand.nextInt(4); 
    plant[3+ry][8]=4; 
    xr=3+ry; 

    for(int u=7;u>1;u--){ 

     int yu=rand.nextInt(3); 
     plant[xr-1+yu][u]=4; 
     xr=xr-1+yu; 

    } 

} 

public void generateSimpleFlower(){ 

    plant[xr][2]=3; 

    for(int q2=1;q2<4;q2++) 
     if((2-q2)!=0) 
      plant[xr][q2]=2; 

    for(int q3=xr-1;q3<=xr+1;q3++) 
     if((xr-q3)!=0) 
      plant[q3][2]=2; 

} 
+2

*本当にランダム*とはどういう意味ですか? – jeremy

+4

2番目の@Nileのコメント。ランダムにしたい花について何か*をまず分離することができます。色、花びらのサイズ、コアのサイズ/色、茎のサイズなどが含まれます。その花の真の無作為化は、本当に厄介な植物のためになります。 – brainmurphy1

+0

私のプロファイルの写真で花を生成するために使用したアルゴリズムは、幹が奇跡を起こした方法を変えただけではなく、アルゴリズムを使用していました。花はまだ同じように見えました。ですから、私はそれを "本当にランダム"にしたい、つまり、エンタメ手順をランダムにしたいと思っています。 – Hele

答えて

4

それはおそらく基づいて、あなただけの時間で1つのパラメータを生成合理的に簡単な問題のように聞こえます前の変数の出力

私の花の模型は:ちょうど合理的に直立した茎、完全に丸い中心、交互の側の茎のある量の葉、中央付近の花弁が完全に分布しています。

random()は、一部の選択された範囲内の単なる乱数であり、境界は各変数に対して一意であってもよい。 random(x1, x2, ..., xn)は、変数x1、x2、...、xn(stemWidth < stemHeight/2のように合理的な仮定)に依存するいくつかの境界内で乱数を生成します。

stemXPosition = width/2 
stemHeight = random() 
stemWidth = random(stemHeight) 
stemColour = randomColour() 
stemWidthVariationMax = random(stemWidth, stemHeight) 
stemWidthVariationPerPixel = random(stemWidth, stemHeight) 

stemWidthVariationMax/-PerPixel(あなたが複雑な何かをしたい場合は、低PerPixelは滑らかさのためである、)完全にまっすぐではない幹を生成するためのものです。次のようにこれらを使用して、幹を生成します。

pixelRelative[y-position][0] := left x-position at that y-position relative to the stem 
pixelRelative[y-position][1] := right x-position at that y-position relative to the stem 

pixelRelative[0][0] = randomInRange(-stemWidthVariationMax, stemWidthVariationMax) 
for each y > 0: 
    pixelRelative[y-1][0] = max(min(randomInRange(pixel[y] - stemWidthVariationPerPixel, 
             pixel[y] + stemWidthVariationPerPixel), 
          -stemWidthVariationMax), 
         stemWidthVariationMax) 
//pixelRelative[0][1] and pixelRelative[y-1][1] generated same as pixelRelative[y-1][i] 
for each y: 
    pixelAbsolute[y][0] = width/2 - stemWidth/2 + pixelRelative[y][0] 
    pixelAbsolute[y][1] = width/2 + stemWidth/2 + pixelRelative[y][1] 

あなたはまた、物事を単純化し、一度に1つのピクセル以上を行くために弧を使用することができます。

トップ

centerRadius = random(stemHeight) 
petalCount = random() // probably >= 3 
petalSize = random(centerRadius, petalCount) 

それは花びらを生成するには余りにも簡単ではありません、あなたは2*PI/petalCountのステップサイズで0〜2 *のPIからのステップと円の周りの弧を生成する必要があります。それは良いグラフィックスAPIか、まともな数学を必要とします。

Here'sいくつかの美しい花の頂点は、一見オープンソースではありませんが、彼らはまったく中心を持っていないことに注意してください。 (またはcenterRadius = 0)

あなたはおそらく(this oneのように)、これに全体の論文を書くことができますが、単純なアイデアは、ちょうど1/2円を生成し、外側の線を延長するだろうそこから円の半径2 *で会い、花の上に平行線を描きます。

あなたは葉の生成アルゴリズムたら:

leafSize = random(stemHeight) // either all leaves are the same size or generate the size for each randomly 
leafStemLength = random(leafSize) // either all leaves have the same stem length or generate for each randomly 
leafStemWidth = random(leafStemLength) 
leaf[0].YPosition = random(stemHeight) 
leaf[0].XSide = randomly either left or right 
leaf[0].rotation = random between say 0 and 80 degrees 
for each leaf i: 
    leaf[i].YPosition = random(stemHeight, leaf[i-1]) // only generate new leaves above previous leaves 
    leaf[i].XSide = opposite of leaf[i].XSide 

最後の言葉を

どちらかがそれを主張する、またはそれにいくつかの固定値を与えることであろう各randomの境界を決定する方法ランダムに数回ランダムに生成し、奇妙に見えるようになるまで増減を続けます。

10 x 10と500 x 500の間にはおそらく大きく異なるアルゴリズムが必要ですが、100 x 100未満の場合は推奨しません。より大きな画像を生成し、平均化などを使用して単純に縮小します。

コード

私はそれは私がこれに費やすしたいと思いよりも少し時間がかかることがありますので、私は私がこれまで持っているものを紹介します気づいたとき、いくつかのJavaコードを書き始めました。

// some other code, including these functions to generate random numbers: 
    float nextFloat(float rangeStart, float rangeEnd); 
    int nextInt(int rangeStart, int rangeEnd); 

    ... 

    // generates a color somewhere between green and brown 
    Color stemColor = Color.getHSBColor(nextFloat(0.1, 0.2), nextFloat(0.5, 1), nextFloat(0.2, 0.8)); 
    int stemHeight = nextInt(height/2, 3*height/4); 
    int stemWidth = nextInt(height/20, height/20 + height/5); 
    Color flowerColor = ??? // I just couldn't use the same method as above to generate bright colors, but I'm sure it's not too difficult 
    int flowerRadius = nextInt(Math.min(stemHeight, height - stemHeight)/4, 3*Math.min(stemHeight, height - stemHeight)/4); 
+0

簡単に言えば、あなたは最高です! – Hele

関連する問題