Bài giảng Đồ họa máy tính - Chương 9: Kỹ thuật lặp, đệ quy ứng dụng tạo hoa văn
Tính tự tương tự: giống nhau ở mọi tỷ lệ
Tính tự tương tự chính xác: hình ảnh sau khi phóng to giống hệt hình ảnh ban đầu
Tính tự tương tự thống kê: mức độ bất quy tắc và lượn sóng chỉ giống nhau ở mức độ trung bình
Ví dụ: đường bờ biển khi nhìn từ trên cao, sau đó tiến lại gần
Fractal: các hình thức khác nhau của sự tự tương tự
Các đường cong có chiều dài vô tận có chiều nằm giữa 1 và 2
ĐỒ HỌA MÁY TÍNH
Trường Đại Học Bách Khoa TP Hồ Chí Minh
Khoa Khoa học & Kỹ thuật Máy tính
CHƯƠNG 9:
KỸ THUẬT LẶP, ĐỆ QUY ỨNG DỤNG TẠO HOA VĂN
NỘI DUNG TRÌNH BÀY
Giới thiệu
FRACTAL VÀ TÍNH TỰ TƯƠNG TỰ
Tính tự tương tự: giống nhau ở mọi tỷ lệ
Tính tự tương tự chính xác: hình ảnh sau khi phóng to giống hệt hình ảnh ban đầu
Tính tự tương tự thống kê: mức độ bất quy tắc và lượn sóng chỉ giống nhau ở mức độ trung bình
Ví dụ: đường bờ biển khi nhìn từ trên cao, sau đó tiến lại gần
Fractal: các hình thức khác nhau của sự tự tương tự
Các đường cong có chiều dài vô tận có chiều nằm giữa 1 và 2
FRACTAL VÀ TÍNH TỰ TƯƠNG TỰ
Tinh chỉnh đường cong: đường cong Koch
Tạo K n+1 từ K n bằng cách chia mỗi đoạn của K n thành 3 phần bằng nhau và thay đoạn giữa bằng một tam giác đều
Chiều dài bằng (4/3) i
K 1
K 2
FRACTAL VÀ TÍNH TỰ TƯƠNG TỰ
Bông tuyết Koch
Chu vi bằng 3(4/3) n vô cùng
Diện tích bằng (8/5)S 0 khi n vô cùng
FRACTAL VÀ TÍNH TỰ TƯƠNG TỰ
Vẽ đường cong Koch
Vẽ Kn:
if (n bằng 0)
Vẽ một đoạn thẳng;
else
{
Vẽ Kn-1
Quay trái 60 0
Vẽ Kn-1
Quay phải 120 0
Vẽ Kn-1
Quay trái 60 0
}
SINH CHUỖI VÀ TẠO ĐƯỜNG CONG PEANO
Dùng chuỗi để điều khiển con rùa
'F' có nghĩa là forward(L, l) (đi theo hướng hiện hành một khoảng L, có vẽ đoạn thẳng)
'+' có nghĩa là turn(A) (quay phải một góc A độ)
'-' có nghĩa là turn(-A) (quay trái một góc A độ)
'F-F++F-F', với góc A bằng 60 0 vẽ Knoch bậc 1
Từ chuỗi 'F-F++F-F‘ chuyển thành chuỗi phức tạp?
dựa vào tập luật sinh
'F' "F-F++F-F" (luật của đường cong Koch)
SINH CHUỖI VÀ TẠO ĐƯỜNG CONG PEANO
Chuỗi ban đầu: F
Thế hệ thứ nhất: S 1 = "F-F++F-F"
Thế hệ thứ 2: S 2 = "F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F"
for (each character ch in the input file)
if (ch == '+' || ch == '-') write it to the output file;
else if (ch == 'F') write "F-F++F-F" to the output file;
for (each character ch in the input file)
if (ch == '+') turn(A);
else if (ch == '-') turn(-A);
else if (ch == 'F') forward(1, 1);
SINH CHUỖI VÀ TẠO ĐƯỜNG CONG PEANO
produce()
produce()
produce()
a) Hai giai đoạn của quá trình sinh chuỗi
b) Hệ thống hàm lặp
F
F
S n- 1
S n
F-F++F-F
F-F++F-F-F-F++F-F++F-F++F-F-F-F++F-F
SINH CHUỖI VÀ TẠO ĐƯỜNG CONG PEANO
Mở rộng ngôn ngữ
'F' 'F'
'X' "X+YF+“ tập luật sinh đường cong con rồng
'Y' "-FX-Y"
atom = "FX“
Bắt đầu với nguyên tử F X, chúng ta có
S 1 = "FX+YF+"
S 2 = "FX+YF++-FX-YF+"
X, Y bỏ qua khi vẽ
F, +, - vẫn được thông dịch như trước đây.
SINH CHUỖI VÀ TẠO ĐƯỜNG CONG PEANO
Sinh chuỗi đệ quy và thao tác vẽ
void produceString(char *st, int order){
for(;st ; st++)
switch(*st) {
case '+': CD -= angle; break;
case '-': CD +=angle; break;
case 'F': if (order > 0) produceString(Fstr, order – 1);
else forward(length, 1);
break;
case 'X': if (order > 0) produceString(Xstr, order – 1);
break;
case 'Y': if (order > 0) produceString(Ystr, order – 1);
break;} }
SINH CHUỖI VÀ TẠO ĐƯỜNG CONG PEANO
Cho phép rẽ nhánh:
'[' : saveTurtle() lưu trạng thái hiện tại của con rùa
']' : restoreTurtle() khôi phục trạng thái của con rùa vế trạng thái trước đó.
Trạng thái của con rùa = {CP, CD}
thêm các lệnh sau vào produceString():
'[': saveTurtle();break; đẩy trạng thái hiện hành của con rùa vào ngăn xếp.
']': restoreTurtle();break; lấy trạng thái hiện hành từ đỉnh ngăn xếp.
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
Máy photocopy thực nghiệm
Các hình ảnh ở đầu ra có hội tụ về hình ảnh nào không?
a)
b)
đầu vào
bản copy
máy photocopy
hình ảnh ban đầu I 0
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
Máy photocopy Sierpinski
Hình ảnh hội tụ về tam giác Sierpinski và không phụ thuộc vào hình ảnh ban đầu
Gồm 3 thấu kính mỗi thấu kính thực hiện ba phép biến đổi cho chữ F để nhận được 3 chữ F mới
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
Máy photocopy Sierpinski
- Các phép biến đổi là
Để tiện lợi, chúng ta liệt kê các phần tử của ma trận dưới dạng danh sách
T = { m 11 , m 12 , m 21 , m 22 , m 13 , m 23 }
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
Lý thuyết của quá trình copy
hình ảnh nhập I = tập các điểm màu đen = {( x , y ) sao cho ( x , y ) được tô màu đen}
hình ảnh xuất = T 1( I ) T 2( I ) T 3( I )
tổng quát hóa W (.) = T 1(.) T 2(.) T 3(.)
khi lặp đi lặp lại thao tác đưa hình ảnh xuất vào ngõ nhập thì quỹ đạo của I 0 , I 1 , I 2 ... sẽ hội tụ về một hình ảnh gọi là nhân tố hấp dẫn A
W(A) = A
A không phụ thuộc vào hình ảnh ban đầu
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
Thực hiện thao tác vẽ ở lần lặp thứ k
I 0 là một đường gấp khúc
I 0 là một điểm
Ví dụ: vẽ lá cây dương xỉ
T 1 = {0, 0, 0, .16, 0, 0};
T 2 = {.2, .23, -.26, .22, 0, 1.6};
T 3 = {-.15, .26, .28, .24, 0, .44};
T 4 = {.85, -.04, .04, .85, 0, 1.6};
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
void superCopier(RealPolyArray pts, int k)
{
int i, j;
RealPolyArray newpts;
if(k == 0) drawPoints(pts);
else for(i = 1; i <= N; i++)
{
newpts.num = N*pts.num;
for(j = 0; j < newpts.num; j++)
transform(affines[i],pts.pt[j], newpts.pt[j]);
superCopier(newpts, k-1);
}
}
SỬ DỤNG HỆ HÀM LẶP TẠO HÌNH ẢNH
TẬP MANDELBROT
TẬP MANDELBROT
f ( z ) = z 2 + c
với giá trị ban đầu s, ta có quỹ đạo
d 1 = ( s ) 2 + c
d 2 = (( s ) 2 + c ) 2 + c
d 3 = ((( s ) 2 + c ) 2 + c ) 2 + c
d 4 = (((( s ) 2 + c ) 2 + c ) 2 + c ) 2 + c
(.) 2 + c
d k
s
f (.)
TẬP MANDELBROT
s và c có thể là số phức
quỹ đạo hội tụ và quỹ đạo phân kỳ
điểm cố định của hệ thống thỏa mãn
f(z) = z z 2 + c = z
điểm cố định hấp dẫn, điểm cố định đẩy
TẬP MANDELBROT
Định nghĩa:
với s luôn bằng 0
điểm c nằm trong M nếu quỹ đạo của 0 hội tụ
điểm c nằm ngoài M nếu quỹ đạo của 0 phân kỳ
TẬP MANDELBROT
c có nằm trong tập M hay không?
d k vượt qua giá trị 2 thì quỹ đạo phân kỳ
thời gian để d k vượt qua giá trị 2 được gọi là thời gian cư trú
c nằm trong M có thời gian cư trú rất lớn (Cận trên là Num)
int dwell(double cx, double cy){
#define Num 100
double tmp, dx = cx, dy = cy, fsq = cx * cx + cy * cy;
for(int count = 0; count <= Num && fsq <= 4; count++)
{
tmp = dx;
dx = dx * dx - dy * dy + cx;
dy = 2.0 * tmp * dy + cy;
fsq = dx * dx + dy * dy;
}
return count; }
( x + yi ) 2 = ( x 2 – y 2 ) + (2 xy ) i ,
TẬP MANDELBROT
Xác định màu cho điểm c
c nằm trong M: tô bằng màu đen
c nằm ngoài M: float v = d/(float) Num;
glColor3f(v*v, v*v, 0.2);
d
cường độ màu
1
Num
đen
xanh
đỏ, vàng
TẬP MANDELBROT
Xác định sự tương ứng giữa pixel trên màn hình với số phức c
cửa sổ
TẬP MANDELBROT
for( j = 0; j < rows; j++)
for(i = 0; i < cols; i++)
{
tìm số phức c tương ứng với pixel ở vị trí i, j
xác định thời gian cư trú của quỹ đạo
dựa trên thời gian cư trú xác định màu sắc tương ứng
setPixel(i, j, color);
}
TẬP JULIA
cho c cố định, khảo sát các giá trị khác nhau của s
Tập Julia đầy đủ: là tập hợp tất cả các điểm khởi đầu s có quỹ đạo hội tụ.
vẽ tập Julia
for( j = 0; j < rows; j++)
for(i = 0; i < cols; i++){
tìm số phức s tương ứng với pixel ở vị trí i, j
xác định thời gian cư trú của quỹ đạo
dựa trên thời gian cư trú xác định màu sắc tương ứng
setPixel(i, j, color); }
phải truyền cả s và c cho hàm dwell()
TẬP JULIA
Tập Julia J c : là đường biên của tập Julia đầy đủ K c
Tiền ảnh của z:
Các tiền ảnh của z có quỹ đạo giống như quỹ đạo của z
a)
b)
tiền ảnh của s
TẬP JULIA
Vẽ tập Julia
do{
if(coin flip is head)
else
draw dot at z;
}while (not bored);
Tính căn bậc hai của z = x + iy
, y>= 0
, y < 0
File đính kèm:
bai_giang_do_hoa_may_tinh_chuong_9_ky_thuat_lap_de_quy_ung_d.ppt

