次のコードは、TikZ
直角三角形を描画し、直交平面上にグリッドを配置するように指示します。これに 2 つの変更を加えたいと思います。
三角形の内側を白く「着色」したいです。Web サイト のマニュアルの第 15 章、セクション 7 を参照しましたhttp://texdoc.net/texmf-dist/doc/generic/pgf/pgfmanual.pdf
。中心と半径が指定されている場合に円を着色するコードと、2 つの頂点が指定されている場合に四角形を着色するコードが示されています。次のコードでは、三角形の 1 つの頂点 R がTikZ
コード を使用して計算されます\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
。R の座標を手動で計算せずに三角形の内側を白く「着色」するにはどうすればよいでしょうか。(三角形の内側には直角マークがあります。これを「覆い隠す」べきではありません。)
三角形が R の頂点の上に描かれています。これは奇妙に見えます。TikZ
頂点の下に三角形を描くにはどうすればよいでしょうか?
\documentclass[10pt]{amsart}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw[yellow, line width=0.1pt] (-1.75,-3.25) grid[xstep=0.5, ystep=0.5] (2.75,1.75);
\draw[draw=gray!30,latex-latex] (0,1.75) +(0,0.25cm) node[above right] {$y$} -- (0,-3.25) -- +(0,-0.25cm);
\draw[draw=gray!30,latex-latex] (-1.75,0) +(-0.25cm,0) -- (2.75,0) -- +(0.25cm,0) node[below right] {$x$};
\node[outer sep=0pt,circle, fill,inner sep=1.5pt,label={[fill=white]left:$P$}] (P) at (-1,-1) {};
\node[outer sep=0pt,circle, fill,inner sep=1.5pt, label={[fill=white]right:$Q$}] (Q) at (2,1) {};
\draw[green!20!white] (P) -- (Q);
\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
\node[outer sep=0pt,circle, fill,inner sep=1.5pt, label={[fill=white]right:$R$}] at(R) {};
\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;
\coordinate (a) at ($ (P)!5mm! -45:(Q) $);
\draw[green!20!white] (a) -- ($(P)!(a)!(Q)$);
\draw[green!20!white] (a) -- ($(P)!(a)!(R)$);
\end{tikzpicture}
\end{document}
答え1
を次のように追加しますfill=white
。\draw[green!20!white, fill=white] (Q) -- (P) -- (R) -- (Q) -- cycle;
ドットが前面に表示されるように、コードを書き直しました。Layers 1を使用することもできましたが、コードはこれよりも複雑になり、今回だけ必要な場合は価値がないと思います。
tikzset などの新しい機能をいくつか追加したので、1 つの単語を使用してノード プロパティを定義できます (長いノード オプション リストは必要ありません)。さらに、1 つを修正するだけですべてが修正され、それぞれを変更する必要がありません。
座標を定義し、その座標を使用して最初にノード P、Q、および R を記述し、次に同じ座標を使用して小さな黒い円のノードを作成しました。
\documentclass[margin=10pt]{standalone}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
points/.style={outer sep=0pt, circle, inner sep=1.5pt, fill=white},
dotnode/.style={circle, fill=black, inner sep=0pt,minimum size=4pt},
}
\begin{document}
\begin{tikzpicture}
\coordinate (P) at (-1,-1);
\coordinate (Q) at (2,1);
\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
\coordinate (a) at ($ (P)!5mm! -45:(Q) $);
\draw[yellow, line width=0.1pt] (-1.75,-3.25) grid[xstep=0.5, ystep=0.5] (2.75,1.75);
\draw[draw=gray!30,latex-latex] (0,1.75) +(0,0.25cm) node[above right] {$y$} -- (0,-3.25) -- +(0,-0.25cm);
\draw[draw=gray!30,latex-latex] (-1.75,0) +(-0.25cm,0) -- (2.75,0) -- +(0.25cm,0) node[below right] {$x$};
\node[points, anchor=east] at (-1,-1) {$P$};a
\node[points, anchor=west] at (2,1) {$Q$};
\node[points, anchor=west] at (R) {$R$};
\draw[green!20!white] (P) -- (Q);
\draw[green!20!white, fill=white] (Q) -- (P) -- (R) -- (Q) -- cycle;
\draw[green!20!white] (a) -- ($(P)!(a)!(Q)$);
\draw[green!20!white] (a) -- ($(P)!(a)!(R)$);
\node[dotnode] at (P) {};
\node[dotnode] at (Q) {};
\node[dotnode] at (R) {};
\end{tikzpicture}
\end{document}
1: セクションを参照90: レイヤードグラフィックにPgfマニュアル、820ページ。
答え2
何のことか分からないRの座標を手動で計算せずに意味。例えば
\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$R$}] (R)
at ($(P)!1cm*sqrt(5)!-90:(Q)$){};
いずれにせよ、TikZ
コードが書かれた順序と同じ順序ですべてを描画します。したがって、描画すると
\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;
後
\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
\node[outer sep=0pt,circle, fill,inner sep=1.5pt, label={[fill=white]right:$R$}] at(R) {};
三角形は の上に描かれていますR
。しかし、 と の上に描かれているのはなぜでしょR
うか。前の行からわかるように、 はP
Q
R
描かれていない座標(名前のないノードを持つ点を 上に描くR
)とP
が特定のサイズQ
で定義されている。そしてnodes
\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;
R
ノード境界の間に線を描画します。境界は、ポイントの場合のみに存在するわけではありません。
次のコードで何が起こるかを確認してください。ノードP
とQ
のみが描画され、円の周囲はR
名前のないノードであり、後で参照されないことに注意してください。
\documentclass[10pt]{amsart}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node[outer sep=0pt,circle, draw ,inner sep=1.5pt,label={[fill=white]left:$P$}] (P) at (-1,-1) {};
\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$Q$}] (Q) at (2,1) {};
\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$R$}] at(R) {};
\draw[red, fill=green] (Q) -- (P) -- (R) --(Q)-- cycle;
\end{tikzpicture}
\end{document}
その間
\documentclass[10pt]{amsart}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\node[outer sep=0pt,circle, draw ,inner sep=1.5pt,label={[fill=white]left:$P$}] (P) at (-1,-1) {};
\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$Q$}] (Q) at (2,1) {};
\draw[green!20!white] (P) -- (Q);
%\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$R$}] (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$){};
\draw[red, fill=green] (Q) -- (P) -- (R) --(Q)-- cycle;
\end{tikzpicture}
\end{document}
生産する
前の図からわかるように、この場合、 は実際のサイズであり、パスが分離されているため、塗りつぶす領域を閉じることはできませんR
(正しいですか?)。
両方の問題を解決するにはどうすればよいでしょうか。三角形を塗りつぶしてノードの下で実行するにはどうすればよいでしょうか。tikzlibrary を使用してbackgrounds
パスを閉じます。
次のコードは、考えられる解決策を示しています。グリッドと軸は、ライブラリbackground
によって宣言されたレイヤーに描画されますbackgrounds
。また、白い三角形も背景レイヤーに描画されますが、すべてが順番に描画されるため、グリッドの上に描画されます。
\begin{scope}[on background layer]
...
\end{scope}
ただし、三角形の頂点と角は前景レイヤーに描画されます。
三角形は、名前だけでなくノードの中心を参照して塗りつぶすことができます。
\draw[green!20!white, fill=white] (Q.center) -- (P.center) -- (R.center) -- cycle;
完全なコード:
\documentclass[tikz,10pt,border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,backgrounds}
\begin{document}
\begin{tikzpicture}[dot/.style={circle, fill, inner sep=1.5pt, outer sep=0pt}]
\begin{scope}[on background layer]
\draw[yellow, line width=0.1pt] (-1.75,-3.25) grid[xstep=0.5, ystep=0.5] (2.75,1.75);
\draw[draw=gray!30,latex-latex] (0,1.75) +(0,0.25cm) node[above right] {$y$} -- (0,-3.25) -- +(0,-0.25cm);
\draw[draw=gray!30,latex-latex] (-1.75,0) +(-0.25cm,0) -- (2.75,0) -- +(0.25cm,0) node[below right] {$x$};
\end{scope}
\coordinate[dot, label={[fill=white]left:$P$}] (P) at (-1,-1) {};
\coordinate[dot, label={[fill=white]right:$Q$}] (Q) at (2,1) {};
\coordinate[dot, label={[fill=white]below right:$R$}] (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$) {};
%
%%\draw[green!20!white] (P) -- (Q);
%
%%\coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
%
\begin{scope}[on background layer]
\draw[green!20!white, fill=white] (Q.center) -- (P.center) -- (R.center) -- cycle;
\end{scope}
%
\coordinate (a) at ($ (P)!5mm! -45:(Q) $);
\draw[green!20!white] ($(P)!(a)!(Q)$)--(a)--($(P)!(a)!(R)$);
\end{tikzpicture}
\end{document}
答え3
興味のある人のために、MetaPost でこれを行う方法を説明します。三角形を白色で塗りつぶすには、グリッドと軸を描画した後、三角形自体 (およびそのラベル) を描画する前に、その内容を塗りつぶさないようにします。
path triangle; triangle = P--Q--R--cycle;
unfill triangle; draw triangle;
三角形が閉じたパスとして定義されているわけではありません。P--Q--R--cycle;
この--cycle
部分は必須であり、そうでない場合はパスを塗りつぶすことも塗りつぶさないこともできません。
MetaPost 自体の「レイヤー」については知りませんが、MetaFun 形式を使用するときにそれについて何か聞いたことがあります。ただし、確信はありません。
注意: MetaPost の方法で閉じたパスを塗りつぶさないということは、実際には背景色で塗りつぶすことを意味します。背景色は通常白なので、ほとんどの場合同じ結果になります。それ以外の場合は、命令をunfill triangle;
より直接的な に置き換えてくださいfill triangle with color white;
。
\documentclass[border=2mm]{standalone}
\usepackage{luamplib}
\mplibsetformat{metafun}
\mplibtextextlabel{enable}
\begin{document}
\begin{mplibcode}
% Axes parameters
u := cm; % Unit length
xmin := -1.75u; xstep := .5u; xmax := 2.75u;
ymin := -5u; ystep := xstep; ymax := 1.75u;
% Triangle summits
pair P, Q, R; P = u*(-1, -1); Q = u*(2, 1);
R = P + 2u*sqrt2*unitvector(Q-P) rotated -90;
beginfig(1);
% Grid
drawoptions(withcolor yellow);
for i = ceiling(xmin/xstep) upto floor(xmax/xstep):
draw (i*xstep, ymin) -- (i*xstep, ymax);
endfor
for j = ceiling(ymin/ystep) upto floor(ymax/ystep):
draw (xmin, j*ystep) -- (xmax, j*ystep);
endfor
% Axes
drawoptions(withcolor .8white);
drawarrow (xmin, 0) -- (xmax, 0);
drawarrow (0, ymin) -- (0, ymax);
% Triangle
drawoptions(withcolor green);
path triangle; triangle = P--Q--R--cycle;
unfill triangle; draw triangle;
% Right-angle mark of length 2 mm (and no label)
anglemethod := 2; anglelength := 2mm;
draw anglebetween(P--Q, P--R, "");
% Labels
drawoptions();
label.bot("$x$", (xmax, 0)); label.lft("$y$", (0, ymax));
dotlabel.lft("$P$", P); dotlabel.rt("$Q$", Q); dotlabel.bot("$R$", R);
endfig;
\end{mplibcode}
\end{document}