TikZ: diferentes escalas x, y pero para que las formas mantengan sus aspectos

TikZ: diferentes escalas x, y pero para que las formas mantengan sus aspectos

Tengo un código pstricks antiguo que estoy rehaciendo con TikZ. En mi imagen actual, las escalas xey son diferentes:

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

Sin embargo, esto tiene el problema de que los círculos se dibujan como elipses, estirándose más en la dirección y. yo también lo he intentado

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

pero esto tiene el mismo efecto de estirar círculos hasta convertirlos en elipses.

Entonces, ¿hay alguna forma de escalar las coordenadas solo en TikZ, que no afecte las formas de los objetos?

Respuesta1

He descubierto la solución de la siguiente manera.

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

hace el trabajo. yo había estado usando

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

que recoge las escalas individuales.

Respuesta2

PSTricks utiliza \psrunital dibujar \pscircle.

ingrese la descripción de la imagen aquí

\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 la unidad radial globalmente le brinda la ventaja de poder cambiar todas las unidades de radios circulares en un solo lugar.


También podemos declarar una nueva clave para que podamos acceder más fácilmente a esta unidad 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}

ingrese la descripción de la imagen aquí

Respuesta3

La idea clave de todas las soluciones propuestas se basa en cambiar las unidades con x=y y=. Esto funciona bien.

Sin embargo, en mi código es muy recomendable seguir con xscale=y yscale=. Por eso he configurado una macro muy simple:

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

que se utiliza con:

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

para colocar uncircularpunto rojo de 1,5 puntos de radio en la ubicación (3,4).

información relacionada