Sombreado dentro de un triángulo cuando TikZ calcula las coordenadas de un vértice

Sombreado dentro de un triángulo cuando TikZ calcula las coordenadas de un vértice

El siguiente código indica TikZdibujar un triángulo rectángulo y colocar una cuadrícula en el plano cartesiano. Me gustaría hacerle dos modificaciones.

Quiero que el interior del triángulo sea "coloreado" de blanco. Miré el Capítulo 15, Sección 7 del manual en el sitio web http://texdoc.net/texmf-dist/doc/generic/pgf/pgfmanual.pdf. Muestra el código para sombrear un círculo si se especifican su centro y radio, y muestra el código para sombrear un rectángulo si se especifican dos de sus vértices. En el siguiente código, un vértice, R, del triángulo se calcula utilizando TikZel código \coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);. ¿Cómo "coloreo" el interior del triángulo de blanco sin calcular manualmente las coordenadas de R? (Hay una marca de ángulo recto dentro del triángulo; no debe estar "cubierto").

El triángulo está dibujado sobre el vértice en R. Esto parece extraño. ¿Cómo puedo TikZdibujar el triángulo debajo de los 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}

Respuesta1

Agregue fill=white, así:\draw[green!20!white, fill=white] (Q) -- (P) -- (R) -- (Q) -- cycle;

Para que los puntos aparezcan en el frente, me tomé la libertad de reescribir su código. Podrías haber usado Layers 1 , pero el código sería más complicado que esto y no creo que valga la pena si lo necesitas sólo esta vez.

Agregué algunas cosas nuevas como tikzset, para que puedas usar una sola palabra para definir las propiedades de los nodos (y no necesitas tener esas largas listas de opciones de nodos), además, solo necesitas arreglar una para arreglarlos todos, sin tener que para cambiar cada uno.

Definí las coordenadas y usé esas coordenadas primero para escribir los nodos P, Q y R, y luego usé las mismas coordenadas para crear pequeños nodos circulares negros.

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: Ver Sección90: Gráficos en capassobre elPgfmanual, página 820.

Respuesta2

No estoy seguro de quésin calcular manualmente las coordenadas de Rmedio. Puede 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)$){};

En cualquier caso, TikZdibuja todo en el mismo orden en que se escribe el código. Por lo tanto, mientras dibujas

\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;

después

\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) {};

el triángulo está dibujado sobre R. Pero ¿por qué una y otra vez Ry no una Py otra vez Q? Porque R, como podéis ver en líneas anteriores, es unno dibujadocoordinar (dibuja el punto con un nodo sin nombre encima R) mientras Py Qse ha definido nodescon un cierto tamaño. Y

\draw[green!20!white] (Q) -- (P) -- (R) -- (Q) -- cycle;

dibuja líneas entre los bordes de los nodos, límites que no existen solo en el caso de Rque sea un punto.

Vea lo que sucede con el siguiente código. Los nodos Py Qsolo se dibujan y recuerde que el círculo alrededor Res un nodo sin nombre al que no se hace referencia más adelante.

\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}

ingrese la descripción de la imagen aquí

Mientras

\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}

produce

ingrese la descripción de la imagen aquí

Como se puede ver en la figura anterior, en este caso no es posible cerrar un área a rellenar porque Rtiene un tamaño real y el camino es disjunto (¿es correcto?).

¿Cómo resolver ambos problemas: llenar el triángulo y hacerlo debajo de los nodos? Con backgroundstikzlibrary y cerrando el camino.

El siguiente código muestra una posible solución. La cuadrícula y los ejes se dibujan en la backgroundcapa declarada por backgroundsla biblioteca. Y el triángulo blanco también se dibuja en la capa de fondo, pero sobre la cuadrícula porque todo está dibujado en orden.

\begin{scope}[on background layer]
...
\end{scope}

Pero el vértice y la esquina del triángulo se dibujan en la capa de primer plano.

El triángulo se puede rellenar haciendo referencia a los centros de los nodos en lugar de solo a sus nombres.

\draw[green!20!white, fill=white] (Q.center) -- (P.center) -- (R.center) -- cycle;

El 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}

ingrese la descripción de la imagen aquí

Respuesta3

La forma MetaPost de hacer esto, para aquellos que estén interesados: llenar el triángulo con color blanco se logra simplemente vaciando su contenido después de dibujar la cuadrícula y los ejes, y antes de dibujar el triángulo en sí (y sus etiquetas).

path triangle; triangle = P--Q--R--cycle;
unfill triangle; draw triangle;

No es que el triángulo haya sido definido como un camino cerrado: P--Q--R--cycle;la --cycleparte es por lo tanto obligatoria, de lo contrario el camino no se puede llenar ni vaciar.

No sé acerca de las "capas" en MetaPost, pero escuché algo sobre ellas cuando uso el formato MetaFun. Aunque no estoy seguro de ello.

NB: vaciar un camino cerrado a la manera MetaPost significa de hecho llenarlo con el color del fondo. Como generalmente es blanco, en la mayoría de los casos equivale a lo mismo. De lo contrario, simplemente reemplace la instrucción unfill triangle;por la más directa 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}

ingrese la descripción de la imagen aquí

información relacionada