TikZ: разные масштабы x, y, но так, чтобы формы сохраняли свои аспекты

TikZ: разные масштабы x, y, но так, чтобы формы сохраняли свои аспекты

У меня есть старый код pstricks, который я переделываю с помощью TikZ. На моей текущей картинке шкалы x и y отличаются:

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

Однако проблема в том, что круги рисуются как эллипсы, растянутые больше в направлении Y. Я также пробовал

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

но это имеет тот же эффект растяжения кругов в эллипсы.

Так есть ли способ масштабировать только координаты в TikZ, не влияя на формы объектов?

решение1

Я нашел решение следующим образом

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

делает свою работу. Я использовал

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

который улавливает индивидуальные масштабирования.

решение2

PSTricks использует \psrunitпри рисовании \pscircle.

введите описание изображения здесь

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

Примечание: глобальное объявление радиальной единицы дает вам преимущество, поскольку вы можете изменить все единицы радиусов окружности в одном месте.


Мы также можем объявить новый ключ, чтобы облегчить доступ к этому радиальному блоку.

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

введите описание изображения здесь

решение3

Основная идея всех предлагаемых решений заключается в замене единиц измерения x=на и y=. Это работает хорошо.

Однако в моем коде крайне желательно придерживаться xscale=и yscale=. Поэтому я создал очень простой макрос:

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

который используется с:

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

разместитькруговойкрасная точка радиусом 1,5 пункта в точке (3,4).

Связанный контент