LINUX.ORG.RU
решено ФорумTalks

Покритикуйте схему в TikZ

 ,


0

1

Понадобился набросок схемы квадратурного демодулятора.

Обычно, простые схемы, состоящие менее чем, скажем, из 10 элементов, я рисовал в MS Visio Dia, в этот раз решил попробовать TikZ, пока что получилось вот что:

\tikzset{
   block/.style    = {draw, thick, rectangle, minimum height = 3em, minimum width = 3em},
   sum/.style      = {draw, circle, node distance = 2cm}, % Adder
   input/.style    = {coordinate}, % Input
   splitter/.style    = {coordinate}, % Input
   output/.style   = {coordinate}, % Output
   triangle/.style = {draw, thick, regular polygon, regular polygon sides=3},
   border rotated/.style = {shape border rotate=90}
}

\begin{tikzpicture}[auto, thick, node distance=2cm, >=triangle 45]
  
 % Сплиттер гетеродина
 \draw node[splitter, name=heterodyne_splitter] {}; 

 % Фазовращатель
 \draw node[block, below of=heterodyne_splitter] (phase_shifter) {$\pi/2$};

 % Косинусный и синусный перемножители
 \draw node [sum, above of=heterodyne_splitter] (prod_cos) {\Large$\times$};
 \draw node [sum, below of=phase_shifter] (prod_sin) {\Large$\times$};

 % Входной сплиттер
 \draw node[splitter, name=input_splitter, left of=heterodyne_splitter, xshift=-1cm]{};

 % Входная клемма
 \draw (-5, 0)[right=-0.8mm] circle [radius=0.8mm];
 \draw node [input, name=input, left of=input_splitter] {}; 

 % Соединяем вход с перемножителями
 \draw (input) -- node {$ s(t) $}(input_splitter);
 \draw[->] (input_splitter) |- node {}(prod_cos);
 \draw[->] (input_splitter) |- node {}(prod_sin);

 % Соединяем гетеродин с перемножителями
 \draw[->] (heterodyne_splitter) -- node {$2\cos(2 \pi f_0 t)$}(prod_cos);
 \draw[->] (heterodyne_splitter) -- node {}(phase_shifter);
 \draw[->] (phase_shifter) -- node {$2\sin(2 \pi f_0 t)$}(prod_sin);

 % Усилитель после гетеродина
 \draw node[triangle, border rotated, right of=heterodyne_splitter] (heterodyne_amplifier) {$2$};
 \draw (heterodyne_amplifier) -- node {}(heterodyne_splitter);

 % Гетеродин
 \draw node[block, right of=heterodyne_amplifier] (heterodyne) {$f_0$};
 \draw[->] (heterodyne) -- node {}(heterodyne_amplifier);

 % Косинусный ФНЧ
 \draw node[block, right of=prod_cos, xshift=2cm] (lpf_cos) {LPF};
 \draw[->] (prod_cos) -- node {$s_i(t)$}(lpf_cos);

 % Синусный ФНЧ
 \draw node[block, right of=prod_sin, xshift=2cm] (lpf_sin) {LPF};
 \draw[->] (prod_sin) -- node {$s_q(t)$}(lpf_sin);

 % Выходные клеммы
 \draw (7,  2)node[splitter, name=output_cos]{};
 \draw (7, -4)node[splitter, name=output_sin]{};
 \draw[->] (lpf_cos) -- node {$i(t)$}(output_cos);
 \draw[->] (lpf_sin) -- node {$q(t)$}(output_sin);

 % Точки
 \draw  node at (0,0) {\textbullet};
 \draw  node at (-3,0) {\textbullet};

\end{tikzpicture}

Выгляди это дело так: http://postimg.org/image/5hsb8tuw1/

Это мой первый опыт с Tikz-ом и ощущения, откровенно говоря, паршивые. Не понимаю, то ли задачу я выбрал не ту, то ли решал не так, но нарисовать такую схему в tikz показалось на порядок дольше, чем мышкой растаскивать прямоугольнички по листу в wysiwyg-е.

