Schattierung innerhalb eines Dreiecks, wenn die Koordinaten eines Scheitelpunkts von TikZ berechnet werden

Schattierung innerhalb eines Dreiecks, wenn die Koordinaten eines Scheitelpunkts von TikZ berechnet werden

Der folgende Code weist an, TikZein rechtwinkliges Dreieck zu zeichnen und ein Raster auf der kartesischen Ebene zu platzieren. Ich möchte zwei Änderungen daran vornehmen.

Ich möchte, dass das Innere des Dreiecks weiß „gefärbt“ wird. Ich habe mir Kapitel 15, Abschnitt 7 des Handbuchs auf der Website angesehen http://texdoc.net/texmf-dist/doc/generic/pgf/pgfmanual.pdf. Dort wird der Code zum Schattieren eines Kreises gezeigt, wenn dessen Mittelpunkt und Radius angegeben sind, und es wird der Code zum Schattieren eines Rechtecks ​​gezeigt, wenn zwei seiner Eckpunkte angegeben sind. Im folgenden Code wird ein Eckpunkt, R, des Dreiecks mithilfe TikZdes Codes berechnet \coordinate (R) at ($(P)!1cm*sqrt(5)!-90:(Q)$);. Wie „färbe“ ich das Innere des Dreiecks weiß, ohne die Koordinaten von R manuell zu berechnen? (Im Inneren des Dreiecks befindet sich eine rechtwinklige Markierung; sie sollte nicht „abgedeckt“ sein.)

Das Dreieck wird über den Scheitelpunkt bei R gezeichnet. Das sieht komisch aus. Wie zeichne ich TikZdas Dreieck unter den Scheitelpunkten?

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

Antwort1

Fügen Sie fill=whitewie folgt hinzu:\draw[green!20!white, fill=white] (Q) -- (P) -- (R) -- (Q) -- cycle;

Damit die Punkte auf der Vorderseite erscheinen, habe ich mir die Freiheit genommen, Ihren Code neu zu schreiben. Sie hätten Layer 1 verwenden können , aber der Code wäre komplizierter und ich denke nicht, dass es sich lohnt, wenn Sie ihn nur dieses eine Mal brauchen.

Ich habe einige neue Dinge wie Tikzset hinzugefügt, sodass Sie ein einzelnes Wort zum Definieren von Knoteneigenschaften verwenden können (und Sie benötigen diese langen Knotenoptionslisten nicht). Darüber hinaus müssen Sie nur eines korrigieren, um sie alle zu korrigieren, ohne jedes einzelne ändern zu müssen.

Ich habe die Koordinaten definiert und diese Koordinaten zuerst zum Schreiben der Knoten P, Q und R verwendet. Anschließend habe ich dieselben Koordinaten zum Erstellen kleiner schwarzer Kreisknoten verwendet.

Abbildung 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: Siehe Abschnitt90: Überlagerte Grafikenauf derPgf-Handbuch, Seite 820.

Antwort2

Ich bin mir nicht sicher, wasohne manuelle Berechnung der Koordinaten von Rbedeutet. Könnte so etwas sein wie

\node[outer sep=0pt,circle, draw,inner sep=1.5pt, label={[fill=white]right:$R$}] (R) 
      at ($(P)!1cm*sqrt(5)!-90:(Q)$){};

In jedem Fall TikZzeichnet alles in der gleichen Reihenfolge, in der der Code geschrieben wird. Daher, wenn Sie zeichnen

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

nach

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

das Dreieck wird über gezeichnet R. Aber warum über Rund nicht über Pund Q? Weil R, wie Sie aus den vorherigen Zeilen ersehen können, einnicht gezeichnetKoordinate (Sie zeichnen den Punkt mit einem unbenannten Knoten über R), während Pund als mit einer bestimmten Größe Qdefiniert wurde . Undnodes

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

zeichnet Linien zwischen Knotengrenzen, Grenzen, die nur dann nicht existieren, wenn Res sich um einen Punkt handelt.

Sehen Sie, was mit dem folgenden Code passiert. Knoten Pund Qwerden nur gezeichnet. Denken Sie daran, dass der Kreis darum Rein unbenannter Knoten ist, auf den später nicht mehr verwiesen wird.

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

Bildbeschreibung hier eingeben

Während

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

produziert

Bildbeschreibung hier eingeben

Wie Sie der vorherigen Abbildung entnehmen können, ist es in diesem Fall nicht möglich, einen auszufüllenden Bereich zu schließen, da Rer eine reale Größe hat und der Pfad disjunkt ist (ist das richtig?).

Wie löst man beide Probleme: das Dreieck füllen und dies unterhalb der Knoten tun? Mit backgroundsTikzlibrary und dem Schließen des Pfads.

Der folgende Code zeigt eine mögliche Lösung. Raster und Achsen werden auf der backgroundEbene gezeichnet, die von der Bibliothek deklariert wird backgrounds. Und das weiße Dreieck wird auch auf der Hintergrundebene gezeichnet, aber über dem Raster, da alles der Reihe nach gezeichnet wird.

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

Aber der Scheitelpunkt und die Ecke des Dreiecks werden auf der Vordergrundebene gezeichnet.

Das Dreieck kann mit Bezug auf Knotenzentren ausgefüllt werden, statt nur mit Bezug auf deren Namen

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

Der vollständige Code:

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

Bildbeschreibung hier eingeben

Antwort3

Für Interessierte: Die MetaPost-Methode hierfür lautet: Das Füllen des Dreiecks mit weißer Farbe wird ganz einfach dadurch erreicht, dass der Inhalt nach dem Zeichnen des Rasters und der Achsen und vor dem Zeichnen des Dreiecks selbst (und seiner Beschriftungen) entfüllt wird.

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

Beachten Sie, dass das Dreieck als geschlossener Pfad definiert wurde: P--Q--R--cycle;Das --cycleTeil ist also obligatorisch, da der Pfad sonst weder ausgefüllt noch unausgefüllt sein kann.

Ich weiß nichts über „Ebenen“ in MetaPost selbst, aber ich habe gehört, dass es sie bei der Verwendung des MetaFun-Formats gibt. Bin mir da aber nicht sicher.

NB: Das Aufheben der Füllung eines geschlossenen Pfads auf die MetaPost-Art bedeutet tatsächlich, ihn mit der Farbe des Hintergrunds zu füllen. Da dieser im Allgemeinen weiß ist, läuft es in den meisten Fällen auf dasselbe hinaus. Andernfalls ersetzen Sie die Anweisung einfach unfill triangle;durch die direktere 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}

Bildbeschreibung hier eingeben

verwandte Informationen