Seite 1 von 1

[pstricks] psRandom - Abstand zum clipping Objekt

Verfasst: Di 13. Dez 2016, 17:22
von mushroom20
Hallo,

ich möchte ein bestimmte Anzahl von Punkten bzw. Kreisen in einer Ellipse zufällig angeordnet haben. Dazu habe ich einen Blick auf den Befehl \psRandom aus dem Paket pstricks-add geworfen mit folgendem Ergebnis
\documentclass[a4paper]{scrbook}

\usepackage[ngerman]{babel}
\usepackage{pstricks-add}

\begin{document}
	\begin{pspicture}(4,4)
		\definecolor{orange}{cmyk}{0,0.61,0.87,0.001}
		\psgrid[gridcolor=orange, gridwidth=0.5pt,subgridwidth=0.1pt, subgridcolor=orange,subgriddiv=10]
		\psRandom[dotsize=0.5mm, randomPoints=500](1.9,1)(2.9,2){%
		\psellipse[linestyle=none](2.5,1.5)(0.5,0.3)}
	\end{pspicture}
\end{document}
Dabei stört mich, daß einige Punkt am Rand des Clipping-Objekts durch dieses abgeschnitten werden, da \psRandom die Punkte ja zufällig in einem rechteckigen Objekt verteilt. Gibt es eine Möglichkeit einen gewissen Abstand zum Rand des Clipping-Objektes zu definieren, so daß alle Punkte vollständig und nicht abgeschnitten gezeichnet werden?

Grüße
Markus

Ich habe das Problem auch in http://latex-community.org/forum/viewto ... 45&t=28819 in Englisch gestellt.

Verfasst: So 18. Dez 2016, 08:17
von Stefan Kottwitz
Hallo Markus,

willkommen im Forum!

Exzellentes Minimalbeispiel, und cross-post zur Info verlinkt, sehr gut! So will ich auch antworten, obwohl ich mich mit PSTricks nicht so sehr auskenne, eher TikZ bevorzuge. Daher auch mal eine TikZ-Lösung, mit pgfplots, die sich aber auch mit PSTricks verwenden lässt, da das auch plotten kann. Hier geht es mir auch nur um das Grundprinzip.

Statt purem Zufall, wo es dicke Häufungen und große Lücken geben kann, könnte man auch in x-Richtung gleich verteilt vorgehen und in y-Richtung zufällig variieren. Und zwar so, dass es innerhalb der Ellipse bleibt, also etwa die Ellipsen-Funktion mit einem Random-Wert zwischen -1 und 1 multiplizieren. Und ein bisschen was abziehen, damit es nicht auf dem Rand landet.
\documentclass[tikz, border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\pgfmathsetseed{5}
\begin{document}
\begin{tikzpicture}
  \begin{axis} [
      hide axis,
      axis equal
    ]
    \addplot [only marks, samples=120, domain=-3.9:3.9]
      ({ x },{rand * (sqrt( 2^2 * (1 - \x^2/(4^2) ) - 0.4)} );
    \draw (0,0) ellipse [x radius=4, y radius=2];
  \end{axis}
\end{tikzpicture}
\end{document}
Bild

Natürlich kann man auf die gleiche Weise einfach in einer Schleife auch den x-Wert zufällig berechnen. Kann ich bei Interesse gern zeigen.

Stefan

Verfasst: Mo 19. Dez 2016, 13:17
von mushroom20
Hallo Stefan,

vielen Dank für die Anregung mit der Ellipsengleichung. Ich habe es mal versucht auf mein Problem in pstricks umzusetzen:
\documentclass[a4paper]{scrbook}

\usepackage[ngerman]{babel}
\usepackage{pstricks-add}

\begin{document}
	\begin{pspicture}(4,4)
		\definecolor{orange}{cmyk}{0,0.61,0.87,0.001}
		\psgrid[gridcolor=orange, gridwidth=0.5pt,subgridwidth=0.1pt, subgridcolor=orange,subgriddiv=10]
		%\psRandom[dotsize=0.5mm, randomPoints=500](1.9,1)(2.9,2){%
		%\psellipse[linestyle=dotted](2.5,1.5)(0.5,0.3)}
		\rput(2.5,1.5){
			%Ellipsengleichung: y^2 = b^2(1-x^2/a^2) -> y^2 = 0.3^2(1-x^2/0.5^2)
			\psplot[plotstyle=dots, plotpoints=10]{-0.5}{0.5}{1 x 2 exp 0.5 2 exp div sub 0.3 2 exp mul sqrt}
			\psplot[plotstyle=dots, plotpoints=10, linecolor=blue, dotstyle=triangle]{-0.5}{0.5}{1 x 2 exp 0.5 2 exp div sub 0.3 2 exp mul sqrt rand mul}
			\psellipse(0,0)(0.5,0.3)
		}
	\end{pspicture}
\end{document}
Ich schaffe es aber nicht, ein äquivalentes Ergebnis zu erhalten. Folgende Parameter habe ich geändert:
a = 0.5 (alt: 4)
b = 0.3 (alt: 2)
Die Subtraktion von 0.4 weggelassen.

Die scharzen Punkte liegen (klarerweise) auf der Ellipse. Irgendwie scheint mir rand Funktion zum Vergleich (blau Punkte) hier nicht richtig umgesetzt zu sein. Verstehe nicht, wo hier das Problem ist.[/code]

Verfasst: Do 19. Jan 2017, 18:02
von CrazyHorse
\documentclass[pstricks]{standalone}
    \usepackage{pst-plot}
\begin{document}
     
    \begin{pspicture}[showgrid](-4.3,-2.3)(4,2.2)
    \psplot[plotstyle=dots,algebraic,plotpoints=200]{-3.9}{3.9}{Rand*(sqrt(4-x^2/4)-0.1)}
    \psplot[plotstyle=dots,algebraic,plotpoints=200]{-3.9}{3.9}{Rand*(-sqrt(4-x^2/4)+0.1)}
    \psellipse(0,0)(4,2)
    \end{pspicture}
\end{document}
Bild

Verfasst: Fr 20. Jan 2017, 16:53
von mushroom20
Vielen Dank CrazyHorse,

hatte mich eine Weile nicht um das Problem weiter gekümmert, da ich mit anderen Dingen voll ausgelastet bin. Dank deines Beitrages jetzt nochmal in Angriff genommen und adaptiert, funktioniert einwandfrei.