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Ộ
Trang 1BỘ 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
Trang 2LỜ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
Trang 31 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;
Trang 4}
Void khungnhin(float x1,float y1,float x2,float y2)
{
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:
Trang 5void chuyenDen(float x, float y){
int xm = (int) (tlx*(x - xw1)+xv1); int ym = (int) (tly*(yw2 - y)+yv1); 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"
Trang 6#include "stdio.h"
#include "conio.h"
#include "iostream"
#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;
Trang 7//Tao khung nhin
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);
Trang 8//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);
}
Trang 9//Ve truc toa do
void tructoado()
{
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;
Trang 10while (y < yw2)
{
chuyenden(-0.1,y);
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) {
Trang 11putpixel(tx,ty,mt);
Loang(tx+1,ty,mb,mt);
Loang(tx-1,ty,mb,mt);
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);
}
Trang 12//Ve hinh
void vehinh(float xa,float ya, float r, int m1, int m2, int m3) {
//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;
Trang 13put8pixel(xc,yc,xb,yb);
float p=5/4-R;
while (xc < R/sqrt(2))
{
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;
Trang 14float x_t2=(2*xa+r*sqrt(3))/2;
chuyenden(xa,ya+r);
veden(x_t1,y_t);
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;
}
Trang 15//Ham Main
main()
{
//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: ";
Trang 16cin>>mau3;
cout<<"Chon 1 de tinh tien va 2 de bien doi ty le: "; cin >> socannhap;
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 :
Trang 17for (int i = 0; i < 2; i++)
{
vehinh(x_1,y_1,bankinh,mau1,mau2,mau3); 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();
}
Trang 184 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:
Trang 19- Tịnh tiến nó đến vị trí khác:
Trang 20- Phóng to thu nhỏ hình đó: