2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Не работает трансформация в TikZ
Сообщение20.12.2021, 19:24 


26/11/21
13
Не подскажет ли кто-нибудь, почему не работает код
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 


26/11/21
13
И даже если схимичить такую конструкцию, все равно красная линия 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 
Заслуженный участник
Аватара пользователя


31/01/14
11304
Hogtown
Общие замечания:
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 


26/11/21
13
Как поместить код в спойлер а то все полотно на показ?

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

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

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник
Аватара пользователя


31/01/14
11304
Hogtown
Не надо вообще использовать кнопку 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 
Заслуженный участник


09/05/12
25179
 i  Оформление кода в сообщениях ТС исправлено.

 Профиль  
                  
 
 Re: Не работает трансформация в TikZ
Сообщение24.12.2021, 01:21 


26/11/21
13
Вот, нашел несколько костылей, можно делать трансформации через 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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group