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

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

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



+ 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



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



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

d-=90;

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

d+=45;

}

else

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

}

void CDragon(int n,float l,float d,int s){

if(n>0){

d+=45*s;

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

d-=90*s;

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

d+=45;

}

else

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

main(){

int gd=0,gm=0;

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

setcolor(WHITE);

// Koch

outtextxy(10,0,"Duong cong Koch: ");

moveto(200,0);

K(4,300,0);

// C

outtextxy(10,150,"Duong cong C: ");

moveto(200,150);

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



Trang 21



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



C(10,100,0);

// Dragon

outtextxy(10,300,"Duong cong Dragon: ");

moveto(200,300);

CDragon(10,100,0,1);

getch();

closegraph();}

Câu 2 :

#include"AFFINE.H"

#include

#include

void vetructoado(){

setcolor(BLUE);

int Ox=getmaxx()/2;

int Oy=getmaxy()/2;

//Ox

line(Ox,20,Ox,Oy);

//Oy

line(Ox,Oy,getmaxx()-20,Oy);

//Oz

line(Ox,Oy,Ox-150,Oy+150);

//Goc toa do

setcolor(YELLOW);

circle(Ox,Oy,1);

settextjustify(1,1);

setcolor(BLUE);

outtextxy(Ox,20,"^");

outtextxy(getmaxx()-20,Oy,">");

outtextxy(Ox+10,Oy+10,"O");

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



Trang 22



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



outtextxy(Ox+10,20,"Y");

outtextxy(getmaxx()-20,Oy+10,"X");

outtextxy(Ox-150,Oy+150,"<");

outtextxy(Ox-160,Oy+160,"Z");

}

void tudien(point *p1,point*p2,point *p3,point*p4,int

mau)

{ setcolor(mau);

veduong(p1,p2);

veduong(p1,p3);

veduong(p1,p4);

veduong(p2,p3);

veduong(p3,p4);

veduong(p2,p4);

}

void xoaycheo(point *p1,point*p2,point *p3,point*p4)

{

point q1,q2;

for(int i=1;i<=5;i++){

q1=quay(p1,p2,i*30);

q2=quay(p1,p3,i*30);

tudien(p1,&q1,&q2,p4,RED);

delay(500);

tudien(p1,&q1,&q2,p4,BLACK);

}}

void xoaydoc(point *p1,point*p2,point *p3,point*p4)

{ //xoay quanh truc ngang;

point q1,q2;

for(int i=1;i<=5;i++){

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



Trang 23



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



q1=quay(p1,p4,i*30);

q2=quay(p1,p3,i*30);

tudien(p1,&q1,&q2,p2,RED);

delay(500);

tudien(p1,&q1,&q2,p2,BLACK);

} }

void xoayngang(point *p1,point*p2,point *p3,point*p4)

{ //xoay quanh truc ngang;

point q1,q2;

for(int i=1;i<=5;i++){

q1=quay(p1,p2,i*30);

q2=quay(p1,p4,i*30);

tudien(p1,&q1,&q2,p3,RED);

delay(500);

tudien(p1,&q1,&q2,p3,BLACK);

}}

int main(){

int gd=0,gm=0,c;

point p1,p2,p3,p4;

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

vetructoado();

setcolor(WHITE);

p1.x=getmaxx()/2;

p1.y=getmaxy()/2;

p2.x=p1.x;

p2.y=p1.y-200;

p3.x=p1.x+150;

p3.y=p1.y;

p4=quay(&p1,&p3,135);

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



Trang 24



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



do{

for(int j=0;j<=10;j++)

{xoaydoc (&p1,&p2,&p3,&p4);}

vetructoado();

for(int k=0;k<=10;k++)

{xoaycheo(&p1,&p2,&p3,&p4);}

vetructoado();

for(int i=0;i<=10;i++)

{xoayngang(&p1,&p2,&p3,&p4);}

vetructoado();

} while(1) ;

vetructoado();

getch();

closegraph();}

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 25



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



Bài tập 5.



Thiết kế đường cong và mặt cong



Câu 1 : khai báo.

typedef float MATRIX[3][3];

typedef MATRIX Affine;

typedef MATRIX Point ;

Câu 2 : biến đổi ảnh của 1 điểm.

void Change(Point A,Affine &B){

B[0][0]=A[0];



B[0][1]=A[1]; B[0][2]=1;



}

Phép tịnh tiến :

void Tinhtien(Affine &T,float x,float y){

T[0][0]=1;



T[0][1]=0;



T[0][2]=0;



T[1][0]=0;



T[1][1]=1;



T[1][2]=0;



T[2][0]=x;



T[2][1]=y;



T[2][2]=1;



}

Phép quay :

void Quay(Affine &T,float fi){

T[0][0]=cos(fi);



T[0][1]=sin(fi);



T[0][2]=0.0;



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



Trang 26



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



T[1][0]=-sin(fi); T[1][1]=cos(fi);

T[2][0]=0.0;



T[2][1]=0.0;



T[1][2]=0.0;

T[2][2]=1.0;



}

Tích 2 phép affine :

void Tich(Affine A,Affine B,Affine &C){

Affine Tr1,Tr;

Tr1[0][0]=A[2][0]; Tr1[0][1]=A[2][1]; Tr1[0][2]=1;

MatMul(A,B,C,2,2);

MatMul(Tr1,B,Tr,1,2);

C[2][0]=Tr[0][0]+B[2][0];C[2][1]=Tr[0][1]+B[2][1];

}

Phép méo hình :

void Codan(Affine &T,float Sx,float Sy){

T[0][0]=Sx; T[0][1]=0;



T[0][2]=0;



T[1][0]=0; T[1][1]=Sy;



T[1][2]=0;



T[2][0]=0; T[2][1]=0;



T[2][2]=1;



}

Phép biến dạng :

void Nghieng(Affine &T,float h,float g){

T[0][0]=1;



T[0][1]=g;



T[0][2]=0;



T[1][0]=h;



T[1][1]=1;



T[1][2]=0;



T[2][0]=0;



T[2][1]=0;



T[2][2]=1;



}

Mã nguồn :

File afine.h

#include

typedef float Point[2];

typedef float Affine[3][3];

void Change(Point A,Affine &B){

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



Trang 27



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

×