VietTUG.org - old forum - threads' archive

thread_id = 4901, contains 4901, 4902, 4906, 4912, 4915, 4918
id = 4901, parent = 0, thread = 4901, catid = 8, locked = 0, moved = 0,
userid = tanphu, ip = 203.162.3.152, time = 2008/07/21 (1216640994) ,
subject = Vẽ đồ thị hàm số bằng MetaPost, hits = 1667, karma = 2+0-,
VẼ ĐỒ THỊ HÀM SỐ TRONG LATEX BẰNG METAPOST
Xin chào mọi người. Hôm nay tôi sẽ hướng dẫn các bạn tận tay cách vẽ đồ thị của hàm trong LaTex bằng cách sử dụng gói MetaPost.
MetaPost được viết bởi John D. Hobby. Nó giống như là một ngôn ngữ lập trình, chuyên dùng để vẽ hình hình học và có thể là bất cứ hình gì bạn muốn.
Nếu yêu cầu vẽ hình của bạn không quá cao, bạn có thể sử dụng một số phần mềm hình học động ví 2D như là: Cabri II plus, sketchpad, Geogebra, Euclide; hoặc các phần mềm hình học động 3D (vẽ các hình khối trong không gian) như Cabri 3D, GeoSpace; hoặc để vẽ đồ thị hàm số ta có thể dùng Maple. Cần nói thêm là ngoài Maple thì các phần mềm hình học động nêu trên đều có chức năn vẽ đồ thị hàm số.
Các phần mềm trên có ưu điểm là dễ sử dụng nhưng cũng có một nhược điểm là nó xuất ra các hình ảnh mà khi in với độ phân giải cao sẽ được kết quả không đẹp. Khi soạn thảo văn bảng Toán bằng LaTex, để chèn các hình vẽ bằng các phần mềm hình học trên vào Tex bạn phải xuất hình ảnh được vẽ thành ảnh JPG rồi \includegraphics vào LaTex. Cách làm này khi in thường cho kết quả xấu và làm cho dung lượng file PDF phình to ra.
Hai nhược điểm trên có thể khắc phục bằng cách sử dụng MetaPost. Metapost xuất ra file Postscript có dung lượng nhỏ có thể chèn vào file PDF. Dung lượng file PDF thu được nhỏ nhưng khi in thì lại được chất lượng bản in rất cao.
Có một điều mà người sử dụng ngại dùng MetaPost là hầu hết họ cảm thấy khó vì phải làm một công việc gần như là lập trình, viết lệnh để vẽ hình. Dùng MetaPost đúng là viết lệnh để vẽ hình thật, nhưng cũng không khó như bạn tưởng đâu, vì đôi khi những công việc khó khăn đó đã có những người đi trước tạo sẵn một số macro và ta chỉ cần input các macro ấy vào là có thể sử dụng ngay và tiết kiệm được nhiều dòng lệnh. Một khi đã dùng quen MetaPost, đã tạo ra được một số hình mẫu cơ bản rồi thì việc tạo ra một hình mới rất nhanh, tao chỉ cần lấy hình cũ và chỉnh sửa một số lệnh trong đó theo yêu cầu của hình mới cần vẽ.
Trước tiên ta cần biết nguyên tắc hoạt động của việc vẽ hình bằng MetaPost. Việc việc vẽ hình và chèn vào Latex thông qua các bước sau:
Bước 1: Viết lệnh và lưu các lệnh trong một file có phần mở rộng là *.mp. Việc này có thể thực hiện bằng bất cứ một phần mềm soạn thảo Latex nào. Ở đây tôi dùng WinEdt, bạn có thể tải WinEdt tại địa chỉ: ftp://cam.ctan.org/tex-archive/systems/ … nedt55.exe Nếu không tìm thấy trong WinEdt chức năng lưu file với phần mở rộng là *.mp thì bạn cứ lưu thành file *.tex rồi dùng Windows Explorer để rename cái phần mở rộng *.tex thành *.mp là được.
Để minh hoạ cho bước 1, bạn mở WinEdt soạn thảo các lệnh sau và lưu thành file bacbon.mp và lưu trong thư mục C:\vidu
beginfig(1)
u:=.8cm; % hang so do dai de su dung sau nay
mm:=.1; % hang so de su dung sau nay
numeric a, b, xmin, xmax, ymin, ymax; % khai bao cac so
a:=-2.3;
b:=2.3;
xmin:=-4; %phai la cac so nguyen
xmax:=4;
ymin:=-5;
ymax:=7;

