if ((fx == lx)&(fy == ly)) return 1; else
return 0;
} else return 0;
}
- Kiểm soát việc di chuyển chuột:
void mouse_move(int mouseX, int mouseY)
{
_AX = 4;
_CX = mouseX;
_DX = mouseY;
geninterrupt(0x33);
}
void mouse_setX(int start, int end)
{
_AX = 7;
_CX = start;
_DX = end;
geninterrupt(0x33);
}
void mouse_setY(int start, int end)
{
_AX = 8;
_CX = start;
_DX = end;
geninterrupt(0x33);
}
b) Trong chế độ đồ họa của MS Paint các đường thẳng, hình chữ nhật và
đường ellip được vẽ theo cách dùng chuột xác định 2 điểm :
- Đối với đường thẳng là 2 điểm : điểm đầu và điểm cuối.
- Đối với hình chữ nhật là 2 điểm xác định đường chéo.
- Đối với hình ellip là 2 điểm xác định đường chéo của hình chữ
nhật ngoại tiếp hình ellip.
Trong chương trình mô phỏng MS Paint này em cũng xác định 2 điểm như trên
để lập trình vẽ đường thẳng, hình chữ nhật và hình ellip (dựa theo việc thay đổi 2
trục x, y ta có thể vẽ hình vuông và hình tròn từ hình chữ nhật và hình ellip).
5
Để lập trình chương trình tương tự MS Paint (khi xác định điểm cuối bằng cách
di chuột thì hình vẽ sẽ biến đổi theo vị trí chuột ) em xây dựng thêm các hàm
lineMY ,rectMY ,ellipMY để vẽ hình bằng putpixel() từng điểm trên màn hình đồ
họa (riêng hàm ellipMY được hỗ trợ bởi hàm doixung() để vẽ đối xứng cung tròn)
void lineMY(int sx, int sy, int ex, int ey, int c, int
style )
{
int t, d;
int xe = 0, ye = 0, dx, dy;
int ix,iy;
dx = ex - sx;
dy = ey - sy;
if (dx > 0) ix = 1;
else if (dx == 0) ix = 0; else ix = -1;
if (dy > 0) iy = 1;
else if (dy == 0) iy = 0; else iy = -1;
dx = abs(dx);
dy = abs(dy);
d = (dx > dy) ? dx : dy;
for (t = 0; t <= d; t++)
{
if (style == 1) putpixel(sx, sy,
c^getpixel(sx, sy)); else putpixel(sx, sy, c);
xe = xe + dx;
ye = ye + dy;
if (xe > d)
{
xe = xe - d;
sx = sx + ix;
}
if (ye > d)
{
ye = ye - d;
sy = sy + iy;
6
}
}
}
void rectMY(int sx, int sy, int ex, int ey, int c, int
style)
{
lineMY(sx, sy, ex, sy, c, style);
lineMY(sx, sy, sx, ey, c, style);
lineMY(ex, sy, ex, ey, c, style);
lineMY(sx, ey, ex, ey, c, style);
if (style == 1) putpixel(ex, ey, c^getpixel(ex,
ey)); else putpixel(ex, ey, c);
}
void doixung(int xc, int yc, int xp, int yp, int c, int
style)
{
if (style == 1)
{
putpixel(xc + xp, yc - yp, c^getpixel(xc +
xp, yc - yp));
putpixel(xc + xp, yc + yp, c^getpixel(xc +
xp, yc + yp));
putpixel(xc - xp, yc + yp, c^getpixel(xc -
xp, yc + yp));
putpixel(xc - xp, yc - yp, c^getpixel(xc -
xp, yc - yp));
} else
{
putpixel(xc + xp, yc - yp, c);
putpixel(xc + xp, yc + yp, c);
putpixel(xc - xp, yc + yp, c);
putpixel(xc - xp, yc - yp, c);
}
7
}
void ellipMY(long xc, long yc, long a, long b, long c,
int style)
{
long xp, yp, vung = 1;
double d = b*b - a*a*b + ((float)a*a/4);
xp = 0; yp = b;
while (yp >= 0)
{
doixung(xc, yc, xp, yp, c, style);
if ((vung ==1) & (a*a*(yp - 0.5) <= b*b*(xp +
1) ))
{
vung = 2;
d = b*b*xp*xp+b*b*xp + ((float)b*b/4) +
a*a*(yp-1)*(yp -1) - a*a*b*b;
}
if (vung ==1)
{
if (d < 0)
{
d = d + b*b*(2*xp + 3);
xp = xp + 1;
} else
{
d = d + b*b*(2*xp + 3) + a*a*(2-2*yp);
xp = xp + 1; yp = yp -1;
}
}
if (vung == 2)
{
if (d < 0)
{
d = d + b*b*(2*xp+2)+a*a*(3-2*yp);
8
xp = xp + 1; yp = yp -1;
} else
{ d = d + a*a*(3-2*yp);
yp = yp -1;
} }
} }
c) Đối với các hàm bút vẽ (draw_pen(int d)), hàm tẩy xóa(erase(int d)) có
khai báo biến d để xác định độ dày nét vẽ.
Khai báo cấu trúc line_def để lưu lại kiểu đường mặc định :
struct line_def
{
int linestyle;
unsigned int upattern;
int thickness;
};
line_def(norm_line);
Thiết lập kiểu mới:
setlinestyle(SOLID_LINE,0,d);
Phục hồi kiểu cũ:
setlinestyle(norm_line.linestyle,norm_line.upattern
,norm_line.thickness);
d) Hàm vẽ các chấm điểm ngẫu nhiên trong vùng bán kính r (draw_air(int r))
có thể dùng để tô màu dạng airbrush:
for (i = 0; i<= 5; ++i)
{
x = random(r + 1);
if (random(2)) x = -x;
y = random(int(sqrt(r * r - x * x)));
if (random(2)) y = -y;
an_mouse();
if
((nowX+x>frameX)&(nowX+x<frameX+frameW)&(nowY+y>fra
meY)&(nowY+y<frameY+frameH))
putpixel(nowX + x, nowY + y, ncolor);
hien_mouse();
9
e) Hàm lưu lại hình đang vẽ vào bộ nhớ và load hình ra vẽ tiếp:
Hàm size = imagesize( frameX , frameY , frameX +
frameW , frameY + frameH/4 ) được khai báo dạng unsigned trả
về số byte để lưu ảnh ¼ màn hình.
p[k]=(long*)malloc(size); p[k] trỏ tới vùng nhớ size byte mới
được cấp phát ở trên.
Hàm getimage( frameX , frameY + (k-
1)*(frameH/4) , frameX + frameW , frameY +
k*(frameH/4) , p[k] ) được sử dụng để lưu lại các điểm ảnh vào
vùng nhớ do p[k] trỏ tới có độ lớn bằng size.
Hàm putimage(frameX ,frameY + (k-1)*(frameH/4),
p[k] , COPY_PUT) dùng để sao ảnh lưu trong vùng nhớ ra màn hình tại
vị trí (frameX ,frameY + (k-1)*(frameH/4)) theo kiểu sao chép COPY_PUT.
f) Hàm show_nut() được sử dụng để hiện ra màn hình nút điều khiển được
khai báo theo struct nut
- Nếu stats của nút đk == 1 thì nút sẽ hiện ra dạng “nổi” còn ngược lại nó sẽ
hiện ra dạng “chìm”:
if (nbut.stats == 1) setcolor(15); else
setcolor(8);
for (i = 1; i <= nbut.b; i++)
{
line(nbut.x - i, nbut.y - i, nbut.x - i, nbut.y
+ nbut.h + i);
line(nbut.x - i, nbut.y - i, nbut.x + nbut.w +
i, nbut.y - i);
}
if (nbut.stats == 1) setcolor(8); else
setcolor(15);
for (i = 1; i <= nbut.b; i++)
{
line(nbut.x + i + nbut.w, nbut.y - i, nbut.x + i +
nbut.w, nbut.y + nbut.h + i);
line(nbut.x - i, nbut.y +i + nbut.h, nbut.x +
nbut.w + i, nbut.y +i + nbut.h);
10
}
- Thiết lập màu chữ và hiện ra caption của nút:
setcolor(0);
outtextxy(nbut.x + 10, nbut.y + nbut.h / 2-3,
nbut.cap);
g) Hàm in_nut() trả về giá trị xác định vị trí chuột khi click chuột có thuộc
vùng một nút đk nào:
int in_nut(int nowX, int nowY, struct nut bclick)
{
return ((nowX>=bclick.x)&(nowX<=bclick.x+bclick.w)
& (nowY>=bclick.y)&(nowY<=bclick.y+bclick.h));
}
h) Một loạt các hàm update như (update_pcolor(), update_ bline(),
update_bpen(), update_brect(), update_brectf(), update_bellip(),
update_bellipf(), update_bpoly(), update_bair(), update_bera(),
update_bfill(), update_nut()) được sử dụng để vẽ hình mô tả nút điều
khiển .
i) Hàm kt_bangmau() khởi tạo và vẽ ra màn hình 1 bảng 16 mầu cơ bản chia
làm 2 dòng :
{
int i;
pcolor[0].b = 2; pcolor[0].h = 12;pcolor[0].stats
= 1;
pcolor[0].w = 36; pcolor[0].cap = "";
pcolor[0].x = 90; pcolor[0].y = 435;
show_nut(pcolor[0]); setfillstyle(1, 0);
bar(pcolor[0].x,pcolor[0].y,pcolor[0].x +
pcolor[0].w, pcolor[0].y + pcolor[0].h);
for (i = 1; i<= 7; i++)
{
pcolor[i].b = 2; pcolor[i].h =
12;pcolor[i].stats = 1;
pcolor[i].w = 36;pcolor[i].cap = "";
11
pcolor[i].x = pcolor[i-1].x + 40;pcolor[i].y =
435;
if (i == ncolor) pcolor[i].stats = 0;
show_nut(pcolor[i]); setfillstyle(1, i);
bar(pcolor[i].x,pcolor[i].y,pcolor[i].x +
pcolor[i].w, pcolor[i].y + pcolor[i].h);
}
pcolor[8].b = 2; pcolor[8].h = 12;pcolor[8].stats
= 1;
pcolor[8].w = 36; pcolor[8].cap = "";
pcolor[8].x = 90; pcolor[8].y = 435+20;
show_nut(pcolor[8]); setfillstyle(1, 8);
bar(pcolor[8].x,pcolor[8].y,pcolor[8].x +
pcolor[8].w, pcolor[8].y + pcolor[8].h);
for (i = 9; i<= 15; i++)
{
pcolor[i].b = 2; pcolor[i].h =
12;pcolor[i].stats = 1;
pcolor[i].w = 36; pcolor[i].cap = "";
pcolor[i].x = pcolor[i-1].x + 40;pcolor[i].y =
435+20;
if (i == ncolor) pcolor[i].stats = 0;
show_nut(pcolor[i]); setfillstyle(1, i);
bar(pcolor[i].x,pcolor[i].y,pcolor[i].x +
pcolor[i].w, pcolor[i].y + pcolor[i].h);
}
}
j) Hàm hien_color() có khai báo biến s để lưu giá trịmàu hiện thời và hiện
ra ô cstyle[s]
{
cstyle[s].b = 2; cstyle[s].h = 34;
cstyle[s].w = 34; cstyle[s].cap = "";
cstyle[s].x = 35; cstyle[s].y = 435;
show_nut(cstyle[s]);
12
setfillstyle(1, s);
bar(cstyle[s].x,cstyle[s].y,cstyle[s].x +
cstyle[s].w, cstyle[s].y + cstyle[s].h);
}
k) Hàm kt_bangve vẽ lên màn hình bảng chứa các nút chức năng vẽ và nút
điều khiển chương trình:
{
panel.x = 10; panel.y = 50;
panel.h = 130; panel.w = 55;
panel.stats = 1; panel.cap = ""; panel.b = 1;
pstyle.x = 15; pstyle.y = 190;
pstyle.h = 30; pstyle.w = 45;
pstyle.stats = 1; pstyle.cap = ""; pstyle.b = 1;
bline.x = 15; bline.y = 55;
bline.h = 20; bline.w = 20;
bline.stats = 1; bline.cap = ""; bline.b = 1;
bpen.x = 40; bpen.y = 55;
bpen.h = 20; bpen.w = 20;
bpen.stats = 1; bpen.cap = ""; bpen.b = 1;
bellip.x = 15; bellip.y = 80;
bellip.h = 20; bellip.w = 20;
bellip.stats = 1; bellip.cap = ""; bellip.b = 1;
brect.x = 40; brect.y = 80;
brect.h = 20; brect.w = 20;
brect.stats = 1; brect.cap = ""; brect.b = 1;
bellipf.x = 15; bellipf.y = 105;
bellipf.h = 20; bellipf.w = 20;
bellipf.stats = 1; bellipf.cap = ""; bellipf.b =
1;
13
brectf.x = 40; brectf.y = 105;
brectf.h = 20; brectf.w = 20;
brectf.stats = 1; brectf.cap = ""; brectf.b = 1;
bpoly.x = 15; bpoly.y = 130;
bpoly.h = 20; bpoly.w = 20;
bpoly.stats = 1; bpoly.cap = ""; bpoly.b = 1;
bair.x = 40; bair.y = 130;
bair.h = 20; bair.w = 20;
bair.stats = 1; bair.cap = ""; bair.b = 1;
bera.x = 15; bera.y = 155;
bera.h = 20; bera.w = 20;
bera.stats = 1; bera.cap = ""; bera.b = 1;
bfill.x = 40; bfill.y = 155;
bfill.h = 20; bfill.w = 20;
bfill.stats = 1; bfill.cap = ""; bfill.b = 1;
bnew.x = 15; bnew.y = 240;
bnew.h = 20; bnew.w = 50;
bnew.cap = "New"; bnew.stats = 1; bnew.b = 1;
bsave.x = 15; bsave.y = 270;
bsave.h = 20; bsave.w = 50;
bsave.cap = "Save"; bsave.stats = 1; bsave.b = 1;
bload.x = 15; bload.y = 300;
bload.h = 20; bload.w = 50;
bload.cap = "Load"; bload.stats = 1; bload.b = 1;
bhelp.x = 15; bhelp.y = 330;
bhelp.h = 20; bhelp.w = 50;
14
Không có nhận xét nào:
Đăng nhận xét