Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa vaên
description
Transcript of Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa vaên
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
1
Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa vaên
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
2
Laùt khaûm (lôïp ngoùi) treân beà maët
ª Töï ñoïc
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
3
Ñöôøng cong Koch
ª Ñöôøng cong Koch (cung Koch)– do nhaø toaùn hoïc ngöôøi Thuïy Ñieån Helge von
Koch tìm thaáy naêm 1904– tuy naèm trong vuøng giôùi haïn, nhöng laïi coù
chieàu daøi voâ haïn.– ñöôïc xaây döïng baèng ñeä quy
K0
K1
K2
60o
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
4
Ñònh nghóa toaùn hoïc cuûa ñöôøng cong Koch
ª Ñöôøng cong Koch K0 laø moät ñoaïn thaúng coù chieàu daøi laø 1
ª Ñöôøng K1 ñöôïc xaây döïng töø ñöôøng K0 baèng caùch
– chia K0 thaønh 3 ñoaïn thaúng baèng nhau
– thay ñoaïn giöõa baèng moät ñöôøng gaáp khuùc goàm 2 caïnh, moãi caïnh daøi 1/3. Nhö vaäy K1 goàm 4 ñoaïn thaúng.
ª Ñöôøng cong Koch baäc i + 1 ñöôïc xaây döïng töø ñöôøng cong Koch baäc i. Ñöôøng Ki goàm 4i ñoaïn thaúng, moãi ñoaïn daøi 1/3i
– cho moãi ñoaïn thaúng cuûa Ki : thay ñoaïn giöõa baèng moät ñöôøng gaáp khuùc goàm 2 caïnh, moãi caïnh daøi (1/3i )/3 = 1/3i + 1.
Tính chaátª Chieàu daøi cuûa Ki laø 4i 1/3i =
i
3
4
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
5
Giaûi thuaät ñeå veõ ñöôøng cong Koch baäc n
Ñöôøng cong Koch baäc n > 0
treân ñoaïn thaúng coù höôùng
=
Ñöôøng cong Koch
baäc n 1
Ñöôøng c
ong K
och
baäc
n
1
Ñöôøng cong Koch
baäc n 1
Ñöôøng cong Koch
baäc n 1
Ñöôøng cong Koch baäc 0treân ñoaïn thaúng coù höôùng
=
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
6
Giaûi thuaät ñeå veõ ñöôøng cong Koch baäc n (tieáp)
procedure Koch(dir, len : real; n : integer);{Veõ ñöôøng cong Koch baäc n coù cô sôû laø ñoaïn thaúng coù chieàu daøi len
töø CP vaø höôùng dir ño baèng ñoä}const rads = 0.017453293; {= 1 ñoä, ñeå ñoåi ñoä sang radian}begin
if n > 0 thenbegin
Koch(dir, len / 3, n - 1);dir := dir + 60;Koch(dir, len / 3, n - 1);dir := dir 120;Koch(dir, len / 3, n - 1);dir := dir + 60;Koch(dir, len / 3, n - 1);
endelse LineRel_(len*cos(rads*dir), len*sin(rads*dir))
end;
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
7
Caây goïi ñeä quy
ª Caây goïi ñeä quy cuûa thuû tuïc Koch: goïi Koch(0, 1, 2)
0, 1, 2
0, 1/9, 0
60, 1/9, 0
-60, 1/9, 0
60, 1/9, 0
120, 1/9, 0
0, 1/9, 0
0, 1/3, 1
60, 1/3, 1
-60, 1/3, 1
0, 1/3, 1
0, 1/9, 0
60, 1/9, 0
......
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
8
Ñöôøng cong C
C0
ª Caùc ñöôøng cong C baäc 0, 1, 2, 3
C1 C2 C3
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
9
Ñònh nghóa toaùn hoïc cuûa ñöôøng cong C
ª Ñöôøng cong C0 laø moät ñoaïn thaúng coù chieàu daøi laø 1
ª Ñöôøng C1 ñöôïc xaây döïng töø ñöôøng C0 baèng caùch
– thay ñoaïn thaúng baèng moät ñöôøng gaáp khuùc goàm 2 caïnh, moãi caïnh daøi 1/2. Nhö vaäy C1 goàm 2 ñoaïn thaúng.
ª Ñöôøng cong C baäc i + 1 ñöôïc xaây döïng töø ñöôøng cong C baäc i. Ñöôøng Ci goàm 2i ñoaïn thaúng, moãi ñoaïn daøi 1/2i
(cho pheùp hai ñoaïn thaúng ñöôïc veõ lieân tieáp thaúng haøng ñöôïc khoâng keå laø moät ñoaïn)
– cho moãi ñoaïn thaúng cuûa Ci : thay baèng moät ñöôøng gaáp khuùc goàm 2 caïnh, moãi caïnh daøi (1/2i )/2 = 1/2i
+ 1.
Tính chaátª Chieàu daøi cuûa Ci laø 2i 1/2i = 2i
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
10
Giaûi thuaät ñeå veõ ñöôøng cong C baäc n
Ñöôøng cong C baäc n > 0
treân ñoaïn thaúng coù höôùng
=
Ñöô
øng c
ong C
baä
c n
1
Ñöôøng cong Cbaäc n 1
=
Ñöôøng cong C baäc 0treân ñoaïn thaúng coù höôùng
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
11
Giaûi thuaät ñeå veõ ñöôøng cong C baäc n (tieáp)
procedure DrawC(dir, len : real; n : integer);{Veõ ñöôøng C baäc n leân ñoaïn thaúng töø CP daøi len theo höôùng dir}const fct = 0.7071067; {1./caên baäc 2 cuûa 2.0}begin
if n > 0 thenbegin
dir := dir + 45;DrawC(dir, len*fct, n - 1);dir := dir - 90;DrawC(dir, len*fct, n - 1);dir := dir + 45
endelse LineRel_(len*cos(rads*dir), len*sin(rads*dir))
end;
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
12
Caây goïi ñeä quy
ª Caây goïi ñeä quy cuûa thuû tuïc DrawC: goïi DrawC(90, 1, 2)
90, 1, 2
180, 1/2, 0
90, 1/2, 0
90, 1/2, 0
135, 1/2, 1
45, 1/2, 10, 1/2, 0
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
13
Ñöôøng cong Hilbert
ª Ñöôøng cong Hilbert– Nhaø toaùn hoïc Ñöùc David Hilbert (1862-1943)– ñi qua moïi ñieåm cuûa hình vuoâng ñôn vò– khoâng coù tieáp tuyeán taïi moïi ñieåm cuûa noù
Ñöôøng cong Hilbertbaäc 3 kieåu A, kyù hieäuA3
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
14
Ñöôøng cong Hilbert
ª Ñöôøng cong Hilbert baäc D, D = 1, 2,...– 2D ñieåm chia moãi caïnh cuûa hình vuoâng thaønh
2D 1 ñoaïn baèng nhau– neáu caïnh cuûa hình vuoâng coù chieàu daøi laø 1
thì chieàu daøi cuûa moãi ñoaïn treân laø
ñoù laø chieàu daøi cuûa moãi caïnh cuûa ñöôøng cong Hilbert baäc D.
12
1
Ddisp
D = 3
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
15
Ñöôøng cong Hilbert
ª Caùc baûng duøng ñeå ñònh nghóa ñöôøng cong Hilbert
B A A C
A B B D
D C C A
C D D B
up right
right up
left down
down left
down
left
right
up
row dir
row[A, ]:
row[B, ]:
row[C, ]:
row[D, ]:
dir[A, ]:
dir[B, ]:
dir[C, ]:
dir[D, ]:
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
16
Ñöôøng cong Hilbert (tieáp)
ª Caùc ñöôøng cong Hilbert baäc 1 vaø 2
A1 B1 C1 D1
A2B2 C2 D2
upright
down
left
B1C1
A1 A1
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
17
Ñöôøng cong Hilbert (tieáp)
ª Giaûi thuaät veõ ñöôøng cong Hilbert
constA = 1; B = 2; C = 3; D = 4;up = 1; left = 2; down = 3; right = 4;
typeversion = 1..4;direction = 1..4;
varrow : array [version, version] of version;dir : array [version, 1..3] of direction;dist : real; {chieàu daøi cuûa moãi ñoaïn}
<Naïp trò vaøo caùc array row vaø dir>
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
18
Ñöôøng cong Hilbert (tieáp)
ª (tieáp)
procedure Hilbert(kind : version; order : integer);{Veõ ñöôøng cong Hilbert coù baäc order}var j : integer;begin
if order > 0 then for j := 1 to 4 do beginHilbert(row[kind, j], order - 1);if j < 4 then {khoâng caàn ñoaïn noái khi j = 4}case dir[kind, j] of
up : LineRel_(0, dist);down : LineRel_(0, -dist);left : LineRel_(-dist, 0);right : LineRel_(dist, 0)
endend
end;
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
19
Caây goïi ñeä quy
ª Caây goïi ñeä quy cuûa thuû tuïc Hilbert: goïi Hilbert(A, 3)
A, 3
A, 1
B, 1
B, 1
B, 1
A, 1
A, 1
B, 2
A, 2
A, 2
C, 2
D, 1
C, 1
......
B, 0
A, 0
A, 0
C, 0
etc
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
20
Caây fractal
ª Moät caây laø moät nhaùnh vôùi moät soá caây moïc ra töø cuoái nhaùnh.
p
p2
L
A
F
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
21
Caây fractal (tieáp)
ª Giaûi thuaät veõ caây fractal
varFanratio, {tyû soá giöõa goùc xoøe ra cuûa nhaùnh vaø goùc xoøe ra
cuûa nhaùnh cha cuûa noù}LengthRatio : real; {tyû soá giöõa chieàu daøi cuûa nhaùnh vaø chieàu daøi cuûa
nhaùnh cha cuûa noù}NumBranch : integer; {soá löôïng caùc nhaùnh moïc ra töø cuoái moãi nhaùnh
cha}procedure Tree(p : point; A, L, F : real; n : integer);{veõ caây baäc n taïo moät goùc A ñoä, chieàu daøi L, vaø goùc xoøe ra F. Baét ñaàu taïi p}const rads = 0.017453293; {= 1 ñoä, ñeå ñoåi ñoä sang radians}var
i, num : integer;p2 : point;delang, ang : real;
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
22
Caây fractal (tieáp)
ª (tieáp)
beginif n > 0 then begin
p2.x := p.x + L*cos(rads*A);p2.y := p.y + L*sin(rads*A);Line(p, p2); {veõ nhaùnh}num := NumBranch;if num > 1 then delang := F/(num - 1.0) else delang := 0.0;ang := A - F/2.0 - delang; {saün saøng cho nhaùnh thöù nhaát}for i := 1 to num do begin
ang := ang + delang;Tree(p2, ang, L* LengthRatio, F* FanRatio, n - 1)
endendelse DrawLeaf {thuû tuïc veõ laù giaû söû ñaõ coù}
end;
30.9.2004 Chöông 6: Kyõ thuaät laëp, ñeä quy, öùng duïng taïo hoa
vaên
23
Baøi thí nghieäm/thöïc haønh 5
ª 1. Cho caùc caùc ñoaïn thaúng ab vaø cd vôùi caùc ñieåm bieân a = (1, 2), b = (3, 3) c = (2, 4), d = (3, 0).
Haõy xaùc ñònh xem caùc ñoaïn ab vaø cd coù caét nhau khoâng maø khoâng caàn giaûi phöông trình naøo caû. Haõy giaûi thích caâu traû lôøi!
ª 2. Vieát giaûi thuaät veõ hình boâng tuyeát Koch.ª 3. Hieän thöïc giaûi thuaät veõ ñöôøng cong Hilbert.ª 4. Cho maøn hình coù ñoä phaân giaûi 1024 768 pixels.
Ñeå veõ moät ñoaïn thaúng naèm ngang hay thaúng ñöùng treân maøn hình maø coøn nhaän ra ñöôïc, ngöôøi ta caàn ít nhaát 3 pixels. Xaùc ñònh baäc toái ña cuûa ñöôøng cong Hilbert coøn nhaän ra ñöôïc treân maøn hình.