¿Cómo dibujar una curva suave cerrada a partir de una lista de nodos?

¿Cómo dibujar una curva suave cerrada a partir de una lista de nodos?

ingrese la descripción de la imagen aquí

Karles una lista de nodos generados aleatoriamente mediante \curvepnodesel uso de puntos paramétricos en RPN (no sé cómo usarlos randen expresiones algebraicas). El número de elementos de la lista es \Karlnodecount + 1o plotpoints.

En la documentación solo veo \psnlineconectar la lista con un segmento de línea recta entre dos nodos consecutivos. Para cerrar el camino, invoco \closepathel interior \pscustom.

  • Desafortunadamente, el segmento de línea de cierre no parece fluido.
  • En lugar de utilizar un segmento de línea recta, quiero utilizar uno curvo. Usar \psparametricplot[plotstyle=curve]ayuda un poco, pero el segmento final sigue siendo problemático.

ingrese la descripción de la imagen aquí

\documentclass[pstricks]{standalone}
\usepackage{pst-plot,pst-node}
\psset
{
    fillstyle=solid,
    fillcolor=gray,
    linearc=2pt,
}
\begin{document}
\begin{pspicture}(-3,-3)(3,3)
\curvepnodes[plotpoints=40]{0}{360}{/R rand 1001 mod 1000 div 1.5 add def R t cos mul  R t sin mul}{Karl}
\pscustom
{
    \psnline(0,\Karlnodecount){Karl}
    \closepath
}
\end{pspicture}
\end{document}

También intenté usar \multidoy \curvetopero \curvetonecesito 3 puntos por invocación (dos de ellos son puntos de control de una curva Bézier).

¿Cómo dibujar una curva suave cerrada a partir de una lista de nodos?

Respuesta1

\documentclass{article}
\usepackage{pst-node,multido}
\SpecialCoor
\pstVerb{1234 srand} 
\def\PlotImage#1{% #1: no of points
  \pstVerb{ /Step 360 #1 div def } \def\randompath{}
  \multido{\i=0+1}{#1}{%
    \xdef\randompath{\randompath(! Rand 2 mul 1 sub 2.5 add \i\space Step mul PtoC  )}}%
  \begin{pspicture}[showgrid=false](-3,-3)(3,3)
    \psset{fillstyle=solid,fillcolor=black!20}
    \expandafter\psccurve\randompath
    \psset{linecolor=red,opacity=0.4,fillcolor=blue!40}
    \expandafter\psccurve\randompath
  \end{pspicture}}

\begin{document}

\PlotImage{36}  \PlotImage{142}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Lo siento, no conozco PSTricks, pero a modo de comparación, este es el equivalente Metapost de la solución TikZ de Jake:

ingrese la descripción de la imagen aquí

\starttext

\startMPpage[offset=3mm]

  path p;
  p := for i = 0 step 10 until 350 : (1 randomized 1)*dir(i) .. endfor cycle;
  draw p scaled 1cm;

\stopMPpage


\stoptext

Respuesta3

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{hobby}
\begin{document}
\pgfmathsetseed{2}
\edef\randompath{}
\foreach \theta in {0,10,...,350} {
    \pgfmathsetmacro\r{rnd+1}
    \xdef\randompath{\randompath (\theta:\r) ..}
}
\begin{tikzpicture}[use Hobby shortcut]
\expandafter\draw\randompath cycle;
\end{tikzpicture}
\end{document}

Respuesta4

La solución a prueba de balas.

\documentclass[pstricks]{standalone}

\usepackage{pst-node,pst-plot}
\psset{fillstyle=solid,fillcolor=gray}

\def\points{}
\pstVerb{realtime srand}
\def\N{25}

\begin{document}
\begin{pspicture}(-3,-3)(3,3)
\curvepnodes[plotpoints=\N]{0}{360}{rand 16 mod 15 div 1.5 add t PtoC}{P}
\multido{\i=0+1}{\Pnodecount}{\xdef\points{\points (P\i)}}
\expandafter\psccurve\points
\end{pspicture}
\end{document}

información relacionada