
Usando LaTeX y TikZ, ¿es posible usar una operación de línea a en el mismo comando que una operación a distancia? Me gustaría dibujar un rectángulo y luego crear un nodo con nombre en el punto medio del borde superior del rectángulo. Para hacer esto, estoy usando una operación de distancia para encontrar el centro del rectángulo y luego una operación de línea a para encontrar el borde superior. Consulte a continuación el código MWE que creo que debería funcionar, pero no funciona.
\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}
Respuesta1
No usaría ese cálculo matemático para obtener una coordenada en el medio de la línea superior. Los nodos en el camino se pueden colocar de manera bastante inteligente.
El problema aquí es que la ubicación de los nodos en la rectangle
ruta original está solo en una línea recta entre las dos coordenadas, por lo que los nodos en las dos rutas siguientes están en el mismo lugar con el mismo <pos>
:
\path (c1) -- node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);
Tendré tres soluciones para ti.
- Una coordenada simplemente auxiliar.
- Reemplazar la
rectangle
ruta con dos|-
/-|
rutas. - Usando un adecuadoTemporizadorfunciones para la
rectangle
ruta a travésext.paths.timer
de mitikz-ext
paquete.
Solución 1
Con una coordenada auxiliar simplemente puedes hacer
\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};
Código
\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}
Solución 2
Utilice dos combinados |-
o -|
y la posición .75
o .25
(respectivamente). Las esquinas tienen la posición .5
(→Nodo en un camino TikZ articulado).
Código
\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}
Solución 3
Cargue la ext.paths.timer
biblioteca y luego podrá usar very near start
( pos = 0.125
) para acceder al centro del primer lado (superior).
Código
\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}
Producción
Respuesta2
EDITAR: Se ve un cálculo en línea en la parte inferior.
En principio lo es. Realmente no he optimizado lo siguiente, podría reducirse un poco.
Puede utilizar el let
operador (que también proviene de la calc
biblioteca).
Lo que quieres hacer es obtener el máximoycoordinar y luego seleccionar la mitadXcoordinar. Entonces necesitas elXyycoordenadas de cada punto.
Además deberíasnuncaespecifique una coordenada usando un node
! Esto puede dar problemas muy imprevistos. Recuerde que los nodos conservan un tamaño, mientras que las coordenadas no.
Yo haría su sistema algo como esto:
\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}
Por supuesto, si no necesita la coordenada, ABMid
simplemente hágalo\node at ($(A)!.5!(B)$) {...};
Lo anterior lo que hace es calcularen el caminoelXyycoordenada de su punto superior. \p<int> = (<coordinate>)
AhorraréXyypara \x<int>,\y<int>
realizar más cálculos dentro de la let
línea. La \n{x}
línea calcula elX-coordenada de su punto superior, y la \n{y}
línea calcula el máximoy-coordinar.
Lo anterior producirá:
Me di cuenta de que realmente querías algo en línea (lo cual es factible perofeo). Entonces, lo que puedes hacer es proyectar B
en la línea vertical que comienza en A
, luego calcular el punto medio entre este y B
, eso te dará la mitad de la línea que necesitas.
Entonces esto se puede hacer a través de estooscuroconstruir:
\coordinate (ABMidTop) at ($(A)!(B)!($(A)+(0,1)$)!.5!(B)$);
\node[above] at (ABMidTop) {Top of Rect [incorrect]};
Debería leerse así:
dibuja la línea A
hasta A+(0,1)
y luego proyecta B
sobre esta línea. Luego tome el punto medio entre el punto calculado anteriormente y B
.