這聽起來像一個相當簡單的問題,你只是在一個時間產生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)
這不是太容易產生花瓣,你需要從0到2 * PI步驟與2*PI/petalCount
步長和產生電弧繞了一圈。它需要一個良好的圖形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×10與500×500很可能需要大大不同的算法,我不會推薦以上低於100×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
我第二@Nile的評論。你可能首先要分離出你想要隨機的花。顏色,花瓣大小,核心大小/顏色,莖幹大小等。該花的真正隨機化將會使真實的雜亂植物變得困難。 – brainmurphy1
我的意思是,我用來生成在我的個人資料PIC花算法使用的算法比僅改變了幹ooked的方式。花仍然看起來一樣。所以我想讓它成爲「真正的randam」,即使enteire程序是隨機的。 – Hele