TikZ の距離と Line-To 操作を組み合わせることは可能ですか?

TikZ の距離と Line-To 操作を組み合わせることは可能ですか?

LaTeX と TikZ を使用する場合、距離操作と同じコマンドで Line-To 操作を使用できますか? 長方形を描画し、長方形の上端の中点に名前付きノードを作成したいと思います。これを行うには、距離操作を使用して長方形の中心を見つけ、次に 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パス上のノードの配置が 2 つの座標間の直線上にのみあるため、次の 2 つのパス上のノードは同じ場所にあり、同じであることです<pos>

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

3つの解決策をご紹介します。

  1. 単なる補助座標。
  2. パスを 2 つの/パスrectangleに置き換えます。|--|
  3. 適切なタイマー私のからのrectangleパスの関数ext.paths.timertikz-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

|-または を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 startpos = 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

編集: 下部にインライン計算が表示されます。

原則的にはそうです。以下は実際には最適化されていないので、いくらか削減できる可能性があります。

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)$) {...};

上記は計算を行っている道の上でバツそしてええ最上位のポイントの座標を\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]};

これは次のように読む必要があります:に
線を引き、この線に投影します。次に、前に計算した点と の間の中間点を取ります。AA+(0,1)BB

関連情報