![변수가 정확하지 않은 PSTricks 그리기](https://rvso.com/image/281484/%EB%B3%80%EC%88%98%EA%B0%80%20%EC%A0%95%ED%99%95%ED%95%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20PSTricks%20%EA%B7%B8%EB%A6%AC%EA%B8%B0.png)
다음 예를 고려하십시오.
\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 sin
3D 보기에 필요합니다. 코일은 의 값인 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}