![Desenho PSTricks com variáveis não exatas](https://rvso.com/image/281484/Desenho%20PSTricks%20com%20vari%C3%A1veis%20%E2%80%8B%E2%80%8Bn%C3%A3o%20exatas.png)
Considere o seguinte exemplo:
\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}
Como pode ser visto, o peso não está conectado ao mesmo ponto da mola (módulo um número inteiro de enrolamentos) se eu alterar o número total de graus em que a mola está torcida.
Como faço isso?
PS: Se o código puder ser simplificado (o que quase certamente pode), você será muito bem-vindo para melhorá-lo.:)
Responder1
\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
é necessário para a visualização 3D. A bobina é vista sob um ângulo de 45, que é o valor de coilaspect
, que é por padrão 45
. No entanto, suponho que você esteja procurando algo assim:
\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}
e como animação:
Responder2
pszigzag
fornecido por pst-coil
não parece ser confiável, então crio meu próprio zigue-zague da seguinte maneira.
Certifique-se \CoilWidth
de nunca ficar negativo em todos os quadros ao criar animações.
\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}