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. \tikzmath
me permite reutilizar las longitudes para poder especificar exactamente las mismas radius
cuando dibujo el arco (así, cuando jugueteo con los valores del radio, solo necesito hacerlo en un punto).
Inteligente, ¿eh? Excepto que no funciona:
¡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] {};
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 cm
y otra sin! ¿Qué debo hacer?
Respuesta1
El manual indica que radius
in canvas polar
debe ser una dimensión, por lo que cuando pasa un número sin unidades, supongo que pt
se usa la dimensión predeterminada. Puede solucionar este problema, por ejemplo, diciendo radius = \radius cm
en la canvas polar cs
coordenada.
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}
Respuesta2
Una forma posible de hacer esto es declarar explícitamente \radius
que 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 around
clave 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}
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);
Si esto es demasiado detallado, puede crear su propia sintaxis más corta con insert path
o to path
o cualquier otro atajo.