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

Bài tập 5. Thiết kế đường cong và mặt cong

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



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



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



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



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



}

void Cover(Affine &A,Affine B){

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

}

void MatMul(Affine A,Affine B,Affine &C,int m,int n){

int i,j,k;

for(i=0;i
for(j=0;j
C[i][j]=0;

for(k=0;k
}

}

void Quay(Affine &T,float fi){

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



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



T[0][2]=0.0;

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

T[1][2]=0.0;

T[2][0]=0.0;



T[2][1]=0.0;



T[2][2]=1.0;}

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;



}

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;



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



Trang 28



Báo Cáo Thực Hành Đồ Họa Máy Tí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;



}

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];

}

void QuayTamO(Affine &T,float fi,float x,float y){

Affine T1,T2,Q,tam;

tam[0][2]=0;

Tinhtien(T1,-x,-y);

Tinhtien(T2,x,y);

Quay(Q,fi);

Tich(T1,Q,tam);

Tich(tam,T2,T);

}

File main.cpp

#include

#include

#include

#include

#include "affine.h"

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



Trang 29



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



#define RAD 0.01745329

int x,y,goc=0;

int tm1,tm2,tm3,tm4,c[6];

Affine A1,B1,C1,D1;

void Vecanhquat(int x,int y,int mau1,int mau2)

{

//Code ve canh quat dang test

setcolor(mau1);

c[0]=x+70; c[1]=y-260;

B1[0][0]=x+70; B1[0][1]=y-190; B1[0][2]=1;

//Canh quat thu nhat

QuayTamO(A1,goc*RAD,c[0],c[1]);

MatMul(B1,A1,C1,1,3);

line(c[0],c[1],C1[0][0],C1[0][1]);

int b0x=C1[0][0],b0y=C1[0][1];

QuayTamO(A1,(goc+30)*RAD,c[0],c[1]);

MatMul(B1,A1,D1,1,3);

QuayTamO(A1,(goc+120)*RAD,c[0],c[1]);

MatMul(B1,A1,C1,1,3);

line(c[0],c[1],C1[0][0],C1[0][1]);

int bx=C1[0][0],by=C1[0][1];

QuayTamO(A1,(goc+150)*RAD,c[0],c[1]);

MatMul(B1,A1,D1,1,3);

QuayTamO(A1,(goc+240)*RAD,c[0],c[1]);

MatMul(B1,A1,C1,1,3);

line(c[0],c[1],C1[0][0],C1[0][1]);

int b1x=C1[0][0],b1y=C1[0][1];

QuayTamO(A1,(goc+270)*RAD,c[0],c[1]);

MatMul(B1,A1,D1,1,3);

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



Trang 30



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



line(b0x,b0y,bx,by);

line(bx,by,b1x,b1y);

line(b0x,b0y,b1x,b1y);

};

main()

{

initwindow(980,480,"OTO");

outtextxy(10,360,"THUC HANH DO HOA VE MAY QUAT");

x=400;y=500;

while(!kbhit()){

Vecanhquat(x,y,GREEN,14);

delay(100);

setfillstyle(1,BLACK);

floodfill(45,5,WHITE);

goc+=20; }

getch();

closegraph();

return 0; }

Kết quả Demo



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



Trang 31



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



PHẦN 2.



BÀI TẬP TRÊN LỚP



Bài tập 1.

Viết chương trình cài đặt thuật toán Bresham. Ứng dụng thuật toán Bresham để vẽ ngôi

nhà.

Mã nguồn

#include

#include

#include

#include

#include

#include

void veduongthang(int x1,int y1,int x2,int y2,int mau)

{

int x,y,dx,dy,e,et,ekt,c=mau;

float m;

dx=x2-x1;

dy=y2-y1;

if (dx==0)

{ //outtextxy(100,100,"Truong hop dx==0");

for(x=x1,y=(y1
putpixel(x,y,c);

}

else if (dy==0)

{ //outtextxy(100,100,"Truong hop dy==0");

for(x=(x1
putpixel(x,y,c);

}

else if (dx<0) veduongthang(x2,y2,x1,y1,mau);

else { m=(float)dy/dx;

if(m==1)

{ // outtextxy(100,100,"Truong hop m==1");

for(x=x1,y=y1;x<=x2;x++,y++)

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



Trang 32



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



{

putpixel(x,y,c);

}

}

else if(m==-1)

{ //outtextxy(100,100,"Truong hop m==-1");

for(x=x1,y=y1;x<=x2;x++,y--)

putpixel(x,y,c);

}

else if(m<-1)

{ // outtextxy(100,100,"Truong hop m<-1");

ekt=dx+dx;

e=ekt+dy;

et=e+dy;

for (x=x2,y=y2;y<=y1;y++)

{

putpixel(x,y,c);

if (e<0) e+=ekt;

else

{

x--;

e+=et;

}

}

}

else if((m>-1)&&(m<0))

{ //outtextxy(100,100,"Truong hop -1
ekt=-dy-dy;

e=ekt-dx;

et=e-dx;

for (x=x1,y=y1;x<=x2;x++)

{

putpixel(x,y,c);

if (e<0) e+=ekt;

else

{

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



Trang 33



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



y--;

e+=et;

}

}

}

else if (m>1)

{

//outtextxy(100,100,"Truong hop m>1");

e=2*dx-dy;

et=2*dx-2*dy;

ekt=2*dx;

for(x=x1,y=y1;y<=y2;y++)

{

putpixel(x,y,c);

if(e<0) e+=ekt;

else {

x++;

e+=et;

}

}

}

else {

//outtextxy(100,100,"Truong hop 0
ekt=dy+dy;

e=ekt-dx;

et=e-dx;

for(x=x1,y=y1;x<=x2;x++)

{

putpixel(x,y,c);

if(e<0) e+=ekt;

else

{

y++;

e+=et;

}

}

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



Trang 34



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



}

}

}

main()

{

int i;

initwindow(640,480,"WinBGIm");

//ve may nha

veduongthang(70,150,320,50,4);

veduongthang(320,50,570,150,4);

veduongthang(570,150,70,150,4);

//ve khung nha

rectangle(120,150,520,450);

//ve cua chinh

rectangle(170,300,250,450);

//ve khoa cua chinh

circle(240,380,5);

setfillstyle(1,4);

floodfill(240,380,15);

//ve cua so

rectangle(370,200,450,280);

getch();

closegraph( );

}

Kết quả demo



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



Trang 35



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



Bài tập 2.

Viết chương trình thực hiện

-



Nhập tọa độ của P1,P2



-



Vẽ hình chữ nhật w, vẽ đường thẳng P1P2



-



Xén P1P2 vào w



-



Vẽ lại đường thẳng P1P2 với màu khác



-



Vẽ lại đường thẳng P1P2 với màu khác



Mã nguồn

#include

#include

#include

//Thuat toan to mau fill

void fill(int x, int y, int oldcolor, int newcolor)

{

int pc=getpixel(x,y);

if(pc==oldcolor)

{

putpixel(x,y,newcolor);

fill(x-1,y,oldcolor,newcolor);



fill(x,y-1,oldcolor,newcolor);



fill(x+1,y,oldcolor,newcolor);



fill(x,y+1,oldcolor,newcolor);



}

}

// Thuat toan xen hinh

struct { float l, t,r,b;}w;

struct point {float x,y;};

struct code {int l,t,r,b;};

code Encode(point p)

{

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



Trang 36



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



code c;

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

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

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

c.b = p.y
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;

float m;

int in1,in2;

while(1){

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.b)) return 0;

if(in1){

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

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

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



Trang 37



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

×