O código a seguir instrui TikZ
a desenhar um triângulo retângulo e a colocar uma grade no plano cartesiano. Gostaria de fazer duas modificações nele.
Quero que o interior do triângulo seja "colorido" de branco. Eu olhei o Capítulo 15, Seção 7 do manual no site http://texdoc.net/texmf-dist/doc/generic/pgf/pgfmanual.pdf
. Ele mostra o código para sombrear um círculo se seu centro e raio forem especificados, e mostra o código para sombrear um retângulo se dois de seus vértices forem especificados. No código a seguir, um vértice, R, do triângulo é calculado usando TikZ
o código \coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);
. Como faço para “colorir” o interior do triângulo de branco sem calcular manualmente as coordenadas de R? (Há uma marca de ângulo reto dentro do triângulo; ela não deve ser "coberta".)
O triângulo é desenhado sobre o vértice em R. Isto parece estranho. Como faço para TikZ
desenhar o triângulo sob os vértices?
\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}
Responder1
Adicione fill=white
, assim:\draw[green!20!white, fill=white] (Q) -- (P) -- (R) -- (Q) -- cycle;
Para que os pontos apareçam na frente, tomei a liberdade de reescrever seu código. Você poderia ter usado Layers 1 , mas o código seria mais complicado que isso e não acho que valha a pena se você precisar só dessa vez.
Eu adicionei algumas coisas novas como tikzset, para que você possa usar uma única palavra para definir as propriedades do nó (e você não precisa ter aquelas longas listas de opções de nós), além disso, você só precisa consertar uma para consertar todas elas, sem ter para mudar cada um.
Defini as coordenadas e usei-as primeiro para escrever os nós P, Q e R e depois usei as mesmas coordenadas para criar pequenos nós de círculo preto.
\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: Veja a Seção90: Gráficos em CamadasnoPgfmanual, página 820.
Responder2
Eu não tenho certeza sobre o quesem calcular manualmente as coordenadas de Rsignifica. Pode ser algo como
\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$R$}] (R)
at ($(P)!1cm*sqrt(5)!-90:(Q)$){};
De qualquer forma, TikZ
desenha tudo na mesma ordem em que o código é escrito. Portanto, enquanto você desenha
\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;
depois
\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) {};
o triângulo é desenhado R
. Mas por que repetidamente R
e não P
repetidamente Q
? Porque R
, como você pode ver nas linhas anteriores, é umnão desenhadocoordenada (você desenha o ponto com um nó sem nome R
) enquanto P
e Q
foi definido como nodes
com um determinado tamanho. E
\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;
desenha linhas entre as bordas dos nós, fronteiras que não existem apenas R
porque é um ponto.
Veja o que acontece com o código a seguir. Os nós P
e Q
são apenas desenhados e lembre-se de que o círculo ao redor R
é um nó sem nome que não é referenciado posteriormente.
\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}
Enquanto
\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}
produz
Como você pode ver na figura anterior, neste caso não é possível fechar uma área a ser preenchida porque R
ela tem um tamanho real e o caminho é disjunto (está correto?).
Como resolver os dois problemas: preencher o triângulo e fazer abaixo dos nós? Com backgrounds
tikzlibrary e fechando o caminho.
O código a seguir mostra uma possível solução. A grade e os eixos são desenhados na background
camada declarada pela backgrounds
biblioteca. E o triângulo branco também é desenhado na camada de fundo, mas sobre a grade porque tudo é desenhado em ordem.
\begin{scope}[on background layer]
...
\end{scope}
Mas o vértice e o canto do triângulo são desenhados na camada de primeiro plano.
O triângulo pode ser preenchido referenciando os centros dos nós em vez de apenas seus nomes
\draw[green!20!white, fill=white] (Q.center) -- (P.center) -- (R.center) -- cycle;
O código completo:
\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}
Responder3
A maneira MetaPost de fazer isso, para quem estiver interessado: preencher o triângulo com a cor branca é conseguido simplesmente descarregando seu conteúdo após desenhar a grade e os eixos, e antes de desenhar o próprio triângulo (e seus rótulos).
path triangle; triangle = P--Q--R--cycle;
unfill triangle; draw triangle;
Não que o triângulo tenha sido definido como um caminho fechado: P--Q--R--cycle;
: a --cycle
parte é portanto obrigatória, caso contrário o caminho não pode ser preenchido nem despreenchido.
Não conheço “camadas” no próprio MetaPost, mas ouvi algo sobre elas ao usar o formato MetaFun. Não tenho certeza sobre isso, no entanto.
NB: despreencher um caminho fechado no modo MetaPost significa na verdade preenchê-lo com a cor do fundo. Como geralmente é branco, na maioria dos casos equivale à mesma coisa. Caso contrário, simplesmente substitua a instrução unfill triangle;
pela mais direta 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}