Longitudes y coordenadas en arcos TikZ

Longitudes y coordenadas en arcos TikZ

Siempre me ha molestado que sea tan difícil dibujar arcos TikZ especificando el centro del arco. Entonces pensé que tenía una buena solución usando la biblioteca TikZ math. Usémoslo para dibujar un arco con centro en el origen y luego pongamos un punto en el origen.

\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}

De esta manera salto a la posición inicial del arco usando el sistema de coordenadas polares. \tikzmathme permite reutilizar las longitudes para poder especificar exactamente las mismas radiuscuando dibujo el arco (así, cuando jugueteo con los valores del radio, solo necesito hacerlo en un punto).

Inteligente, ¿eh? Excepto que no funciona:

ingrese la descripción de la imagen aquí

¡Comienza a dibujar en el origen aunque especifiqué las coordenadas correctas! ¿Qué está sucediendo? ¿Quizás un problema de dimensión?

            \radius = 1cm;

Eso hace estallar la imagen por completo. ¿Mi enfoque está condenado al fracaso? Sin embargo, tenga en cuenta que esto funciona:

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

ingrese la descripción de la imagen aquí

Ok, esa es la imagen correcta, ¡pero el código es una tontería! ¡No quiero entrar en cada radio de mis mil imágenes una vez con cmy otra sin! ¿Qué debo hacer?

Respuesta1

El manual indica que radiusin canvas polardebe ser una dimensión, por lo que cuando pasa un número sin unidades, supongo que ptse usa la dimensión predeterminada. Puede solucionar este problema, por ejemplo, diciendo radius = \radius cmen la canvas polar cscoordenada.

Otra opción es utilizar declare function, como se muestra a continuación.

\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}

salida de código

Respuesta2

Una forma posible de hacer esto es declarar explícitamente \radiusque es una dimensión, usando \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}

De lo contrario, no entiendo por qué no se arroja ningún error de tipo.

Respuesta3

Es un poco falso y podría romper algo, pero para los fanáticos del hacking, aquí hay una aroundclave que dibujará el arco alrededor del último punto:

\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}

ingrese la descripción de la imagen aquí

Respuesta4

Quizás si usas el comando de movimiento del lápiz no te resultará tan difícil; Escojamos un punto aleatorio y usémoslo para dibujar un arco a partir de 40 grados con un radio de 1 cm.

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

ingrese la descripción de la imagen aquí

Si esto es demasiado detallado, puede crear su propia sintaxis más corta con insert patho to patho cualquier otro atajo.

información relacionada