Aller au contenu

Automate cellulaire BlocsGénérateur de flocons de neige CAO

Envoyer à un Conseiller

Description du modèle 3D

Il s'agit d'un générateur de flocons de neige d'automate cellulaire randomisable et personnalisable dans BlocksCAD. Il existe en deux versions, une version à 20 niveaux (rayon de panneau jusqu'à 20) et une version à 40 niveaux. La version de 40 niveaux est à peine dans les limites des capacités de BlocksCAD : BlocksCAD devient lent mais fonctionne toujours (je recommande d'utiliser Firefox au lieu de Chrome pour une bien meilleure réactivité).

L'automate dépose un hexagone vivant (coloré) au milieu du plateau, puis suit les règles d'évolution (comme dans le[Jeu de la vie] de Conway (https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life)). La règle par défaut (captures d'écran bleu foncé) estStephen Wolfram's : une cellule vivante survit éternellement, et une nouvelle cellule génère quand elle a exactement un voisin vivant.

Vous pouvez faire varier l'ensemble de règles en faisant varier l'effet des différents nombres de voisins vivants (0-6) sur la survie ou la génération. Vous pouvez également définir des règles indéterminées, où il y a des probabilités entre 0 et 1 de survie ou de génération dans les différents cas de comptage de voisins. Dans les cas indéterministes, la symétrie des flocons de neige (six fois la rotation, plus la réflexion) est toujours appliquée par le code.

Les images en bleu clair ont été faites avec un ensemble de règles indéterminées où le seul changement apporté était de régler la probabilité de génération lorsqu'il y a un voisin à 0,5, donc les paramètres de génération étaient 0,0,5,0,0,0,0,0,0,0,0,0. Ces images ressemblent plus à des flocons de neige pour moi. Un autre ensemble intéressant de paramètres de génération est 0,0,5,0,0,0,1,0,0,0,1 (0,5 chance de génération avec un voisin ; 0,1 chance avec 3 voisins, certitude avec 6 voisins).

Vous pouvez poster dans les commentaires quels sont les ensembles de règles intéressants. La règle par défaut et sa variante probabiliste ci-dessus sont tout à fait imprimables. Les règles où toutes les probabilités de survie sont de 1 se traduiront par des flocons de neige complètement connectés. Si certaines probabilités de survie sont inférieures à 1, il peut y avoir des valeurs aberrantes.

Le Customizer basé sur OpenSCAD a été généré en exportant le code OpenSCAD de BlocksCAD et en déplaçant les définitions de variables vers le haut du fichier pour assurer la compatibilité du Customizer.

Si vous activez l'ombrage des couleurs (en ayant des réglages de couleur1 et de couleur2 différents), l'ombrage des couleurs passe par l'étape pendant laquelle une cellule a été générée. Vous pouvez également activer le banderolage périodique pour un effet de couleur spécial.

Il était difficile d'implémenter un automate cellulaire dans BlocksCAD car BlocksCAD ne supporte pas les tableaux et, pour plus de complications, est un langage fonctionnel.

Pour accélérer le code, l'automate cellulaire n'est implémenté que sur un segment 1/12 de la carte, le reste étant reconstruit par symétrie.

Le coeur du code est un module récursif géant evolve' qui (dans la version radius 40) prend 421 arguments. Le premier argument compte les itérations. Les 420 arguments restants stockent chacun une cellule de données. Si le nombre d'itérations atteint 0, alorsevolve' appelle draw(i,j,v) pour chaque cellule. Il doit le faire par une union d'invocation 420, puisqu'il n'y a pas de tableaux et donc aucun moyen d'itération sur les arguments. La fonction draw(i,j,v)' dessine l'hex siv' est différent de zéro, ainsi que les 11 autres hexs qui lui sont liés par les symétries des flocons de neige.

Ensuite, le module evolve' s'appelle récursivement avec le nombre d'itérations décrémenté, et chaque argument de cellule évolue. L'évolution des arguments de la cellule se fait en additionnant le nombre de voisins pour chaque argument et en vérifiant si la cellule doit être vivante. Il y a un appel codé en dur à une fonction d'évolutioncellulaire' pour chacun des 420 arguments.

Il y a aussi un module go' qui appelleevolve' avec ses arguments initiaux 421 (version radius 40) : un comptage des itérations, suivi d'un 1 central, suivi des zéros. Enfin, le code extrude linéairement la sortie du module " go " pour le rendre 3D.

À ce stade, vous pourriez penser que je suis fou de glisser-déposer du code d'évolution pour chacune des 420 cellules de evolve'. Eh bien, je ne l'ai pas fait. J'ai écrit un script python rapide et sale (inclus commeblockscad.py' et cell6.py' : ce dernier est le script principal) qui peut générer un sous-ensemble de code xml BlocksCAD, et l'utilise pour générer automatiquement le module géantevolve' qui appelle cell' pour chaque cellule, et le grand modulego'.

Le reste du code a été saisi manuellement dans BlocksCAD : le module go', du code de niveau supérieur, la fonctioncell' evolution, et le module `draw'.

Assembler tout le code dans BlocksCAD a été un peu de travail. La plus grande partie du code saisi manuellement a été sauvegardée en xml en tant que sauvegarde (inclus en tant que "code main"). Puis j'ai importé le fichier xml généré par python dans BlocksCAD. Puis j'ai ajouté l'enveloppe d'extrusion autour du module " go ". (Ou du moins c'est comme ça que je l'ai fait quand j'ai finalement trouvé comment le faire fonctionner.) J'ai ensuite fait quelques optimisations.

https://youtu.be/sJjrz4mL5aA

  • Format du fichier 3D : STL

Mots-clefs

Créateur

License

CC BY

Page traduite par traduction automatique. Voir la version originale.

Contenus correspondants


Ajouter un commentaire