É possível combinar distância TikZ e operações Line-To?

É possível combinar distância TikZ e operações Line-To?

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 rectanglecaminho 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ê.

  1. Uma coordenada simplesmente auxiliar.
  2. Substituindo o rectanglecaminho por dois caminhos |-/ .-|
  3. Usando um adequadocronômetrofunções para o rectanglecaminho através ext.paths.timerdo meutikz-extpacote.

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

insira a descrição da imagem aqui

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 letoperador (que também vem da calcbiblioteca).

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, ABMidbasta 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 letlinha. A \n{x}linha calcula ox-coordenada do seu ponto superior, e a \n{y}linha calcula o máximosim-coordenada.

O acima produzirá:

insira a descrição da imagem aqui

Percebi que você realmente queria algo embutido (o que é possível, masfeio). Então o que você pode fazer é projetar Bna 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 Aaté A+(0,1)e projete Bnesta linha. Em seguida, pegue o ponto intermediário entre o ponto calculado anterior e B.

informação relacionada