Wie zeichnet man aus einer Liste von Knoten eine geschlossene, glatte Kurve?

Wie zeichnet man aus einer Liste von Knoten eine geschlossene, glatte Kurve?

Bildbeschreibung hier eingeben

Karlist eine Liste zufällig generierter Knoten unter \curvepnodesVerwendung parametrischer Punkte in RPN (ich weiß nicht, wie man sie randin algebraischen Ausdrücken verwendet). Die Anzahl der Elemente der Liste ist \Karlnodecount + 1oder plotpoints.

In der Dokumentation sehe ich nur, \psnlinedass die Liste mit einem geraden Liniensegment zwischen zwei aufeinanderfolgenden Knoten verbunden werden soll. Um den Pfad zu schließen, rufe ich \closepathinside auf \pscustom.

  • Leider sieht das Schlussliniensegment nicht glatt aus.
  • Anstatt eines geraden Liniensegments möchte ich ein gekrümmtes verwenden. Die Verwendung \psparametricplot[plotstyle=curve]hilft ein wenig, aber das abschließende Segment ist immer noch problematisch.

Bildbeschreibung hier eingeben

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

Ich habe auch versucht, \multidound zu verwenden, \curvetoaber es \curvetowerden 3 Punkte pro Aufruf benötigt (zwei davon sind Kontrollpunkte einer Bézierkurve).

Wie zeichnet man aus einer Liste von Knoten eine geschlossene, glatte Kurve?

Antwort1

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

Bildbeschreibung hier eingeben

Antwort2

Entschuldigung, ich kenne PSTricks nicht, aber zum Vergleich ist dies das Metapost-Äquivalent zu Jakes TikZ-Lösung:

Bildbeschreibung hier eingeben

\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

Antwort3

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

Antwort4

Die bombensichere Lösung.

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

verwandte Informationen