Also, я не понимаю почему надпись 2 \sin( 2 \pi f_0 t) оказалась справа и как расположить её слева, так же сделано для косинуса?

паршивые

Сделай вертикальные стрелки длиннее, чтобы формулы не смешивались с горизонтальными связями и сразу станет намного лучше.
А так — аккуратно.

Stahl ★★☆ ()
Последнее исправление: Stahl (всего исправлений: 1)
Ответ на: комментарий от Stahl

И шрифт подбери.
Если это для распечатки, то ок. Но с экрана смотрится не очень.

Stahl ★★☆ ()

нарисовать такую схему в tikz показалось на порядок дольше, чем мышкой растаскивать прямоугольнички по листу в wysiwyg-е.

Конечно, многое упирается в опыт, если с tikz не работал, то будет долго. Хотя вот мне tikz не нравится — без хелпа фиг что нарисуешь. Metapost, например, куда проще. Профит от программирования в двух случаях: сделать ну очень уж красивую схему или схема настолько сложна, что просто нарисовать трудно. В остальных случаях разве wysiwyg хуже?

iVS ★★★★★ ()

Это мой первый опыт с Tikz-ом и ощущения, откровенно говоря, паршивые. Не понимаю, то ли задачу я выбрал не ту, то ли решал не так, но нарисовать такую схему в tikz показалось на порядок дольше, чем мышкой растаскивать прямоугольнички по листу в wysiwyg-е.

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

vostrik ★★★☆ ()

Also, я не понимаю почему надпись 2 \sin( 2 \pi f_0 t) оказалась справа и как расположить её слева, так же сделано для косинуса?

насколько я помню, это не синус оказался справа, а косинус из-за auto переехал влево дабы не налазить на усилок. но давно это было, могу ошибаться

vostrik ★★★☆ ()
Ответ на: комментарий от vostrik

То есть, вот это вот всё just for fun? Так же, какой практический смысла «текстом вместо битмапа»? Ну ладно, если bitmap не угодил, но есть eps или сразу pdf.

P.S. Благодарю за наводку на auto, вылезал действительно косинус. Решил заменой на

\draw[->] (heterodyne_splitter) -- node[right] {$2\cos(2 \pi f_0 t)$} node {}(prod_cos);

omegatype ★★ ()
Ответ на: комментарий от omegatype

То есть, вот это вот всё just for fun?

обрати внимание, там 90% - то, что в визивиге рисовать геморно потому что либо одинаковые элементы нужно ставить-ставить-ставить по порядку, либо нужно по кругу размещать либо еще что-то. что совсем не походит на «нарисуй в уме или на бумажке гетерогенную схему и перенеси её в набор элементов в тикзе»

Так же, какой практический смысла «текстом вместо битмапа»? Ну ладно, если bitmap не угодил, но есть eps или сразу pdf

не то чтобы его сильно много, но другого я не нашел. лаконично описанный вектор - единственное, что мне понравилось в tikz, для плакатов всяких приемлемый вариант, особенно с учетом того, что его можно рисовать условными Ctrl+C|Ctrl+V|Ctrl+H

vostrik ★★★☆ ()
Ответ на: комментарий от omegatype

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

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

ptarh ★★★★★ ()
Ответ на: комментарий от omegatype

Подрочил, спасибо.
А если без сарказма,то выглядит отлично.
Но шрифт я бы пересмотрел. Нижние и верхние индексы выглядят не очень. Может какой-то более жирный и без засечек?
Но это уже на твоё усмотрение.
На бумаге у меня не было бы никаких возражений.
Красиво.
(Но я нихрена не понимаю, что начерчено. Вообще. Может кто поймёт, тот более внятно выскажется. Для меня это просто абстрактная блоксхема)

Stahl ★★☆ ()
Ответ на: комментарий от vostrik

А вообще, если простую (или типа описанной тут) блок-схему, то что есть, помимо tikz? Вот тут рекомендуют Metapost, что скажешь по поводу оного? Еще слышал про PSTricks.

omegatype ★★ ()
Ответ на: комментарий от Stahl

Мерси за комплеман!

