それはおそらく基づいて、あなただけの時間で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);
*本当にランダム*とはどういう意味ですか? – jeremy
2番目の@Nileのコメント。ランダムにしたい花について何か*をまず分離することができます。色、花びらのサイズ、コアのサイズ/色、茎のサイズなどが含まれます。その花の真の無作為化は、本当に厄介な植物のためになります。 – brainmurphy1
私のプロファイルの写真で花を生成するために使用したアルゴリズムは、幹が奇跡を起こした方法を変えただけではなく、アルゴリズムを使用していました。花はまだ同じように見えました。ですから、私はそれを "本当にランダム"にしたい、つまり、エンタメ手順をランダムにしたいと思っています。 – Hele