Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang38/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   34   35   36   37   38   39   40   41   ...   55

Vẽ điểm, đường, khối, màu sắc

Màu sắc


getmaxcolor(): Trả lại số hiệu (hằng) tương ứng với màu tối đa của màn hình hiện tại. Do các hằng màu được tính từ 0 nên số màu sẽ bằng hằng trả lại cộng thêm 1.

setbkcolor(màu): Đặt màu nền. Có tác dụng với văn bản và các nét vẽ.

setcolor(màu): Đặt màu vẽ. Có tác dụng với văn bản và các nét vẽ.

getbkcolor(): Trả lại màu nền hiện tại.

getcolor(): Trả lại màu vẽ hiện tại (từ 0 đến getmaxcolor()).

Ví dụ: In toạ độ tại vị trí hiện tại của con trỏ màn hình. Trong ví dụ này chúng ta sử dụng câu lệnh sprintf(xâu s, "dòng đk", các biểu thức cần in), câu lệnh này sẽ thay việc in các biểu thức ra màn hình thành in ra xâu s (tức tạo xâu s từ các biểu thức). Ngoài ra hàm outtextxy(x, y, s) sẽ in xâu s tại vị trí (x,y).

void intoado(dx, dy, color)

{

int oldcolor;



oldcolor = getcolor();

setcolor(color);

char td[10];

sprintf(td, "(%d, %d)", getx(), gety());

outtextxy(getx()+dx, gety()+dy, td);

setcolor(oldcolor);

}

Vẽ điểm


putpixel(x, y, c): Vẽ điểm (x, y) với màu c.

getpixel (x, y): Trả lại màu tại điểm (x, y).

: Vẽ bầu trời sao

void sky()

{

int maxx, maxy, maxc;



int i, xarr[3001], yarr[3001];

maxx = getmaxx();

maxy = getmaxy();

maxc = getmaxcolor();

randomize();

for (i=1;i<3001;i++) {xarr[i]=random(maxx);yarr[i]=random(maxy);}

while (!kbhit()) {

for (i=1;i<3001;i++)

{

putpixel(xarr[i], yarr[i], random(maxc));delay(1);



}

for (i=1;i<3001;i++)

if (getpitxel(xarr[i], yarr[i]) == random(maxc))

putpitxel(xarr[i], yarr[i], 0);

}

}

Vẽ đường thẳng và gấp khúc


line(x1, y1, x2, y2): Vẽ đường thẳng từ (x1, y1) đến (x2, y2). Con trỏ màn hình vẫn đứng tại vị trí cũ.

lineto(x, y): Vẽ đường thẳng từ vị trí hiện tại của con trỏ đến vị trí (x, y). con trỏ chuyển về (x, y).

linerel(dx, dy): Gọi (x, y) là vị trí hiện tại của con trỏ, lệnh này sẽ vẽ đường thẳng nối (x, y) với điểm mới có tọa độ (x+dx, y+dy). Tức lệnh này cũng tương đương với lệnh lineto(getx()+dx, gety()+dy), trong đó getx() và gety() là hai hàm trả lại vị trí x, y hiện tại của con trỏ. Lệnh linerel sau khi thực hiện xong sẽ đặt con trỏ tại vị trí cuối của đường thẳng vừa vẽ.

: Vẽ hình bao thư bằng 1 nét.

void baothu()

{

setbkcolor(1);



setcolor(YELLOW);

moveto(100, 100);

lineto(300, 100); lineto(300, 200); lineto(100, 200); lineto(100, 100);

lineto(200, 50); lineto(300, 100);

}

rectangle(x1, y1, x2, y2): Vẽ hình khung chữ nhật với góc trên bên trái có tọa độ (x1, y1) và góc dưới bên phải có tọa độ (x2, y2).

bar(x1, y1, x2, y2): Vẽ hình chữ nhật đặc. Màu khung được đặt bởi setcolor và màu nền lẫn mẫu tô nền được đặt bởi lệnh setlinestyle. Mẫu nền ngầm định là đặc và màu là getmaxcolor.

