Thử vẽ một vài hình đơn giản trong Latex
Để vẽ một hình vẽ hình học phẳng thuần túy, thông thường trong các hình có những điểm liên quan đến nhau. Từ đó xuất phát nhu cầu cần có những điểm phải lặp lại, những điểm do yêu cầu bài toán liên quan. Khi đó ta đi tìm tọa độ từng điểm rất mệt mỏi. Bạn không cần lo lắng vì TikZ đã biết trước điều đó.
3.3.1. Khai báo các điểm dùng nhiều lần
Để khai báo một điểm ta dùng lệnh:
\coordinate (point name) at (point);
trong đó point name là tên điểm do ta tự đặt (chẳng hạn A,B,C…) và point là tọa độ điểm. Sau khi ta khai báo điểm này, khi cần vẽ liên quan đến điểm này ta chỉ cần gọi ra:
\begin{tikzpicture} \coordinate (A) at (0,0); \coordinate (B) at (2,1); \coordinate (C) at (3,-1); \coordinate (D) at (-1,-2); \draw (A)--(B)--(C)--(D)--cycle (A)--(C) (B)--(D); \end{tikzpicture}
Thật đơn giản phải không bạn? Tất nhiên bạn muốn hơn thế nữa, chẳng hạn bạn muốn nối trung điểm M của AB và trung điểm N của CD thì làm thế nào?
Cũng chẳng có gì phức tạp khi TikZ đã nghĩ hộ cho bạn, không chỉ là trung điểm mà còn là một phép vị tự với tỉ lệ k bất kỳ:
\coordinate (M) at ($(A)! k ! (B)$);
Lệnh này sẽ khai báo cho ta điểm M nằm trên đường thẳng AB với điều kiện
AM = k AB. Hiển nhiên nếu M là trung điểm AB thì lệnh khai báo sẽ là:
\coordinate (m) at ($(A)!0.5!(B)$);
Ta hãy thực hành lệnh này xem sao:
\begin{tikzpicture} \draw[step=1,thin,gray!20] (-1,-2) grid (3,1); \coordinate (A) at (0,0);\coordinate (B) at (2,1); \coordinate (C) at (3,-1);\coordinate (D) at (-1,-2); \coordinate (M) at ($(A)!0.5!(B)$); \coordinate (N) at ($(C)!0.5!(D)$); \draw (A)--(B)--(C)--(D)--cycle (A)--(C) (B)--(D) (M)--(N); \end{tikzpicture}
Ngoài ra, phép tịnh tiến cũng được TikZ quan tâm. Bạn muốn khai báo điểm E là ảnh của điểm A qua phép tịnh tiến theo véc tơ v = (1;–2) chẳng hạn:
\coordinate (E) at ($(A)+(1,-2)$);
Vậy là bạn có thể dùng điểm E trong các lệnh vẽ của mình. Hơn nữa, ta có thể hiển thị tên các điểm cho hình vẽ của mình với đoạn mã lệnh đầy đủ.
\begin{tikzpicture} \coordinate (A) at (0,0); \coordinate (B) at (2,1); \coordinate (C) at (3,-1); \coordinate (D) at (-1,-2); \coordinate (M) at ($(A)!0.5!(B)$); \coordinate (N) at ($(C)!0.5!(D)$); \coordinate (E) at ($(A)+(1,-2)$); \draw (A)--(B)--(C)--(D)--cycle; \draw (A)--(C) (B)--(D) (M)--(N) (A)--(E)--(C); \foreach \p/\q in {A/135,B/90,C/-60,D/-90,M/90,N/45,E/-90} \draw[fill=white] (\p) circle(1pt) node[shift={(\q:6pt)}]{\color{black}$\p$}; \end{tikzpicture}
Bạn hãy cứ an tâm rằng, nếu như ngay từ ban đầu bạn quên khai báo một điểm nào đó, bạn cũng có thể khai báo ngay điểm đó ngay tại lệnh vẽ kiểu như:
\draw (0,1)coordinate(A)–(2,-3)coordinate(B)–(1,2)coordinate(C);
3.3.2. Giao điểm của các đường trong TikZ
Khi vẽ hình, ta thường gặp các hình vẽ cần nối các giao điểm của đường này và đường kia. TikZ cũng rất ân cần giúp ta điều này. Tuy nhiên để có thể lấy giao điểm của các đường ta cần gán cho mỗi đường (đoạn, cung) những cái tên riêng cho nó để TikZ có thể nhận ra.
Trước hết, các bạn cần gọi thư viện intersections của tikz bằng
\usetikzlibrary{intersections} .
Sau đó ta bắt đầu gán tên đường. Để gán tên ta dùng lệnh
\draw với tham số: \draw[name path= ] ….
Sau khi các đường đã được đặt tên, ta có thể tìm giao điểm của các đường ấy bằng lệnh:
\path [name intersections={of=one and two,by=name point}];
Và bây giờ ta hoàn toàn có thể dùng cái giao điểm vừa tìm để vẽ hình một cách thoải mái. Ta hãy thử với ví dụ sau:
\begin{tikzpicture}[scale=0.75,every node/.style={scale=0.75}] \draw [step=1,gray,very thin] (-3,-3) grid (3,3); \coordinate[label=A] (A) at (-3,0); \coordinate[label=B] (B) at (3,2); \coordinate[label=C] (C) at (0,3); \coordinate[label=below:D] (D) at (2,-3); \coordinate[label=below:O] (O) at (0,0); \draw[name path=done](A)--(B); \draw[name path=dtwo] (C)--(D); \path [name intersections={of=done and dtwo, by=H}]; \draw (O)--(H) ; \draw (H) node[above right]{H}; \end{tikzpicture}
Hơn thế nữa, giao điểm của đường thẳng và đường cong cũng thật sự chính xác.
Vấn đề đặt ra ở đây là hai đối tượng nếu giao nhau bởi hai điểm trở lên thì ta sẽ phải làm thế nào? Cũng không hề khó khăn khi bạn dùng cụm lệnh.
\path [name intersections={of=path1 and path 2}]; \coordinate[label=intersection 1] (m) at (intersection-1); \coordinate[label=intersection 2] (k) at (intersection-2);
Với cụm lệnh trên ta có thể khai báo luôn cả hai giao điểm của hai đối tượng rồi, và tiếp theo ta chỉ việc dùng lệnh vẽ với các điểm đó. Chẳng hạn tôi sẽ tìm giao điểm của hai đường tròn và nối chúng lại bằng một đường nét đứt như code sau.
Hoàn toàn tương tự, nếu hai đường cắt nhau bởi ba điểm trở lên. Hoặc ngay chính hai đường chỉ có duy nhất một giao điểm, khuyến cáo bạn nên dùng cách này để khai báo điểm được chính xác và có thể gán nhãn luôn cho điểm khi vẽ hình (đỡ tốn công dùng lệnh \node{…} hoặc \draw … node {…} ).
\begin{tikzpicture}[scale=0.8] \coordinate[label =$O_{1}$] (O1) at (0,0); \coordinate[label=$O_{2}$] (O2) at (2,1.5); \draw [name path=done] (O1) circle (2); \draw[name path=dtwo] (O2) circle (1.25); \path [name intersections ={of = done and dtwo}]; \coordinate[label=$A$] (A) at (intersection-1); \coordinate[label=below:$B$] (B) at (intersection-2); \draw[dashed] (A)--(B) (O1)--(O2); \end{tikzpicture}
Xem thêm Tô màu cho hình vẽ trong Latex