TikZ 円弧の長さと座標

TikZ 円弧の長さと座標

円弧の中心を指定して TikZ 円弧を描くのが非常に難しいことが、ずっと気になっていました。そこで、TikZ ライブラリを使用することで、よい回避策が思いつきましたmath。これを使用して、原点を中心とする円弧を描き、原点に点を置きましょう。

\documentclass{standalone}

\usepackage{tikz}

\usetikzlibrary{math}

\begin{document}
    \begin{tikzpicture}
        \tikzmath{
            \angle  = 90;
            \radius = 1;
        }
        \draw
            ( canvas polar cs:
              radius = \radius
            , angle  = \angle
            )
            arc
            [ radius      = \radius
            , start angle = \angle
            , end angle   = 4*\angle
            ];
        \node[circle,fill] {};
    \end{tikzpicture}
\end{document}

この方法では、極座標系を使用して円弧の開始位置にジャンプします。\tikzmath長さを再利用できるため、radius円弧を描くときにまったく同じ値を指定できます (そのため、半径の値をいじるときは、1 つのポイントでのみ行う必要があります)。

賢いですね。ただし、うまくいきません。

ここに画像の説明を入力してください

正しい座標を指定したのに、原点から描画が始まります。何が起こっているのでしょうか? 寸法の問題でしょうか?

            \radius = 1cm;

これで状況は完全に悪化しました。私のアプローチは失敗に終わるのでしょうか? ただし、これは機能します:

    \tikzmath{
        \angle  = 90;
    }
    \draw
        ( canvas polar cs:
          radius = 1cm
        , angle  = \angle
        )
        arc
        [ radius      = 1
        , start angle = \angle
        , end angle   = 4*\angle
        ];
    \node[circle,fill] {};

ここに画像の説明を入力してください

わかりました。これは正しい写真ですが、コードがおかしいです。1,000 枚の写真の半径を、それぞれ 1 回ずつ、または 1 回ずつ入力したくありませんcm。どうすればいいでしょうか。

答え1

マニュアルには、radiusは次元である必要があると記載されているcanvas polarため、単位のない数値を渡すと、デフォルトの次元ptが使用されると思います。たとえば、座標 と指定することで、この問題を回避できます。radius = \radius cmcanvas polar cs

別のオプションとしてはdeclare function、以下に示すように を使用することです。

\documentclass[border=5mm]{standalone}

\usepackage{tikz}

\usetikzlibrary{math}

\begin{document}
    \begin{tikzpicture}[
       declare function={
          R=1cm;
          a=90;
       }
    ]
        \tikzmath{
            \angle  = 90;
            \radius = 1;
        }
        \draw
            ( canvas polar cs:
              radius = \radius cm % <-- added cm here
            , angle  = \angle
            )
            arc
            [ radius      = \radius
            , start angle = \angle
            , end angle   = 4*\angle
            ];
        \node[circle,fill] {};

        \draw (2.5,0) node[circle,fill]{}
           ++(canvas polar cs:
               angle=a,
               radius=R) 
          % or equivalently
          % ++(a:R)
          arc[radius=R,
              start angle=a,
              end angle=4*a];
    \end{tikzpicture}
\end{document}

コードの出力

答え2

これを行う 1 つの方法は、 を\radius次のように明示的にディメンションとして宣言することです\newdimen

\documentclass{standalone}

\usepackage{tikz}

\usetikzlibrary{math}

\begin{document}
    \begin{tikzpicture}
        \newdimen\radius
        \tikzmath{
            \angle  = 90;
            \radius = 1cm;
        }
        \draw
            ( canvas polar cs:
              radius = \radius
            , angle  = \angle
            )
            arc
            [ radius      = \radius
            , start angle = \angle
            , end angle   = 4*\angle
            ];
        \node[circle,fill] {};
    \end{tikzpicture}
\end{document}

それ以外の場合に型エラーがスローされない理由は私にはわかりません。

答え3

少し面倒で、何かを壊してしまう可能性もありますが、ハッキングのファンのために、around最後のポイントの周りに円弧を描くキーを紹介します。

\documentclass[tikz,border=5]{standalone}
\makeatletter
\newif\iftikz@arc@around
\tikzset{around/.is if=tikz@arc@around, around=false}
\let\tikz@arc@around=\@empty
\def\tikz@arc@opt[#1]{%
  {%
    \tikzset{every arc/.try,#1}%
    \pgfkeysgetvalue{/tikz/start angle}\tikz@s
    \pgfkeysgetvalue{/tikz/end angle}\tikz@e
    \pgfkeysgetvalue{/tikz/delta angle}\tikz@d
    \ifx\tikz@s\pgfutil@empty%
      \pgfmathsetmacro\tikz@s{\tikz@e-\tikz@d}
    \else
      \ifx\tikz@e\pgfutil@empty%    
        \pgfmathsetmacro\tikz@e{\tikz@s+\tikz@d}
      \fi%
    \fi%
    \xdef\pgf@marshal{\noexpand%
    \tikz@do@arc{\tikz@s}{\tikz@e}
      {\pgfkeysvalueof{/tikz/x radius}}
      {\pgfkeysvalueof{/tikz/y radius}}
      {\iftikz@arc@around.\fi}}%
  }%
  \pgf@marshal%
  \tikz@arcfinal%  
}
\let\tikz@do@arc@orig=\tikz@do@arc
\def\tikz@do@arc#1#2#3#4#5{%
  \def\tikz@arc@around{#5}%
  \ifx\tikz@arc@around\@empty%
  \else%
    \let\tikz@pointpolar=\pgfpointpolarxy
    \pgfmathparse{#3}\ifpgfmathunitsdeclared\let\tikz@pointpolar=\pgfpointpolar\fi
    \pgfmathparse{#4}\ifpgfmathunitsdeclared\let\tikz@pointpolar=\pgfpointpolar\fi
    \pgfpathmoveto{\pgfpointadd{\pgfpoint{\tikz@lastx}{\tikz@lasty}}
      {\tikz@pointpolar{#1}{#3 and #4}}}%
  \fi%
  \tikz@do@arc@orig{#1}{#2}{#3}{#4}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\fill (0,0) circle [radius=0.05];
\draw [red]   (0,0) arc [radius=2, start angle=180, end angle=0];
\draw [green] (0,0) arc [radius=2, start angle=180, end angle=0, around];
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

答え4

ペン移動コマンドを使用すると、それほど難しく感じないかもしれません。ランダムな点を選択し、それを使用して 40 度から始まる半径 1cm の円弧を描画してみましょう。

 \tikz\draw (rand,rand) node{A} ++(40:1cm) arc (40:-180:1cm);

ここに画像の説明を入力してください

insert pathこれが冗長すぎる場合は、 orto pathまたはその他のショートカットを使用して独自の短い構文を作成できます。

関連情報