bar3d(x1, y1, x2, y2, c, top): Vẽ hình trụ chữ nhật với đáy là (x1, y1, x2, y2) và độ cao c, nếu top = 1 hình sẽ có nắp và nếu top = 0 hình không có nắp.

Ví dụ : Vẽ các hình khối chữ nhật với mầu nền và mẫu tô khác nhau.

void main()

{

int gdriver = DETECT, gmode;



initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi");

int midx = getmaxx() / 2;

int midy = getmaxy() / 2;

for (int i=SOLID_FILL; i

{

setfillstyle(i, i);



bar3d(midx-50, midy-50, midx+50, midy+50, 100, 0);

getch();

}

closegraph();



}

Ghi chú: để xoá điểm hoặc đường ta vẽ lại điểm hoặc đường đó bằng màu nền hiện tại. Để biết màu nền hiện tại ta sử dụng hàm getbkcolor().

Các thuộc tính về đường (kiểu đường, độ rộng)


setlinestyle(style, pattern, width): đặt các thuộc tính về đường vẽ, trong đó style là kiểu đường, pattern là mẫu tô và width là độ đậm của đường vẽ. Các thuộc tính này được giải thích bên dưới.

getlinesettings(struct linesettingstype *info): Lấy các thuộc tính về đường vẽ hiện tại cho vào biến được trỏ bởi info.

Kiểu của biến chứa các thuộc tính đường vẽ:

struct linesettingstype {

int linetsyle;

int upattern;

int thickness;

}

Các hằng số qui định các kiểu đường (style):



style: SOLID_LINE = 0

DOTTED_LINE = 1

CENTER_LINE = 2

DASHED_LINE = 3

USERBIT_LINE = 4, // Kiểu đường do NSD định nghĩa

pattern: Do NSD định nghĩa theo 2 byte cho một đường. Chỉ có tác dụng khi style = 4.

Các hằng số qui định độ đậm (độ dày) của đường (width):

NORM_WIDTH = 1

THICK_WIDTH = 3
:

void netve()

{

char *lname[] = {"Duong lien net", "Duong cham cham",



"Duong trung tam", "Duong dut net", "Duong do NSD dinh nghia" };

int style, midx, midy, mauNSD;

midx = getmaxx() / 2; midy = getmaxy() / 2;

// Mẫu đường được định nghĩa bởi NSD "0000000000000001"

mauNSD = 1;

for (style=SOLID_LINE; style<=USERBIT_LINE; style++) {

setlinestyle(style, mauNSD, 1);

line(0, 0, midx-10, midy);

rectangle(0, 0, getmaxx(), getmaxy());

outtextxy(midx, midy, lname[style]);

line(midx, midy+10, midx+8*strlen(lname[style]), midy+10);

getch();


cleardevice();

}

}


Các thuộc tính về hình (mẫu tô, màu tô)


setfillstyle(mẫu tô, màu tô): Đặt mẫu tô, màu tô

setfillpattern(mẫu tô, màu tô): Định nghĩa mẫu tô.

getfillsettings(struct fillsettingstype *info): Lấy mẫu tô hiện tại

struct fillsettingstype {

int pattern;

int color;

};

getfillpattern(mẫu tô): Trả lại mẫu tô hiện do NSD định nghĩa. Là một con trỏ trỏ đến mảng 8 kí tự. Sau đây là một số mẫu tô và các hằng tương ứng

EMPTY_FILL 0

SOLID_FILL 1

LINE_FILL 2

LTSLASH_FILL 3

SLASH_FILL 4

BKSLASH_FILL 5

LTBKSLASH_FILL 6

HATCH_FILL 7

XHATCH_FILL 8

INTERLEAVE_FILL 9

WIDE_DOT_FILL 10

CLOSE_DOT_FILL 11

USER_FILL 12

: Đặt mẫu tô.

char caro[8] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};

maxx = getmaxx();

maxy = getmaxy();

setfillpattern(caro, getmaxcolor()); ­

// Tô màn hình theo mẫu

