From Gossip@caterpillar

Computer Graphics: 雪花曲線

 

 


雪花的遞迴繪圖基本圖案如下圖左所示,進一步的構圖如下圖右所示:



這只是個大致的繪圖,說明雪花的基本架構,但並不是很精確,在遞迴時起始位置還需用上一些數學運算,才能使雪花繪圖接近自然,這個部份請自行觀看示範程式中的原始碼,如下所示:

  • SnowCurve.java
package onlyfun.caterpillar.graphics.recursive;

import onlyfun.caterpillar.graphics.Turtle;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JApplet;

public class SnowCurve extends JApplet {
private Turtle t;

public void init() {
t = new Turtle();

setBackground(Color.black);
}

public void snow(double rad, double min,
double ks, Turtle t) {
if(rad>min) {
double r=rad*(1-ks)/(1+ks);
snow(r, min, ks, t);
int n=(int)Math.ceil(
Math.log(min/rad)/Math.log(ks));
for(int i=0;i<6;i++) {
for(int j=1;j<n;j++) {
t.warp(rad*(1-Math.pow(ks,(double)j)));
snow(r*Math.pow(ks,(double)j), min, ks, t);
t.warp(-rad*(1-Math.pow(ks,(double)j)));
}
t.turn(60.0);
}
}
else
t.pset(t.LPX, t.LPY);
}


public void paint(Graphics g) {
g.setColor(Color.yellow);

t.setGraphics(g);
t.window(0, 0, getSize().width, getSize().height);
t.view(0, 0, getSize().width, getSize().height);
t.setpoint(300, 50);
t.setangle(90.0);

double d = getSize().height / 8;

for(int i = 0; i < 20; i++) {
double x = d + (getSize().width - 2*d) *
Math.random();
double y = d + 5 * d * Math.random();
double r = 0.1 * d + 0.9 * d * Math.random();
t.setpoint(x,y);
t.setangle(90.0);
snow(r, 0.1, 0.5, t);
}
}
}