Возможно ли объединить операции TikZ Distance и Line-To?

Возможно ли объединить операции TikZ Distance и Line-To?

Используя LaTeX и TikZ, можно ли использовать операцию Line-To в той же команде, что и операцию расстояния? Я хотел бы нарисовать прямоугольник, а затем создать именованный узел в середине верхнего края прямоугольника. Для этого я использую операцию Distance, чтобы найти центр прямоугольника, а затем операцию Line-To, чтобы найти верхний край. Ниже приведен код MWE, который, как я думаю, должен работать, но не работает.

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

решение1

Я бы не стал использовать такие математические вычисления для получения координаты в середине верхней линии. Узлы на пути можно разместить вполне разумно.

Проблема здесь в том, что узел на исходном rectangleпути располагается только на прямой линии между двумя координатами, поэтому узлы на двух следующих путях находятся в одном и том же месте с одинаковыми <pos>:

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

У меня для вас есть три решения.

  1. Просто вспомогательная координата.
  2. Замена rectangleпути двумя путями |-/ -|.
  3. Используя правильныйтаймерфункции для rectangleпути через ext.paths.timerиз моегоtikz-extупаковка.

Решение 1

С помощью вспомогательной координаты вы можете просто сделать

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

Код

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

Решение 2

Используйте два комбинированных |-или -|и позицию .75или .25(соответственно). Углы имеют позицию .5(→Узел на соединенном пути TikZ).

Код

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

Решение 3

Загрузите ext.paths.timerбиблиотеку, затем вы можете использовать very near start( pos = 0.125) для доступа к середине первой (верхней) стороны.

Код

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

Выход

введите описание изображения здесь

решение2

EDIT: Внизу виден встроенный расчет.

В принципе так и есть. Я не особо оптимизировал нижеизложенное, его можно было бы немного сократить.

Вы можете использовать letоператор (который также есть в calcбиблиотеке).

То, что вы хотите сделать, это получить максимумукоординируйте, а затем выберите половинуИксКоординировать. Так что вам нужноИксиукоординаты каждой точки.

Кроме того, вам следуетникогдаукажите координату с помощью node! Это может привести к очень непредвиденным проблемам. Помните, что узлы сохраняют размер, а координаты — нет.

Я бы сделал вашу систему примерно такой:

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

Конечно, если вам не нужны координаты, ABMidто просто сделайте это.\node at ($(A)!.5!(B)$) {...};

Вышеуказанное вычисляетна пути the Иксиукоординаты вашей верхней точки. \p<int> = (<coordinate>)сохранитИксиудля \x<int>,\y<int>дальнейшего вычисления в letстроке. \n{x}Линия вычисляетИкс-координата вашей верхней точки, и \n{y}линия вычисляет максимальнуюу-координата.

Вышеуказанное даст:

введите описание изображения здесь

Я понял, что вам действительно нужно что-то встроенное (что выполнимо, ноуродливый). Итак, что вы можете сделать, так это спроецировать Bна вертикальную линию, начинающуюся в A, а затем вычислить среднюю точку между ней и B, что даст вам середину нужной вам линии.

Итак, это можно сделать с помощью этогозатемнятьконструкция:

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

Читать это следует так:
проведите линию Aдо A+(0,1), затем спроецируйте Bна эту линию. Затем возьмите среднюю точку между предыдущей вычисленной точкой и B.

Связанный контент