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
}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
#include
#include
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
#include
#include
#include
#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