पहली बात मैं के बारे में सोचा एक यादृच्छिक विस्थापन भग्न था। यह इलाके उत्पन्न करने के लिए भी प्रयोग किया जाता है और पर्लिन शोर से आसान है।
package so;
import java.util.Random;
public class Noise {
/** Source of entropy */
private Random rand_;
/** Amount of roughness */
float roughness_;
/** Plasma fractal grid */
private float[][] grid_;
/** Generate a noise source based upon the midpoint displacement fractal.
*
* @param rand The random number generator
* @param roughness a roughness parameter
* @param width the width of the grid
* @param height the height of the grid
*/
public Noise(Random rand, float roughness, int width, int height) {
roughness_ = roughness/width;
grid_ = new float[width][height];
rand_ = (rand == null) ? new Random() : rand;
}
public void initialise() {
int xh = grid_.length - 1;
int yh = grid_[0].length - 1;
// set the corner points
grid_[0][0] = rand_.nextFloat() - 0.5f;
grid_[0][yh] = rand_.nextFloat() - 0.5f;
grid_[xh][0] = rand_.nextFloat() - 0.5f;
grid_[xh][yh] = rand_.nextFloat() - 0.5f;
// generate the fractal
generate(0, 0, xh, yh);
}
// Add a suitable amount of random displacement to a point
private float roughen(float v, int l, int h) {
return v + roughness_ * (float) (rand_.nextGaussian() * (h - l));
}
// generate the fractal
private void generate(int xl, int yl, int xh, int yh) {
int xm = (xl + xh)/2;
int ym = (yl + yh)/2;
if ((xl == xm) && (yl == ym)) return;
grid_[xm][yl] = 0.5f * (grid_[xl][yl] + grid_[xh][yl]);
grid_[xm][yh] = 0.5f * (grid_[xl][yh] + grid_[xh][yh]);
grid_[xl][ym] = 0.5f * (grid_[xl][yl] + grid_[xl][yh]);
grid_[xh][ym] = 0.5f * (grid_[xh][yl] + grid_[xh][yh]);
float v = roughen(0.5f * (grid_[xm][yl] + grid_[xm][yh]), xl + yl, yh
+ xh);
grid_[xm][ym] = v;
grid_[xm][yl] = roughen(grid_[xm][yl], xl, xh);
grid_[xm][yh] = roughen(grid_[xm][yh], xl, xh);
grid_[xl][ym] = roughen(grid_[xl][ym], yl, yh);
grid_[xh][ym] = roughen(grid_[xh][ym], yl, yh);
generate(xl, yl, xm, ym);
generate(xm, yl, xh, ym);
generate(xl, ym, xm, yh);
generate(xm, ym, xh, yh);
}
/**
* Dump out as a CSV
*/
public void printAsCSV() {
for(int i = 0;i < grid_.length;i++) {
for(int j = 0;j < grid_[0].length;j++) {
System.out.print(grid_[i][j]);
System.out.print(",");
}
System.out.println();
}
}
/**
* Convert to a Boolean array
* @return the boolean array
*/
public boolean[][] toBooleans() {
int w = grid_.length;
int h = grid_[0].length;
boolean[][] ret = new boolean[w][h];
for(int i = 0;i < w;i++) {
for(int j = 0;j < h;j++) {
ret[i][j] = grid_[i][j] < 0;
}
}
return ret;
}
/** For testing */
public static void main(String[] args) {
Noise n = new Noise(null, 1.0f, 250, 250);
n.initialise();
n.printAsCSV();
}
}
स्रोत
2011-04-03 21:42:02
मैंने आपके स्रोत को शोर की साजिश का उत्पादन करने के लिए बदल दिया, नीले रंग के निम्नतम और पीले उच्चतम मूल्यों के साथ। छवि पर अलग-अलग रेखाएं प्रतीत होती हैं, जो कि 'मध्य बिंदु' पर सबसे अधिक ध्यान देने योग्य हैं, लेकिन कुछ हद तक, प्रत्येक 'बच्चे' मध्यबिंदु। क्या उन असंतुलन को कम करने या उन्मूलन करने का कोई तरीका है? यदि कोई दिलचस्पी लेता है, तो मैं परिवर्तित स्रोत जोड़ सकता हूं। –
यह फ्रैक्टल कोड के लिए आसान है लेकिन इन लाइनों का उत्पादन करता है। इस पर एक सुधार है हीरा वर्ग फ्रैक्टल के रूप में जाना जाता है जिसे इन कलाकृतियों को कम करना है। –
बीटीडब्ल्यू मुझे लगता है कि मेरे कार्यान्वयन में भी एक समस्या है। कोड प्रत्येक तरफ midpoints की ऊंचाई दो बार सेट करता है। यह असंतोष के लिए बनाता है। यदि ग्रिड को फ्लोट.NAN में प्रारंभ किया गया है और प्रत्येक बिंदु केवल इसके लिए परीक्षण करके सेट किया गया है, तो मुझे लगता है कि आउटपुट में सुधार होगा। –