Download miễn phí Trình bày các kỹ thuật hình học phân hình thông qua sự khảo sát các cấu trúc Fractal cơ sở và thuật toán chi tiết để tạo nên các cấu trúc này
LỜI NÓI ĐẦU. 1
Chương I:SỰ RA ĐỜI VÀ CÁC KẾT QUẢ CỦA HÌNH HỌC PHÂN HÌNH. 5
I.1 Sự ra đời của lý thuyết hình học phân hình 5
Tính hỗn độn của các quá trình phát triển có quy luật trong tự nhiên 5
Sự mở rộng khái niệm số chiều và độ đo trong lý thuyết hình học Eulide cổ điển 8
I.2 Sự phát triển c ủa l ý thuyết hình học phân hình 9
I.3 Các ứng dụng tổng quát của hình học phân hình 10
Ứng dụng trong vấn đề tạo ảnh trên máy tính 11
Ứng dụng trong công nghệ nén ảnh 11
Ứng dụng trong khoa học cơ bản 13
I.4 Các kiến thức cơ sở của hình học phân hình 13
I.4.1 Độ đo Fractal 13
I.4.2 Các hệ hàm lặp IFS 17
Chương II : MỘT SỐ KỸ THUẬT CÀI ĐẶT HÌNH HỌC PHÂN HÌNH. 21
II.1 Họ đường Von Kock 21
Đường hoa tuyết Von Kock-Nowflake 21
Đường Von Kock-Gosper 26
Đường Von Kock bậc hai 3-đoạn 28
Đường Von Kock bậc hai 8-đoạn 30
Đường Von Kock bậc hai 18-đoạn 32
Đường Von Kock bậc hai 32-đoạn 33
Đường Von Kock bậc hai 50-đoạn 35
Generator phức tạp 38
II.2 Họ đường Peano 44
Đường Peano nguyên thuỷ 44
Đường Peano cải tiến 45
Tam giác Cesaro 49
Tam giác Cesaro cải tiến 51
Một dạng khác của đường Cesaro 54
Tam giác Polya 56
Đường Peano-Gosper 58
Đường hoa tuyết Peano 7-đoạn 62
Đường hoa tuyết Peano 13-đoạn 66
II.3 Đường Sierpinski 70
II.4 Cây Fractal 73
Các cây thực tế 73
Biểu diễn toán học của cây 73
II.5 Phong cảnh Fractal 77
II.6 Hệ thống hàm lặp (IFS) 84
Các phép biến đổi Affine trong không gian R2 84
IFS của các pháp biến đổi Affine trong không gian R2 85
Giải thuật lặp ngẫu nhiên 86
II.7 Tập Mandelbrot 88
Đặt vấn đề 98
Công thức toán học 88
Thuật toán thể hiện tập Mandelbrot 89
II.8 Tập Julia 94
Đặt vấn đề 94
Công thức toán học 94
Thuật toán thể hiện tập Julia 95
II.9 Họ các đường cong Phoenix 97
Chương III : GIỚI THIỆU VỀ NGÔN NGỮ CÀI ĐẶT VÀ KẾT QUẢ CHƯƠNG TRÌNH. 100
III.1 Giới thiệu về ngôn ngữ cài đặt 100
III.2 Kết quả chương trình 111
TÀI LIỆU THAM KHẢO 116
http://cloud.liketly.com/flash/edoc/jh2i1fkjb33wa7b577g9lou48iyvfkz6-swf-2015-09-09-trinh_bay_cac_ky_thuat_hinh_hoc_phan_hinh_thong_qua_su_khao.RegN0mpUgj.swf /tai-lieu/trinh-bay-cac-ky-thuat-hinh-hoc-phan-hinh-thong-qua-su-khao-sat-cac-cau-truc-fractal-co-so-va-thuat-toan-chi-tiet-de-tao-85145/
Để tải tài liệu này, vui lòng Trả lời bài viết, Mods sẽ gửi Link download cho bạn ngay qua hòm tin nhắn.
Ketnooi -
Ai cần tài liệu gì mà không tìm thấy ở Ketnooi, đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí
Tóm tắt nội dung tài liệu:
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
else
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
Turn(Angles[ I/2 ],Turtle_Theta);
XTemp = XPoints [NumLines -1];
YTemp = YPoints [NumLines -1];
for (I= 0 ; I
pDC->LineTo((int)XPoints[ I+1 ],(int)YPoints[ I+1 ]);
delete[]XPoints;
delete[]YPoints;
Đối với Level > 1 thì hàm này giống như hàm –Generator của đường Peano gốc. Với Level = 1, thì hàm này có hơi khác một chút. Thay vì định nghĩa bước con rùa (là biến Turtle_R) bằng 1/3 chiều dài đoạn thẳng ban đầu thì ta định nghĩa nó bằng 1/18 chiều dài đoạn thẳng ban đầu, về cơ bản generator được viết sao cho con rùa vẫn đi qua con đường giống như generator của đường Peano gốc, sử dụng các góc quay giống nhau, nhưng dùng 6 bước thay vì 1 bước như generator của Peano gốc. Tuy nhiên, các điểm được lưu trữ trong các mảng toạ độ có thay đổi. Sau khi lưu trữ toạ độ thứ nhất, ta lưu trữ vị trí sau bước 5, vị trí kế tiếp được lưu trữ ở cuối bước 1 sau khi quay đi một góc đầu tiên. Các vị trí còn lại được lưu trữ sau bước 5 và sau bước đầu tiên của đoạn thẳng kế, ngoại trừ bước 5 của đoạn thẳng cuối cùng sẽ không được lưu trữ lại. Kết quả là khi các đoạn thẳng được vẽ, chúng sẽ tạo nên một đường xiên nối các điểm 1/6 khoảng cách trên mỗi đoạn thẳng gặp nhau ở góc. (Ở đây NumLines = 19).
□ TAM GIÁC CESARO:
Hình sau cho chúng ta xem một generator rất đơn giản (initiator là đoạn thẳng nằm ngang):
Generator chứa hai cạnh của một tam giác cân. Do đó, số đoạn thẳng là N=2 và chiều dài của mỗi đoạn là:
Giả sử đoạn thẳng ban đầu có chiều dài là 1. Khi đó số chiều fractal là:
Phụ thuộc vào các điều kiện cụ thể, generator này sẽ được đặt bên trái hay bên phải của mỗi đoạn thẳng mà nó thay thế. Nhiều đường cong khác nhau hoàn toàn có thể được sinh ra từ generator này. Các đường này được khám phá bởi Ernest Cesaro vào năm 1905.
Các hình sau là các mức khác nhau của tam giác Cesaro:
Mức thứ nhất
Mức thứ năm
Ở bất kỳ mức nào trong việc xây dựng đường này, generator luôn được đặt ở bên phải của mỗi đoạn thẳng ở mức đầu tiên, bên trái của mỗi đoạn thẳng ở mức thấp hơn kế tiếp, bên phải của mỗi đoạn thẳng ở mức thấp hơn kế tiếp nữa v.v…
Như vậy đoạn mã của hàm Generator có thêm mảng Sign để lúc quay theo các góc khác nhau, chúng ta nhân tương ứng với phần tử của mảng Sign được khởi động như sau:
for (I = Level; I >=0; --I )
{
Sign [ I ] = Sign1;
Sign1 = -1;
}
Với Sign1 có thể khởi động lúc đầu là 1 hay -1.
// Sau đây là Edit Code của đường cong Tam Giác Cesaro.
void CesaroTriangleGenerator(CDC *pDC,double X1, double Y1, double X2, double Y2, int Level,int NumLines, double LineLen, double Angles[],int Sign[])
double *XPoints ,*YPoints;
int I;
double Turtle_Theta,Turtle_X, Turtle_Y, Turtle_R;
XPoints = new double [NumLines + 1];
YPoints = new double [NumLines + 1];
--Level;
Turtle_R=sqrt((X2-X1)* (X2-X1)+ (Y2-Y1)* (Y2-Y1))*LineLen;
XPoints[0]= X1;
YPoints[0]= Y1;
XPoints[NumLinesv -1]= X2;
YPoints[NumLines -1]= Y2;
Turtle_Theta = Point(X1,Y1,X2,Y2);
Turtle_X=X1;
Turtle_Y=Y1;
for (I=NumLines ; I>=1 ;I-=2)
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
XPoints[ I ]=Turtle_X;
YPoints[ I ]=Turtle_Y;
Turn(Angles[ I ]*Sign[Level],Turtle_Theta);
if (Level)
for ( I=0 ; I
Y1 = YPoints [ I ];
X2 = XPoints [ I+1 ];
Y2 = YPoints [ I+1 ];
CesaroTriangleGenerator(pDC, X1, Y1, X2, Y2Level, NumLines, LineLen, Angles, Sign );
else
for ( I= 0; I
pDC->LineTo((int)XPoints[ I+1 ],(int)YPoints[ I+1 ]);
delete[]XPoints;
delete[]YPoints;
□ TAM GIÁC CESARO CẢI TIẾN:
Tam giác mô tả ở trên hơi khó để lần theo dấu vết vì đường rẽ theo góc 900 từ tâm của đoạn thẳng gốc thật sự đi lại theo vết của nó nhưng không thể quan sát được khi vẽ. Việc cập nhật đường cesaro có thể thực hiện bằng cách thay đổi góc generator từ 900 sang 850 đối với mức thấp nhất trước khi thực hiện quá trình vẽ.
Hình sau minh hoạ một generator (initiator là đoạn thẳng nằm ngang ).
Giống như đường Peano cải tiến, kết quả thu được là một đường cong mà số chiều fractal không hoàn toàn là 2, nhưng khi số lần đệ quy tiến ra vô cực thì số chiều fractal tiến về 2.
Hình sau cho chúng ta thấy mức thứ tư của tam giác Cesaro cải tiến:
Ta tính chiều dài mỗi đoạn của generator.
Giả sử chiều dài đoạn thẳng gốc là a
Ta có:
AE = a / 2
Đặt:
AC = b
CD = c
Ta có:
Mà
Ta có:
Đoạn mã của hàm –Generator như sau:
void ModifiedCesaroGenerator(CDC *pDC,double X1, double Y1, double X2, double Y2, int Level,int NumLines, double LineLen, double Angles[],int Sign[])
double *XPoints , *YPoints ;
int I;
double Turtle_Theta,Turtle_X, Turtle_Y, Turtle_R,Turtle_R1;
XPoints = new double [NumLines + 1];
YPoints = new double [NumLines + 1];
--Level;
Turtle_R1=sqrt((X2-X1)* (X2-X1)+ (Y2-Y1)* (Y2-Y1))*LineLen;
Turtle_R=Turtle_R1* 0.9128442;
XPoints [0]= X1;
YPoints [0]= Y1;
XPoints[NumLines -2]= X2 ;
YPoints[NumLines -2]= Y2 ;
Turtle_Theta = Point(X1,Y1,X2,Y2);
Turtle_X=X1;
Turtle_Y=Y1;
for (I=NumLines -1; I >=1; I-=2)
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
XPoints[ I ]=Turtle_X;
YPoints[ I ]=Turtle_Y;
Turn(Angles[ I ]* Sign[Level],Turtle_Theta);
if (I= =NumLines - 1)
Turtle_R=Turtle_R1;
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
XPoints[NumLines ]=Turtle_X;
YPoints[NumLines ]=Turtle_Y;
Turn(Angles[NumLines ]* Sign[Level],Turtle_Theta);
if (Level)
for (I= 0; I
Y1 = YPoints [ I ];
X2 = XPoints [ I+1 ];
Y2 = YPoints [ I+1 ];
ModifiedCesaroGenerator(pDC, X1, Y1, X2, Y2,Level,NumLines, LineLen, Angles,Sign);
else
for (I= 0; I
pDC->LineTo((int)XPoints[ I+3 ],(int)YPoints[ I+3 ]);
for (I= 1; I
pDC->LineTo((int)XPoints[ I+2 ],(int)YPoints[ I+2 ]);
delete[]XPoints;
delete[]YPoints;
Hàm này giống với hàm trong đường Cesaro gốc nhưng lúc này mảng Angle là {0, -170, 0, 85, 0 } và NumLines = 4, đồng thời chiều dài các đoạn của generator có khác nhau. Chúng chia làm hai loại:
Loại chiều dài thứ nhất: Bằng nửa chiều dài của đoạn thẳng ban đầu.
Loại chiều dài thứ hai: Bằng nửa chiều dài của đoạn ban đầu nhân với 0.9128442.
□ MỘT DẠNG KHÁC CỦA ĐƯỜNG CESARO:
Giả sử chúng ta bắt đầu với đường generator và hai mức đầu tiên như ở đường Cesaro, nhưng sử dụng sự sắp xếp khác đi khi đặt generator về phía bên trái và phải của đoạn thẳng gốc khi chúng ta ở mức cao hơn. Kết quả là nhiều đường khác nhau có thể được sinh ra từ cách sắp xếp này.
Hình sau cho chúng ta mức khác nhau của hình Cesaro này:
Đoạn mã của hàm –Generator như sau:
void OtherCesaroGenerator(CDC *pDC,double X1, double Y1, double X2, double Y2, int Level,int NumLines,
double LineLen, double Angles[],int Sign)
double *XPoints ,*YPoints;
int I;
double Turtle_Theta,Turtle_X, Turtle_Y, Turtle_R;
XPoints = new double [NumLines + 1];
YPoints = new double [NumLines + 1];
--Level;
Turtle_R=sqrt((X2-X1)* (X2-X1)+ (Y2-Y1)* (Y2-Y1))*LineLen;
XPoints[0]= X1;
YPoints[0]= Y1;
XPoints[NumLinesv -1]= X2;
YPoints[NumLines -1]= Y2;
Turtle_Theta = Point(X1,Y1,X2,Y2);
Turtle_X=X1;
Turtle_Y=Y1;
for (I=NumLines; I>=1; I-=2)
Step(Turtle_X, Turtle_Y, Turtle_R, Turtle_Theta);
XPoints[ I ]=Turtle_X;
YPoints[ I ]=Turtle_Y;
Turn(Angles[ I ]*Sign,Turtle_Theta);
Sign= -1;
if (Level)
for(I=0; I
Y1 = YPoints [ I ];
...