Sombreamento dentro de um triângulo quando as coordenadas de um vértice são calculadas pelo TikZ

Sombreamento dentro de um triângulo quando as coordenadas de um vértice são calculadas pelo TikZ

O código a seguir instrui TikZa 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 TikZo 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 TikZdesenhar 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.

figura 1

\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, TikZdesenha 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 Re não Prepetidamente Q? Porque R, como você pode ver nas linhas anteriores, é umnão desenhadocoordenada (você desenha o ponto com um nó sem nome R) enquanto Pe Qfoi definido como nodescom 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 Rporque é um ponto.

Veja o que acontece com o código a seguir. Os nós Pe Qsã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}

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Como você pode ver na figura anterior, neste caso não é possível fechar uma área a ser preenchida porque Rela 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 backgroundstikzlibrary e fechando o caminho.

O código a seguir mostra uma possível solução. A grade e os eixos são desenhados na backgroundcamada declarada pela backgroundsbiblioteca. 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}

insira a descrição da imagem aqui

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 --cycleparte é 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}

insira a descrição da imagem aqui

informação relacionada