Votre travail consiste à générer une carte de hauteur et à l'afficher sous la forme d'un paysage de voxels projeté en parallèle. Les règles sont les suivantes:
- La (hauteur du paysage) doit être générée aléatoirement
- Vous devez également décrire fonctionnement de l'algorithme que vous utilisez, afin que chacun puisse apprendre quelque chose de nouveau ici
- Vous devez également générer une image ou afficher le paysage généré à l'écran
- L'image résultante doit être projetée parallèlement (donc pas en perspective), et elle ne peut contenir que des voxels (elle doit donc être faite de petites boîtes)
- Il s'agit d'un concours de popularité, vous pouvez donc ajouter des fonctionnalités supplémentaires à votre programme pour obtenir plus de votes positifs.
- Le gagnant est la réponse valide la plus votée 7 jours après la dernière soumission valide. Toutes les soumissions valides doivent suivre les règles, y compris la description de l'algorithme utilisé. Vous pouvez ajouter des fonctionnalités supplémentaires qui ne respectent pas certaines des règles (comme l'ajout d'un mode perspective), mais dans ce cas, elles doivent être des fonctionnalités facultatives (par exemple, lorsque vous les désactivez, le résultat doit suivre toutes les règles)
- Ma soumission ne compte pas comme valide.
Un exemple d'image de résultat est le suivant:
Réponses:
Traceur de fonctions 3D Python2, édition Voxel
Voici mon entrée dans ce concours:
Comme indiqué clairement dans le titre, il fonctionne comme un traceur de fonctions 3D, mais comme cette compétition nécessite que le terrain soit généré de manière aléatoire, cette fonction sinusoïdale aléatoire
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
dépend de 4 variables aléatoires. Cela crée des terrains comme celui-ci:On peut bien sûr remplacer cette fonction aléatoire par n'importe quelle fonction à 2 variables, par exemple
sin(sqrt((x/2)²+(y/2)²))*3
donne ce terrain:et
-x*y*e^(-x^2-y^2)
donne ceci:(les tracés à droite sont calculés par wolfram alpha)
Et pendant que nous y sommes, Riemann zeta le long de la bande critique:
Pour les personnes qui ne la connaissent pas, comme vous pouvez le voir, ces bassins d'eau (qui représentent les zéro de la fonction) se trouvent tous sur une ligne droite (partie réelle = 0,5). Si vous pouvez le prouver, vous obtiendrez 1000000 $! Voir ce lien.
J'espère que tu aimes!
la source
C #, WPF
J'ai expérimenté une marche aléatoire , qui fonctionne mieux que je ne l'avais prévu. Je commence quelque part sur la carte, marche jusqu'à une tuile adjacente aléatoire et augmente sa valeur de hauteur , puis passe à la suivante et ainsi de suite. Ceci est répété des milliers de fois et conduit finalement à une carte de hauteur comme celle-ci (100 x 100):
Ensuite, je «discrétise» la carte, réduit le nombre de valeurs aux niveaux de hauteur donnés et attribue le terrain / la couleur en fonction de cette hauteur:
Plus de terrains similaires à des archipels:
Augmentation du nombre d'étapes aléatoires et de niveaux de hauteur pour obtenir un terrain plus montagneux:
Code
Caractéristiques: Recréez le terrain avec un bouton. Afficher le terrain 3D et la carte 2D. Zoom (molette de la souris) et défilement 3D (touches fléchées). Mais ce n'est pas très performant - après tout, cela est écrit uniquement en WPF, pas DirectX ou OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
la source
JavaScript et Crafty.JS, à améliorer considérablement
Voici un exemple de sortie:
Et voici le code (page Web complète):
Voici
sprite.png
:Maintenant, j'ai quelques choses à dire.
Ne me jugez pas pour ce terrible code! : PI l'a écrit il y a de nombreuses années quand j'étais une terrible programmation. En fait, c'est de l'ancien temps du site que j'avais que je ne me souvenais même pas! http://oddllama.cu.cc/terrain/
J'ai en quelque sorte copié beaucoup de code de la démo isométrique Crafty.JS . : P
L'explication viendra bientôt! Je dois dormir maintenant car il est tard ici. (C'est aussi pourquoi le sprite est si terrible!)
Fondamentalement, c'est vraiment non poli et il sera considérablement amélioré plus tard!
Il utilise le même algorithme de diamant carré mentionné dans la réponse du PO.
la source
Ruby + RMagick
J'utilise l' algorithme Diamond-Square pour générer la carte de hauteur.
L'algorithme en bref:
[0,0] == [4,0] == [0,4] == [4,4]
. Aussi[-2,0] == [2,0]
, etc.[0,0]
sur une couleur aléatoire[0,0] == [4,0] == [0,4] == [4,4]
)Comme cela se traduira par une image grise ennuyeuse, vous devez ajouter un nombre aléatoire à cette valeur à chaque étape. Il est préférable que cette valeur aléatoire couvre toute la plage à la première itération, mais diminue au fil du temps lorsque vous vous adressez à des sous-ensembles de plus en plus petits du tableau. Moins ce caractère aléatoire diminue avec le temps, plus l'image sera bruyante.
Après avoir terminé, j'attribue simplement une couleur à chaque valeur de hauteur.
Code:
generate.rb
Gemfile
Remarque: l'Imagemagick que j'utilise est de 16 bits
Image de résultat:
Remarque: cette image est une représentation isométrique de haut en bas, où la taille d'un voxel est exactement d'un pixel, donc elle est valide selon les règles (sauf une: que ma réponse n'est pas considérée comme valide)
la source
Java (en utilisant l'image couleur de @ fejesjoco comme algorithme de base)
Après avoir joué un peu avec les images couleur FullRGB de @fejesjoco, j'ai remarqué qu'elles pouvaient être utilisées comme base pour d'intéressants paysages de voxels falaises. Au lieu de réimplémenter l'algorithme, j'ai utilisé son code comme un exécutable externe (téléchargez-le depuis http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ et placez-le nommé artgen. exe dans le même répertoire)
Aperçu:
carte de hauteur utilisée (stockée dans le canal bleu)
Image d'entrée:
Le sous-algorithme que j'utilise fonctionne de cette manière:
1. Tri
2. Commencez avec un pixel noir au centre
3. Jusqu'à ce que toutes les couleurs soient utilisées: placez la couleur actuelle au point de montage le plus proche et ajoutez les voisins inutilisés comme nouveaux points utilisables Quand il a fini, je le modifie pour le réduire à 256 valeurs différentes
red&(green|blue)
4. puis j'utilise des sprites prégénérés et génère l'image couche par couchela source
HTML + JavaScript
Voici ma tentative de compétition:
J'utilise l' algorithme Euclidean F1 Cell Noise pour générer une carte de hauteur que je transforme ensuite en une image en prenant la couleur appropriée dans un tableau et en dessinant un carré à 10x, 10y-hauteur pour que des pixels plus élevés soient élevés. Je dessine ensuite un rectangle comme côté en utilisant la même couleur à partir d'un tableau différent.
Voici le même code utilisant un algorithme de marche aléatoire de 10 000 étapes:
! [Random Walk 2] [4]
Quand il «marche» d'un bord, il s'enroule sur l'autre, donc il a toujours l'air bien carrelé.
Il est toujours techniquement parallèle, juste sous un angle différent.
la source