1. Trang chủ >
  2. Công nghệ thông tin >
  3. Lập trình >

Bài tập 3. Hình học Fractal

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 (1.07 MB, 39 trang )


Báo Cáo Thực Hành Đồ Họa Máy Tính



}w;

struct point{

float x,y;

};

struct code{

int l,t,r,b;

};

code Encode(point p)

{

code c;

c.l = p.x < w.l;

c.t = p.y < w.t;

c.r = p.x > w.r;

c.b = p.y > w.b;

return c;

};

int Inw(point p)

{

code c;

c = Encode(p);

return !(c.l||c.t||c.r||c.b);

};

int Clip(point &p1, point &p2)

{

point tmpp;

code c1,c2,tmpc;

int in1,in2;

float m;

while(1)

Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT



Trang 15



Báo Cáo Thực Hành Đồ Họa Máy Tính



{

c1 = Encode(p1); c2 = Encode(p2);

in1 = Inw(p1); in2 = Inw(p2);

if(in1 && in2) return 1;

if((c1.l&&c2.l)||(c1.t&&c2.t)||(c1.r&&c2.r)||(c1.b

&&c2.)) return 0;

if(in1)

{

tmpp = p1; p1 = p2; p2 = tmpp;

tmpc = c1; c1 = c2; c2 = tmpc;

}

if(p1.x == p2.x)

if(c1.t) p1.y = w.t;

else p1.y = w.b;

else{

m = (p2.y-p1.y)/(p2.x-p1.x);

if(c1.l)

{

p1.y += m*(w.l-p1.x);

p1.x = w.l;

}

else if(c1.t)

{



p1.x += (w.t-p1.y)/m; p1.y = w.t;}



else if(c1.r)

{



p1.y += m*(w.r - p1.x); p1.x = w.r;}

else{

p1.x +=(w.b-p1.y)/m;

p1.y = w.b;

}



Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT



Trang 16



Báo Cáo Thực Hành Đồ Họa Máy Tính



}

}}

main()

{

int gd = 0, gm;

point p1,p2;

p2.x = 100; p2.y = 100; p1.x = 400; p1.y = 450;

w.l = 150; w.t = 50; w.r = 500; w.b = 300;

initgraph(&gd,&gm,"");

rectangle((int)w.l, (int)w.t, (int)w.r,

(int)w.b);

setcolor(8);

if(Clip(p1,p2))

line((int)p1.x,(int)p1.y,(int)p2.x,(int)p2.y);

getchar();

closegraph();

}

Câu 2:

#include

#include

#include

void fill(int x,int y,int bc){

int pc,c;

c=RED;

pc=getpixel(x,y);

if(pc!=c&&pc!=bc){

putpixel(x,y,c);

fill(x-1,y,bc);

fill(x+1,y,bc);

Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT



Trang 17



Báo Cáo Thực Hành Đồ Họa Máy Tính



fill(x,y-1,bc);

fill(x,y+1,bc);}

}

main()

{

int d=0,m=0;

initgraph(&d,&m,"");

setcolor(BLUE);

circle(200,200,150);

fill(200,200,BLUE);

getch();

}

Kết quả Demo

Câu 1



Câu 2:



Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT



Trang 18



Báo Cáo Thực Hành Đồ Họa Máy Tính



Bài tập 4. Phép biến đổi 2 chiều

Thuật toán :

define Rad 0.017452 // 1o.

1.Cong Koch

+ Nếu n>0 gọi đệ quy



-



K(n-1,l/3,d);d+=60;

K(n-1,l/3,d);d-=120;

K(n-1,l/3,d);d+=60;

K(n-1,l/3,d);



+ Ngược lại linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));

2. Cong C.

+ define vuong 0.7071 // √2/2

+ Nếu n>0 gọi đệ quy



-



d+=45;

C(n-1,l*vuong,d);

d-=90;

C(n-1,l*vuong,d);

d+=45;



Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT



Trang 19



Báo Cáo Thực Hành Đồ Họa Máy Tính



+ Ngược lại linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));

3. Cong Rồng (Dragon)

+ Giống đường cong C nhưng có sự xuất hiện thêm biến dấu s.

+ Lời gọi đệ quy sẽ là:



-



d+=45*s;

CDragon(n-1,l*vuong,d,-1);

d-=90*s;

CDragon(n-1,l*vuong,d,1);

d+=45;



Mã nguồn :

Câu 1 :

#include

#include

#include

#include

#define Rad 0.017452

#define vuong 0.7071

void K(int n,float l,float d){

if(n>0){

K(n-1,l/3,d);d+=60;

K(n-1,l/3,d);d-=120;

K(n-1,l/3,d);d+=60;

K(n-1,l/3,d);

}

else

linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));

}

void C(int n,float l,float d){

if(n>0){

d+=45;

Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT



Trang 20



Xem Thêm
Tải bản đầy đủ (.docx) (39 trang)

×