Вот восемь полных колебаний синусоиды:
Вот код:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[gray!20] (0,-2) grid (32,2); %Grid
\draw[black,-] (0, 0) -- (32,0); %X-Axis
\draw[black,-] (0,-2) -- (0 ,2); %Y-Axis
\draw[blue] (0 ,0) %Origin
%Sine-Wave%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sin (1 ,2) cos (2 ,0) sin (3 ,-2) cos (4 ,0) sin (5 ,2) cos (6 ,0) sin (7 ,-2) cos (8 ,0)
sin (9 ,2) cos (10,0) sin (11,-2) cos (12,0) sin (13,2) cos (14,0) sin (15,-2) cos (16,0)
sin (17,2) cos (18,0) sin (19,-2) cos (20,0) sin (21,2) cos (22,0) sin (23,-2) cos (24,0)
sin (25,2) cos (26,0) sin (27,-2) cos (28,0) sin (29,2) cos (30,0) sin (31,-2) cos (32,0);
\end{tikzpicture}
\end{document}
Мой вопрос не обязательно о синусоидах или тригонометрических функциях. Он скорее о написании алгоритмов с помощью LaTeX и использовании его как настоящего языка программирования.
Обратите внимание, как я вручную указал 32 пары координат и ссылался на обе sin
и cos
16 раз, чтобы нарисовать 8 итераций одной и той же кривой? Скажем, я хочу сгенерировать серию различных автономных волн, которые похожи, но отличаются от этой. Я не хочу вводить каждую отдельную координату каждый раз, я хочу автоматизировать все скучные, повторяющиеся вещи.
Теперь мне не нужно, чтобы кто-то просто нарисовал это для меня и выложил код, а скорее поделился и объяснил различные приемы и методы, которые можно использовать для решения этой проблемы программным способом. Многие из нас не знают об инструментах, которые есть в нашем распоряжении. Цель состоит в том, чтобы показать остальным из нас, как подходить к этим проблемам и решать их самостоятельно, чтобы мы могли научиться делать это сами.
решение1
Для рисования синусоидальной функции я бы использовал plot
макрос:
\documentclass[tikz, margin=3mm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[gray,thin] (0,-2) grid[xstep=pi/2,ystep=1] (8*pi,2); %Grid
\draw (0, 0) -- (8*pi,0) %X-Axis
(0,-2) -- (0 ,2); %Y-Axis
% Sine-Wave, \x r means to convert '\x' from degrees to radians
\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
\end{tikzpicture}
\end{document}
Редактировать:
TikZ предоставляет макрос
plot
для рисования функции. Его использование описано в разделе22.5 Построение графика функции, стр. 339 в Руководстве TikZ & PGF (версия 3.1.4a).Поскольку я определяю область определения в радианах, к аргументу
sin
функции добавляетсяr
:sin(\x r)
, что выполняет преобразование аргумента функции из радиан в градусы.при определении домена используется небольшой трюк. Поскольку домен из восьми интервалов функции длиннее ширины текста, домен сокращается вдвое (до
16*pi`` and the same time the widths of intervals is shortened to
0,5*\x` (это удваивает частоту функции):
\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
- Эта нарисованная функция гладкая, я использовал 20 выборок на радиан (всего 320 выборок)
решение2
Дает частоту, период и амплитуду синусоиды с цветом в качестве опций в pic
наборе. Сетка рисуется в соответствии со значениями частоты, периода и амплитуды. foreach
цикл tikzset
начинается с нуля, а частота рисуется с 0 to f-1
. Рисование синусоиды основано на TiКz основы.
\documentclass[tikz,border=10pt]{standalone}
\tikzset{%
pics/sw/.style args={color=#1,f=#2,p=#3,a=#4}{%
code={%
\def\f{#2}%Frequency
\def\p{#3}%Period
\def\a{#4}%Amplitude
\draw[gray!20] (0,-\a) grid (\p*\f,\a); %Grid
\draw[black,-] (0, 0) -- (\p*\f,0); %X-Axis
\draw[black,-] (0,-\a) -- (0 ,\a); %Y-Axis
\pgfmathsetmacro{\k}{#2-1}
\foreach \t in{0,1,...,\k}{
\draw[thick,#1] ({\t*\p},0) sin (#3/4+\t*\p,#4)cos(#3/2+\t*\p,0)sin(#3*3/4+\t*\p,-#4)cos(#3+\t*\p,0);%
}%
}
}
}
\begin{document}
\begin{tikzpicture}
\pic {sw={color=blue,f=8,p=4,a=2}};
\end{tikzpicture}
\end{document}
Для f=8
, p=4
и a=2
:\pic {sw={color=blue,f=8,p=4,a=2}};
Для f=4
, p=5
и a=3
:\pic {sw={color=red,f=4,p=5,a=3}};
ПРИЛОЖЕНИЕ: Добавление некоторых функций в код:
\documentclass[tikz,border=10pt]{standalone}
\tikzset{%
pics/sw/.style args={color=#1,f=#2,p=#3,a=#4}{%
code={%
\def\f{#2}%Frequency
\def\p{#3}%Period
\def\a{#4}%Amplitude
\draw[gray!50] (0,-\a) grid (\p*\f,\a); %Grid
\pgfmathsetmacro{\n}{#2*#3}
\foreach \x in{0,1,...,\n}{
\node at (\x,0)[below right]{\x};}
\draw[black,->] (0, 0) -- (\p*\f+1,0)node[above]{$x$}; %X-Axis
\draw[black,->] (0,-\a)node[left]{-$#4$} -- (0 ,\a+1)node[right]{$y$}; %Y-Axis
\node at (0,\a)[left]{$#4$};
\pgfmathsetmacro{\k}{#2-1}
\foreach \t in{0,1,...,\k}{
\draw[ultra thick,#1] ({\t*\p},0) sin (#3/4+\t*\p,#4)cos(#3/2+\t*\p,0)sin(#3*3/4+\t*\p,-#4)cos(#3+\t*\p,0);%
}%
\node at (\n/2,\a+1){$y=\sin\,x$};%
}
}
}
\begin{document}
\begin{tikzpicture}
\pic {sw={color=cyan,f=6,p=4,a=3}};
\end{tikzpicture}
\end{document}
решение3
Очень грубая отправная точка с foreach
петлями. Не элегантно (ИМХО), но дает одну возможность.
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[gray!20] (0,-2) grid (32,2); %Grid
\draw[black,-] (0, 0) -- (32,0); %X-Axis
\draw[black,-] (0,-2) -- (0 ,2); %Y-Axis
%% incorporating @marmot's (user121799) suggestion
\draw[blue] foreach \x in {1,5,...,29} { ({\x-1} ,0) sin ({\x} ,2) cos ({\x+1} ,0) sin ({\x+2}, -2) cos ({\x+3} ,0)};
\end{tikzpicture}
\end{document}
Тем не менее, я почти уверен, что вы можете сделать гораздо больше :)