path q;

vardef f(expr x)=x**4-2x**2 enddef;
q:=u*(a,f(a)) for i=a step .01 until b+.01: ..u*(i,f(i)) endfor;

%==== Ve luoi toa do ====
drawoptions(dashed evenly scaled .5 withpen pencircle scaled .3pt);
%for i=xmin upto xmax: draw u*(i,ymin)--u*(i,ymax); endfor;
%for i=ymin upto ymax: draw u*(xmin,i)--u*(xmax,i); endfor;

%=====Ve cac truc toa do Ox, Oy
drawoptions(withpen pencircle scaled 1pt);
drawarrow u*(xmin,0)--u*(xmax,0);
drawarrow u*(0,ymin)--u*(0,ymax);

label.top(btex $y$ etex,u*(0,ymax));
label.rt(btex $x$ etex,u*(xmax,0));
label.urt(btex $O$ etex,u*(0,0));

%==== Dien cac so chia don vi
for i=xmin+1 upto xmax-1: label.llft(decimal(i), u*(10i/7,0)) scaled .7; endfor;
for i=ymin+1 upto ymax-1: label.llft(decimal(i), u*(0,10i/7)) scaled .7; endfor;

%===== ve cac vach chia don vi
drawoptions(withpen pencircle scaled .3pt);
for i=xmin+1 upto xmax-1: draw u*(i,-mm)--u*(i,mm); endfor;
for i=ymin+1 upto ymax-1: draw u*(-mm,i)--u*(mm,i); endfor;

drawoptions(withpen pencircle scaled 1.2pt);
draw q;
label(btex $y=x^4-2x^2$ etex,u*(4,4));

endfig;
end;

Bước 2: Dùng chế độ dòng lệnh biên dịch file bacbon.mp để xuất ra file bacbon.1. Đây là file chứa hình ảnh mà ta sẽ sử dụng để chèn vào Latex. Thực hiện như sau:
Trong màn hình soạn thảo cua WinEdt khi đang mở file bacbon.mp, bạn nhấp chuột vào nút lệnh Command Promt có biểu tượng cửa sổ dos màu đen. Một cửa sổ DOS mở ra và đang ở thư mục “C:\vidu”. Bạn gõ vào dòng lệnh: “mpost bacbon”. Nhớ rằng là không có dấu ngoặc kép và sau từ khoá mpost có một khoảng trắng.
Thực hiện xong bước này thì ta đã tạo ra được file bacbon.1. Bạn có thể dùng My Computer vào thư mục C:\vidu để kiểm tra điều này.
Khi thực hiện lệnh mpost, nếu hệ thống Miktex của bạn chưa cài gói metapost thì sẽ có một cửa sổ xuất hiện yêu bạn chỉ đường dẫn để cài đặt bổ sung gói này.
Bước 3: Chèn file hình vẽ được vào Latex. Thực hiện như sau:
Dùng WinEdt soạn thảo và lưu file minhhoa.tex với nội dung như sau:

\documentclass[12pt,a4paper]{article}
\usepackage[viscii]{vietnam}
\usepackage{graphicx}
\begin{document}
\convertMPtoPDF{bacbon.1}{1.2}{1.2}
\end{document}

Biên dịch thành file PDF để xem kết quả.

