2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Не работает трансформация в TikZ
Сообщение20.12.2021, 19:24 
Не подскажет ли кто-нибудь, почему не работает код
код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\begin{tikzpicture}[scale=.1]
 
 \draw (-50,0) -- (50,0);
 \draw (0,-50) -- (0,50);
 
 \coordinate (A) at (10,10);
 \coordinate (B) at (10,20);
 \coordinate (C) at (15,20);
 \coordinate (D) at (20,10);

 \draw (A) -- (B) -- (C) -- (D) -- cycle;
 
 \draw [xscale=-1,red] (A) -- (B) -- (C) -- (D) -- cycle;
 %\draw [xscale=-1,red] (10,10) -- (10,20) -- (15,20) -- (20,10) -- cycle;
 
 \draw [blue] (-20,25) -- (10,-40);
 
\end{tikzpicture}


Трансформация почему то не работает для именованных координат в круглых скобках (красная линия), работает только вариант в закоменченой строчке, но это мне не подходит. scope тоже не помогает.

 
 
 
 Re: Не работает трансформация в TikZ
Сообщение20.12.2021, 21:36 
И даже если схимичить такую конструкцию, все равно красная линия AB не отражается:

Код:
\draw [red,xscale=-1] let \p1=(A), \p2=(B) in (\x1,\y1) -- (\x2,\y2);


-- 20.12.2021, 21:56 --

Такая конструкция работает

Код:
\draw [red] let \p1=(A), \p2=(B), \p3=(C), \p4=(D) in {[xscale=-1] (\p1) -- (\p2) -- (\p3) -- (\p4) -- cycle};


но громоздко очень получается

 
 
 
 Re: Не работает трансформация в TikZ
Сообщение20.12.2021, 22:17 
Аватара пользователя
Общие замечания:
1) Используйте не общий Code, а Выберите язык > LaTeX
2) Пишите преамбулу

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[tikz]{standalone}

Работает (если декларации точек внутри scope):
\begin{document}
\begin{tikzpicture}[scale=.1]
\draw (-50,0) -- (50,0);
\draw (0,-50) -- (0,50);
\begin{scope}[xscale=-1]
\coordinate (A) at  (10,10);
\coordinate (B) at (10,20);
\coordinate (C) at (15,20);
\coordinate (D) at (20,10);
\draw [red]   (A) --(B) --(C)--(D)--cycle;
\end{scope}
\draw [blue] (-20,25) -- (10,-40);
\end{tikzpicture}
\end{document}

 
 
 
 Re: Не работает трансформация в TikZ
Сообщение21.12.2021, 00:23 
Как поместить код в спойлер а то все полотно на показ?

Очень неудобно все запихивать в окружение

