BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP LỚN
MÔN ĐỒ HỌA MÁY TÍNH
ĐỀ TÀI: VẼ HÌNH TRÒN NỘI TIẾP HÌNH VUÔNG VÀ HÌNH TAM GIÁC NỘI TIẾP HÌNH
TRÒN, TÔ MÀU, TỊNH TIẾN VÀ LÀM BIẾN DẠNG HÌNH ĐÓ
GVHD : ThS. Nguyễn Thị Cẩm Ngoan
Nhóm thực hiện: NHÓM 22
Thành viên: Phạm Tiến Dũng
Phạm Văn Phong
Nguyễn Ngọc Tú
Hà Nội, tháng 2 năm 2013
Đồ họa máy tính
LỜI NÓI ĐẦU
Có câu rằng “một hình ảnh bằng cả nghìn lời nói ”. Điều đó thật không thể phủ
nhận. Và rõ ràng là nếu hiển thị thông tin chỉ với các ký hiệu, chữ cái, chữ số
không thôi thì không thể hấp dẫn và dễ hiểu như khi có thêm biểu diễn đồ họa Kỹ
thuật đồ hoạ cũng là công cụ không thể thiếu trong các ngành khoa học kỹ thuật,
giáo dục, nghệ thuật, giải trí, quảng cáo (để diễn đạt máy móc thiết bị, kiến trúc,
cấu trúc cơ thể, thông tin thiên văn địa lý, hình ảnh minh hoạ ). Chính vì vậy, đồ
họa là một vấn đề được quan tâm trong ngành công nghệ thông tin.
Cùng với sự phát triển của tin học, kỹ thuật đồ họa trên máy vi tính, ngày
càng trở nên tinh xảo. Giao diện các phần mềm ngày nay trở nên thân thiện, đẹp
mắt nhờ các thể hiện đồ họa. Sự hổ trợ của tin học cho các ngành khác trở nên đắc
lực hơn nhờ khả năng đồ họa vi tính. Và thế giới thực thì được biểu diễn một cách
sinh động, linh hoạt, đầy màu sắc bằng không gian ba chiều.
Trong thành công của kỹ thuật đồ họa ngày nay không thể không nói đến sự
phát triển vượt bậc của tốc độ phần cứng lẫn hệ điều hành. Nhưng bản thân kỹ
thuật đồ họa thì có bước tiến nhảy vọt từ những phép tính toán học phức tạp đến
những thư viện đồ họa được tạo sẳn. Các thư viện này cho phép giảm nhẹ thời gian
và công sức của người lập trình.
Mục tiêu của bài tập lớn này là tìm hiểu các thuật toán,cách vẽ vẽ Hypebol
bằng ngôn ngữ C++
Tuy nhiên, đề tài không thể không tránh khỏi những hạn chế và thiếu sót, nên
rất mong được sự chỉ bảo, góp ý của Cô và các bạn
Nhóm em xin chân thành cảm ơn
2
Đồ họa máy tính
1. GIỚI THIỆU NỘI DUNG, YÊU CẦU CỦA ĐỀ TÀI
NỘI DUNG
Viết chương trình vẽ hình tròn nội tiếp hình vuông, hình tam giác nội tiếp
hình tròn.
- Tô màu với mỗi hình một màu sắc
- Tịnh tiến hình đó đến vị trí khác
- Phóng to thu nhỏ hình đó
- Biến dạng hình đó
YÊU CẦU
Mỗi thành viên phải hiểu và làm chủ được toàn bộ đề tài của nhóm mình.
Ngôn ngữ lập trình: C++. (Sử dụng trình biên dịch Dev C 4.9.9.2)
2. THUẬT TOÁN SỬ DỤNG
CÔNG THỨC CHUYỂN ĐỔI QUAN SÁT
Void cuaso(float x1,float y1,float x2,float y2
{
xw1=x1;yw1= y1; xw2= x2,yw2= y2;
}
Void khungnhin(float x1,float y1,float x2,float y2)
{
3
Đồ họa máy tính
xv1= x1; yv1=y1; xv2= x2; yv2=y2;
tlx=(xv2-xv1)/(xw2-xw1);tly=(yv2-yv1)/(yw2-yw1);
}
BỘ CÔNG CỤ 2D
*
void chuyenden(float x, float y):
Con trỏ chuyển tương ứng đến điểm (xm, ym) trên màn hình
*
void veden(float x, float y):
Vẽ đến điểm (xm, ym) tương ứng trên màn hình
*Cài Đặt:
void chuyenDen(float x, float y){
int xm = (int) (tlx*(x - xw1)+xv1);
int ym = (int) (tly*(yw2 - y)+yv1);
4
Đồ họa máy tính
moveto(xm,ym);
}
void veDen(float x, float y){
int xm = (int) (tlx*(x - xw1)+xv1);
int ym = (int) (tly*(yw2 - y)+yv1);
lineto(xm,ym);
}
3. CODE CHƯƠNG TRÌNH
#include "graphics.h"
#include "stdio.h"
#include "conio.h"
#include "iostream"
5
Đồ họa máy tính
#include "math.h"
#define W WHITE
using namespace std;
//Khai bao mot so bien toan cuc
float xw1,yw1,xw2,yw2;
int xv1,yv1,xv2,yv2;
float tlx,tly;
float x_1, y_1, bankinh;
//Tao cua so
void cuaso(float x1, float y1, float x2, float y2)
{
xw1=x1;
yw1=y1;
xw2=x2;
yw2=y2;
}
//Tao khung nhin
6
Đồ họa máy tính
void khungnhin(int x1, int y1, int x2, int y2)
{
xv1=x1;
yv1=y1;
xv2=x2;
yv2=y2;
tlx=(xv2-xv1)/(xw2-xw1);
tly=(yv2-yv1)/(yw2-yw1);
}
//Chuyen den toa do trong khung nhin
void chuyenden(float x, float y)
{
int xm=(int)(tlx*(x-xw1)+xv1);
int ym=(int)(tly*(yw2-y)+yv1);
moveto(xm,ym);
}
7
Đồ họa máy tính
//Ve duong thang trong khung nhin
void veden(float x, float y)
{
int xm=(int)(tlx*(x-xw1)+xv1);
int ym=(int)(tly*(yw2-y)+yv1);
lineto(xm,ym);
}
//Ve putpixel trong khung nhin
void vetam(float x, float y)
{
int xm=(int)(tlx*(x-xw1)+xv1);
int ym=(int)(tly*(yw2-y)+yv1);
putpixel(xm,ym,W);
}
//Ve truc toa do
void tructoado()
{
8
Đồ họa máy tính
setcolor(5);
outtextxy(315,310,"O");
outtextxy(600,310,"x");
outtextxy(315,40,"y");
setcolor(2);
// Ve truc Ox tai khung nhin
float xt = xw1, yt = 0;
chuyenden(xt, yt);
xt = xw2; yt = 0;
veden(xt, yt);
// Ve truc Oy tai khung nhin
xt = 0; yt = yw1;
chuyenden(xt, yt);
xt = 0; yt = yw2;
veden(xt, yt);
float y = yw1 + 1;
while (y < yw2)
{
chuyenden(-0.1,y);
9
Đồ họa máy tính
veden(0.1,y);
y++;
}
float x = xw1 + 1;
while (x < xw2)
{
chuyenden(x,-0.1);
veden(x,0.1);
x++;
}
}
//Ham to mau theo thuat toan Vet dau loang
void Loang(int tx,int ty,int mb,int mt)
{
if(getpixel(tx,ty)!=mb&&getpixel(tx,ty)!=mt)
{
putpixel(tx,ty,mt);
Loang(tx+1,ty,mb,mt);
Loang(tx-1,ty,mb,mt);
10
Đồ họa máy tính
Loang(tx,ty+1,mb,mt);
Loang(tx,ty-1,mb,mt);
}
}
//Thuat toan ve 8 diem doi xung
void put8pixel(int xc, int yc, int xb, int yb)
{
putpixel(xc+xb,yc+yb,W);
putpixel(yc+xb,xc+yb,W);
putpixel(yc+xb,-xc+yb,W);
putpixel(xc+xb,-yc+yb,W);
putpixel(-xc+xb,-yc+yb,W);
putpixel(-yc+xb,-xc+yb,W);
putpixel(-yc+xb,xc+yb,W);
putpixel(-xc+xb,yc+yb,W);
}
//Ve hinh
void vehinh(float xa,float ya, float r, int m1, int m2, int m3)
{
11
Đồ họa máy tính
//Ve hinh vuong
vetam(xa,ya);
chuyenden(xa-r,ya-r);
veden(xa+r,ya-r);
veden(xa+r,ya+r);
veden(xa-r,ya+r);
veden(xa-r,ya-r);
//To mau hinh vuong
int xk=(int)(tlx*(xa-xw1)+xv1);
int yk=(int)(tly*(yw2-ya)+yv1);
Loang(xk-1,yk-1,W,m1);
//Ve hinh tron theo thuat toan midpoint.
int xb=(int)(tlx*(xa-xw1)+xv1);
int yb=(int)(tly*(yw2-ya)+yv1);
int R= (int)(((xv2-xv1)/(xw2-xw1))*r);
int xc=0, yc=R;
put8pixel(xc,yc,xb,yb);
float p=5/4-R;
while (xc < R/sqrt(2))
12
Đồ họa máy tính
{
if (p<0)
p+=2*xc+3;
else
{
p+=2*(xc-yc)+5;
yc ;
}
xc++;
put8pixel(xc,yc,xb,yb);
}
//To mau hinh tron.
Loang(xk-1,yk-1,W,m2);
//Ve tam giac can.
float y_t=ya-r/2;
float x_t1=(2*xa-r*sqrt(3))/2;
float x_t2=(2*xa+r*sqrt(3))/2;
chuyenden(xa,ya+r);
veden(x_t1,y_t);
13
Đồ họa máy tính
veden(x_t2,y_t);
veden(xa,ya+r);
//To mau tam giac can.
Loang(xk-1,yk-1,W,m3);
}
//Tinh Tien
void TinhTien(float x1, float y1)
{
x_1 = x_1 + x1;
y_1 = y_1 + y1;
}
//Bien Doi Ti Le
void TiLe (float tile)
{
bankinh = bankinh*tile;
}
//Ham Main
main()
{
14
Đồ họa máy tính
//Nhap vao mot so bien
cout<<"\nKich thuoc cua so do hoa la: 650x650";
int mau1, mau2, mau3, socannhap;
float tt1, tt2, tl;
cout<<" ";
cout<<"\nNhap vao toa do x: ";
cin>>x_1;
cout<<"Nhap vao toa do y: ";
cin>>y_1;
cout<<"Nhap vao nua do rong hinh vuong: ";
cin>>bankinh;
cout<<"Nhap vao mau hinh vuong: ";
cin>>mau1;
cout<<"Nhap vao mau hinh tron: ";
cin>>mau2;
cout<<"Nhap vao mau hinh tam giac: ";
cin>>mau3;
cout<<"Chon 1 de tinh tien va 2 de bien doi ty le: ";
cin >> socannhap;
15
Đồ họa máy tính
cout << "Nhap hoanh do tinh tien: "; cin >> tt1;
cout << "Nhap tung do tinh tien: "; cin >> tt2;
cout << "Nhap he so bien doi: "; cin >> tl;
//Khai bao moi goi cua so
initwindow(650,650);
//Ve cua so va khung nhin.
cuaso(-10,-10,10,10);
khungnhin(50,50,600,600);
//Ve truc toa do.
tructoado();
//Ve hinh:
setcolor(W);
//vehinh(2,3,5,1,2,3);
switch (socannhap)
{
case 1 :
for (int i = 0; i < 2; i++)
{
vehinh(x_1,y_1,bankinh,mau1,mau2,mau3);
16
Đồ họa máy tính
TinhTien(tt1, tt2);
};
break;
case 2 :
for (int i = 0; i < 2; i++)
{
vehinh(x_1,y_1,bankinh,mau1,mau2,mau3);
TiLe(tl);
};
}
getch();
closegraph();
}
4. Hình vẽ minh họa
- Vẽ hình tròn nội tiếp hình vuông, hình tam giác nội tiếp hình tròn và tô
màu cho từng hình:
17
Đồ họa máy tính
- Tịnh tiến nó đến vị trí khác:
18
Đồ họa máy tính
- Phóng to thu nhỏ hình đó:
19