El siguiente código indica TikZ
dibujar 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 TikZ
el 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 TikZ
dibujar 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.
\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, TikZ
dibuja 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 R
y no una P
y 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 P
y Q
se ha definido nodes
con 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 R
que sea un punto.
Vea lo que sucede con el siguiente código. Los nodos P
y Q
solo se dibujan y recuerde que el círculo alrededor R
es 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}
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
Como se puede ver en la figura anterior, en este caso no es posible cerrar un área a rellenar porque R
tiene 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 backgrounds
tikzlibrary y cerrando el camino.
El siguiente código muestra una posible solución. La cuadrícula y los ejes se dibujan en la background
capa declarada por backgrounds
la 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}
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 --cycle
parte 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}