TikZ: escalas x, y diferentes, mas para que as formas mantenham seus aspectos

TikZ: escalas x, y diferentes, mas para que as formas mantenham seus aspectos

Eu tenho alguns códigos pstricks antigos que estou refazendo com o TikZ. Na minha imagem atual, as escalas x e y são diferentes:

\begin{tikzpicture}[xscale=1.8,yscale=4]

No entanto, isso tem o problema de os círculos serem desenhados como elipses, sendo mais esticados na direção y. Eu também tentei

\begin{tikzpicture}[x=1.8cm,y=4cm]

mas isso tem o mesmo efeito de esticar círculos em elipses.

Então, existe alguma maneira de dimensionar as coordenadas apenas no TikZ, que não afete as formas dos objetos?

Responder1

Eu descobri a solução da seguinte maneira

\draw (1,1) circle(0.1cm);

faz o trabalho. eu estava usando

\draw (1,1) circle(0.1);

que capta as escalas individuais.

Responder2

PSTricks usa \psrunitao desenhar arquivos \pscircle.

insira a descrição da imagem aqui

\documentclass[tikz,border=12pt]{standalone}

\newlength\runit
\runit=1cm

\edef\Radius#1{#1\runit}

\begin{document}
\begin{tikzpicture}[x=3cm,y=2cm]
    \draw[fill=red] (0,0) circle (\Radius{2});
    \draw (-2,-2) rectangle (2,2);
\end{tikzpicture}
\end{document}

Nota: declarar a unidade radial globalmente oferece uma vantagem onde você pode alterar todas as unidades dos raios do círculo em um só lugar.


Também podemos declarar uma nova chave para que possamos acessar mais facilmente esta unidade radial.

\documentclass[tikz,border=12pt]{standalone}

\makeatletter
\newlength\tikz@runit
\tikzset{
    r/.code=\pgfmathsetlength\tikz@runit{#1},
    r=+1cm, % setting a default value
    r radius/.style={radius={(#1)*\tikz@runit}},
    xr radius/.style={x radius={(#1)*\tikz@runit}},
    yr radius/.style={y radius={(#1)*\tikz@runit}}
}
\makeatother

\begin{document}
\begin{tikzpicture}[x=3cm,y=2cm]
    \fill[fill=red] (0,0) circle [r radius=1+1];
    \fill[fill=green] (-1,1) circle [xr radius=1+3/4, yr radius=1-1/3]
                      (1,1)  circle [xr radius=1+3/4, yr radius=1-1/3];
    \draw (-2,-2) rectangle (2,2);
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder3

A ideia chave de todas as soluções propostas é a mudança das unidades com x=e y=. Isso funciona bem.

No entanto, no meu código, é altamente desejável manter xscale=e yscale=. Portanto, configurei uma macro muito simples:

\newcommand{\pnt}[3][black]{%
\begin{scope}[shift={#2}];
\fill[color=#1,shift only] (0,0) circle(#3);
\end{scope}}

que é usado com:

\pnt[red]{(3,4)}{0.06}

para colocar umcircularponto vermelho com raio de 1,5pt no local (3,4).

informação relacionada