![PSTricks dibujando con variables no exactas](https://rvso.com/image/281484/PSTricks%20dibujando%20con%20variables%20no%20exactas.png)
Considere el siguiente ejemplo:
\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 puede verse, el peso no está conectado al mismo punto del resorte (módulo un número entero de vueltas) si cambio el número total de grados en que se tuerce el resorte.
¿Cómo logro esto?
PD: Si el código se puede simplificar (lo cual es casi seguro que se puede), puedes mejorarlo.:)
Respuesta1
\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
es necesario para la vista 3D. La bobina se ve bajo un ángulo de 45, que es el valor de coilaspect
, que es por defecto 45
. Sin embargo, supongo que estás buscando algo como esto:
\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}
y como animación:
Respuesta2
pszigzag
proporcionado por pst-coil
no parece ser confiable, así que creo mi propio zigzag de la siguiente manera.
Asegúrese de que \CoilWidth
nunca se vuelva negativo en todos los fotogramas al crear animaciones.
\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}