我已經檢查了舊問題和 TikZ 手冊,我想繪製我的畢達哥拉斯三角形邊的正方形。
到目前為止我已經
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=1.25]%,cap=round,>=latex]
\coordinate [label=left:$C$] (A) at (-1.5cm,-1.cm);
\coordinate [label=right:$A$] (C) at (1.5cm,-1.0cm);
\coordinate [label=above:$B$] (B) at (1.5cm,1.0cm);
\draw (A) -- node[above] {$a$} (B) -- node[right] {$c$} (C) -- node[below] {$b$} (A);
\draw (1.25cm,-1.0cm) rectangle (1.5cm,-0.75cm);
\end{tikzpicture}
\end{document}
產生
答案1
首先,讓我們將三角形的寬度和高度設為常數,以便日後需要時可以更改它們。這些是您使用的值,但是透過加載它們一次並動態計算其他所有內容,可以更輕鬆地稍後更改內容:
\newcommand{\pythagwidth}{3cm}
\newcommand{\pythagheight}{2cm}
接下來,重新標記座標,以便名稱與列印的標籤相匹配,否則我們會感到非常困惑。
\coordinate [label={below right:$A$}] (A) at (0, 0);
\coordinate [label={above right:$B$}] (B) at (0, \pythagheight);
\coordinate [label={below left:$C$}] (C) at (-\pythagwidth, 0);
如果有點冗長的話,兩個矩形(與水平和垂直邊緣相符的矩形)很容易繪製:
\draw [dashed] (A) -- node [below] {$b$} ++ (-\pythagwidth, 0)
-- node [right] {$b$} ++ (0, -\pythagwidth)
-- node [above] {$b$} ++ (\pythagwidth, 0)
-- node [left] {$b$} ++ (0, \pythagwidth);
\draw [dashed] (A) -- node [right] {$c$} ++ (0, \pythagheight)
-- node [below] {$c$} ++ (\pythagheight, 0)
-- node [left] {$c$} ++ (0, -\pythagheight)
-- node [above] {$c$} ++ (-\pythagheight, 0);
這些變化讓我們取得了很大的進展:
然後我們需要畫出斜邊對應的正方形。計算斜邊本身似乎太多(閱讀:我很累,現在不記得該怎麼做:P
)。相反,我們可以使用一些平面幾何:
我們可以將原來的三角形旋轉90度,然後進行適當的平移,找到正方形的另一邊。我們可以用同樣的方法求 TikZ 中斜邊正方形的兩個額外座標:
\coordinate (D1) at (-\pythagheight, \pythagheight + \pythagwidth);
\coordinate (D2) at (-\pythagheight - \pythagwidth, \pythagwidth);
然後繪製這個正方形很簡單:
\draw [dashed] (C) -- node [above left] {$a$} (B)
-- node [below left] {$a$} (D1)
-- node [below right] {$a$} (D2)
-- node [above right] {$a$} (C);
因此,將所有這些放在一起,我們有:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\newcommand{\pythagwidth}{3cm}
\newcommand{\pythagheight}{2cm}
\begin{tikzpicture}
\coordinate [label={below right:$A$}] (A) at (0, 0);
\coordinate [label={above right:$B$}] (B) at (0, \pythagheight);
\coordinate [label={below left:$C$}] (C) at (-\pythagwidth, 0);
\coordinate (D1) at (-\pythagheight, \pythagheight + \pythagwidth);
\coordinate (D2) at (-\pythagheight - \pythagwidth, \pythagwidth);
\draw [very thick] (A) -- (C) -- (B) -- (A);
\newcommand{\ranglesize}{0.3cm}
\draw (A) -- ++ (0, \ranglesize) -- ++ (-\ranglesize, 0) -- ++ (0, -\ranglesize);
\draw [dashed] (A) -- node [below] {$b$} ++ (-\pythagwidth, 0)
-- node [right] {$b$} ++ (0, -\pythagwidth)
-- node [above] {$b$} ++ (\pythagwidth, 0)
-- node [left] {$b$} ++ (0, \pythagwidth);
\draw [dashed] (A) -- node [right] {$c$} ++ (0, \pythagheight)
-- node [below] {$c$} ++ (\pythagheight, 0)
-- node [left] {$c$} ++ (0, -\pythagheight)
-- node [above] {$c$} ++ (-\pythagheight, 0);
\draw [dashed] (C) -- node [above left] {$a$} (B)
-- node [below left] {$a$} (D1)
-- node [below right] {$a$} (D2)
-- node [above right] {$a$} (C);
\end{tikzpicture}
\end{document}
產生
答案2
比原始版本更簡化的版本;這裡的想法只是使用
($ (<name1>) ! {sin(90)} ! 90:(<name2>) $)
求連接 和 的線段垂直的<name1>
一點;新點 和 之間的距離與和之間的距離相同:<name1>
<name2>
<name1>
<name1>
<name2>
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=1.25]
\coordinate [label=left:$A$] (A) at (-1.5cm,-1.cm);
\coordinate [label=below right:$C$] (C) at (1.5cm,-1.0cm);
\coordinate [label=above:$B$] (B) at (1.5cm,1.0cm);
\draw
(A) --
node[above] {$c$} (B) --
node[right] {$b$} (C) --
node[below] {$a$}
(A);
\draw
(1.25cm,-1.0cm) rectangle (1.5cm,-0.75cm);
\coordinate (aux1) at
($ (A) ! {sin(90)} ! 90:(B) $);
\coordinate (aux2) at
($ (aux1) ! {sin(90)} ! 90:(A) $);
\coordinate (aux3) at
($ (A) ! {sin(90)} ! -90:(C) $);
\coordinate (aux4) at
($ (aux3) ! {sin(90)} ! -90:(A) $);
\coordinate (aux5) at
($ (C) ! {sin(90)} ! -90:(B) $);
\coordinate (aux6) at
($ (aux5) ! {sin(90)} ! -90:(C) $);
\draw[ultra thick,green,text=black]
(A) --
(aux1) node[midway,auto,swap] {$c$} --
(aux2) node[midway,auto,swap] {$c$} --
(B) node[midway,auto,swap] {$c$};
\draw[ultra thick,green,text=black]
(A) --
(aux3) node[midway,auto] {$a$} --
(aux4) node[midway,auto] {$a$} --
(C) node[midway,auto] {$a$};
\draw[ultra thick,green,text=black]
(C) --
(aux5) node[midway,auto] {$b$} --
(aux6) node[midway,auto] {$b$} --
(B) node[midway,auto] {$b$};
\end{tikzpicture}
\end{document}
這允許在一般情況下定義用於構造正方形的命令(對於任何三個非共線點):
\PythTr[<options>]{<name1>}{<name2>}{<name3>}{<coord1>}{<coord2>}{<coord3>}
其中<name1>
,...,<name3>
是頂點的名稱,<coor1>
,...,<coor3>
是三個頂點的座標;可選參數可用於傳遞選項來控制如何繪製正方形。例如,下圖是透過以下命令得到的
\begin{tikzpicture}
\PythTr{A}{B}{C}{(-1.5cm,-1.cm)}{(1.5cm,-1.0cm)}{(1.5cm,1.0cm)}
\end{tikzpicture}\par\bigskip
\begin{tikzpicture}
\PythTr[Maroon,dashed]{L}{M}{N}{(2,-2)}{(4,2)}{(0,2)}
\end{tikzpicture}
代碼:
\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\PythTr[7][ultra thick,green,text=black]{%
\coordinate [label=left:$#2$] (#2) at #5;
\coordinate [label=below right:$#4$] (#4) at #6;
\coordinate [label=above:$#3$] (#3) at #7;
\draw
(#2) --
node[auto] {$\MakeLowercase{#4}$} (#3) --
node[auto] {$\MakeLowercase{#3}$} (#4) --
node[auto] {$\MakeLowercase{#2}$}
(#2);
\coordinate (aux1) at
($ (#2) ! {sin(90)} ! 90:(#3) $);
\coordinate (aux2) at
($ (aux1) ! {sin(90)} ! 90:(#2) $);
\coordinate (aux3) at
($ (#2) ! {sin(90)} ! -90:(#4) $);
\coordinate (aux4) at
($ (aux3) ! {sin(90)} ! -90:(#2) $);
\coordinate (aux5) at
($ (#4) ! {sin(90)} ! -90:(#3) $);
\coordinate (aux6) at
($ (aux5) ! {sin(90)} ! -90:(#4) $);
\begin{scope}[#1]
\draw
(#2) --
(aux1) node[midway,auto,swap] {$\MakeLowercase{#4}$} --
(aux2) node[midway,auto,swap] {$\MakeLowercase{#4}$} --
(#3) node[midway,auto,swap] {$\MakeLowercase{#4}$};
\draw
(#2) --
(aux3) node[midway,auto] {$\MakeLowercase{#2}$} --
(aux4) node[midway,auto] {$\MakeLowercase{#2}$} --
(#4) node[midway,auto] {$\MakeLowercase{#2}$};
\draw
(#4) --
(aux5) node[midway,auto] {$\MakeLowercase{#3}$} --
(aux6) node[midway,auto] {$\MakeLowercase{#3}$} --
(#3) node[midway,auto] {$\MakeLowercase{#3}$};
\end{scope}
}
\begin{document}
\begin{tikzpicture}
\PythTr{A}{B}{C}{(-1.5cm,-1.cm)}{(1.5cm,-1.0cm)}{(1.5cm,1.0cm)}
\end{tikzpicture}\par\bigskip
\begin{tikzpicture}
\PythTr[Maroon,dashed]{L}{M}{N}{(2,-2)}{(4,2)}{(0,2)}
\end{tikzpicture}
\end{document}
如果構造必須僅限於矩形三角形,則以下是相應的版本:
\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\PythTri[7][ultra thick,green,text=black]{%
\coordinate [label=left:$#2$] (#2) at #5;
\coordinate [label=below right:$#4$] (#4) at #6;
\coordinate (aux) at ($ #5 ! 1 ! 90:#6 $);
\coordinate [label=above:$#3$] (#3) at ($ #5 !#7!(aux) $);
\draw
(#2) --
node[auto] {$\MakeLowercase{#4}$} (#3) --
node[auto] {$\MakeLowercase{#3}$} (#4) --
node[auto] {$\MakeLowercase{#2}$}
(#2);
\coordinate (aux1) at
($ (#2) ! {sin(90)} ! 90:(#3) $);
\coordinate (aux2) at
($ (aux1) ! {sin(90)} ! 90:(#2) $);
\coordinate (aux3) at
($ (#2) ! {sin(90)} ! -90:(#4) $);
\coordinate (aux4) at
($ (aux3) ! {sin(90)} ! -90:(#2) $);
\coordinate (aux5) at
($ (#4) ! {sin(90)} ! -90:(#3) $);
\coordinate (aux6) at
($ (aux5) ! {sin(90)} ! -90:(#4) $);
\begin{scope}[#1]
\draw
(#2) --
(aux1) node[midway,auto,swap] {$\MakeLowercase{#4}$} --
(aux2) node[midway,auto,swap] {$\MakeLowercase{#4}$} --
(#3) node[midway,auto,swap] {$\MakeLowercase{#4}$};
\draw
(#2) --
(aux3) node[midway,auto] {$\MakeLowercase{#2}$} --
(aux4) node[midway,auto] {$\MakeLowercase{#2}$} --
(#4) node[midway,auto] {$\MakeLowercase{#2}$};
\draw
(#4) --
(aux5) node[midway,auto] {$\MakeLowercase{#3}$} --
(aux6) node[midway,auto] {$\MakeLowercase{#3}$} --
(#3) node[midway,auto] {$\MakeLowercase{#3}$};
\end{scope}
}
\begin{document}
\begin{tikzpicture}[scale=0.75]
\PythTri{A}{B}{C}{(0,4)}{(2,0)}{3cm}
\end{tikzpicture}\par\bigskip
\begin{tikzpicture}[scale=0.75]
\PythTri[Maroon,dashed]{L}{M}{N}{(0,0)}{(4,0)}{3cm}
\end{tikzpicture}\par\bigskip
\end{document}
現在命令的語法如下
\PythTri[<options>]{<name1>}{<name2>}{<name3>}{<coord1>}{<coord2>}{<length>}
其中<coord1>
和<coord2>
是其中一個 cathetus 的座標,第六個強制參數現在用於另一個 cathetus 的長度。
初始版本:
使用該庫的一種選擇calc
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=1.25]
\coordinate [label=left:$C$] (A) at (-1.5cm,-1.cm);
\coordinate [label=right:$A$] (C) at (1.5cm,-1.0cm);
\coordinate [label=above:$B$] (B) at (1.5cm,1.0cm);
\draw
(A) --
node[above] {$a$} (B) --
node[right] {$c$} (C) --
node[below] {$b$}
(A);
\draw
(1.25cm,-1.0cm) rectangle (1.5cm,-0.75cm);
\draw[ultra thick,green]
let \p1= ( $ (C)-(A) $ )
in (A) --
++(-90:{veclen(\x1,\y1)}) --
++(0:{veclen(\x1,\y1)}) --
++(90:{veclen(\x1,\y1)});
\draw[ultra thick,green]
let \p1= ( $ (B)-(C) $ )
in (B) --
++(0:{veclen(\x1,\y1)}) --
++(-90:{veclen(\x1,\y1)}) --
++(180:{veclen(\x1,\y1)});
\coordinate (aux1) at
($ (A) ! {sin(90)} ! 90:(B) $);
\coordinate (aux2) at
($ (aux1) ! {sin(90)} ! 90:(A) $);
\draw[ultra thick,green]
(A) -- (aux1) -- (aux2) -- (B);
\end{tikzpicture}
\end{document}
答案3
這是使用美麗的另一種選擇tkz-euclide
包(程式碼是文件中範例的變體):
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
\tkzInit
\tkzDefPoint(0,0){C}
\tkzDefPoint(4,0){A}
\tkzDefPoint(0,3){B}
\tkzDefSquare(B,A)\tkzGetPoints{E}{F}
\tkzDefSquare(A,C)\tkzGetPoints{G}{H}
\tkzDefSquare(C,B)\tkzGetPoints{I}{J}
\tkzFillPolygon[fill = red!50 ](A,C,G,H)
\tkzFillPolygon[fill = blue!50 ](C,B,I,J)
\tkzFillPolygon[fill = green!50](B,A,E,F)
\tkzFillPolygon[fill = orange,opacity=.5](A,B,C)
\tkzDrawPolygon[line width = 1pt](A,B,C)
\tkzDrawPolygon[line width = 1pt](A,C,G,H)
\tkzDrawPolygon[line width = 1pt](C,B,I,J)
\tkzDrawPolygon[line width = 1pt](B,A,E,F)
\tkzLabelSegment[auto](A,C){$a$}
\tkzLabelSegment[auto](C,G){$a$}
\tkzLabelSegment[auto](G,H){$a$}
\tkzLabelSegment[auto](H,A){$a$}
\tkzLabelSegment[auto](C,B){$b$}
\tkzLabelSegment[auto](B,I){$b$}
\tkzLabelSegment[auto](I,J){$b$}
\tkzLabelSegment[auto](J,C){$b$}
\tkzLabelSegment[auto](B,A){$c$}
\tkzLabelSegment[auto](F,B){$c$}
\tkzLabelSegment[auto](E,F){$c$}
\tkzLabelSegment[auto](A,E){$c$}
\end{tikzpicture}
\end{document}
答案4
在 PSTricks 解決方案中,您所要做的就是選擇導管的長度(分別為\lengthA
和的值\lengthB
):
\documentclass{article}
\usepackage{pst-eucl,pstricks-add}
\usepackage{xfp}
\newcommand*\maxHori{\fpeval{\lengthA+2*\lengthB}}
\newcommand*\maxVert{\fpeval{2*\lengthA+\lengthB}}
% labels
\def\Label[#1]#2#3{%
\pcline[linestyle = none, offset = -8pt](#2)(#3)
\ncput{$#1$}}
% lengths of the catheti
\def\lengthA{3 }
\def\lengthB{2 }
\begin{document}
\begin{pspicture}(\maxHori,\maxVert)
\psset{dimen = middel, fillstyle = solid}
\pnodes%
(\fpeval{\lengthA+\lengthB},\fpeval{\lengthA+\lengthB}){A}%
(\lengthB,\lengthA){B}%
(\fpeval{\lengthA+\lengthB},\lengthA){C}%
(\lengthB,0){a1}%
(\fpeval{\lengthA+\lengthB},0){a2}%
(\fpeval{\lengthA+2*\lengthB},\fpeval{\lengthA+\lengthB}){b1}%
(\fpeval{\lengthA+2*\lengthB},\lengthA){b2}%
(0,\fpeval{2*\lengthA}){c1}%
(\lengthA,\fpeval{2*\lengthA+\lengthB}){c2}
\psframe[fillcolor = red!70](a1)(C)
\psframe[fillcolor = blue!70](C)(b1)
\pspolygon[fillcolor = yellow!70](B)(c1)(c2)(A)
\pspolygon[fillcolor = green!70](A)(C)(B)
\pstRightAngle[RightAngleSize = 0.3, fillstyle = solid, fillcolor = green!70]{A}{C}{B}
\uput[60](A){$A$}
\uput[210](B){$B$}
\uput[315](C){$C$}
\Label[a]{a1}{B}
\Label[a]{B}{C}
\Label[a]{C}{a2}
\Label[a]{a2}{a1}
\Label[b]{C}{A}
\Label[b]{A}{b1}
\Label[b]{b1}{b2}
\Label[b]{b2}{C}
\Label[c]{B}{c1}
\Label[c]{c1}{c2}
\Label[c]{c2}{A}
\Label[c]{A}{B}
\end{pspicture}
\end{document}