Ist es möglich, TikZ-Distanz- und Line-To-Operationen zu kombinieren?

Ist es möglich, TikZ-Distanz- und Line-To-Operationen zu kombinieren?

Ist es mit LaTeX und TikZ möglich, eine Line-To-Operation im selben Befehl wie eine Distanzoperation zu verwenden? Ich möchte ein Rechteck zeichnen und dann einen benannten Knoten in der Mitte der oberen Kante des Rechtecks ​​erstellen. Dazu verwende ich eine Distanzoperation, um die Mitte des Rechtecks ​​zu finden, und dann eine Line-To-Operation, um die obere Kante zu finden. Unten finden Sie den MWE-Code, der meiner Meinung nach funktionieren sollte, aber nicht funktioniert.

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}
\node (A) at (0,0) {};
\node (B) at (10,10) {};
\node [above right] at (A) {A};
\node [below left] at (B) {B};
\draw [draw=black] (B) rectangle (A);
\node at ($(A)!0.5!(B)$ |- B) {Top of Rect [incorrect]};
\node (ABMid) [below] at ($(A)!0.5!(B)$) {Midpoint AB};
\node (rectTop) [above] at (ABMid|-B) {Top of Rect [correct]};
\end{tikzpicture}
\end{document}

Antwort1

Ich würde keine mathematischen Berechnungen verwenden, um eine Koordinate in der Mitte der oberen Linie zu erhalten. Knoten auf dem Pfad können recht intelligent platziert werden.

Das Problem hierbei besteht darin, dass die Knotenplatzierung auf dem ursprünglichen rectanglePfad nur auf einer geraden Linie zwischen den beiden Koordinaten liegt, sodass sich die Knoten auf den beiden folgenden Pfaden an der gleichen Stelle mit dem gleichen befinden <pos>:

\path (c1) --        node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);

Ich habe drei Lösungen für Sie.

  1. Eine einfache Hilfskoordinate.
  2. Ersetzen des rectanglePfades durch zwei |-/ -|-Pfade.
  3. Mit einem geeignetenTimerFunktionen für den rectangleWeg über die ext.paths.timervon meinemtikz-extPaket.

Lösung 1

Mit einer Hilfskoordinate können Sie einfach

\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};

Code

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};
\end{tikzpicture}
\end{document}

Lösung 2

Verwenden Sie zwei kombinierte |-oder -|und die Position .75oder .25(bzw.). Die Ecken haben die Position .5(→Knoten auf einem verbundenen TikZ-Pfad).

Code

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) -| node[pos=.25, above] {Top of the Rect} (A) -| (B);
\end{tikzpicture}
\end{document}

Lösung 3

Laden Sie die ext.paths.timerBibliothek, anschließend können Sie mit very near start( pos = 0.125) auf die Mitte der ersten (oberen) Seite zugreifen.

Code

\documentclass[tikz]{standalone}
\usetikzlibrary{ext.paths.timer}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at ( 0, 0);
\coordinate [label=below  left:B] (B) at (20,10);
\draw (B) rectangle node[very near start, above] {Top of the Rect} (A);
\end{tikzpicture}
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Antwort2

BEARBEITEN: Unten ist eine Inline-Berechnung zu sehen.

Im Prinzip schon. Ich habe das Folgende nicht wirklich optimiert, es könnte etwas reduziert werden.

Sie können den Operator verwenden let(der ebenfalls aus der calcBibliothek stammt).

Was Sie tun möchten, ist das Maximum zu erreichenjKoordinate und wählen Sie dann die HälfteXKoordinate. Man braucht also dieXUndjKoordinaten jedes Punktes.

Darüber hinaus sollten SieniemalsGeben Sie eine Koordinate mit einem node! an. Dies kann zu sehr unvorhergesehenen Problemen führen. Denken Sie daran, dass Knoten eine Größe behalten, Koordinaten hingegen nicht.

Ich würde Ihr System ungefähr so ​​gestalten:

\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \node[above right] at (A) {A};
  \coordinate (B) at (10,10);
  \node[below left] at (B) {B};
  \draw [draw=black] (A) rectangle (B);
  \draw let \p1 = (A),
          \p2 = (B),
          \n{x} = {(\x1+\x2)/2},
          \n{y} = {max(\y1,\y2)} in
          (\n{x},\n{y}) node[above] {Top of Rect [incorrect]};
  \coordinate (ABMid) at ($(A)!0.5!(B)$);
  \node at (ABMid) {Midpoint AB};
\end{tikzpicture}

Wenn Sie die Koordinate nicht benötigen, ABMiddann tun Sie es einfach\node at ($(A)!.5!(B)$) {...};

Das Obige berechnetauf dem PfadDieXUndjKoordinate Ihres obersten Punktes. \p<int> = (<coordinate>)wird speichernXUndjzur \x<int>,\y<int>weiteren Berechnung innerhalb der letZeile. Die \n{x}Zeile berechnet dieX-Koordinate Ihres obersten Punktes, und die \n{y}Linie berechnet das Maximumj-Koordinate.

Das Obige ergibt:

Bildbeschreibung hier eingeben

Mir wurde klar, dass Sie wirklich etwas Inline wollten (was machbar ist, aberhässlich). Sie können also Bauf die vertikale Linie projizieren, die in beginnt A, und dann den Mittelpunkt zwischen diesem und berechnen. BDas gibt Ihnen den halben Weg auf der Linie, den Sie benötigen.

Dies kann also über diesesobskurbauen:

\coordinate (ABMidTop) at ($(A)!(B)!($(A)+(0,1)$)!.5!(B)$); 
\node[above] at (ABMidTop) {Top of Rect [incorrect]};

Es sollte folgendermaßen gelesen werden:
Zeichnen Sie die Linie Anach A+(0,1), und projizieren Sie dann Bauf diese Linie. Nehmen Sie dann den Mittelpunkt zwischen dem zuvor berechneten Punkt und B.

verwandte Informationen