Báo cáo thực hành đồ họa máy tính - Pdf 23

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO THỰC HÀNH
ĐỒ HỌA MÁY TÍNH
SVTH : LÊ LONG BẢO
MÃ SV : 102120289
LỚP : 12TLT.CNTT
GVHD : NGUYỄN VĂN NGUYÊN
Đà Nẵng, 12/2013
Báo Cáo Thực Hành Đồ Họa Máy Tính
MỤC LỤC
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 2
Báo Cáo Thực Hành Đồ Họa Máy Tính
NỘI DUNG THỰC HÀNH
PHẦN 1 : BÀI TẬP VỀ NHÀ
Bài tập 1 : Khái quát hệ thống đồ họa
Viết chương trình vẽ đồ thị hàm số y=sin(x) với -π≤x≤π bằng cách:
a) Cho x chạy từ -π đến π, ở mỗi bước tính giá trị y rồi làm tròn để vẽ bằng lệnh
putpixel(x,y,c).
b) Chia miền xác định thành n đoạn bằng nhau, tính giá trị y lại các đầu mút của các
đoạn rồi dùng lệnh lineto(x,y) để vẽ. Thay đổi giá trị n để theo dõi kết quả.
Bài tập 2 : Các thuật toán cơ bản
1. Viết chương trình nhập toạ độ nguyên của hai điểm đầu mút của đoạn thẳng
AB. Dùng thuật toán Bresenham để vẽ đoạn thẳng AB.
Cần nhập cho tất cả các trường hợp.
2. Viết chương trình nhập toạ độ của tâm I và bán kính R của đường tròn C(I,R).
Dùng thuật toán Michener để vẽ đường tròn C.
Bài tập 3 : Hình học Fractal
Viết chương trình nhập bậc n của các đường cong Fractal. Vẽ các đường cong bậc n:

- Lặp i từ -100 đến 100 (-π đến π).
- Tính x = getmaxx()/2 + int(PI*i*ltx/100) .
- Tính y = getmaxx()/2 – int(sin(i*PI/100)*tly).
- Đối với câu a : dùng hàm putpixel(x,y,YELLOW) để nối các điểm lại với
nhau.
- Đối với câu b : dùng hàm lineto(x,y) để kẻ đoạn thẳng đến (x,y).
Chương trình nguồn :
a. Vẽ bằng lệnh putpixel(x,y,c) :
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<math.h>
main(){
int gd = 0, gm=0,c;
float x,y;
initgraph(&gd,&gm,"");
setcolor(BLUE);
line(300,50,300,350);
line(100,200,500,200);
for(int x=-180;x<180;x++){
y=20*sin(x*0.017);
putpixel(x/1.5+300,y+200,5?);
}
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 5
Báo Cáo Thực Hành Đồ Họa Máy Tính
getch();
}
b. Chia miền xác định thành n đoạn bằng nhau, tính giá trị y lại các đầu mút
của các đoạn rồi dùng lệnh lineto(x,y) để vẽ :

Câu 1 :
Nhập các thông số cần thiết và tính ∆x, ∆y, m.
Xét các trường hợp :
- Nếu m>1 và m<-1 có điểm chung là thay ∆x, ∆y cho nhau.
- Nếu m<0 thì ∆y = -∆y.
Tính e(Ti), e(Si), e1.
Xét :
- Nếu m>1 hoặc m<-1 lặp điều kiện yA!=yB (y tăng chậm hơn).
o Putpixel(x,y,c).
o Nếu e<0 (ban đầu là e1) thì e+= e(Ti).
o Ngược lại e+=e(Si) và tăng x lên 1 đơn vị
- Nếu m>1 thì tăng y lên 1 và ngược lại giảm y 1 đơn vị.
o Lặp điều kiện xA!=xB (x tăng chậm hơn y).
o Putpixel(x,y,c).
o Nếu e<0 e+=e(Ti).
o Ngược lại e+=e(Si).
o m>0 tăng y.
o m<0 giảm y.
o Tăng x lên 1 đơn vị.
Câu 2 :
Nhập các số cần thiết và tính d.
Lặp nếu x<=y.
setviewport(xo,yo,xo+R,yo+R,0).
Putpixel 8 điểm đối xứng nhau qua tâm O
Nếu d<0 d+=4*x+6.
Ngược lại d+=4*(x-y)+10 và giảm y 1 đơn vị.
Tăng x lên 1 đơn vị.
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 8
Báo Cáo Thực Hành Đồ Họa Máy Tính
Chương trình nguồn :

