
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 rectangle
Pfad 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.
- Eine einfache Hilfskoordinate.
- Ersetzen des
rectangle
Pfades durch zwei|-
/-|
-Pfade. - Mit einem geeignetenTimerFunktionen für den
rectangle
Weg über dieext.paths.timer
von meinemtikz-ext
Paket.
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 .75
oder .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.timer
Bibliothek, 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
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 calc
Bibliothek 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, ABMid
dann 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 let
Zeile. Die \n{x}
Zeile berechnet dieX-Koordinate Ihres obersten Punktes, und die \n{y}
Linie berechnet das Maximumj-Koordinate.
Das Obige ergibt:
Mir wurde klar, dass Sie wirklich etwas Inline wollten (was machbar ist, aberhässlich). Sie können also B
auf die vertikale Linie projizieren, die in beginnt A
, und dann den Mittelpunkt zwischen diesem und berechnen. B
Das 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 A
nach A+(0,1)
, und projizieren Sie dann B
auf diese Linie. Nehmen Sie dann den Mittelpunkt zwischen dem zuvor berechneten Punkt und B
.