From Gossip@caterpillar

Computer Graphics: 蕨葉曲線

 

 


蕨葉曲線的遞迴繪圖必須呼叫繪圖函式本身三次,所以較為複雜一些,先看看蕨葉曲線的基本圖案,如下所示:



這個基本圖案主要由一個主幹與兩個分枝組成,而遞迴繪圖的方向主要就是由這三個部份開始,如下所示:



如果只看主幹的遞迴部份,就可以大致看出蕨葉的骨架了,如下所示:



分枝的部份即是這個骨架的不斷縮小繪製而成,而遞迴停止的條件是看蕨葉分枝最小長度設定為多少。

以下是Java所撰寫的參考程式:

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

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

public class FernCurve extends JApplet {
private Turtle t;

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

setBackground(Color.black);
}

public void fern(double leng, double min,
double k1, double k2, Turtle t) {
t.move(leng);
if(leng > min) {
t.turn(70.0);
fern(k2*leng, min, k1, k2, t);
t.turn(-71.0);
t.move(k1*leng);
t.turn(-69.0);
fern(k1*k2*leng, min, k1, k2, t);
t.turn(68.0);
fern(k1*k1*leng, min, k1, k2, t);
t.turn(1.0);
t.warp(-k1*leng);
t.turn(1.0);
}
t.warp(-leng);
}

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);

fern(30, 0.1, 0.9, 0.3, t);
}
}