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


Vẽ đồ thị của các hàm toán học



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

Vẽ đồ thị của các hàm toán học


Để vẽ đồ thị của một hàm toán học, ta vẽ từng điểm một của đồ thị. Mỗi điểm được xác định bởi cặp tọa độ (x, y) trên màn hình. Do vậy cần tính các điểm này theo tọa độ trên màn hình. Các bước cần làm gồm có:

Xác định hệ trục tọa độ. Thông thường ta sẽ lấy tâm màn hình làm tâm hệ trục bằng việc xác định lại cửa sổ màn hình bởi câu lệnh:

viewport(midx, midy, maxx, maxy, 0);

trong đó midx, midy là tọa độ tâm màn hình, maxx, maxy là tọa độ góc dưới bên phải của màn hình. Câu lệnh trên tạo một cửa sổ là phần tư bên phải, phía dưới của màn hình. Tham trị cuối (1) cho phép các hình vẽ sẽ được vẽ ra ngoài khung cửa sổ này. Như vậy tâm màn hình sẽ biến thành tâm của hệ trục tọa độ. Tọa độ của tâm màn hình bây giờ được tính là (0,0).

Xác định tỉ lệ: Cần xác định một đơn vị của x và y của hàm cần vẽ sẽ tương ứng với bao nhiêu điểm trên trục x và y của màn hình. Do số điểm theo chiều rộng và chiều cao của màn hình khác nhau và do giá trị của hàm (y) có thể rất lớn so với giá trị của đối (x) (ví dụ hàm y = x4) hoặc rất bé (ví dụ hàm y = sinx) nên các tỉ lệ này theo x và y có thể khác nhau để hình vẽ trên màn hình được cân đối. Việc xác định các tỉ lệ này phụ thuộc vào kinh nghiệm và thường được điều chỉnh sau khi chạy thử chương trình.

Vẽ hệ trục : Có thể vẽ hệ trục tọa độ hay không. Hàm sau cho phép vẽ các trục tọa độ với tâm nằm giữa màn hình.



void vetruc() // Ve truc toa do

{

line(0, midy, maxx, midy); // truc hoanh



line(maxx-7, midy-3, maxx, midy); // mui ten

line(maxx-7, midy+3, maxx, midy);

line(midx, 0, midx, maxy); // truc tung

line(midx-3, 7, midx, 0); // mui ten

line(midx+3, 7, midx, 0);

outtextxy(midx+6, midy+6, "(0, 0)"); // in toa do (0,0)

}
Các ví dụ sau sẽ vẽ đồ thị của một số hàm quen thuộc.
void Sinx() // Do thi ham Sinx

{

int tileX = 20, tileY = 60; // Tỉ lệ theo X và Y



int x, y, i;

setviewport(midx, midy, maxx, maxy, 0);

for (i = -400; i<=400; i++) {

x = 2*pi*i*tileX/200;

y = sin(2*pi*i/200)*tileY;

putpixel(x, y, 1);

}

setviewport(0, 0, maxx, maxy, 0);



}
void Sinoverx() // Ham Sinx/x

{

float t;



float tileX = 50/pi;

float tileY = 80;

int x, y;

for (x = 30; x < maxx-30; x++) {

t = ((x==midx)? 1 : (x-midx))/tileX;

y = midy - int(sin(t)/t*tileY);

putpixel(x, y, 2);

}

}


Ve do thi theo tham so (x = x(t), y = y(t))

void Hypocycloide() // Ham x = cos3t, y = sin3t

{ // t Î [0, 2p]

float t;

int i, x, y;

for (i = 0; i<1000; i++) {

t = (pi/500)*i;

x = int(120*pow(cos(t), 3)) + midx;

y = int(120*pow(sin(t), 3)) + midy;

putpixel(x, y, 3);

}

}



void Trocoide() // Ham (2t-3sint, 2-3cost)

{ // t Î [-9, 9]

float t;

int i, x, y;

for (i = -1000; i<=1000; i++) {

t = 0.01*i;

x = int(15*(2*t-3*sin(t))) + midx;

y = -int(10*(2-3*cos(t))) + midy;

putpixel(x, y, 4);

}

}



void So3() // x = sintcos2t + sint

{ // y = sin2tcost, t Î [0, 2p]

float t;

int i, x, y;

for (i = 0; i<=1000; i++) {

t = (pi/500)*i;

x = int(150*(sin(t)*(1+cos(t)*cos(t)))) + midx;

y = int(200*sin(t)*sin(t)*cos(t)) + midy;

putpixel(x, y, 5);

}

}



Ve do thi theo toa do cuc r = j(q)

void Archimede() // Ham r = q, q Î [0, 40]

{

int i, x, y;



float r, t;

for (i = 0;i<=2500;i++) {

t = 0.02*i;

x = int(3*t*cos(t))+midx;

y = -int(3*t*sin(t))+midy;

putpixel(x, y, 6);

}

}
void Hoahong() // Ham r = sin2q, q Î [0, 2p]



{

int i, x, y;

float r, t;

for (i = 0;i<=2000;i++) {

t = (pi/500)*i;

x = int(150*(sin(2*t)*cos(t)))+midx;

y = int(150*sin(2*t)*sin(t))+midy;

putpixel(x, y, 7);

}

}
Chương trình dưới đây cho phép vẽ hai mặt trong không gian 3 chiều được cho bởi hai hàm f = sinx.siny và g =