Ладно нужно было тему начинать иначе. Вот есть у меня код, который рисует ветви гиперболы (я выбросил кучу лишнего, чтобы не мешалось):

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[12pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{babel}
\usetikzlibrary{quotes}

\usetikzlibrary{math}
\usetikzlibrary{calc}

\begin{document}
 
\begin{tikzpicture}[scale=.1]
 
 %%% Стили
 
 \tikzset{style dash/.style={dash pattern=on 2.7mm off 1.2mm,thin}};
 
 %%% Определения.
 
 \tikzmath
  {
   \xaxbx=-45; % Начало оси X ...
   \xaxex=45; % ... конец.
   \yaxby=-25;
   \yaxey=25;
  }
 
 \coordinate (xaxb) at (\xaxbx,0); % Точка начала оси X ...
 \coordinate (xaxe) at (\xaxex,0); % ... конца.
 \coordinate (yaxb) at (0,\yaxby); % Точка начала оси Y ...
 \coordinate (yaxe) at (0,\yaxey); % ... конца.
 
 \tikzmath
  {
   \a=25;
   \b=15;
   % Гиперболы
   function hyperf1(\x)
    {
     return (\b/\a)*sqrt(\x^2-\a^2);
    };
   function hyperf2(\x)
    {
     return (\b/\a)*sqrt(\a^2+\x^2);
    };
   % Область гипербол
   \xline1=\xaxbx*.8;
   \xline2=\xaxex*.8;
   % Гипербола "a", сплошная линия
   \xhypera1=\a;
   \xhypera2=\xaxex*.9;
   % Гипербола "b", штриховая линия
   \xhyperb1=0;
   \xhyperb2=\xaxex*.9;
  }
 
 %%% Оси.
 
 \draw [->] (xaxb) -- (xaxe);
 \draw [->] (yaxb) -- (yaxe);
 
 \node at (xaxe) [below] {$x$};
 \node at (yaxe) [left] {$y$};
 
 %%% Гиперболы
 
 % Правая сплошная
 \draw [domain=\xhypera1:\xhypera2,samples=150,thick,save path=\mypath] plot (\x,{hyperf1(\x)});
 \draw [use path=\mypath,red,yscale=-1];
 %\draw [domain=\xhypera1:\xhypera2,samples=150,thick] plot (\x,{-hyperf1(\x)});
 % Левая сплошная
 \draw [domain=-\xhypera1:-\xhypera2,samples=150,thick] plot (\x,{hyperf1(-\x)});
 \draw [domain=-\xhypera1:-\xhypera2,samples=150,thick] plot (\x,{-hyperf1(-\x)});
 % Верхняя пунктирная
 \draw [domain=\xhyperb1:\xhyperb2,style dash] plot (\x,{hyperf2(\x)});
 \draw [domain=\xhyperb1:-\xhyperb2,style dash] plot (\x,{hyperf2(-\x)});
 % Нижняя пунктирная
 \draw [domain=\xhyperb1:\xhyperb2,style dash] plot (\x,{-hyperf2(\x)});
 \draw [domain=\xhyperb1:-\xhyperb2,style dash] plot (\x,{-hyperf2(-\x)});
 
\end{tikzpicture}

\end{document}


Строчки, где идет рисование ветвей гиперболы, по-моему смотрятся диковато - куча повторяющегося кода, здесь можно было бы создать одну половину ветви пунктирной и одно половинку сплошной ветви а потом все остальное дорисовать трансформациями.

Есть ли в TikZ некий простой и универсальный способ применить трансформации к ЛЮБЫМ путям, независимо от происхождения (график функции, \ draw rectange, \draw (A) -- (B), кривая и т д) без лишних извращений. Просто создал путь как некий объект (с именем) и потом делаешь с ним все, что угодно когда угодно. Помню в Asymptote с этим вообще все просто было.

 
 
 
 Re: Не работает трансформация в TikZ
Сообщение21.12.2021, 01:46 
Аватара пользователя
Не надо вообще использовать кнопку Code.

Если у вас кривые отличаются значением параметра то используйте \foreach

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[scale=2.1]
\begin{scope}
\fill[fill=cyan!20,  ] (1,0) arc (0:180:1);
\clip  (-1,0) -- (1,0) arc (0:180:1);
\foreach \r in {.125,.25,...,1}
\draw[blue] (0,0) circle (\r);
\foreach \s in {0,...,18}
\draw [red] ({cos (18*\s )}, {sin (18*\s )})--(0,0);
\end{scope}
\draw[very thick] (-1,0) -- (1,0) arc (0:180:1);
\end{tikzpicture}

\begin{tikzpicture}[scale=1]
\fill[cyan!20] (-4.3,0) rectangle (4.3,-2.8);
\draw[ultra thick,] (4.3,0)--(2,0) node[above] {$1$};
\draw[ultra thick,] (-4.3,0)--(-2,0) node[above] {$-1$};;
\draw[ultra thick,] (2,0)--(-2,0);
\begin{scope}
\clip (-4,-2.8) rectangle (4,0);
\foreach \r in {.15,.2,...,.9}
\draw[blue] (0,0) ellipse ({(\r+1/\r)} and {(-\r+1/\r)} );
\foreach \s in {0,.5,...,10}
\draw[red, domain=-3:3]  plot[parametric] function{ cos(pi*\s/10)*cosh(t),sin(pi*\s/10)*sinh(t)  };
\end{scope}

\draw[very thin, ->]  (-4.3,0)--(4.3,0);
\draw[very thin, ->]  (0,0.3)--(0,-2.8);
\end{tikzpicture}
\end{document}

 
 
 
 Re: Не работает трансформация в TikZ
Сообщение21.12.2021, 11:25 
 i  Оформление кода в сообщениях ТС исправлено.

 
 
 
 Re: Не работает трансформация в TikZ
Сообщение24.12.2021, 01:21 
Вот, нашел несколько костылей, можно делать трансформации через transform canvas, и есть более гибкий способ с применением макросов:

код: [ скачать ] [ спрятать ]
Используется синтаксис LaTeX
\documentclass[12pt]{article}

\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}
\usepackage{tikz}

\usetikzlibrary{calc}

\begin{document}
 
\begin{tikzpicture}[scale=.1]
 
 \draw (-50,0) -- (50,0);
 \draw (0,-50) -- (0,50);
 
 \def\A{10,10}
 \def\B{10,20}
 \def\C{15,20}
 \def\D{20,10}
 
 \coordinate (A) at (\A);
 \coordinate (B) at (\B);
 \coordinate (C) at (\C);
 \coordinate (D) at (\D);
 
 \def\mypatha{(\A) -- (\B) -- (\C) -- (\D) -- cycle}
 
 \draw \mypatha;
 \draw [xscale=-1,red] \mypatha;
 \draw [yscale=-1,green] \mypatha;
 \draw [scale=-1,blue,save path=\mypathb] \mypatha;
 % Не хочет трансформировать, если ссылка по имени.
 % Черная фигура поверх синей.
 %\draw [use path=\mypathb,shift=(135:15mm),thick];
 
 \path [use path=\mypatha,transform canvas={yscale=-1},save path=\mypathb];
 
 \coordinate (E) at (-20,25);
 \coordinate (F) at (10,-40);
 
 \path [save path=\mypath] (E) -- (F);
 \draw [use path=\mypath,red,transform canvas={rotate=35}];
 \draw [use path=\mypath,blue,transform canvas={rotate=35,shift=(45:10mm)}];
 
\end{tikzpicture}

\end{document}

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group