Lời nói đầu Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học.. Ngay từ khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt, cuốn hút r
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN
- -BÀI TẬP LỚN
MÔN: ĐỒ HỌA MÁY TÍNH
ĐỀ TÀI: VẼ NGÔI SAO 5 CÁNH VỪA QUAY VỪA DI
CHUYỂN
2. Đinh Thị Như Hương
3. Nguyễn Thị Sim
Trang 2MỤC LỤC
Trang 3Lời nói đầu
Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học Ngay từ khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt, cuốn hút rất nhiều người và được sử dụng ở nhiều lĩnh vực khác nhau như : khoa học, nghệ thuật, kinh doanh, thương mại, công nghiệp, quản lí, giáo dục, giải trí, …
Số lượng các chương trình đồ họa ứng dụng thật khổng lồ và phát triển liên tục.
Với sự hứng thú về đồ họa 2D nhóm chúng em chọn đề tài “Vẽ hình sao 5 cánh quay quanh tâm và di chuyển quanh màn hình bằng 4 phím mũi tên” để có
cơ hội tìm hiểu sâu hơn môn học đồ họa máy tính này Qua thời gian tìm hiểu, chúng em có ý tưởng và các thuật toán cho bài tập lơn và thêm kinh nghiêm sau hơn về đồ họa
Chúng em xin gửi lời cảm ơn chân thành tới cô giáo: “đã tận tâm chỉ bảo và
giúp đỡ chúng em hoàn thành đề tài này Trong quá trình làm đề tài sẽ không tránh khỏi những sai sót, khuyết điểm Vì vậy, nhóm thực hiện chúng em hy vọng nhận được sự đánh giá và đóng góp nhiệt tình từ phía thầy cô và các bạn để bài của nhóm chúng em được hoàn thiện hơn
Chúng em xin chân thành cảm ơn!
Trang 4I PHẦN GIỚI THIỆU
1.Vẽ sao 5 cánh quay quanh tâm
1.1.Ý tưởng .
a. Mô tả ngôi sao 5 cánh
- Hình bên là ngôi sao 5 cánh
- Đặc điểm:
Ngôi sao có cách đỉnh cách đều tâm O 1 khoảng r
Hai đỉnh liên tiếp kề nhau 72o
mode 19 Với O(0,0);
Ox có số điểm ảnh tối đa là 200 pixel;
Oy có số điểm ảnh tối đa là 320 pixel;
• Vẽ sao: Gắn vào hệ trục XO1Y Tọa độ tâm là O1(xc,yc);
Khoảng cách từ tâm đến đỉnh là r;
Xác định tọa độ của các đỉnh
- Quay A quanh tâm O1 theo hướng + 1 góc α + (72*π)/180 ta được A2
Trang 5- Quay A quanh tâm O1, theo chiều hường + một góc
α+(72*2*π)/180 Ta được A3
- Quay A quanh tâm O1, theo chiều hướng + một góc α +
(72*3*π)/180 ta được A4
- Quay A quanh tâm O1, theo chiều hướng + một góc α
+(72*4*)/180 ta được A5
Khi đó hình sao ta cần là:
c. Di chuyển hình sao
• Quay quanh tâm
Thực hiện việc chuyển ngôi sao vừa tạo thành màu giống màu nền và sau đó tạo 1 ngôi sao khác các đình quay quanh tâm cùng 1 góc β nào đó!
• Sao di chuyển
Khi thực hiện phép di chuyển hình sao lên trên, ta thực hiện phép tịnh tiến hình sao theo vector I có tọa độ (-1;0)
Khi thực hiện phép di chyển hình sao xuống dưới, ta thực hiên phep tịnh tiên hình sao theo vector H có tọa độ (1;0)
1.2 Giải thuật
• Vẽ hình sao
Vẽ hình sao với tâm có tọa độ là (xc, yc), khoảng cách từ tâm đền đỉnh r là c Đỉnh A1(xo,yo) với xo, yo tạo với trục Ox 1 góc α, các đỉnh A2, A3, A4, A5 được lưu trên các mảng 1 chiều A2(a[1],b[1]) A3(a[2],b[2]) A4(a[3],b[3]) A5(a[4],a[4])
Code vẽ sao:
void vesao(int mt){
Trang 6setcolor(mt); //ve ngoi sao, chu y a1 la mang cac dinh ngoai ngoi sao
for(int i=1;i<=2;i++){
chuyenden(a1[i].x,a1[i].y);veden(a1[i+2].x,a1[i+2].y);
chuyenden(a1[i].x,a1[i].y);veden(a1[i+3].x,a1[i+3].y); }
chuyenden(a1[3].x,a1[3].y);veden(a1[5].x,a1[5].y);
}
for(int i=1;i<=5;i++){
a1[i].x=2.5-(0.6*cos(phi*M_PI/180));
a2[i].x=2.5+(0.3*cos(phi*M_PI/180));
a1[i].y=2+(0.6*sin(phi*M_PI/180));
a2[i].y=2-(0.3*sin(phi*M_PI/180));
phi+=72; //moi lan quay goc thay doi 72 do(cai nay search dc)
}
vesao(RED); delay(200); vesao(GREEN);
Sao vừa quay quanh tâm vừa di chuyển
•
int main()
Trang 7{
int gd=0,gm;
initgraph(&gd,&gm,"");
cuaso(1,1,4,3);
setbkcolor(GREEN);
setcolor(RED);
khungnhin(120,100,520,380);
//tinh toan cac dinh cua ngoi sao de noi chung lai trong ham vesao
int phi=90;{
for(int i=1;i<=5;i++){
a1[i].x=2.5+(0.6*cos(phi*M_PI/180));
a2[i].x=2.5+(0.3*cos(phi*M_PI/180));
a1[i].y=2+(0.6*sin(phi*M_PI/180));
a2[i].y=2+(0.3*sin(phi*M_PI/180));
phi+=72;
}
clearviewport();
vesao(RED);
delay(200);
vesao(GREEN);
char c1, c2; int i=1;
while (1) {
if (i==360) i=0;
else i++;
do{
if (kbhit()) {
if ((c1=getch())==0) {
c2 = getch();
{
for(int i=1;i<=5;i++){
a1[i].x=2.5-(0.6*cos(phi*M_PI/180));
a2[i].x=2.5+(0.3*cos(phi*M_PI/180));
Trang 8a1[i].y=2+(0.6*sin(phi*M_PI/180));
a2[i].y=2-(0.3*sin(phi*M_PI/180));
phi+=72; //moi lan quay goc thay doi 72 do(cai nay search dc)
}
}
}
vesao(RED); delay(200); vesao(GREEN); }
{
for(int i=1;i<=5;i++){ a1[i].x=2.5+(0.6*cos(phi*M_PI/180)); a2[i].x=2.5-(0.3*cos(phi*M_PI/180)); a1[i].y=2-(0.6*sin(phi*M_PI/180)); a2[i].y=2+(0.3*sin(phi*M_PI/180)); phi+=72; }
clearviewport();
vesao(RED); delay(200); vesao(GREEN); delay(200);
}
for(int i=1;i<=5;i++){ a1[i].x=2.5+(0.6*cos(phi*M_PI/180)); a2[i].x=2.5-(0.3*cos(phi*M_PI/180)); a1[i].y=2+(0.6*sin(phi*M_PI/180)); a2[i].y=2-(0.3*sin(phi*M_PI/180)); phi+=72; }
{ if (c2==75) {
Trang 9for(int i=1;i<=5;i++){
a1[i].x=2.5-0.5+(0.6*cos(phi*M_PI/180));
a2[i].x=2.5-0.5+(0.3*cos(phi*M_PI/180));
a1[i].y=2-0.5+(0.6*sin(phi*M_PI/180));
a2[i].y=2-0.5+(0.3*sin(phi*M_PI/180));
phi+=72; //moi lan quay goc thay doi 72 do(cai nay search dc)
}}
vesao(RED);
delay(20);
vesao(GREEN);}
if (c2==77)
{
for(int i=1;i<=5;i++){
a1[i].x=2.5+0.5+(0.6*cos(phi*M_PI/180));
a2[i].x=2.5-0.5+(0.3*cos(phi*M_PI/180));
a1[i].y=2-0.5+(0.6*sin(phi*M_PI/180));
a2[i].y=2+0.5+(0.3*sin(phi*M_PI/180));
phi+=72;
//moi lan quay goc thay doi 72 do(cai nay search dc)
}}
vesao(RED);
delay(20);
vesao(GREEN);
if (c2==80)
{
for(int i=1;i<=5;i++){
a1[i].x=2.5+(0.6*cos(phi*M_PI/180));
a2[i].x=2.5-0.5+(0.3*cos(phi*M_PI/180));
a1[i].y=2-0.5+(0.6*sin(phi*M_PI/180));
a2[i].y=2+(0.3*sin(phi*M_PI/180));
phi+=72;
//moi lan quay goc thay doi 72 do(cai nay search dc) }}
vesao(RED);
delay(20);
vesao(GREEN);
Trang 10if(c2==27) break;
} while (!kbhit());
} getch();
} closegraph();}
1.Code
Trương trình dùng 4 phím di chuyển hình sao quay quanh tâm
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <iostream>
#include<dos.h>
struct dinh{float x,y;} a1[10],a2[10]; //2 mang luu gia tri cac đỉnh trong va ngoai tam giac
float xw1,yw1,xw2,yw2;
int xv1,yv1,yv2,xv2; float tlx,tly;
//cac cong cu ve 2d
void cuaso(float x1,float y1,float x2,float y2)
{ xw1=x1;yw1=y1;xw2=x2;yw2=y2; }
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);
}
void 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);
Trang 11lineto(xm,ym);
}
void vesao(int mt){
setcolor(mt); //ve ngoi sao, chu y a1 la mang cac dinh ngoai ngoi sao
for(int i=1;i<=2;i++){
chuyenden(a1[i].x,a1[i].y);veden(a1[i+2].x,a1[i+2].y);
chuyenden(a1[i].x,a1[i].y);veden(a1[i+3].x,a1[i+3].y); }
chuyenden(a1[3].x,a1[3].y);veden(a1[5].x,a1[5].y);
}
int main()
{
int gd=0,gm;
initgraph(&gd,&gm,"");
cuaso(1,1,4,3);
setbkcolor(GREEN);
setcolor(RED);
khungnhin(120,100,520,380);
//tinh toan cac dinh cua ngoi sao de noi chung lai trong ham vesao int phi=90;{
clearviewport();
char c1, c2; int i=1;
while (1) {
if (i==360) i=0;
else i++;
if (kbhit()) {
if ((c1=getch())==0)
c2 = getch();
{
for(int i=1;i<=5;i++){
a1[i].x=2.5-(0.6*cos(phi*M_PI/180));
a2[i].x=2.5+(0.3*cos(phi*M_PI/180));
Trang 12a1[i].y=2+(0.6*sin(phi*M_PI/180));
a2[i].y=2-(0.3*sin(phi*M_PI/180));
phi+=72; //moi lan quay goc thay doi 72 do(cai nay search dc)
}
vesao(RED); delay(200); vesao(GREEN);
}
{
for(int i=1;i<=5;i++){ a1[i].x=2.5+(0.6*cos(phi*M_PI/180)); a2[i].x=2.5-(0.3*cos(phi*M_PI/180)); a1[i].y=2-(0.6*sin(phi*M_PI/180)); a2[i].y=2+(0.3*sin(phi*M_PI/180)); phi+=72; //moi lan quay goc thay doi 72 do(cai nay search dc) }
vesao(RED); delay(200); vesao(GREEN); }
}
}
}
getch();
closegraph(); }
2.Hình ảnh minh họa
Trang 13Xuống
Trang 14Trái
Trang 15LỜI KẾT
Vận dụng những kiến thức đã học môn Đồ họa máy tính, chúng em đã xây dựng được trương trình nay, tuy nó rất đơn gian nhưng phần nào đã giúp chúng xem nắm vững kiến thức cần nhớ, và có thêm được vốn kiến thức, cho những môn học tiếp theo, cũng như trong công việc sau này của bọn em Một lần nữa em xin chân thành cảm ơn cô, đã giúp đỡ chúng em hoàn thành được bài tập này Nhóm 2 chúng em còn nhiều thiếu xót cần mong cô xem
và bổ sung và góp ý cho bọn em để hoàn thiện bài làm của mình
Chúng em xin chân thành cảm ơn!