스피로그래프 패턴 그리기

스피로그래프 패턴 그리기

나는 그림 그리기를 좋아한다스피로그래프 패턴(링을 따라 움직이는 바퀴의 한 점으로 표시됩니다). 나는에서 프로그램을 사용이 장소, 내가 게시한 내용튜토리얼 도움말 파일.

그러한 도면을 제작하기 위해 구현할 수 있는 외부 스타일(패키지)을 제작하는 것이 가능합니까?

다음 루틴은수학 프로세서 프로그램 다음 패턴을 생성합니다

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

spirograph = function (R, r, p, nRotations, color)
{
t = vectorin(0, 0.05, 2*pi*nRotations)
x = (R+r) * cos(t) + p * cos((R+r)*t/r)
y = (R+r) * sin(t) + p * sin((R+r)*t/r)
plot(x, y, color)
}
spirograph(60, -15, 10, 1, green)

첫 번째 줄: spirograph라는 함수를 사용하여 마지막 줄에 작성된 변수로 곡선을 그리는 명령줄입니다.

R: 링의 반경입니다.

r: 휠의 반경입니다.

p: 휠 중심에서 드로잉 포인트까지의 거리입니다.

nRotations: 지점 P가 시작된 지점에 도달하기 위해 이동해야 하는 회전 수입니다.

color: 그려질 선의 색상 이름입니다.

t: 등호 뒤의 부분에 대한 기호이다.

벡터인: MathProcessor 프로그램 명령입니다.

x = 및 y =:는 Spirograph를 그리는 수학적 매개변수 방정식입니다.

플롯: 이전 방정식에 지정된 매개변수(x,y 좌표)를 사용하여 지정된 색상으로 곡선을 그리는(플롯) 명령입니다.

마지막 줄은 반경 60의 링, 반경 15의 휠, 휠 중심에서 10 거리 떨어진 지점을 사용하여 Spirograph라는 함수로 패턴을 그리는 주요 매개변수입니다. 녹색으로 점 P를 1회전 주기로 이동하여 곡선을 만듭니다.

답변1

이것은 기능을 그림으로 구현합니다.

