答案1
有很多軟體包可以讓您執行此操作:例如metapost
,,,pstricks
當然asymptote
還有TikZ
我忘記的其他軟體包。
這是一個帶有TikZ
.如果您對程式碼有任何疑問,我會傾聽。
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[gray!20] (0,0)rectangle(3,3);
\draw (0,0)grid(3,3);
\node foreach \j in {1,2} [left] at (0,\j) {$10^\circ$};
\node foreach \j in {1,2} [right] at (3,\j) {$40^\circ$};
\node foreach \i in {1,2} [below] at (\i,0) {$30^\circ$};
\node foreach \i in {1,2} [above] at (\i,3) {$20^\circ$};
\node foreach \i in {1,2} [above right] at (\i,2) {$\i$};
\node foreach \lab [count=\n] in {4,3} [above right] at (\n,1) {$\lab$};
\foreach \list[count=\j from 0] in {{1,2},{0,1,2,3},{0,1,2,3},{1,2}}
\foreach \x in \list {
\fill (\x,\j)[cyan] circle (2pt);
}
\end{tikzpicture}
\end{document}
答案2
使用 TikZ 的 LaTeX 基本繪圖:帶有線、點和標籤的矩形。
您只需要一個包:
\usepackage{tikz}
讓我們為圖形定義藍色和灰色:
\definecolor{mBlue}{HTML}{1F77B4}
\definecolor{mGray}{HTML}{d7dbdd}
現在為點建立樣式。我們不想一次又一次地編寫大量命令和選項。我們將調用此樣式vertex
並使用命令\tikzstyle{vertex}
。從選項中我們可以看到它是一個circle
,它是用我們上面定義的顏色繪製的mBlue
,並且也用相同的顏色填充。分隔選項間接控制圓圈的大小以及您決定在節點內寫入的任何文字之間的分隔。您也可以使用minimimum size=0.2
.
\tikzstyle{vertex}=[circle,draw=mBlue,fill=mBlue,inner sep=0.6mm, outer sep=0mm]
我們可以將以上三行放在序言中,也就是前面的「stuff」\begin{document}
。
現在我們已經準備好使用圖形環境並進行繪圖了。我們的繪圖將放置在tikzpicture
環境中。您會注意到還有一個scale
選項。這可用於增加/減少圖形的大小。有趣的是,縮放不會影響圖形內放置的文字。
\begin{figure}[h]
\centering
\begin{tikzpicture}[scale=1]
% our drawing goes here
\end{tikzpicture}
\caption{The figure.}
\end{figure}
現在,您要做的最重要的事情就是為圖形中的重要點分配一些座標。一開始這對某些人來說可能有點嚇人,但實際上比看起來更容易。假設我們將左下角表示為點 (0,0),將最上面的點表示為 (3,3)。您可以\coordinate (name) at (<x>,<y>);
對圖中的十六個點中的每個點使用該指令。然而,我想引入for
循環,因為很多新用戶都錯過了這個超級方便的功能。我添加了一個座標圖。
\foreach \x in {0,...,3} {
\foreach \y in {0,...,3} {
\coordinate (\x_\y) at (\x,\y);
}
}
現在是draw
外部矩形和線條。您可以使用 來填滿矩形draw[fill=mGray]
。
\draw (0_0) -- (3_0) -- (3_3) -- (0_3) -- (0_0);
\draw (1_0) -- (1_3);
\draw (2_0) -- (2_3);
\draw (0_1) -- (3_1);
\draw (0_2) -- (3_2);
讓我們繪製藍點並為其添加標籤。這些標籤給出了文字。可以使用left
、right
、below
和指定標籤位置above
。我們也可以將它們組合成above right
.
\node[vertex, label=below:$30^\circ$] at (1_0) {};
\node[vertex, label=below:$30^\circ$] at (2_0) {};
\node[vertex, label=left:$10^\circ$] at (0_1) {};
\node[vertex, label=left:$10^\circ$] at (0_2) {};
\node[vertex, label=above right:$2$] at (2_2) {};
剩下的我們應該可以補上!
編輯:如評論中指出的,您可以直接使用座標值而不是使用名稱,例如,直接使用 (2,3) 而不是 (2_3)。您也不需要使用雙 for 迴圈來定義座標。
答案3
可能的Asymptote
版本:
// tab3x3.asy
//
// run asy tab3x3.asy to get tab3x3.pdf
//
settings.tex="pdflatex";
size(4cm);
pen fillPen=rgb("E3E3E5");
pen linePen=rgb("201D1D")+0.7bp;;
pen dotPen =rgb("00A4EC")+4bp;
filldraw(box((-3,-3),(3,3)),fillPen,linePen);
guide mid=box((-1,1),(1,-1));
guide[] net=(-1,3)--(-1,-3)^^(1,3)--(1,-3)^^(-3,-1)--(3,-1)^^(-3,1)--(3,1);
draw(net,linePen);
dot(net,dotPen);
int[] labVal={10,20,30,40};
pair[][] labPos={{(-3,-1),(-3,1)},{(-1,3),(1,3)},{(-1,-3),(1,-3)},{(3,-1),(3,1)}};
pair[] labOff={W,N,S,E};
for(int i=0;i<length(mid);++i){
dot(point(mid,i),dotPen);
label("$"+string(i+1)+"$",point(mid,i),plain.NE,linePen);
}
for(int i=0;i<labVal.length;++i){
for(int j=0;j<labPos[0].length;++j){
label("$"+string(labVal[i])+"^\circ$",labPos[i][j],labOff[i]);
}
}
答案4
另一個簡單的“手動”Asymptote 解決方案
// http://asymptote.ualberta.ca/
unitsize(1.5cm);
import math; // for grid
fill(box((0,0),(3,3)),lightgray);
add(grid(3,3));
pair[] pts={(1,2),(2,2),(2,1),(1,1),(0,1),(0,2),(1,3),(2,3),(3,1),(3,2),(2,0),(1,0)};
string[] s={"$10^{\circ}$","$20^{\circ}$","$30^{\circ}$","$40^{\circ}$"} ;
string[] lb={"$1$","$2$","$3$","$4$",s[0],s[0],s[1],s[1],s[2],s[2],s[3],s[3]};
pair[] a={NE,NE,NE,NE,W,W,N,N,E,E,S,S};
for(int i=0; i<pts.length; ++i){
fill(circle(pts[i],.06),magenta);
label(lb[i],align=a[i],pts[i]);
}
shipout(bbox(5mm));