bar(0, 0, maxx, maxy);

getch();

Vẽ đa giác


drawpoly(số đỉnh, vị trí đỉnh): Vẽ đường đa giác theo setlinestyle;

fillpoly(số đỉnh, vị trí đỉnh): Vẽ hình đa giác đặc theo setfillstyle;

Vị trí đỉnh là con trỏ trỏ đến dãy các toạ độ, thông thường dùng mảng.

Để vẽ đa giác đóng phải đưa ra n+1 toạ độ trong đó toạ độ n = toạ độ 0.

:

int poly[10];



poly[0] = 20; poly[1] = maxy / 2; // đỉnh thứ nhất

poly[2] = maxx - 20; poly[3] = 20; // đỉnh thứ hai

poly[4] = maxx - 50; poly[5] = maxy - 20; // đỉnh thứ ba

poly[6] = maxx / 2; poly[7] = maxy / 2; // đỉnh thứ tư

poly[8] = poly[0]; poly[9] = poly[1];

// vẽ đa giác

drawpoly(5, poly);

Vẽ đường cong


arc(x, y, góc đầu, góc cuối, bán kính): Vẽ cung tròn có tâm (x, y) với các góc và bán kính tương ứng.

circle(x, y, bán kính): Vẽ đường tròn có tâm tại (x, y).

pieslice(x, y, góc đầu, góc cuối, bán kính): Vẽ hình quạt tròn đặc với mẫu hiện tại;

ellipse(x, y, góc đầu, góc cuối, bkx, bky): Vẽ cung elip với tâm, các góc và các bán kính theo hoàng độ và tung độ tương ứng.

fillellipse(x, y, bkx, bky): Vẽ hình elip đặc.

sector(x, y, góc đầu, góc cuối, bkx, bky): Vẽ hình quạt elip.



Chú ý: Nếu góc đầu = 0 và góc cuối = 360 cung, lệnh trên sẽ vẽ đường tròn hoặc elip.

: Vẽ đường tròn và elip.

arc(200, 200, 45, 135, 100) ; // cung tròn

arc(200, 200, 0, 360, 100) ; // đường tròn

circle(200, 200, 100) ; // đường tròn

ellipse(200, 200, 45, 135, 100, 80) ; // cung elip

ellipse(200, 200, 0, 360, 100, 80) ; // đường elip;

setfillstyle(EMPTY_FILL, getmaxcolor());

pieslice(200, 200, 45, 135, 100) ; // đường quạt tròn

fillellipse(200, 200, 0, 360, 100, 80) ; // đường elip

setfillstyle(SOLID_FILL, getmaxcolor());

pieslice(200, 200, 45, 135, 100); // hình quạt tròn;

circle(200, 200, 100); // hình tròn;

fillellipse(200, 200, 0, 360, 100, 80); // hình elip;

sector(200, 200, 45, 135, 100, 80); // hình quạt elip

Tô mầu


floodfill(x, y, c): Tô màu một hình kín chứa điểm x, y và màu viền c. Mầu dùng để tô được đặt bởi hàm setfillstyle(kiểu tô, màu tô). Ví dụ:

void fill()

{

rectangle(100, 100, 180, 140); // Vẽ hình chữ nhật



setfillstyle(1, BLUE); // Mẫu tô đặc, màu xanh

floodfill(120, 120, 15); // Tô hình chữ nhật đã vẽ

int tg[8] = {150, 120, 180, 280, 350, 180, 150, 120};

drawpoly(4, tg);

setfillstyle(2, RED);

floodfill(180, 200, 15);

circle(380, 210, 100);

setfillstyle(3, GREEN);

floodfill(380, 210, 15);

}
void fill2() // Vẽ và tô màu dãy đường tròn liên tiếp

{

int i, x = 0, y = 0, r = 0;



for (i=1;i<10;i++) {

r = 10*i;

y = x += r;

circle(x, y, r);

setfillstyle(i, i);

floodfill(x, y, 15);

}

}

1   ...   34   35   36   37   38   39   40   41   ...   55


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương