Como desenhar uma curva suave fechada a partir de uma lista de nós?

Como desenhar uma curva suave fechada a partir de uma lista de nós?

insira a descrição da imagem aqui

Karlé uma lista de nós gerados aleatoriamente usando \curvepnodespontos paramétricos em RPN (não sei como usar randem expressão algébrica). O número de elementos da lista é \Karlnodecount + 1ou plotpoints.

Na documentação, vejo apenas \psnlinecomo conectar a lista com um segmento de linha reta entre dois nós consecutivos. Para fechar o caminho, invoco \closepathinside \pscustom.

  • Infelizmente, o segmento de linha de fechamento não parece suave.
  • Em vez de usar um segmento de linha reta, quero usar um segmento curvo. Usar \psparametricplot[plotstyle=curve]ajuda um pouco, mas o segmento de fechamento ainda é problemático.

insira a descrição da imagem aqui

\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}

Também tentei usar \multidoand \curvetomas \curvetoprecisa de 3 pontos por invocação (dois deles são pontos de controle de uma curva de Bézier).

Como desenhar uma curva suave fechada a partir de uma lista de nós?

Responder1

\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}

insira a descrição da imagem aqui

Responder2

Desculpe, não conheço o PSTricks, mas para comparação, este é o equivalente Metapost da solução TikZ de Jake:

insira a descrição da imagem aqui

\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

Responder3

\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}

Responder4

A solução à prova de bala.

\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}

informação relacionada