Koch曲線是一個典型的“數學怪物”,它的特點是處處連續但點點不可微。下面將講解Koch曲線的形成原理及matlab程序實現(對空間上的任意兩個點,畫出它們的Koch曲線)
形成過程
對於二維空間上的任意一條線段,將該線段的兩個端點稱爲首點和尾點,我們需要利用這首點和尾點來得到新的五個點。
首先,第一和第五個點即是首點和尾點,第二和第四個點是上述線段的兩個三等分點,而第三個點是跟這兩個三等分點組成等邊三角形的三角形頂點。依次將五個點連接起來,便得到迭代一次的Koch曲線,然後對新得到的曲線上相鄰的兩個點做同樣的操作。如此重複便可以得到Koch曲線,如下圖所示。
對原始線段迭代一次之後得到的四折線段可以看成是原始線段分別做了四次變換之後得到的線段,一般的變換式爲
其中
程序實現
定義Koch曲線函數
function Koch_line(time, A)
% time:迭代次數 A:初始兩點座標(列向量)
% time=10;A=[0,1; 0,0];
w1 = [1.0/3, 0; 0, 1.0/3]; t1 = [0, 0];
w2 = [1.0/6, -sqrt(3)/6; sqrt(3)/6, 1.0/6]; t2 = [1.0/3, 0];
w3 = [1.0/6, sqrt(3)/6; -sqrt(3)/6, 1.0/6]; t3 = [1.0/2, sqrt(3)/6];
w4 = [1.0/3, 0; 0, 1.0/3]; t4 = [2.0/3, 0];
for i=1:time
test_A = zeros(2, 1+4^i);
[m,n] = size(A);
for j=1:n-1 % 每次儲存4個節點
test_A(:, (j-1)*4+1) = A(:, j); % 首點
test_A(:, (j-1)*4+2) = 1/3 * (A(:, j+1)-A(:, j)) + A(:, j); % 首點通過第二個變換得到
test_A(:, (j-1)*4+3) = w2*(A(:, j+1)-A(:, j)) + A(:, j) + 1/3 * (A(:, j+1)-A(:, j)); % 尾點通過第二個變換得到
test_A(:, (j-1)*4+4) = 2/3 * (A(:, j+1)-A(:, j)) + A(:, j); % 首點通過第四個變換得到
end
test_A(:, end) = A(:, end);
A = test_A;
end
figure,line(A(1, :), A(2, :))
axis([0 1 0 1])
end
演示
time=10;A=[0,1; 0,0];
Koch_line(time, A)
time=10;A=[0,1; 0,1];
Koch_line(time, A)
注意
1、點的計算
已知首點和尾點,現在需要得到新的五個點。
首先,第一和第五個點就是原先的首尾點,其次,第二個點可以由尾點通過變換得到,也可以由首點通過變換得到,第三個點可以由尾點通過變換得到,也可以由首點通過變換得到,第四個點可以由尾點通過變換得到,也可以由首點通過變換得到。
所以我在寫程序的時候第一和第五個直接由首尾點得到,第二個點是由首點通過變換得到,第三個點是由尾點通過變換得到,第四個點是由首點通過變換得到,這樣就能減少使用變換。
2、是否繞原點旋轉
通過變換,可以用首點和尾點的座標得到新的五個點的座標,但同時需要注意到,這種變換隻針對原來的兩個點有一個是原點的情況下,其中像變換和,它們是將線段繞原點進行旋轉,再加上一個平移量。而對於空間上的任意兩個點進行變換,如果仍然採用上述的變換矩陣,將不會得到希望的結果。
這時就需要對首點和尾點進行平移,將它們的旋轉中心平移到原點,再進行旋轉變換,之後再平移回去。
舉個例子能更明白一些,比如對首尾點相連的線段進行變換,首先是將繞首點逆時針旋轉60度,然後將縮小爲原來長度的三分之一,最後沿尾點的方向平移原來長度的三分之一距離。如果首點不是原點,則進行上述的變換並不能得到所要的結果,這時需要先將首尾點的座標值減去首點的座標值,在進行上述變換,最後再把首點的座標值加上,如此操作才能畫出正確的Koch曲線。
參考資料
李水根,吳紀桃《分形與小波》