Chú ý: Để chèn file hình vẽ bằng Metapost vào LaTex ta dùng cú pháp
\convertMPtoPDF{bacbon.1}{1.2}{1.2}. Hai thông số 1.2 và 1.2 ở dùng để điều khiển độ rộng và chiều cao của hình được chèn. Để sử dụng được lệnh này bạn cần nạp gói graphicx.
Như vậy là bạn đã tự tay vẽ được đồ thị hàm số bằng MetaPost. Để vẽ đồ thị hàm số khác, bạn chỉ cần mở file bacbon.mp ra rồi lưu thành file khác và điều chỉnh một số thông số rồi thực hiện các bước trên là bạn đã vẽ được hình mới.

GIẢI THÍCH MỘT SỐ LỆNH CƠ BẢN
beginfig(1) % thông số (1) là để quy định sau này khi biên dịch bằng lệnh mpost ta thu được file có phần mở rộng là *.1
u:=.8cm; % khai báo hằng số độ dài, sau này nếu muốn
mm:=.1; % hằng số điều khiển độ dài của đường vạch chia đơn vị trên các truc toạ độ.
numeric a, b, xmin, xmax, ymin, ymax; % lệnh numeric dùng để khai báo các số thực
a:=-2.3; % các thông số a, b để vẽ đồ thị trên đoạn [a;b]
b:=2.3;
xmin:=-4; % bạn nên dùng các số nguyên, bốn thông số xmin, xmax, ymin, ymax dùng để quy định một hình chữ nhật của vùng được vẽ
xmax:=4;
ymin:=-5;
ymax:=7;

path q; % Khai báo một đường cong tên là q dùng để biểu diễn đồ thị

vardef f(expr x)=x**4-2x**2 enddef; % Khai báo hàm số f, để vẽ đồ thị của hàm số khác bạn có thể thay đổi biểu thức của hàm tại đây.
q:=u*(a,f(a)) for i=a step .01 until b+.01: ..u*(i,f(i)) endfor; % Quy định q là đường cong theo công thức của f trên đoạn [a;b]

%==== Vẽ lưới toạ độ ==== Bạn bỏ các dấu % ở đầu dòng để vẽ lưới toạ độ
drawoptions(dashed evenly scaled .5 withpen pencircle scaled .3pt);
%for i=xmin upto xmax: draw u*(i,ymin)--u*(i,ymax); endfor;
%for i=ymin upto ymax: draw u*(xmin,i)--u*(xmax,i); endfor;