Предназначается для печати, да. А шрифт, полагаю, дефолтный (м.б. знающие поправят, но это должен быть Кнутовский Computer Modern?).

omegatype ★★ ()
Ответ на: комментарий от omegatype

Немного про MetaPost: http://www.inp.nsk.su/~baldin/mpost/index.html Правда метод подключения кириллицы сильно устарел. Всё стало намного проще (немного есть на википедии).

IMHO от TikZ это не сильно отличается. Если тебе нравится визивиг и качества тебе от него достаточно — используй визивиг. Я использую MetaPost для картинок просто по той причине, что визивиг тупо не умею, то есть мне картинку проще запрограммировать. И да, прежде чем запрограммировать картинку, я на миллиметровке прикидываю композицию.

Evgueni ★★★★★ ()
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от ptarh

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

1) Точки совсем не воображаемые, можно накинуть сетку на время рисования и потом её убрать.

2) Есть позиционирование относительно других node'ов.

srj ★★ ()
Ответ на: комментарий от omegatype

Metapost

Не получилось раскочегарить.

PSTricks

Неплохой пакет, не такой навороченный (в т.ч. в плане синтаксиса), как tikz, но при этом все необходимое есть. Но увы, не поддерживает pdflatex и самое главное xelatex.

Мой старый скриншот в галерее с pst-circ. www.linux.org.ru/gallery/3578119.png

Есть ещё MetaFun, такой Metapost на стероидах, дефолтный язык рисования для ConTeXt (тот же LaTeX, но с большим упором на всякие красивости).

srj ★★ ()
Ответ на: комментарий от srj

UPD: сейчас маленько погуглил. Оказывается, есть небольшие костылики, чтобы работать с PSTricks из pdflatex и xelatex.

srj ★★ ()
Ответ на: комментарий от vostrik

tikz нужен для того, чтобы рисунки экспортировать в tex текстом вместо битмапа, а не для того, чтобы по точкам рисунки рисовать

Нашел проблему. Зато косяк с масштабированием, емнип, tikzscale только с latex3 работает.

iVS ★★★★★ ()
Ответ на: комментарий от omegatype

Вот тут рекомендуют Metapost, что скажешь по поводу оного?

Для двумерных схем очень здорово. У tikz есть много готовых примитивов, в Metapost их самому надо делать, зато синтаксис удобный и интуитивно понятный.

Еще слышал про PSTricks.

Пробовал, не понравилось. У него куча разнородных пакетов, с которыми нужно отдельно разбираться и «искать розу среди навоза»; и именно того, что тебе нужно, может не оказаться.

Я рекомендую Asymptote: синтаксис близок к С++, примитивов поболее, чем в Metapost; куча возможностей в том числе для трехмерных изображений.

iVS ★★★★★ ()

Да нифига это не быстрее рисовать руками.

psv1967 ★★★★★ ()
Ответ на: комментарий от psv1967

Зависит от предпочтений и способностей. Калю-малю нарисовать безусловно руками быстрее получится, но для хоть сколько-нибудь вменяемой иллюстрации нужны способностей, коих у меня, например, нет. Поэтому конкретно мне проще запрограммировать иллюстрацию.

Evgueni ★★★★★ ()

нарисовать такую схему в tikz показалось на порядок дольше

Всё правильно, в случае со схемами TikZ и не предназначен для скоростной подготовки графики, WISYWIG будет быстрее. Преимущество TikZ в том, что он позволяет получить оформление графики (шрифты, типы линий и т.п.), идентичное основному документу LaTeX, встраивать в графику формулы LaTeX, графики (точные) математических функций и т.п. В статьях это очень полезно. Также рисунки получаются встроенными в текст и меньше риск, что изменится форматирование при смене стилевого файла.

В дальнейшем оформление схем пойдёт быстрее, т.к. все блоки можно написать где-либо один раз, а потом их копипастить в новый документ.

Для схем электрических принципиальных есть библиотека circuits и пакет circuitikz (несовместимые друг с другом), которые содержат готовые символы различных компонентов. Этими средствами я пользуюсь для рисования схем в статьях.

