Sempre me incomodou o fato de ser tão difícil desenhar arcos TikZ especificando o centro do arco. Então pensei que tinha uma boa solução alternativa usando a biblioteca TikZ math
. Vamos usá-lo para desenhar um arco com centro na origem e depois colocar um ponto na origem.
\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}
Desta forma estou saltando para a posição inicial do arco usando o sistema de coordenadas polares. \tikzmath
me permite reutilizar os comprimentos para que eu possa especificar exatamente o mesmo radius
quando desenhar o arco (assim, quando eu mexer nos valores do raio, só preciso fazer isso em um ponto).
Inteligente, hein? Exceto que não funciona:
Começa a desenhar na origem embora eu tenha especificado as coordenadas corretas! O que está acontecendo? Talvez um problema de dimensão?
\radius = 1cm;
Isso explode a imagem completamente. Minha abordagem está condenada? Observe que isso 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, essa é a imagem certa, mas o código é bobo! Não quero inserir todos os raios das minhas mil fotos uma vez com cm
e uma vez sem! O que eu faço?
Responder1
O manual afirma que radius
in canvas polar
deve ser uma dimensão; portanto, quando você passa um número sem unidade, acho que a dimensão padrão, pt
, é usada. Você pode contornar isso, por exemplo, dizendo radius = \radius cm
na canvas polar cs
coordenada.
Outra opção é usar declare function
, conforme mostrado abaixo.
\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}
Responder2
Uma maneira possível de fazer isso é declarar explicitamente \radius
ser uma dimensão, 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}
Por que nenhum erro de tipo é gerado está além da minha compreensão.
Responder3
É um pouco complicado e pode quebrar alguma coisa, mas para os fãs de hacking, aqui está uma around
chave que desenhará o arco em torno do último ponto:
\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}
Responder4
Talvez se você usar o comando de movimentação da caneta não pareça tão difícil; vamos escolher um ponto aleatório e usá-lo para desenhar um arco começando em 40 graus com raio de 1 cm.
\tikz\draw (rand,rand) node{A} ++(40:1cm) arc (40:-180:1cm);
Se for muito detalhado, você pode criar sua própria sintaxe mais curta com um insert path
ou to path
qualquer outro atalho.