Vẽ hình không gian trong LaTeX

Dự định chọn một vài hình không gian nào đó trong chương trình Hình Học 11 để tập vẽ hình bằng LaTeX, nào ngờ dính ngay mấy hình khó nhằn, giao điểm loạn cả lên. Nhưng lỡ bấm nút ghi hình nên đành phóng lao phải theo lao vậy. Bài viết này không nhằm mục đích hướng dẫn mà chỉ là một vài chia sẻ cá nhân, do đó tôi sẽ không trình bày và giải thích quá chi tiết về từng dòng lệnh, quý bạn và các vị có quan tâm thì có thể bình luận bên dưới nhé.

Công đoạn chuẩn bị

Việc vẽ hình trong LaTeX thường được thực hiện bằng gói lệnh tikz. Cho nên việc đầu tiên cần làm là phải khai báo gói lệnh này trong phần đầu tài liệu, kèm theo đó là một số thư viện hỗ trợ. Dưới đây là phần khai báo mà tôi đang sử dụng:

\usepackage{tikz}
\usetikzlibrary{calc, angles, intersections, patterns, decorations.text}

Bắt đầu vẽ hình

Mỗi hình vẽ được thực hiện bởi một số dòng lệnh, bao bọc trong thẻ tikzpicture.

\begin{tikzpicture}
		...
\end{tikzpicture}

Chúng ta có thể khai báo thêm một số thuộc tính cho hình vẽ, như font size, tỉ lệ... Dưới đây là phần khai báo mà tôi dùng cho hầu hết các hình vẽ:

\begin{tikzpicture}[>=stealth,line join=round, line cap=round, scale=1]
		...
\end{tikzpicture}

Vẽ hình không gian

Các hình không gian như hình chóp, lăng trụ... thường bao gồm rất nhiều điểm, tôi thường khai báo trước các điểm đó bằng cách đặt cho mỗi điểm một tọa độ ước chừng, nếu thấy hình chưa ổn thì tôi sửa tọa độ lại là xong. Điểm nào không có tên trong hình, mà quá trình vẽ cần đến nó thì tôi đặt đại một cái tên nào đó, có khi là A1, A2, có khi là AA, BB, AB...

\begin{tikzpicture}[>=stealth,line join=round, line cap=round, scale=1]
		\coordinate (A) at (1,4);
		\coordinate (B) at (0,0);
		\coordinate (C) at (2,-1);
		\coordinate (D) at (5,1);
		\coordinate (M) at ($(A)!0.5!(B)$);
		\coordinate (N) at ($(A)!2/3!(C)$);
...
	\end{tikzpicture}

Hai hình vẽ lần này thuộc dạng toán tìm giao điểm, giao tuyến nên việc khai báo thư viện intersections như đã đề cập ở phần đầu là bắt buộc. Để tìm giao điểm của hai đoạn thẳng, trước tiên ta cần đặt tên (name path) cho hai đoạn thẳng đó, sau đó tìm giao điểm (name intersections) và đặt tên cho giao điểm.

\path[name path=l1] (K)--(J);
\path[name path=l2] (A)--(B);
\path[name intersections={of=l1 and l2, by=M}];

Nếu giao điểm nằm ngoài phạm vi của đoạn thẳng, ta kéo dài đoạn đó thêm một khoảng vài cm nữa. Nhưng kéo về phía nào là do cách đặt path name của mình là (B)--(C) hay (C)--(B).

\path[name path=l5] (J)--(H);
\path[name path=l6] (D)--(C)--([turn]0:2cm); %Kéo dài thêm 2cm theo hướng D->C
\path[name intersections={of=l5 and l6, by=I}];

Hình vẽ hôm nay chỉ có một giao điểm nên tôi sẽ không trình bày mã lệnh của trường hợp nhiều giao điểm. Dưới đây là code của hai hình vẽ đầu bài:

\begin{tikzpicture}[>=stealth,line join=round, line cap=round, scale=1]
		\coordinate (A) at (1,4);
		\coordinate (B) at (0,0);
		\coordinate (C) at (2,-1);
		\coordinate (D) at (5,1);
		\coordinate (M) at ($(A)!0.5!(B)$);
		\coordinate (N) at ($(A)!2/3!(C)$);
		\draw (A) node[above]{$A$}--(M) node[left]{$M$}--(B) node[left]{$B$}--(C) node[below]{$C$}--(N) node[above right]{$N$}--(A)--(D) node[right]{$D$}--(N);
		\draw[dashed] (B)--(D)--(M);
		\path[name path=l1] (B)--(C)--([turn]0:5cm);
		\path[name path=l2] (M)--(N)--([turn]0:5cm);
		\path[name intersections={of=l1 and l2,by=E}];
		\draw (C)--(E) node[right]{$E$}--(M);
		\path[name path=l3] (D)--(C);
		\path[name intersections={of=l3 and l2,by=F}];
		\draw[dashed] (C)--(F);
		\draw (F)--(D);
	\end{tikzpicture}

\begin{tikzpicture}[>=stealth,line join=round, line cap=round, scale=1]
		\coordinate (A) at (1.5,4);
		\coordinate (B) at (0,0);
		\coordinate (D) at (5,0);
		\coordinate (C) at (2.5,-1);
		\coordinate (K) at ($(A)!0.35!(D)$);
		\coordinate (J) at ($(D)!1.5!(B)$);
		\coordinate (H) at ($(B)!2.5!(C)$);
		\path[name path=l1] (K)--(J);
		\path[name path=l2] (A)--(B);
		\path[name intersections={of=l1 and l2, by=M}];
		\path[name path=l3] (A)--(C);
		\path[name path=l4] (M)--(H);
		\path[name intersections={of=l3 and l4, by=N}];
		\path[name path=l5] (J)--(H);
		\path[name path=l6] (D)--(C)--([turn]0:2cm);
		\path[name intersections={of=l5 and l6, by=I}];
		\path[name intersections={of=l4 and l6, by=L}];
		\draw (A) node[above]{$A$}--(M) node[above left]{$M$}--(J) node[left]{$J$}--(I) node[below left]{$I$}--(H) node[right]{$H$}--(N) node[right]{$N$}--(M) (I)--(K) node[above right]{$K$}--(A)--(N) (K)--(D) node[right]{$D$}--(L);
		\draw[dashed] (K)--(M)--(B)--(J) (D)--(B)--(C) node[below]{$C$}--(I) (L)--(C)--(H) (C)--(N);
	\end{tikzpicture}

Chúc các bạn thành công và có một ngày mới vui vẻ.

Bình luận

Chia sẻ