почему надпись 2 \sin( 2 \pi f_0 t) оказалась справа и как расположить её слева

Ещё можно использовать параметр anchor. Например:

\node (A) [anchor=west] at (x,y) { ... }; 

DarthVadimius ★★ ()

Если узлы и координаты вынести из draw, сгруппировать и использовать побольше относительных расположений, то можно переписать так:

\documentclass[tikz]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[russian]{babel}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{arrows}
\usetikzlibrary{calc}

\begin{document}

\tikzset{
   block/.style    = {draw, thick, rectangle, minimum height = 3em, minimum width = 3em},
   sum/.style      = {draw, circle, node distance = 2cm}, % Adder
   input/.style    = {coordinate}, % Input
   splitter/.style    = {coordinate}, % Input
   output/.style   = {coordinate}, % Output
   triangle/.style = {draw, thick, regular polygon, regular polygon sides=3},
   border rotated/.style = {shape border rotate=90}
}

\begin{tikzpicture}[auto, thick, node distance=2cm, >=triangle 45]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Объекты
  
 % Сплиттер гетеродина
 \coordinate (heterodyne_splitter) at (0,0); 
 \fill (heterodyne_splitter) circle(2pt);

 % Фазовращатель
 \node[block, below of=heterodyne_splitter] (phase_shifter) {$\pi/2$};

 % Косинусный и синусный перемножители
 \node[sum] at ($(heterodyne_splitter)+(0cm,3cm)$) (prod_cos) {\Large$\times$};
 \node[sum] at ($(phase_shifter)+(0cm,-3cm)$) (prod_sin) {\Large$\times$};

 % Входной сплиттер
 \coordinate (input_splitter) at ($(prod_cos)!0.5!(prod_sin)+(-2cm,0cm)$);
 \fill (input_splitter) circle(2pt);

 % Входная клемма
 \coordinate[left of=input_splitter] (input); 
 % Отрисовка после соединительных линий
 
 % Усилитель после гетеродина
 \node[triangle, border rotated, right of=heterodyne_splitter] (heterodyne_amplifier) {$2$};

 % Гетеродин
 \node[block, right of=heterodyne_amplifier] (heterodyne) {$f_0$};

 % Косинусный ФНЧ
 \node[block] (lpf_cos) at (heterodyne|-prod_cos) {LPF};

 % Синусный ФНЧ
 \node[block] (lpf_sin) at (heterodyne|-prod_sin) {LPF};

 % Выходные клеммы
 \coordinate[right of=lpf_cos] (output_cos);
 \coordinate[right of=lpf_sin] (output_sin);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Линии

 % Соединяем вход с перемножителями
 \draw (input) -- node[above]{$s(t)$} (input_splitter);
 \draw[->] (input_splitter) |- (prod_cos);
 \draw[->] (input_splitter) |- (prod_sin);

 % Соединяем гетеродин с перемножителями
 \draw[->] (heterodyne_splitter) -- node[right] {$2\cos(2 \pi f_0 t)$} (prod_cos);
 \draw[->] (heterodyne_splitter) -- (phase_shifter);
 \draw[->] (phase_shifter) -- node[right] {$2\sin(2 \pi f_0 t)$}(prod_sin);

 % Усилитель после гетеродина
 \draw ($(heterodyne_amplifier.west)+(1pt,0pt)$) -- (heterodyne_splitter); % Дорисовка вправо

 % Гетеродин
 \draw[->] (heterodyne) -- (heterodyne_amplifier);

 % Косинусный ФНЧ
 \draw[->] (prod_cos) -- node[above]{$s_i(t)$} (lpf_cos);

 % Синусный ФНЧ
 \draw[->] (prod_sin) -- node[above]{$s_q(t)$} (lpf_sin);

 % Выходные клеммы
 \draw[->] (lpf_cos) -- node[above]{$i(t)$} (output_cos);
 \draw[->] (lpf_sin) -- node[above]{$q(t)$} (output_sin);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Дорисовка объектов

 % Точки
 \draw[red,fill=white] (input) circle(2pt);


\end{tikzpicture}

\end{document}
AlexVR ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.