\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[declare function={
spirox(\t,\R,\r,\p)=(\R+\r)*cos(\t)+\p*cos((\R+\r)*\t/\r);
spiroy(\t,\R,\r,\p)=(\R+\r)*sin(\t)+\p*sin((\R+\r)*\t/\r);},
pics/spiro/.style={code={
\tikzset{spiro/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/spiro/##1}} 
\draw[trig format=rad,pic actions] 
 plot[variable=\t,domain=0:2*pi*\pv{nRotations},
    samples=90*\pv{nRotations}+1,smooth cycle] 
    ({spirox(\t,\pv{R},\pv{r},\pv{p})},{spiroy(\t,\pv{R},\pv{r},\pv{p})});
    }},
spiro/.cd,R/.initial=6,r/.initial=-1.5,p/.initial=1,nRotations/.initial=1]
 \draw pic[scale=0.5,blue]{spiro} 
   (5,0) pic[scale=0.5,red]{spiro={R=5,r=-1,p=0.5}}
   (0,-6) pic[scale=0.5,blue,ultra thick,inner color=blue!10,outer color=blue]{spiro}
   (5,-6) pic[scale=0.5,red,line width=1mm,fill=orange,rotate=15]{spiro={R=5,r=-1,p=0.5}};
\end{tikzpicture}
\end{document}

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

그림과 같이 pgf 키를 사용하여 매개변수를 설정할 수 있습니다. 원칙적으로 쉼표로 구분된 목록으로 전달할 수도 있습니다. 필요하다면 지금 알려주십시오. 나는 또한 왜 사진이 (IMHO) 그렇게 유용한지를 보여주는 추가 예를 추가했습니다. 채우기, 회전, 음영 등 모든 종류의 항목을 추가할 수 있습니다.

이것은 음영을 사용하는 약간 더 빠른 버전입니다.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{shadings}
\tikzset{pics/spiro/.style={code={
\tikzset{spiro/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/spiro/##1}} 
\draw[trig format=rad,pic actions] 
 plot[variable=\t,domain=0:2*pi*\pv{nRotations},
    samples=90*\pv{nRotations}+1,smooth cycle] 
    ({(\pv{R}+\pv{r})*cos(\t)+\pv{p}*cos((\pv{R}+\pv{r})*\t/\pv{r})},
     {(\pv{R}+\pv{r})*sin(\t)+\pv{p}*sin((\pv{R}+\pv{r})*\t/\pv{r})});
    }},
spiro/.cd,R/.initial=6,r/.initial=-1.5,p/.initial=1,nRotations/.initial=1}
\begin{document}
\begin{tikzpicture}[]
 \draw 
   (0,0) pic[scale=0.5,blue,ultra thick,rotate=45,
    lower left=orange,lower right=yellow,upper left=red,
        upper right=magenta]{spiro}
   (5,0) pic[scale=0.5,red,line width=1mm,inner color=red!20,
   outer color=red,rotate=18]{spiro={R=5,r=-1,p=0.9}};
\end{tikzpicture}
\end{document}

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

또는 변형 가능성을 보여주는 또 다른 예입니다(날짜에서 어느 정도 영감을 받음).

\documentclass[tikz,border=3mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{shadings}
\tikzset{pics/spiro/.style={code={
\tikzset{spiro/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/spiro/##1}} 
\draw[trig format=rad,pic actions] 
 plot[variable=\t,domain=0:2*pi*\pv{nRotations},
    samples=90*\pv{nRotations}+1,smooth cycle] 
    ({(\pv{R}+\pv{r})*cos(\t)+\pv{p}*cos((\pv{R}+\pv{r})*\t/\pv{r})},
     {(\pv{R}+\pv{r})*sin(\t)+\pv{p}*sin((\pv{R}+\pv{r})*\t/\pv{r})});
    }},
spiro/.cd,R/.initial=6,r/.initial=-1.5,p/.initial=1,nRotations/.initial=1}
\begin{document}
\tdplotsetmaincoords{70}{110}
\begin{tikzpicture}[tdplot_main_coords,line join=round]
 \begin{scope}[canvas is xy plane at z=3]
  \path[fill=blue] (-3,-3) rectangle (3,3);
  \path (0,0) pic[scale=0.5,orange,line width=1mm,inner color=orange!40!black,
   outer color=orange,rotate=18+90,transform shape]{spiro={R=5,r=-1,p=0.9}};
 \end{scope}
 \begin{scope}[canvas is xz plane at y=3]
  \path[fill=blue!80!black] (-3,-3) rectangle (3,3);
  \path (0,0) pic[scale=0.5,yellow,line width=1mm,inner color=yellow!40!black,
   outer color=yellow,rotate=18,transform shape]{spiro={R=5,r=-1,p=0.9}};
 \end{scope}
 \begin{scope}[canvas is yz plane at x=3]
  \path[fill=blue!60!black] (-3,-3) rectangle (3,3);
  \path (0,0) pic[scale=0.5,red,line width=1mm,inner color=red!40!black,
   outer color=red,rotate=18,transform shape]{spiro={R=5,r=-1,p=0.9}};
 \end{scope}
\end{tikzpicture}
\end{document}

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

답변2

이 작업을 수행하려면 Metapost 매크로를 사용하겠습니다.

LuaLaTeX 파일에는 다음이 포함되어 있습니다.

\documentclass[border=2mm]{standalone}
\usepackage{luatex85,luamplib}
\mplibnumbersystem{double}
\everymplib{%
    pi := 3.14159265358979323846; radian := 180/pi;
    vardef cos primary x = cosd(x*radian) enddef;
    vardef sin primary x = sind(x*radian) enddef;

    vardef param_fcn (expr tmin, tmax, tstep)(text f_t)(text g_t) =
        save t; t := tmin;      
        (f_t, g_t)      
        forever: hide(t := t+tstep) exitif t > tmax;
            .. (f_t, g_t) 
        endfor
        if t - tstep <> tmax: hide(t := tmax) .. (f_t, g_t) fi
    enddef;

    vardef spirograph(expr R, r, p, n, u) =
        param_fcn(0, 2*pi*n, .05)
            ((R+r) * cos(t) + p * cos((R+r)*t/r)) ((R+r) * sin(t) + p * sin((R+r)*t/r))
        scaled u
    enddef;

    beginfig(1);}
\everyendmplib{endfig;}

\begin{document}
    \begin{mplibcode}
        draw spirograph(60, -15, 10, 1, mm) withcolor green;
    \end{mplibcode}

    \begin{mplibcode}
        path spir; spir = spirograph(60, -15, 10, 1, mm) rotated 60;
        fill spir .. cycle withcolor red; 
        draw spir withcolor blue withpen pencircle scaled mm;
    \end{mplibcode}

\end{document}

추가 매개변수는 u단위 스케일입니다.

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

관련 정보