
Usando LaTeX e TikZ, é possível usar uma operação Line-To no mesmo comando que uma operação de distância? Gostaria de desenhar um retângulo e, em seguida, criar um nó nomeado no ponto médio da borda superior do retângulo. Para fazer isso, estou usando uma operação de distância para encontrar o centro do retângulo e, em seguida, uma operação Line-To para encontrar a borda superior. Veja abaixo o código MWE que acho que deveria funcionar, mas não está funcionando.
\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}
Responder1
Eu não usaria esse cálculo matemático para obter uma coordenada no meio da linha superior. Os nós no caminho podem ser colocados de forma bastante inteligente.
O problema aqui é que o posicionamento do nó no rectangle
caminho original está apenas em uma linha reta entre as duas coordenadas, então os nós nos dois caminhos seguintes estão no mesmo lugar com o mesmo <pos>
:
\path (c1) -- node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);
Terei três soluções para você.
- Uma coordenada simplesmente auxiliar.
- Substituindo o
rectangle
caminho por dois caminhos|-
/ .-|
- Usando um adequadocronômetrofunções para o
rectangle
caminho atravésext.paths.timer
do meutikz-ext
pacote.
Solução 1
Com uma coordenada auxiliar você pode simplesmente fazer
\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}
Solução 2
Use dois combinados |-
ou -|
e a posição .75
ou .25
(respectivamente). Os cantos têm a posição .5
(→Nó em um caminho 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}
Solução 3
Carregue a ext.paths.timer
biblioteca e então você pode usar very near start
( pos = 0.125
) para acessar o meio do primeiro 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}
Saída
Responder2
EDIT: Um cálculo embutido é visto na parte inferior.
Em princípio é. Eu realmente não otimizei o abaixo, poderia ser um pouco reduzido.
Você pode utilizar o let
operador (que também vem da calc
biblioteca).
O que você quer fazer é obter o máximosimcoordenar e, em seguida, selecione a metadexcoordenada. Então você precisa doxesimcoordenadas de cada ponto.
Além disso você devenuncaespecifique uma coordenada usando um node
! Isso pode causar problemas muito imprevistos. Lembre-se de que os nós mantêm um tamanho, enquanto as coordenadas não.
Eu faria no seu sistema algo assim:
\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}
Claro, se você não precisa da coordenada, ABMid
basta fazer\node at ($(A)!.5!(B)$) {...};
O que o acima faz é calcularno caminhooxesimcoordenada do seu ponto superior. \p<int> = (<coordinate>)
vai salvarxesimpara \x<int>,\y<int>
cálculos adicionais dentro da let
linha. A \n{x}
linha calcula ox-coordenada do seu ponto superior, e a \n{y}
linha calcula o máximosim-coordenada.
O acima produzirá:
Percebi que você realmente queria algo embutido (o que é possível, masfeio). Então o que você pode fazer é projetar B
na linha vertical começando em e A
, em seguida, calcular o ponto médio entre isso e B
, que lhe dará a metade do caminho que você precisa.
Então isso pode ser feito através desteobscurecerconstruir:
\coordinate (ABMidTop) at ($(A)!(B)!($(A)+(0,1)$)!.5!(B)$);
\node[above] at (ABMidTop) {Top of Rect [incorrect]};
Deve ser lido assim:
desenhe a linha A
até A+(0,1)
e projete B
nesta linha. Em seguida, pegue o ponto intermediário entre o ponto calculado anterior e B
.