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