Le Chaos Game est une méthode simple pour générer des fractales. Étant donné un point de départ, un rapport de longueur r et un ensemble de points 2D, procédez à plusieurs reprises comme suit:
- Dans votre ensemble de points, choisissez-en un au hasard (uniformément).
- Faites la moyenne de ce point et du dernier point tracé (ou du point de départ) en utilisant r et 1 - r comme poids (c.-à-d. R = 0 signifie que vous obtenez le point de départ, r = 1 signifie que vous obtenez le point aléatoire et r = 0,5 signifie que vous obtenir le point à mi-chemin entre les deux.)
- Dessinez le point résultant.
Par exemple, si vous avez choisi les sommets d'un triangle équilatéral et r = 0,5 , les points tracés traceraient un triangle de Sierpinski:
Vous devez écrire un programme ou une fonction qui "joue" le jeu du chaos pour créer une fractale.
Contribution
Vous pouvez écrire un programme ou une fonction et prendre les entrées suivantes via ARGV, STDIN ou l'argument de fonction:
- Le nombre de points à tracer.
- La coordonnée de départ (qui doit également être tracée!).
- Le poids moyen r dans l'intervalle [0,1] .
- Une liste de points à choisir.
Sortie
Vous pouvez effectuer un rendu à l'écran ou écrire un fichier image. Si le résultat est tramé, il doit être d'au moins 600 pixels de chaque côté, tous les points doivent être sur le canevas et au moins 75% de l'étendue horizontale et verticale de l'image doivent être utilisés pour les points (ceci afin d'éviter répond avec un seul pixel noir disant "c'est vraiment très loin"). Les axes x et y doivent être sur la même échelle (c'est-à-dire que la ligne de (0,0) à (1,1) doit être à un angle de 45 degrés) et chaque point tracé dans le jeu du chaos doit être représenté comme un seul pixel (si votre méthode de traçage anticrénelage le point, il peut être réparti sur 2x2 pixels).
Les couleurs sont votre choix, mais vous avez besoin d'au moins deux couleurs distinctes: une pour l'arrière-plan et une pour les points tracés pendant le jeu du chaos. Vous pouvez mais ne devez pas tracer les points d'entrée.
Veuillez inclure trois exemples de résultats intéressants dans votre réponse.
Notation
Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.
Modifier: vous n'avez plus besoin de tracer les points d'entrée, car ils ne sont de toute façon pas vraiment visibles en tant que pixels uniques.
la source
Réponses:
Mathematica, 89
Comment ça marche
Dans Mathematica, la
Graphics[]
fonction produit des graphiques évolutifs, vous la restituez à la taille souhaitée en faisant simplement glisser les coins de l'image. En fait, la taille initiale de tous les graphiques affichés est un paramètre ".ini" que vous pouvez définir à 600 ou à toute autre valeur que vous souhaitez. Il n'est donc pas nécessaire de faire quoi que ce soit de spécial pour l'exigence 600x600.La
AbsolutePointSize[]
chose spécifie que la taille du point ne sera pas modifiée en agrandissant la taille de l'image.La construction de base est
ou en pseudo-code non golfé:
Il construit récursivement une liste à partir de
(start point)
et applique la fonction (vectorielle) du premier argument à chaque point successif, pour finalement retourner la liste de tous les points calculés à tracer parPoint[]
Quelques exemples d'auto-réplication:
la source
Instructions for testing this answer without Mathematica installed:
1) Téléchargez -le à partir de pastebin et enregistrez-le sous * .CDF 2) Téléchargez et installez l' environnement CDF gratuit de Wolfram Research à (pas un petit fichier). Prendre plaisir. Dites-moi si ça marche!#r
der#
de sortir sans espace ou*
entre les deux.#
etr
.#key
. Je suis sûr que cela vous sera utile. :)Java: 246
253447En fonction
m()
:Sauts de ligne (dans un programme pour montrer l'utilisation):
Le dessin des points d'entrée a été supprimé des exigences (oui 80 octets!). Ils sont toujours affichés dans les anciennes captures d'écran ci-dessous, mais n'apparaîtront pas si vous l'exécutez. Voir l'historique des révisions si vous êtes intéressé.
Les entrées sont données sous forme de tableau de flottants. La première est des itérations, les deux suivantes commencent
x y
. La quatrième estr
, et enfin vient la liste des coordonnées, à lax1 y1 x2 y2 ...
mode.Étoile de ninja
Traverser
Octochains
la source
show
est obsolèteshow()
est obsolète, mais il fonctionne toujours. Lorsque vous dites "ne fonctionne pas", qu'est-ce que cela signifie? Si vous n'avez pas Java 8, vous devrez au moins ajouter unfinal
àString[]a
dans main.JavaScript (E6) + Html 173
176 193 193Edit: grosse coupe, grâce à William Barbosa
Edit: 3 octets de moins, grâce à DocMax
173 octets comptant la fonction et l'élément canvas nécessaires pour afficher la sortie.
Testez l' enregistrement en tant que fichier html et ouvrez-le dans FireFox.
JSFiddle
la source
<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>
est de 176 octets, je n'ai pas compris votre comptefor
appel:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Python -
200189Prend l'entrée comme arguments de fonction dans a, écrit le résultat dans stdout en tant que fichier pgm.
n
est des itérations,s
est le point de départ,r
est r etz
est la liste des points d'entrée.Modifier: ne dessine plus les points d'entrée en gris.
Sorties intéressantes:
la source
p=[255]*360000
peuvent aller comme paramètres optionnels à la fonction; le corps d'une boucle for peut tous aller sur la même ligne s'il n'a pas de flux de contrôle; vous pouvez raser les parens au[1]*(n+1)
fur et à mesure[1]*-~n
; puisque vous n'utilisez pasi
dans la boucle for externe, il est plus court d'exécuter le coden
commeexec"code;"*n
); Je pense que les parensfor i in(0,1)
peuvent être supprimés.SuperCollider - 106
SuperCollider est un langage pour générer de la musique, mais il peut faire des graphiques à la rigueur.
J'ai utilisé des raccourcis de syntaxe obscurs pour économiser quelques octets - une version plus lisible et plus efficace en mémoire est
à 109 caractères.
Comme avec l'exemple Mathematica, vous devez redimensionner manuellement la fenêtre pour obtenir 600x600 pixels. Vous devez attendre qu'il redessine lorsque vous faites cela.
Cela génère un triangle de Sierpinsky de base (non affiché car vous l'avez déjà vu)
Cela fait une sorte de chose de type pentagone Sierpinsky:
La même chose avec 6 points laisse un flocon de neige Koch inversé au milieu:
Enfin, voici un riff sur les pyramides 3D de la réponse d'Ace. (Notez que j'ai utilisé l'un des points deux fois, pour obtenir l'effet d'ombrage.)
la source
Python,
189183175Édition: correction du rapport r inversé et passage à l'image noir et blanc afin d'économiser quelques octets.
Prend le nombre de points comme
n
, le premier point commep
, le rapport commer
et la liste des points commel
. A besoin du module Oreiller.Exemples:
Je génère des points en cercle autour du centre de l'image
Répétitions XOXO, en changeant simplement le rapport de 0,4 à 0,6
Une sorte de flocon de neige
la source
n,p,r,l=input()
. Vous pouvez également supprimer les crochets des*=
opérations et de l'utilisationimport random as R
.*=
:(. Lainput
chose serait bien très désagréable à travailler, et l'importation est actuellement la forme la plus concise possible (ou ai-je oublié quelque chose?).import random as R,PIL.Image as I
etrandom.choice
peut l'êtreR.choice
. Oui, l'utilisation de l'entrée est boiteuse, mais vous pouvez utiliser la version de la fonction pour tester et publierinput()
celle pour un meilleur score !! 1! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Je suis heureux d'avoir des commentaires sur mon script et sur le golf car je ne suis pas à l'aise avec JS =) (N'hésitez pas à l'utiliser / à le modifier pour votre propre soumission!)
Lecture de l'entrée (pour être comparable à l' entrée de l' edc65 , je ne compte pas l'entrée.):
Configuration et calcul du canevas
Un peu plus non golfé (y compris un exemple d'entrée où les invites d'entrée réelles sont juste commentées, donc prêtes à l'emploi):
Exemples
la source
Traitement, 153
Porté la réponse Java de @Geobits au traitement et a fait un peu plus de golf, ce qui a entraîné une réduction de 100 caractères. J'avais initialement l'intention d'animer le processus, mais les contraintes d'entrée sont trop dures à ce sujet (Processing n'a pas stdin ou argv, ce qui signifie que je dois écrire ma propre fonction au lieu d'utiliser la
draw()
boucle native de Processing ).Programme complet avec sauts de ligne:
Le programme ci-dessus donne à Crosses:
Cela donne aux Pyramides:
Cela donne le triangle de Sierpinski:
la source
"Implémentation de référence" non golfée, Python
Mise à jour : beaucoup, beaucoup plus rapide (par ordre de grandeur)
Découvrez le shell interactif!
Modifiez le fichier et définissez-
interactive
leTrue
, puis effectuez l'une des opérations suivantes:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
génère, enregistre et affiche un polygone.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
fait ce que la spécification demande.la source
Python (202 caractères)
Prend le nombre de points comme
n
, le poids moyen commer
, le point de départ comme atuple
s
et la liste des points comme une liste de XYtuple
appelésl
.la source