From Gossip@caterpillar

Computer Graphics: 科赫曲線

 

 


遞迴繪圖的基本原則,就是以一次函式呼叫的繪圖為基礎,每次遞迴時依同樣的原則繪製圖形,遞迴繪圖單一原則的方式與自然界的一些事物之幾何有相類似之處,許多複雜的圖形其實遵循著一定的規則,而遞迴繪圖往往可以這些自然界的幾何,例如樹的成長、螺紋、雪花結晶等等。

(對於線的遞迴繪圖而言,其0次繪圖通常是一條直線)

科赫曲線(Koch Curves)是由數學家科赫(H.von Koch)所發明的,其1次繪圖的原則如下:



繪圖原則是將一條長度L的直線分為三分,第一次畫L/3,然後仰60度再畫L/3,然後俯120度再畫L/3,然後仰60度再畫L/3。

如果是2次科赫曲線,則L會被分為L/(3^2),接下來依此類推,2次科赫曲線如下,注意與1次科赫曲線相同的部份在哪:



下面是3次科赫曲線:



以下是科赫曲線的實作,其中使用了二維海龜繪圖法

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

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

public class KochCurve extends JApplet {
private Turtle t;

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

setBackground(Color.black);
}

public void koch(int n, double leng, Turtle t) {
if(n == 0)
t.move(leng);
else {
koch(n-1, leng, t);
t.turn(60);
koch(n-1, leng, t);
t.turn(-120);
koch(n-1, leng, t);
t.turn(60);
koch(n-1, leng, t);
}
}

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(50, 200);
t.setangle(0);

koch(3, 10, t);
}
}

如果您將三條科赫曲線以每次旋轉120度併湊起來,可以得到類似雪花圖案的科赫島,如下所示: