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 )
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
#include
#include
#include
#include
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
#include
#include
#include
#include
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
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
{
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
{
putpixel(x,y,c);y++;
}}
else if(kt==-1){
y=ya;
c=getcolor();
for(x=xa;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
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
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
#include
#include
#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
#include
#include
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