Das Chaos-Spiel ist eine einfache Methode, um Fraktale zu generieren. Führen Sie unter der Annahme eines Startpunkts, eines Längenverhältnisses r und einer Menge von 2D-Punkten wiederholt Folgendes aus:
- Wählen Sie aus Ihrem Punktesatz einen Punkt nach dem Zufallsprinzip (einheitlich) aus.
- Dieser Punkt und der zuletzt gezogene Punkt (oder der Startpunkt) werden gemittelt, wobei r und 1 - r als Gewicht verwendet werden (dh r = 0 bedeutet, dass Sie den Startpunkt erhalten, r = 1 bedeutet, dass Sie den Zufallspunkt erhalten, und r = 0,5 bedeutet, dass Sie den Punkt auf halbem Weg dazwischen bekommen.)
- Zeichnen Sie den resultierenden Punkt.
Wenn Sie beispielsweise die Eckpunkte eines gleichseitigen Dreiecks und r = 0,5 auswählen, werden die eingezeichneten Punkte ein Sierpinski-Dreieck darstellen:
Sie müssen ein Programm oder eine Funktion schreiben, die das Chaos-Spiel "spielt", um ein Fraktal zu erstellen.
Eingang
Sie können entweder ein Programm oder eine Funktion schreiben und folgende Eingaben über ARGV, STDIN oder Funktionsargument vornehmen:
- Die Anzahl der zu zeichnenden Punkte.
- Die Startkoordinate (die auch eingetragen werden muss!).
- Das Durchschnittsgewicht r im Intervall [0,1] .
- Eine Liste mit Punkten zur Auswahl.
Ausgabe
Sie können auf dem Bildschirm rendern oder eine Bilddatei schreiben. Wenn das Ergebnis gerastert wird, muss es auf jeder Seite mindestens 600 Pixel betragen, alle Punkte müssen sich auf der Leinwand befinden und mindestens 75% der horizontalen und vertikalen Ausdehnung des Bildes müssen für Punkte verwendet werden (dies ist zu vermeiden) Antworten mit einem einzelnen schwarzen Pixel, das sagt "es ist wirklich weit herausgezoomt"). Die x- und y- Achse müssen auf derselben Skala liegen (dh die Linie von (0,0) bis (1,1) muss einen Winkel von 45 Grad haben), und jeder im Chaosspiel geplottete Punkt muss als einzelner Punkt dargestellt werden Pixel (wenn Ihre Plotmethode den Punkt als Anti-Aliase darstellt, kann er über 2x2 Pixel verteilt sein).
Sie haben die Wahl zwischen Farben, aber Sie benötigen mindestens zwei unterscheidbare Farben: eine für den Hintergrund und eine für die Punkte, die während des Chaos-Spiels gezeichnet werden. Möglicherweise müssen Sie die Eingabepunkte zeichnen, aber nicht.
Bitte fügen Sie Ihrer Antwort drei interessante Beispielausgaben bei.
Wertung
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Bearbeiten: Sie müssen die Eingabepunkte nicht mehr zeichnen, da sie ohnehin nicht wirklich als einzelne Pixel sichtbar sind.
quelle
Antworten:
Mathematica, 89
Wie es funktioniert
In Mathematica
Graphics[]
erzeugt die Funktion skalierbare Grafiken. Sie rendern sie auf die gewünschte Größe, indem Sie einfach die Bildecken ziehen. Tatsächlich handelt es sich bei der Anfangsgröße aller angezeigten Grafiken um eine ".ini" -Einstellung, die Sie auf 600 oder einen anderen gewünschten Wert festlegen können. Für die 600x600-Anforderung müssen also keine besonderen Maßnahmen ergriffen werden.Das
AbsolutePointSize[]
Ding legt fest, dass die Punktgröße durch Vergrößern der Bildgröße nicht verändert wird.Das Kernkonstrukt ist
oder in nicht-golfed Pseudo-Code:
Es wird rekursiv eine Liste erstellt
(start point)
, die mit der (vektoriellen) Funktion im ersten Argument beginnt und auf jeden nachfolgenden Punkt angewendet wird, wobei schließlich die Liste aller berechneten Punkte zurückgegeben wird, die geplottet werden sollenPoint[]
Beispiele für die Selbstreplikation:
quelle
Instructions for testing this answer without Mathematica installed:
1) Laden Sie dies aus dem Pastebin herunter und speichern Sie es als * .CDF. 2) Laden Sie die kostenlose CDF-Umgebung von Wolfram Research unter (keine kleine Datei) herunter und installieren Sie sie . Genießen. Sag mir, ob es funktioniert!#r
zur#
ohne Leerzeichen wegzukommen oder*
dazwischen.#
und getauschtr
.#key
. Ich bin sicher, das wird nützlich sein. :)Java: 246
253447Als eine Funktion
m()
:Zeilenumbrüche (innerhalb eines Programms, um die Verwendung anzuzeigen):
Das Zeichnen von Eingabepunkten wurde aus den Anforderungen entfernt (yay 80 Bytes!). Sie werden immer noch in den alten Screenshots unten gezeigt, aber nicht angezeigt, wenn Sie es ausführen. Bei Interesse den Versionsverlauf einsehen.
Die Eingaben werden als Array von Floats angegeben. Das erste sind Iterationen, die nächsten beiden beginnen
x y
. Viertens istr
und zuletzt kommt die Liste der Koordinaten inx1 y1 x2 y2 ...
Mode.Ninja Stern
Kreuz
Oktoketten
quelle
show
sind veraltetshow()
ist veraltet, aber es funktioniert immer noch. Wenn Sie sagen "funktioniert nicht", was bedeutet das? Wenn Sie nicht über Java 8 verfügen, müssen Sie mindestens einfinal
toString[]a
in main hinzufügen .JavaScript (E6) + Html 173
176 193Edit: Big Cut, danke an William Barbosa
Edit: 3 Bytes weniger dank DocMax
173 Bytes, die die Funktion und das Canvas-Element zählen, die zur Anzeige der Ausgabe erforderlich sind.
Testen Sie das Speichern als HTML-Datei und öffnen Sie es in FireFox.
JSFiddle
quelle
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>
ist 176 Bytes lang, ich habe Ihre Zählung nicht verstandenfor
for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Python -
200189Übernimmt Eingaben als Funktionsargumente in ein, schreibt das Ergebnis als pgm-Datei in stdout.
n
ist Iterationen,s
ist Startpunkt,r
ist r undz
ist eine Liste von Eingabepunkten.Bearbeiten: Zeichnet keine Eingabepunkte mehr in Grau.
Interessante Ergebnisse:
quelle
p=[255]*360000
können als optionale Parameter für die Funktion verwendet werden. Der Rumpf einer for-Schleife kann sich alle in derselben Zeile befinden, wenn er keinen Kontrollfluss hat. Sie können Parens rasieren von[1]*(n+1)
als[1]*-~n
; da Siei
in der äußeren for-Schleife nicht verwenden , ist es kürzer, den Coden
wie folgt auszuführen:)exec"code;"*n
; Ich denke, die Elternfor i in(0,1)
können entfernt werden.SuperCollider - 106
SuperCollider ist eine Sprache zum Erzeugen von Musik, kann aber zur Not Grafiken erstellen.
Ich habe einige obskure Syntaxverknüpfungen verwendet, um ein paar Bytes zu sparen - eine lesbarere und speichereffizientere Version
bei 109 Zeichen.
Wie im Mathematica-Beispiel müssen Sie die Größe des Fensters manuell ändern, um 600 x 600 Pixel zu erhalten. Sie müssen warten, bis es erneut gezeichnet wird, wenn Sie dies tun.
Dies erzeugt ein einfaches Sierpinsky-Dreieck (wird nicht angezeigt, weil Sie es schon einmal gesehen haben)
Dadurch entsteht eine Art Sierpinsky-Pentagon:
Das gleiche mit 6 Punkten hinterlässt eine umgekehrte Kochschneeflocke in der Mitte:
Zum Schluss noch ein Riff über die 3D-Pyramiden aus Aces Antwort. (Beachten Sie, dass ich einen der Punkte zweimal verwendet habe, um den Schattierungseffekt zu erzielen.)
quelle
Python,
189183175Bearbeiten: Das inverse R- Verhältnis wurde korrigiert und auf Schwarzweiß-Bild umgeschaltet, um ein paar Bytes zu sparen.
Nimmt die Anzahl der Punkte als
n
, den ersten Punkt alsp
, das Verhältnis alsr
und die Liste der Punkte alsl
. Benötigt das Modul Kissen.Beispiele:
Ich generiere Punkte im Kreis um die Bildmitte
XOXO-Wiederholungen, einfach das Verhältnis von 0,4 auf 0,6 ändern
Eine Art Schneeflocke
quelle
n,p,r,l=input()
. Sie können die Klammern auch aus den*=
Operationen entfernen und verwendenimport random as R
.*=
:( ungültig . Dasinput
Ding wäre gut, wäre sehr unangenehm, damit zu arbeiten, und der Import ist derzeit die prägnanteste Form, die möglich ist (oder habe ich etwas verpasst?).import random as R,PIL.Image as I
und dann seinrandom.choice
kannR.choice
. Ja, die Verwendung von Eingaben ist lahm, aber Sie können die Funktionsversion zum Testen verwenden und die Version veröffentlichen,input()
um eine bessere Punktzahl zu erzielen !! 1! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Ich freue mich über Feedback zu meinem Skript und zum Golfen, da ich mit JS nicht vertraut bin.
Lesen Eingang (Um vergleichbar edc65 den Einstieg Ich zähle nicht die Eingabe.):
Canvas Setup & Berechnung
Etwas ungolfed (einschließlich einer Beispieleingabe, bei der die tatsächlichen Eingabeaufforderungen nur auskommentiert sind, also einsatzbereit):
Beispiele
quelle
Processing, 153
Portierte die Java-Antwort von @Geobits auf Processing und spielte etwas mehr Golf, was zu einer Reduzierung von 100 Zeichen führte. Eigentlich wollte ich den Prozess animieren, aber die Eingabebeschränkungen sind zu streng (Processing hat weder stdin noch argv, was bedeutet, dass ich meine eigene Funktion schreiben muss, anstatt die native
draw()
Schleife von Processing zu verwenden ).Komplettes Programm mit Zeilenumbrüchen:
Das obige Programm gibt Kreuze:
Dies gibt Pyramiden:
Dies ergibt das Sierpinski-Dreieck:
quelle
Ungolfed "Referenzimplementierung", Python
Update : viel, viel schneller (um Größenordnungen)
Schauen Sie sich die interaktive Shell an!
Bearbeiten Sie die Datei und setzen Sie sie
interactive
aufTrue
. Führen Sie dann einen der folgenden Schritte aus:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
generiert, speichert und zeigt ein Polygon an.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
tut was die Spezifikation verlangt.quelle
Python (202 Zeichen)
Nimmt die Anzahl der Punkte als
n
, das Durchschnittsgewicht alsr
, den Startpunkt alstuple
s
und die Liste der Punkte als Liste dertuple
aufgerufenen XYsl
.quelle