else {
y++;e=e+et;
} } }
else if(kt>-1&&kt<0){
e=-2*dy-dx;
ekt=-2*dy;
et=-2*dy-2*dx;
c=getcolor();y=ya;
for(x=xa;x<xb;x++){
putpixel(x,y,YELLOW);
if(e<0) e=e-2*dy;
else {y ;e=e-2*dy-2*dx;}
} }
else if(kt>1){
e=2*dx-dy;
ekt=2*dx;
et=2*dx-2*dy;
c=getcolor();y=ya;
for(x=xa;y<yb;y++)
{
putpixel(x,y,c);
if(e<0) e=e+2*dx;
else{x++;e=e+2*dx-2*dy;}
} }
else if(kt<-1){
e=2*dx+dy;
ekt=2*dx;
et=2*dx+2*dy;}
else if(kt==1){
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 10

Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 11
Báo Cáo Thực Hành Đồ Họa Máy Tính
{putpixel(x,y,c);}
} }
main(){
int gd=0,gm=0;
initgraph(&gd,&gm,"");
setcolor(WHITE);
bresline(100,100,250,100);
bresline(250,100,250,170);
bresline(100,170,250,170);
bresline(100,100,100,170);
setfillstyle(1,CYAN);
floodfill(105,105,WHITE);
//Mai nha
bresline(100,100,130,70);
bresline(130,70,220,70);
bresline(220,70,250,100);
setfillstyle(1,YELLOW);
floodfill(135,75,WHITE);
getch();
}
Câu 2:
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
#include "math.h"
void brescircle(int xi,int yi,int R){
int dt,dkt,d,x,y,c;
c=getcolor();d=-2*R+3;

Kết quả Demo
Câu 1:
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 13
Báo Cáo Thực Hành Đồ Họa Máy Tính
Câu 2:
Bài tập 3. Hình học Fractal
Mã nguồn:
Câu 1 :
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
struct{
float l,t,r,b;
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 14
Báo Cáo Thực Hành Đồ Họa Máy Tính
}w;
struct point{
float x,y;
};
struct code{
int l,t,r,b;
};
code Encode(point p)
{
code c;
c.l = p.x < w.l;
c.t = p.y < w.t;
c.r = p.x > w.r;
c.b = p.y > w.b;
return c;

else{
m = (p2.y-p1.y)/(p2.x-p1.x);
if(c1.l)
{
p1.y += m*(w.l-p1.x);
p1.x = w.l;
}
else if(c1.t)
{ p1.x += (w.t-p1.y)/m; p1.y = w.t;}
else if(c1.r)
{ p1.y += m*(w.r - p1.x); p1.x = w.r;}
else{
p1.x +=(w.b-p1.y)/m;
p1.y = w.b;
}
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 16
Báo Cáo Thực Hành Đồ Họa Máy Tính
}
} }
main()
{
int gd = 0, gm;
point p1,p2;
p2.x = 100; p2.y = 100; p1.x = 400; p1.y = 450;
w.l = 150; w.t = 50; w.r = 500; w.b = 300;
initgraph(&gd,&gm,"");
rectangle((int)w.l, (int)w.t, (int)w.r,
(int)w.b);
setcolor(8);
if(Clip(p1,p2))

Kết quả Demo
Câu 1
Câu 2:
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 18
Báo Cáo Thực Hành Đồ Họa Máy Tính
Bài tập 4. Phép biến đổi 2 chiều
Thuật toán :
define Rad 0.017452 // 1o.
1.Cong Koch
+ Nếu n>0 gọi đệ quy
- K(n-1,l/3,d);d+=60;
- K(n-1,l/3,d);d-=120;
- K(n-1,l/3,d);d+=60;
- K(n-1,l/3,d);
+ Ngược lại linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
2. Cong C.
+ define vuong 0.7071 // √2/2
+ Nếu n>0 gọi đệ quy
- d+=45;
- C(n-1,l*vuong,d);
- d-=90;
- C(n-1,l*vuong,d);
- d+=45;
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 19
Báo Cáo Thực Hành Đồ Họa Máy Tính
+ Ngược lại linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
3. Cong Rồng (Dragon)
+ Giống đường cong C nhưng có sự xuất hiện thêm biến dấu s.
+ Lời gọi đệ quy sẽ là:
- d+=45*s;

d+=45;
}
else
linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
}
void CDragon(int n,float l,float d,int s){
if(n>0){
d+=45*s;
CDragon(n-1,l*vuong,d,-1);
d-=90*s;
CDragon(n-1,l*vuong,d,1);
d+=45;
}
else
linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));}
main(){
int gd=0,gm=0;
initgraph(&gd,&gm,"");
setcolor(WHITE);
// Koch
outtextxy(10,0,"Duong cong Koch: ");
moveto(200,0);
K(4,300,0);
// C
outtextxy(10,150,"Duong cong C: ");
moveto(200,150);
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 21
Báo Cáo Thực Hành Đồ Họa Máy Tính
C(10,100,0);
// Dragon

outtextxy(getmaxx()-20,Oy+10,"X");
outtextxy(Ox-150,Oy+150,"<");
outtextxy(Ox-160,Oy+160,"Z");
}
void tudien(point *p1,point*p2,point *p3,point*p4,int
mau)
{ setcolor(mau);
veduong(p1,p2);
veduong(p1,p3);
veduong(p1,p4);
veduong(p2,p3);
veduong(p3,p4);
veduong(p2,p4);
}
void xoaycheo(point *p1,point*p2,point *p3,point*p4)
{
point q1,q2;
for(int i=1;i<=5;i++){
q1=quay(p1,p2,i*30);
q2=quay(p1,p3,i*30);
tudien(p1,&q1,&q2,p4,RED);
delay(500);
tudien(p1,&q1,&q2,p4,BLACK);
} }
void xoaydoc(point *p1,point*p2,point *p3,point*p4)
{ //xoay quanh truc ngang;
point q1,q2;
for(int i=1;i<=5;i++){
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 23
Báo Cáo Thực Hành Đồ Họa Máy Tính

Báo Cáo Thực Hành Đồ Họa Máy Tính
do{
for(int j=0;j<=10;j++)
{xoaydoc (&p1,&p2,&p3,&p4);}
vetructoado();
for(int k=0;k<=10;k++)
{xoaycheo(&p1,&p2,&p3,&p4);}
vetructoado();
for(int i=0;i<=10;i++)
{xoayngang(&p1,&p2,&p3,&p4);}
vetructoado();
} while(1) ;
vetructoado();
getch();
closegraph();}
Kết quả Demo
Câu 1
Câu 2:
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 25


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status