%=====Vẽ các trục toạ độ Ox, Oy
drawoptions(withpen pencircle scaled 1pt); % Lệnh drawoptions tuỳ chọn loại đường nét vẽ (nét liền hay nét đứt, đường kính nét vẽ là bao nhiêu, màu gì, …
drawarrow u*(xmin,0)--u*(xmax,0); % Vẽ mũi tên (trục Ox)
drawarrow u*(0,ymin)--u*(0,ymax); % trục Oy

label.top(btex $y$ etex,u*(0,ymax)); % Lệnh này đặt một đoạn text tại toạ độ được chỉ ra, từ khoá btex và etex là để mở đầu và kết thúc đoạn text, dùng hai dấu $$ để hiển thị công thức toán theo quy ước gõ công thức toán của Latex, bạn có thể hiện thị một công thức toán phức tạp ở đây theo chuẩn của LaTeX.
label.rt(btex $x$ etex,u*(xmax,0));
label.urt(btex $O$ etex,u*(0,0));

%==== Điền các số chia đơn vị lên các trục Ox và Oy, nếu không muốn dùng thì bạn bỏ hai dòng này đi.
for i=xmin+1 upto xmax-1: label.llft(decimal(i), u*(10i/7,0)) scaled .7; endfor;
for i=ymin+1 upto ymax-1: label.llft(decimal(i), u*(0,10i/7)) scaled .7; endfor;

%===== Vẽ các vạch chia đơn vị
drawoptions(withpen pencircle scaled .3pt);
for i=xmin+1 upto xmax-1: draw u*(i,-mm)--u*(i,mm); endfor;
for i=ymin+1 upto ymax-1: draw u*(-mm,i)--u*(mm,i); endfor;

drawoptions(withpen pencircle scaled 1.2pt);
draw q; % Vẽ đường cong q đã được khai báo ở trên
label(btex $y=x^4-2x^2$ etex,u*(4,4)); % hiển thị một công thức toán tai toạ độ cho sẵn.

endfig; %từ khoá bắt buộc dùng để kết một thúc hình
end; % từ khoá kết thúc file
Bạn có thể tìm hiểu thêm trong các tài liệu về Metapost để có thể hiểu rõ hơn về các lệnh và cách sử dụng chúng cũng như các loại biến dữ liệu và cách khai báo.
 
id = 4902, parent = 4901, thread = 4901, catid = 8, locked = 0, moved = 0,
userid = phuongnam, ip = 123.22.92.82, time = 2008/07/21 (1216648053) ,
subject = Re:Vẽ đồ thị hàm số bằng MetaPost, hits = 0, karma = 0+0-,
Cám ơn bác tanphu đã hướng dẫn vẽ hình bằng metapost. Thật ra, chương trình hình học Geogebra có cho phép bác chuyển một hình vẽ nào đó qua mã Latex. Khi đó, copy đoạn mã đó qua văn bản Tex một cách dễ dàng. Vẽ trong Geogebra rất dễ. Chu ý rằng, khi dán đoạn mã từ Geogebra sang TeX, đôi khi cần điều chỉnh một tí cho vừa mắt mình. Tôi nghĩ, dùng Geogebra là một trong các cách đơn giản nhất.
 
id = 4906, parent = 4902, thread = 4901, catid = 8, locked = 0, moved = 0,
userid = tanphu, ip = 203.162.3.148, time = 2008/07/24 (1216834967) ,
subject = Re:Vẽ đồ thị hàm số bằng MetaPost, hits = 0, karma = 0+0-,
Tôi đã có biết qua cách dùng Geogebra đễ vẽ hình rồi copy code chèn vào Tex. Cách này rất dễ thực hiện nhưng đối với những hình phức tạp cần đến kĩ thuật lập trình thì MetaPost chiếm ưu thế hơn. Tôi đơn cử một hình fractal đó là bông tuyết VonKock. Đễ vẽ hình bông tuyết này thì phải dùng MetaPost thôi.
Nhân đây tôi cũng hướng dẫn các bác cài đặt GeoGebra. Để cài được GeoGebra bạn cần phải cài đặt JRE tải tại địa chỉ:
http://cds.sun.com/is-bin/INTERSHOP.enf … i586-p.exe
Sau đó tải Geogebra và cài đặt tại đây:
http://www.geogebra.org/download/GeoGebra_3_0_0_0.exe
 
id = 4912, parent = 4906, thread = 4901, catid = 8, locked = 0, moved = 0,
userid = nqt, ip = 123.19.52.77, time = 2008/08/03 (1217780260) ,
subject = Re:Vẽ đồ thị hàm số bằng MetaPost, hits = 0, karma = 0+0-,
Tôi muốn tìm hiểu Metapost thì cần đọc tài liệu gì? Mong các bạn giúp đỡ
 
id = 4915, parent = 4912, thread = 4901, catid = 8, locked = 0, moved = 0,
userid = viettug, ip = 125.234.189.79, time = 2008/08/05 (1217871988) ,
subject = Re:Vẽ đồ thị hàm số bằng MetaPost, hits = 0, karma = 0+0-,
Bạn có thể đọc User's Manual: http://tug.org/docs/metapost/mpman.pdf

Các tài liệu khác, ví dụ: http://tug.org/metapost.html
 
id = 4918, parent = 4915, thread = 4901, catid = 8, locked = 0, moved = 0,
userid = nqt, ip = 123.19.60.247, time = 2008/08/07 (1218102209) ,
subject = Re:Vẽ đồ thị hàm số bằng MetaPost, hits = 0, karma = 0+0-,
Cảm ơn bạn nhiều!