typedef struct TOADO {

int OX, OY, UX, UY, UZ; // truc hoanh, tung va don vi cac truc

double Xx, Xy; // goc (OX, ox), (OY, oy)

};

TOADO gr3 = { 320, 20, 20, 20, 20, 0.8*pi, 0.2*pi };


void Vetruc() // Ve truc Ox, Oy

{

setviewport(0, 0, maxx, maxy, 0);



settextstyle(DEFAULT_FONT, HORIZ_HUONG, 0);

setcolor(WHITE);

line(0, midy, maxx, midy);

line(maxx-7, midy-3, maxx, midy); line(maxx-7, midy+3, maxx, midy);

line(midx, 0, midx, maxy);

line(midx-3, 7, midx, 0); line(midx+3, 7, midx, 0);

outtextxy(midx+6, midy+6, "(0, 0)");

outtextxy(maxx-18, midy+6, "x"); outtextxy(midx+8, 6, "y");

setbkcolor(CYAN); setcolor(RED);

settextstyle(TRIPLEX_FONT, HORIZ_HUONG, 2);

outtextxy(10, 0, "DO THI KHONG GIAN 3 CHIEU");

}
int X(double x, double y, double z) // doi toa do xyz sang truc X

{

return gr3.OX + x*gr3.UX*cos(gr3.Xx) + y*gr3.UY*cos(gr3.Xy);



}

int Y(double x, double y, double z) // doi toa do xyz sang truc Y

{

return gr3.OY + x*gr3.UX*sin(gr3.Xx) + y*gr3.UY*sin(gr3.Xy) - z*gr3.UZ;



}

double f(double x, double y) // Ham f(x, y) can ve

{

return 4*sin(x)*sin(y);



}

double g(double x, double y) // Ham g(x, y) can ve

{

return 5*sin(sqrt(x*x+y*y))/sqrt(x*x+y*y);



}

void Vehamf()

{

double x, y, z;



double xa = -6.28, xb = 6.28;

double ya = -6.28, yb = 6.28;

double xp = 0.2, yp = 0.2;

int mat[8];

settextstyle(TRIPLEX_FONT, HORIZ_HUONG, 1);

outtextxy(10, 20, "Ham z = sinx.siny");

setviewport(0, midy, maxx, maxy, 0);

for (x = xa; x <= xb; x+=xp) // ve mat an

for (y = ya; y <= yb; y+=yp)

{

if (kbhit()) return;



z = f(x, y); // diem A

mat[0] = X(x, y, z); mat[1] = Y(x, y, z);

z = f(x, y+yp); // diem B

mat[2] = X(x, y+yp, z); mat[3] = Y(x, y+yp, z);

z = f(x+xp, y+yp); // diem C

mat[4] = X(x+xp, y+yp, z); mat[5] = Y(x+xp, y+yp, z);

z = f(x+xp, y); // diem D

mat[6] = X(x+xp, y, z); mat[7] = Y(x+xp, y, z);

if ((mat[3]-mat[1]) * (mat[6]-mat[0]) -

(mat[7]-mat[1]) * (mat[2]-mat[0]) < 0)

setfillstyle(1, YELLOW); else setfillstyle(1, GREEN);

fillpoly(4, mat);

delay(10);

}

getch();



}
void Vehamg()

{

double x, y, z;



double xa = -10, xb = 10;

double ya = -10, yb = 10;

double xp = 0.1, yp = 0.1;

settextstyle(TRIPLEX_FONT, HORIZ_DIR, 1);

outtextxy(10, 20, "Ham z = sin(sqrt(x*x+y*y))");

outtextxy(100, 30, "------------");

outtextxy(115, 40, "sqrt(x*x+y*y)");

setviewport(0, midy, maxx, maxy, 0);

setcolor(BLUE);

for (x = xa; x <= xb; x+=xp)

for (y = ya; y <= yb; y+=yp)

{

if (kbhit()) return;



z = g(x, y); lineto(X(x, y, z), Y(x, y, z));

delay(10);

}

getch();


}
void main()

{

Initgraph(); Vetruc(); Vehamf();



cleardevice(); Vetruc(); Vehamg();

closegraph();

}


Каталог: wp-content -> uploads -> 2015
2015 -> TRƯỜng đẠi học ngân hàng tp. Hcm markerting cơ BẢn lớP: mk001-1-111-T01
2015 -> Hãy là người đầu tiên biết
2015 -> Có chiến lược toàn diện về việc truyền phát tin tức
2015 -> BỘ TÀi chính
2015 -> THỦ TƯỚng chính phủ
2015 -> SỞ lao đỘng thưƠng binh và XÃ HỘI
2015 -> CỘng hòa xã HỘi chủ nghĩa việt nam trưỜng đẠi học cần thơ Độc lập – Tự do – Hạnh phúc
2015 -> Dapandethi. Blogspot. Com lịch sử BÁo chí thế GiỚI
2015 -> Dapandethi. Blogspot. Com đẠi học quốc gia hà NỘi trưỜng đẠi học khoa học xã HỘi và nhân văn khoa báo chí
2015 -> Tài liệu đang trong quá trình chỉnh sửa, không phải là giá trình chính thức Dân số và sự gia tăng dân số

tải về 1.98 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   36   37   38   39   40   41   42   43   ...   55




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

    Quê hương