¿Es posible combinar las operaciones de distancia y línea de TikZ?

¿Es posible combinar las operaciones de distancia y línea de TikZ?

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 rectangleruta 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.

  1. Una coordenada simplemente auxiliar.
  2. Reemplazar la rectangleruta con dos |-/ -|rutas.
  3. Usando un adecuadoTemporizadorfunciones para la rectangleruta a través ext.paths.timerde mitikz-extpaquete.

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 .75o .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.timerbiblioteca 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

ingrese la descripción de la imagen aquí

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 letoperador (que también proviene de la calcbiblioteca).

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, ABMidsimplemente 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 letlí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á:

ingrese la descripción de la imagen aquí

Me di cuenta de que realmente querías algo en línea (lo cual es factible perofeo). Entonces, lo que puedes hacer es proyectar Ben 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 Ahasta A+(0,1)y luego proyecta Bsobre esta línea. Luego tome el punto medio entre el punto calculado anteriormente y B.

información relacionada