Tải bản đầy đủ (.doc) (2 trang)

Đệ quy cùng hình học

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (105.26 KB, 2 trang )

Cung được đĩnh nghĩa đệ quy,
quy tắc và cách vẽ
Phạn Xuân Bách
Cung là một đối tượng cơ bản trong đồ học vi tính. Cung cho ta những hình ảnh đơn giản
nhưng khá bắt mắt (trừ những khung phức tạp như Fratal). Các cung thường có quy tắc và
được định nghĩa dưới dạng tham số hay đệ quy.ở đây chúng ta chỉ xét các cung được định
nghĩa đệ quy. Cũng có thể bạn không hứng thú lắm với hình ảnh các cung nhưng mình
nghĩ thuật toán để vẽ có thể giúp ích được cho bạn trong khi lập trình đấy.
Chúng ta xét 4 cung cơ bản là cung koch, cung C, cung Hilbel và cung Sierpinski.
1. Cung Koch
Cung này được nhà toán học Helge von Koch tìm ra năm 1904, nó có thể tạo ra một đường
dài vô hạn trong một vùng hữu hạn. Nó được định nghĩa như sau:
Từ một đoạn thẳng ban đầu, nó được thay thế 4 đoạn thẳng có cùng chiều dài và bằng 1/3
chiều dài đoạn thẳng ban đầu. Cách bố trí như hình vẽ.(hình)
Đó là cung Koch bậc 1. Để vẽ cung Koch bậc 2 ta thay mỗi đoạn của cung Koch bậc 1 theo
quy tắc đó. Cũng theo quy tắc đó cho mỗi đoạn của cung Koch bậc n-1, ta có cung bậc n.
Đây là thuật giải để vẽ.
Procdure Koch(dir, len:real; n: byte);
Const rads=0,017453292; {pi/180}
Begin
If n>0 then
Begin
Koch(dir,len/3,n-1);{đoạn 1}
Koch(dir+60,len/3,n-1);{đoạn 2}
Koch(dir-60,len/3,n-1);{đoạn 3}
Koch(dir,len/3,n-1);{đoạn 4}
End
ElseLineRel(Round(len*cos(Rads*dir)),-Round(len*sin(Rads*dir)));
End;
Với dir,len là hướng (góc) và độ dài ban đầu; n: độ sâu của đệ quy.
Một đoạn thẳng bất kỳ có thể vẽ được thành cung Koch. Chúng ta có thể vẽ cung Koch cho


các cạch của một đa giác bất kỳ miễn là biết được đỉnh, góc bắt đầu và độ dài của một
cạnh. Bằng hình học giải tích vectơ, bạn có thể biết được những yếu tố đó nhưng phải quy
ước chiều quay của các cạnh là cùng chiều với kim đồng hồ. Và lúc đó bạn sửa tham số thế
nào cho hợp?
Đây là đoạn chương trình vẽ cung Koch trên ba cạnh của tam giác đều với đỉnh đầu là
(x
s
,y
s
), độ dài len theo phương có góc bắt đầu là A
s

Procedure UDKoch(x
s
,y
s
:integer;A
s
,len:real;n:byte);
Begin
MoveTo(x
s
,y
s
);
Koch(A
s
+60,len,n);
Koch(A
s

-60,len,n);
Koch(A
s
+180,len,n);
End;
Bạn thử vẽ cung Koch cho đa giác đều m đỉnh thử xem.
2. Cung C.
Cung C hình thành dựa vào việc tinh chế một đoạn thẳng và tiến trình đó được định nghĩa
như sau:
Dựa vào cách định nghĩa, bạn thử xây dựng thủ tục vẽ cung C xem. Ta có được cung C bậc
n bằng việc thay mỗi đoạn thẳng của cung C bậc n-1 theo cùng quy tắc.
Từ cung C, cung rồng được định nghĩa như sau: (hình)
Tinh chế đoạn thứ hai trong cung C theo chiều ngược với đoạn thứ nhất, ta thu được cung
rồng.
Đây là thủ tục vẽ cung rồng với h là biểu điều khiển hướng quay.
Procedure CungR(dir, len: real;h :shortint; n:byte);
Const fct=0.707106781; {1/sqrt(2)}
Begin
If n>0 then
Begin
cungR(dir+h*45,len*fct,1,n-1);
cungR(dir-h*45,len*fct,-1,n-1);
end
else
LineRel(Round(len*cos(rads*dir)),-Round(len*sin(rads*dir)));
End;
Lúc gọi thủ tục, bạn gọi với tham số h=1; Khi vẽ bạn nhớ đến điểm khởi đầu, hướng bắt
đầu, độ dài và độ sâu đệ quy. Bạn có thể tạo điểm dừng đệ quy cho chiều dài của cạnh, chỉ
thực hiện khi len còn lớn hơn Minlen (tuỳ độ phân giải thiết bị).
Hẹn gặp lại bạn khi chúng ta tìm hiểu về cung Hilbert và cung SierpinaSki, những cung

được định nghĩa phức tạp hơn.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×