theo da Vinci. Do đú cỏc dạng cỏc dạng cấu trỳc giống cõy, mụ hỡnh đơn giản đƣợc cho ở trờn cú khả năng ỏp dụng cho cỏc hệ thống sụng tốt hơn cỏc cõy, vỡ thƣờng cú nhiều hơn hai con sụng nhỏnh của một hệ thống sụng sẽ nối với nhau ở cựng một nơi. Cỏc cõy khỏc đƣợc tỡm thấy trong cơ thể con ngƣời là hệ thống động mạch và cuống phổi dựng để vận chuyển mỏu và oxy, trong đú đối với hệ thống cuống phổi là 3 và đối với động mạch là 2.7.
Khi chỳng ta xõy dựng cõy chỳng ta sẽ sử dụng biểu thức: (a)
Ở đõy Bn là đƣờng kớnh của nhỏnh ở mức thấp hơn. Bn+1 biểu diễn đƣờng kớnh mỗi nhỏnh con khi Bn tỏch thành hai nhỏnh.
Chỳng ta cũng cần xem xột chiều dài mỗi nhỏnh. McMahon nghiờn cứu cỏc loại cõy kiểu mẫu khỏc nhau và đƣa ra cụng thức nhƣ sau cho chiều dài:
(b)
Với Ln là chiều dài của nhỏnh trƣớc đú và Ln+1 chiều dài của mỗi nhỏnh trong hai nhỏnh kế sau khi nhỏnh trƣớc đú đƣợc tỏch ra làm hai.
Để tạo thành một cõy, ở đõy chỳng ta sử dụng đồ hoạ con rựa. Gọi:
(X,Y) là toạ độ của gốc cõy.
Height, Width là chiều cao và chiều rộng của cõy.
Letf_Alpha, Right_Alpha là gúc Alpha bờn trỏi và gúc Alpha bờn phải. Left_Angle, Right_Angle là gúc rẽ bờn trỏi và gúc rẽ bờn phải của nhỏnh.
Level là mức của cõy. Color1 là màu của thõn cõy. Color2 là màu của tƣớc cõy. Color3 là màu của lỏ cõy.
Thuật toỏn: n B n B 1 2 1 n L n L 3 2 2 1
(i) Tớnh cỏc hệ số:
+ Chiều rộng trỏi và phải theo cụng thức (a).
Left_Width_Factor = pow (2, -1.0 / Left_Alpha ); Right_Width_Factor = pow (2, -1.0 / Right_Anpha ); + Chiều cao trỏi và phải theo cụng thức (b)
Left_Height_Factor = pow (2, -2.0 / (3 * Left_Alpha));
Right_Height_Factor = pow (2, -2.0 / (3 * Right_Alpha));
(ii) Xỏc định toạ độ ngọn của thõn cõy: X1 = X;
Y1 = Y + Height;
(iii) Vẽ thõn cõy từ (X, Y) đến (X1, Y1) với màu Color1 và chiều rộng là Width.
DrawLine (X, Y, X1,Y1, Color1, Width); (iv) Phỏt sinh nhỏnh bờn trỏi:
a) Xỏc định gốc giữa thõn cõy và trục x (tức là gúc của con rựa) Turtle_Theta = Point (X, Y, X1, Y1);
b) Quay con rựa về phớa bờn trỏi một gúc Left Turn (Left_Angle, &Turtle_Theta);
c) Sau đú gọi hàm Generator để phỏt sinh ra nhỏnh bờn trỏi. Generator (X1, Y1,Left_Width_Factor * Width, Left_Height_Factor * Height, Level);
v) Phỏt sinh bờn nhỏnh bờn phải:
a) Xỏc định gốc giữa thõn cõy và trục x (tức là gúc của con rựa) Turtle_Theta = Point (X, Y, X1, Y1);
b) Quay con rựa về phớa phải một gúc Right_Angle Turn (-Right_Angle, &Turtle_Theta);
c) Sau đú gọi hàm Generator để phỏt sinh ra nhỏnh bờn phải Generator (X1, Y1, Right_Width_Factor * Width, Right_Height_Factor * Height, Level); Hàm Generator cú đoạn mó nhƣ sau:
Generator (float X, float Y,float Width, float Height, unsigned char Level)
{
(i) Xỏc định vị trớ con rựa hiện tại và chiều dài một bƣớc của con rựa
Turtle_X = X; Turtle_Y = Y; Turtle_R = Height;
(ii) Xỏc định ngọng của tƣớc mới phỏt sinh và giảm mức đi một đơn vị.
X2 = Turtle_X; Y2 = Turtle_Y; Level--;
(iii) Vẽ đoạn thẳng từ (X, Y) đến (X2, Y2) với độ rộng là Width và màu đƣợc xỏc định nhƣ sau:
+ Nếu Level < 3 thỡ màu hiện thời là Color2. + Nếu Level >= 3 thỡ màu hiện thời là Color3. If (Level < 3)
DrawLine (X, Y, X2, Y2, Width, Color2); Else
DrawLine (X, Y, X2, Y2, Width, Color3);
iv) Nếu Level > 0 thỡ chỳng ta tiếp tục phõn làm hai nhỏnh trỏi và phải.
if (Level > 0) {
Turtle_Theta = Point(X, Y, X2, Y2); Turtle (Left_Angle, &Turtle_Theta);
Generator (Turtle_X, Turtle_Y, Left_Width_Factor * Width, Left_Height_Factor * Height, Level )
Turntle_Theta = Point (X, Y, X2, Y2); Turn (- Right_Angle, &Turtle_Theta); Generator (X2, Y2, Right_Width_Factor * Width,
Right_Height_Factor * Height, Level);
} }
Sau đõy là hỡnh minh hoạ một cõy fractal với Level = 14, Height = 80, Width = 20, Left_Alpha = 2.0, Right_Alpha = 2.2, Left_Angle = 20, Right_Angle = 28.