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