PSTricks dibujando con variables no exactas

PSTricks dibujando con variables no exactas

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}

producción

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}

ingrese la descripción de la imagen aquí

45 sines 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}

ingrese la descripción de la imagen aquí

y como animación:

ingrese la descripción de la imagen aquí

Respuesta2

pszigzagproporcionado por pst-coilno parece ser confiable, así que creo mi propio zigzag de la siguiente manera.

Asegúrese de que \CoilWidthnunca 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}

ingrese la descripción de la imagen aquí

información relacionada