
Используя 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);
У меня для вас есть три решения.
- Просто вспомогательная координата.
- Замена
rectangle
пути двумя путями|-
/-|
. - Используя правильныйтаймерфункции для
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
.