Tải bản đầy đủ (.docx) (39 trang)

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

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 )

ĐẠ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:


đường cong Koch, C và Rồng.
Bài tập 4 : Phép biến đổi 2 chiều
Cài đặt các phép affine hai chiều trong hệ toạ độ thuần nhất:
a) Khai báo kiểu afine
b) Định nghĩa các hàm cần thiết: biến đổi ảnh của 1 điểm, cài đặt cho các phép tịnh
tiến, phép quay, phép biến dạng, phép méo hình, tích hai phép afine.
Chương trình vẽ giữa màn hình một đa giác đều và gọi các hàm này để mô phỏng quạt
máy quay bằng cách cho đa giác quay quanh tâm của nó
Bài tập 5 : Thiết kế đường cong và mặt cong
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 3
Báo Cáo Thực Hành Đồ Họa Máy Tính
Viết chương trình nhập toạ độ của n điều khiển, dùng thuật toán Casteljau để vẽ
đường cong qua các điểm điều khiển này.
PHẦN 2 : BÀI TẬP TRÊN LỚP
Bài 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à.
Bài 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

Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 4
Báo Cáo Thực Hành Đồ Họa Máy Tính
PHẦN 1. BÀI TẬP VỀ NHÀ
Bài tập 1. Khái quát hệ thống đồ họa
Thuật toán :
Thiết lập các cấu hình đơn giản
Vẽ hệ trục tọa độ chia màn hình thành 4 phần bằng nhau.
Vẽ đồ thị :

- 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ẽ :

#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);
moveto(-180/1.5+300,200);
for(int x=-180;x<=180;){
y=20*sin(x*0.017);
lineto(x/1.5+300,y+200);
x=x+2;
setcolor(RED);
}
getch();
}
Kết quả Demo
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 6
Báo Cáo Thực Hành Đồ Họa Máy Tính
Câu a
Câu b
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 7
Báo Cáo Thực Hành Đồ Họa Máy Tính
Bài tập 2. Các thuật toán cơ bản
Thuật toán :

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 :

Câu 1 :
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<dos.h>
void bresline(int xa,int ya,int xb,int yb)
{int x,y,e,ekt,et,dx,dy,c;
float kt,dy1,dx1;

if(xa>xb) {
int t=xa;
int t1=ya;
xa=xb;
ya=yb;
xb=t;
yb=t1;
}
dx=xb-xa;dy=yb-ya;
dx1=float(dx);
dy1=float(dy);
kt=dy1/dx1;
if(kt>0&&kt<1){
ekt=dy+dy;e=ekt-dx;et=e-dx;
c=getcolor();y=ya;
for(x=xa;x<=xb;x++){
putpixel(x,y,c);
if(e<0) e=ekt+e;
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 9
Báo Cáo Thực Hành Đồ Họa Máy Tính

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

Báo Cáo Thực Hành Đồ Họa Máy Tính
y=ya;
c=getcolor();
for(x=xa;x<xb;x++)
{
putpixel(x,y,c);y++;
} }
else if(kt==-1){
y=ya;
c=getcolor();
for(x=xa;x<xb;x++)
{
putpixel(x,y,c); y ;
} }
else if((xa==xb)){
if(ya>yb) {
int t=ya;
ya=yb;
yb=t;}
c=getcolor();
for(x=xa,y=ya;y<yb;y++){
putpixel(x,y,c);}
}
else if((ya==yb)){
if(xa>xb) {
int t=xa;
xa=xb;
xb=t;}
c=getcolor();
for(y=ya,x=xa;x<xb;x++)

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;

for(x=0,y=R;x<=sqrt(2)/2*R;x++){
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 12
Báo Cáo Thực Hành Đồ Họa Máy Tính
putpixel(x+xi,y+yi,c);
putpixel(-x+xi,y+yi,c);
putpixel(-x+xi,-y+yi,c);
putpixel(y+xi,x+yi,c);
putpixel(x+xi,-y+yi,c);
putpixel(-y+xi,x+yi,c);
putpixel(y+xi,-x+yi,c);
putpixel(-y+xi,-x+yi,c);
if(d<0) d=d+4*x+6;
else {y ;d=d+4*(x-y)+10;}
}
main(){
int gd=0,gm=0,x,y,c=1;
initgraph(&gd,&gm,"");
x=getmaxx()/2;
y=getmaxy()/2;
for(int R=10;R<=200 ;R+=15)
{
setcolor(WHITE);
brescircle(x,y,R);
setfillstyle(1,c+1);
floodfill(x+R-2,y,WHITE);
c++;
if(c==15)c=0;
}
getch();
}

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;

};
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;
int in1,in2;
float m;
while(1)
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 15
Báo Cáo Thực Hành Đồ Họa Máy Tính
{
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.)) return 0;
if(in1)
{
tmpp = p1; p1 = p2; p2 = tmpp;
tmpc = c1; c1 = c2; c2 = tmpc;
}
if(p1.x == p2.x)
if(c1.t) p1.y = w.t;
else p1.y = w.b;

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))

