변수가 정확하지 않은 PSTricks 그리기

변수가 정확하지 않은 PSTricks 그리기

다음 예를 고려하십시오.

\documentclass{article}

\usepackage{pst-coil}

\psset{dimen = middel}

\def\frekvensgenerator[#1,#2](#3,#4){
  \psframe(#3,#4)(!#3 #1 add #4 #2 add)
  \psline(!#3 #4 #2 2 div add)(!#3 #1 add #4 #2 2 div add)
  \psframe(!#3 #1 2 div add 0.2 sub #4)(!#3 #1 2 div add 0.2 add #4 #2 2 div add)
  \rput{270}(!#3 #1 2 div add #4){%
    \psCoil[
      linewidth = 1.5pt,
      coilwidth = \spolevidde,
      coilheight = \spolehoejde,
      coilarm = 0
    ]{0}{\drejning}%
  }
  \psframe[
    fillstyle = solid,
    fillcolor = yellow!70
  ](!#3 #1 2 div add 0.25 sub  #4 \drejning\space 480 div \spolevidde\space mul \spolehoejde\space mul sub 1 sub)(!#3 #1 2 div add 0.25 add  #4 \drejning\space 480 div \spolevidde\space mul \spolehoejde\space mul sub)
  \psline(!#3 #1 2 div add #4 \drejning\space 480 div \spolevidde\space mul \spolehoejde\space mul sub 1 sub)(!#3 #1 2 div add #4 \drejning\space 480 div \spolevidde\space mul \spolehoejde\space mul sub 3 sub)
}

\begin{document}

\def\spolevidde{0.5}
\def\spolehoejde{0.5}

\begin{pspicture}(3.5,6.2)
\def\drejning{810}
  \frekvensgenerator[1.5,1.5](0,4.7)
\def\drejning{3330}
  \frekvensgenerator[1.5,1.5](2,4.7)
\end{pspicture}

\end{document}

산출

볼 수 있듯이 스프링이 비틀리는 총 각도 수를 변경하면 무게추는 스프링의 동일한 지점(감기의 정수 모듈로)에 연결되지 않습니다.

이 작업을 어떻게 수행합니까?

추신: 코드를 더 간단하게 만들 수 있다면(거의 확실히 가능합니다), 코드를 개선하는 것을 매우 환영합니다.:)

답변1

\documentclass{article}
\usepackage{pst-coil}
%\psset{dimen = middel}

\def\frekvensgenerator[#1,#2](#3,#4)#5{%
  \psframe(#3,#4)(!#3 #1 add #4 #2 add)
  \psline(!#3 #4 #2 2 div add)(!#3 #1 add #4 #2 2 div add)
  \psframe(!#3 #1 2 div add 0.2 sub #4)(!#3 #1 2 div add 0.2 add #4 #2 2 div add)
  \rput{270}(!#3 #1 2 div add #4){%
    \psCoil[
      linewidth = 1.5pt,
      coilwidth = \spolevidde,
      coilheight = \spolehoejde,
      coilaspect=45,
    ]{0}{#5}%
  }%
  \psframe[fillstyle = solid,fillcolor = yellow!70]%
    (!#3 #1 2 div add 0.25 sub #4 #5 360 div \dxCoil mul sub 1 sub)%
    (!#3 #1 2 div add 0.25 add #4 #5 360 div \dxCoil mul sub  )
  \psline(!#3 #1 2 div add #4 #5 360 div \dxCoil mul sub 1 sub)%
    (!#3 #1 2 div add #4 #5 360 div \dxCoil mul sub 3 sub)%
}

\begin{document}
\def\spolevidde{0.5 }
\def\spolehoejde{0.5 }
\edef\dxCoil{ \spolehoejde \spolevidde mul 45 sin mul }

\begin{pspicture}(3.5,6.2)
  \frekvensgenerator[1.5,1.5](0,4.7){810}
  \frekvensgenerator[1.5,1.5](2,4.7){3330}
  \frekvensgenerator[1.5,1.5](4,4.7){6930}
\end{pspicture}

\end{document}

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

45 sin3D 보기에 필요합니다. 코일은 의 값인 45도 각도에서 보입니다. coilaspect이는 기본적으로 입니다 45. 그러나 나는 당신이 다음과 같은 것을 찾고 있다고 가정합니다.

\documentclass{article}
\usepackage{pst-coil}

\makeatletter
\def\frekvensgenerator{\@ifnextchar[\frekvensgenerator@i{\frekvensgenerator[1.5,1.5]}}
\def\frekvensgenerator@i[#1,#2](#3,#4)#5{%
  \psframe(#3,#4)(!#3 #1 add #4 #2 add)
  \psline(!#3 #4 #2 2 div add)(!#3 #1 add #4 #2 2 div add)
  \psframe(!#3 #1 2 div add 0.2 sub #4)(!#3 #1 2 div add 0.2 add #4 #2 2 div add)
  \pnode(!#3 #1 2 div add #4){StartX}
  \psline[linewidth=1.5pt](StartX)(StartX|{!0 #4 \spolearm sub})
  \rput{270}(StartX|{!0 #4 \spolearm sub \dxCoil 2 div sub}){%
    \psCoil[
      linewidth = 1.5pt,
      coilwidth = \spolevidde,
      coilheight = \spolehoejde,
    ]{-90}{#5}%
  }%
  \psline[linewidth = 1.5pt]%
    (StartX|{!0 #4 #5 90 sub 360 div \dxCoilRel mul sub \spolearm sub \dxCoil sub})%
    (StartX|{!0 #4 #5 90 sub 360 div \dxCoilRel mul sub \spolearm dup add sub \dxCoil sub})
  \psframe[fillstyle = solid,fillcolor = yellow!70]%
    (!#3 #1 2 div add 0.25 sub #4 
      #5 90 sub 360 div \dxCoilRel mul sub \spolearm dup add sub \dxCoil sub)%
    (!#3 #1 2 div add 0.25 add #4 
      #5 90 sub 360 div \dxCoilRel mul sub \spolearm dup add sub \dxCoil sub 1 sub)
  \pnode(StartX|{!0 #4 #5 90 sub 360 div \dxCoilRel mul sub 
                  \spolearm dup add sub \dxCoil sub 3 sub}){End#3}
  \psline(StartX|{!0 #4 #5 90 sub 360 div \dxCoilRel mul sub 
                   \spolearm dup add sub \dxCoil sub 1 sub})(End#3)%
}
\makeatother
\begin{document}
\def\spolearm{0.2 }
\def\spolevidde{0.5 }
\def\spolehoejde{0.3 }
\def\dxCoil{ \spolehoejde \spolevidde mul }
\def\dxCoilRel{ \dxCoil 45 sin mul }

\begin{pspicture}(3.5,6.2)
  \frekvensgenerator(0,4.7){3690}
  \def\spolevidde{0.45 }\def\spolehoejde{0.6 }
  \frekvensgenerator(2,4.7){3690}
  \def\spolevidde{0.4 }\def\spolehoejde{1.2 }
  \frekvensgenerator(4,4.7){3690}
  \def\spolevidde{0.35 }\def\spolehoejde{2.4 }
  \frekvensgenerator(6,4.7){3690}
  \pscurve[linecolor=red,linewidth=1.5pt](End0)(End2)(End4)(End6)
\end{pspicture}

\end{document}

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

그리고 애니메이션으로:

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

답변2

pszigzag에서 제공하는 것이 pst-coil신뢰할 수 없는 것 같아서 다음과 같이 나만의 지그재그를 만듭니다.

\CoilWidth애니메이션을 만들 때 모든 프레임에서 음수가 되지 않도록 하세요 .

\FPeval\CoilWidth{1-1.4*Lambda}% make sure it never becomes negative, otherwise the orientation will change!

MWE

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-node,pst-plot}
\usepackage[nomessages]{fp}

\FPset\CoilArm{.6}
\FPset\Windings{7}

\psset
{
    dimen=medusa,
    fillcolor=yellow,
    linejoin=1,
}

\def\System#1{% #1: total length includes the arms
    \FPeval\Lambda{(#1-2*CoilArm)/Windings}%
    \FPeval\CoilWidth{1-1.4*Lambda}% make sure it never becomes negative, otherwise the orientation will change!
    \FPeval\PlotPoints{trunc(4*Windings+1,0)}%
    \curvepnodes[plotpoints=\PlotPoints,algebraic]{0}{\Lambda\space \Windings\space mul}{\CoilWidth*sin(2*Pi*t/\Lambda)|-t-\CoilArm}{P}%
    \rput(-.5,0){\psframe(1,1)\psframe(1,.5)\psframe(!1 3 div 0)(!2 3 div .5)}%
    \pscustom
    {
        \psline(0,0)
        \psnline(0,\Pnodecount){P}
        \psline(0,-#1)
    }%
    \rput(!-.25 -#1 1 sub){\psframe[fillstyle=solid](.5,1)\psline(.25,0)(.25,-2)}%
    \ignorespaces
}

\def\func(#1){2*sin(2*pi*#1/1)+4}

\begin{document}
\multido{\n=.00+.05}{21}{%
\begin{pspicture}(1,-9)(3,1)
    \rput(2,0){\FPeval\y{\func(\n)}\System{\y}}
\end{pspicture}}
\end{document}

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

관련 정보