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

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