tikz를 사용하여 프로그래밍 방식으로 정현파 그리기

tikz를 사용하여 프로그래밍 방식으로 정현파 그리기

사인파의 8가지 전체 진동은 다음과 같습니다.

사인

코드는 다음과 같습니다.

\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로 알고리즘을 작성하고 이를 실제 프로그래밍 언어처럼 사용하는 것에 관한 것입니다.

동일한 곡선을 8번 반복하기 위해 수동으로 32쌍의 좌표를 지정하고 sin& 16번을 모두 참조한 방법에 주목하세요 . cos예를 들어, 이 파동과 유사하지만 다른 일련의 독립형 파동을 생성하고 싶습니다. 매번 좌표를 일일이 입력할 필요 없이 지루하고 반복적인 모든 작업을 자동화하고 싶습니다.

이제 나를 위해 그림을 그려주고 코드를 덤프해 주는 사람이 필요하지 않습니다. 대신 프로그래밍 방식으로 문제를 해결하는 데 사용할 수 있는 다양한 트릭과 기술을 공유하고 설명해야 합니다. 우리 중 많은 사람들은 우리가 사용할 수 있는 도구에 대해 알지 못합니다. 목표는 나머지 사람들에게 이러한 문제에 스스로 접근하고 해결하는 방법을 보여 주어 스스로 배우는 방법을 배우는 것입니다.

답변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 함수 그래프 그리기, TikZ & PGF 매뉴얼(버전 3.1.4a)의 339페이지를 참조하세요.

  • 도메인을 라디안으로 정의했기 때문에 함수 인수에 : 을 sin추가하면 함수 인수를 라디안에서 각도로 변환할 수 있습니다.rsin(\x r)

  • 도메인을 정의할 때 작은 트릭이 사용됩니다. 8개 함수 간격의 도메인은 텍스트 너비보다 길기 때문에 도메인은 절반으로 단축됩니다( 16*pi`` and the same time the widths of intervals is shortened to0.5*\x`(이것은 함수 빈도의 두 배):

\draw[blue] plot[domain=0:16*pi, samples=320] (0.5*\x,{2*sin(\x r)});
  • 그려진 함수는 매끄러워서 라디안당 20개의 샘플을 사용했습니다(모두 합쳐서 320개의 샘플).

여기에 이미지 설명을 입력하세요

답변2

pic세트 내 옵션으로 색상과 함께 사인파의 주파수, 주기, 진폭을 제공합니다 . 주파수, 주기, 진폭 값에 따라 그리드가 그려집니다. foreach루프 인은 tikzset0으로 시작하고 주파수는 로 그려집니다 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=4a=2\pic {sw={color=blue,f=8,p=4,a=2}};

여기에 이미지 설명을 입력하세요

f=4, 및 :p=5a=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. 우아하지는 않지만(IMO) 한 가지 가능성을 제공합니다.

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

그럼에도 불구하고, 저는 여러분이 이보다 훨씬 더 많은 일을 할 수 있다고 확신합니다 :)

여기에 이미지 설명을 입력하세요

관련 정보