line((int)p1.x,(int)p1.y,(int)p2.x,(int)p2.y);
getchar();
closegraph();
}
Câu 2:
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
void fill(int x,int y,int bc){
int pc,c;
c=RED;
pc=getpixel(x,y);
if(pc!=c&&pc!=bc){
putpixel(x,y,c);
fill(x-1,y,bc);
fill(x+1,y,bc);
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 17
Báo Cáo Thực Hành Đồ Họa Máy Tính
fill(x,y-1,bc);
fill(x,y+1,bc);}
}
main()
{
int d=0,m=0;
initgraph(&d,&m,"");
setcolor(BLUE);
circle(200,200,150);
fill(200,200,BLUE);
getch();
}

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;

- CDragon(n-1,l*vuong,d,-1);
- d-=90*s;
- CDragon(n-1,l*vuong,d,1);
- d+=45;
Mã nguồn :
Câu 1 :
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
#define Rad 0.017452
#define vuong 0.7071
void K(int n,float l,float d){
if(n>0){
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);
}
else
linerel(int(l*cos(d*Rad)),int(l*sin(d*Rad)));
}
void C(int n,float l,float d){
if(n>0){
d+=45;
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 20
Báo Cáo Thực Hành Đồ Họa Máy Tính
C(n-1,l*vuong,d);
d-=90;
C(n-1,l*vuong,d);

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(10,300,"Duong cong Dragon: ");
moveto(200,300);
CDragon(10,100,0,1);
getch();
closegraph();}
Câu 2 :
#include"AFFINE.H"
#include<conio.h>
#include<graphics.h>
void vetructoado(){
setcolor(BLUE);
int Ox=getmaxx()/2;
int Oy=getmaxy()/2;
//Ox
line(Ox,20,Ox,Oy);
//Oy
line(Ox,Oy,getmaxx()-20,Oy);
//Oz
line(Ox,Oy,Ox-150,Oy+150);
//Goc toa do
setcolor(YELLOW);
circle(Ox,Oy,1);
settextjustify(1,1);
setcolor(BLUE);
outtextxy(Ox,20,"^");
outtextxy(getmaxx()-20,Oy,">");
outtextxy(Ox+10,Oy+10,"O");
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 22
Báo Cáo Thực Hành Đồ Họa Máy Tính
outtextxy(Ox+10,20,"Y");

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

q1=quay(p1,p4,i*30);
q2=quay(p1,p3,i*30);
tudien(p1,&q1,&q2,p2,RED);
delay(500);
tudien(p1,&q1,&q2,p2,BLACK);
} }
void xoayngang(point *p1,point*p2,point *p3,point*p4)
{ //xoay quanh truc ngang;
point q1,q2;
for(int i=1;i<=5;i++){
q1=quay(p1,p2,i*30);
q2=quay(p1,p4,i*30);
tudien(p1,&q1,&q2,p3,RED);
delay(500);
tudien(p1,&q1,&q2,p3,BLACK);
} }
int main(){
int gd=0,gm=0,c;
point p1,p2,p3,p4;
initgraph(&gd,&gm," ");
vetructoado();
setcolor(WHITE);
p1.x=getmaxx()/2;
p1.y=getmaxy()/2;
p2.x=p1.x;
p2.y=p1.y-200;
p3.x=p1.x+150;
p3.y=p1.y;
p4=quay(&p1,&p3,135);
Sinh viên thực hiện: Lê Long Bảo, Lớp: 12TLT.CNTT Trang 24

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

×