Je cherche à dessiner des formes irrégulières sur une grille x, y, et j'aimerais proposer une méthode simple et rapide si possible. Jusqu'à présent, ma seule idée est de dessiner un tas de cercles de tailles aléatoires très proches les uns des autres, mais à une distance aléatoire en dehors d'une coordonnée plus ou moins centrale, puis de remplir les espaces vides. Je me rends compte que c'est une méthode maladroite et inélégante, j'espère qu'elle vous donnera une idée approximative des types de formes arrondies et aléatoires tachées pour lesquelles je vis. Veuillez suggérer des méthodes pour y parvenir, je ne suis pas tellement intéressé par le code. Je peux nouiller cette partie moi-même. Merci!
2d
algorithm
random
procedural
Yttermayn
la source
la source
Réponses:
Vous pouvez choisir certains points, choisir un vecteur à chaque point et dessiner une spline à travers eux. Voir cette page wikipedia pour une description simple d'une spline cubique (alias Irwin-Hall spline). Cela fait un moment que je ne les ai pas utilisés, mais si je me souviens bien, c'est celui que j'ai trouvé le plus facile à comprendre et à utiliser. Si vous connaissez l'outil stylo de photoshop, cela fonctionne très similaire (je suis convaincu que photoshop utilise également des splines, mais je ne suis pas sûr qu'il s'agisse d'une spline cubique).
Si vous êtes intéressé, il existe de nombreuses autres splines: par exemple, les splines de Bézier et les splines B sont intéressantes.
Une autre chose qui me vient à l'esprit sont les level sets, bien que cela nécessiterait probablement un peu plus de recherche de votre part (pour trouver des fonctions qui répondent à vos besoins).
Les ensembles de niveaux sont des inégalités sous la forme
f (x, y) = c
où f est une fonction et c est une constante.
Ceci est une description très générale. Vous voudrez peut-être remplir une forme et dessiner tous les pixels où
f (x, y) <= c
avec une certaine couleur. Par exemple, pour une forme 2d parfaitement ronde, vous avez l'équation bien connue:
x ^ 2 + y ^ 2 <= r ^ 2
Vous pouvez mettre à l'échelle les composantes x et y pour obtenir un ellipsoïde Avec un peu d'expérimentation et de recherche, il sera possible de trouver des formes plus funk (je suppose).
Edit: un peu d' expérimentation sur wolframalpha.com m'a donné ce . (créé avec la commande 'plot abs ((x + sin (x) * y / 3) ^ 3) + y ^ 2 <= 7'). Je n'ai aucune idée si c'est quelque chose comme ce que vous voulez, mais c'est juste pour vous donner une idée.
la source
Une autre approche simple consiste à utiliser votre propre bruit basse fréquence pour dessiner (ou définir) un chiffre en coordonnées polaires.
Supposons que vous vouliez une goutte centrée à l'origine, de rayon moyen 1; cela peut facilement être mis à l'échelle et traduit en d'autres positions et tailles. Imaginez avec l'équation simple r = 1 - cela définirait un cercle de rayon un à l'origine. Pour y ajouter une petite variation, vous pouvez changer le rayon de manière sinusoïdale - ajoutez un terme de la forme w 1 * sin (θ + θ 1 ), où w 1 et θ 1 sont des constantes auxquelles je reviendrai dans un instant. Un terme de péché ne fera pas beaucoup de différence, mais ayant plusieurs différentes Sines de fréquences différentes va commencer à ajouter exactement le genre de variation « soft » Je suppose que vous êtes après. La forme globale serait dans le sens de r = 1 + w 1 * sin (θ + θ 1 ) + w2 * sin (2θ + θ 2 ) + w 3 * sin (3θ + θ 3 ) + w 4 * sin (4θ + θ 4 ) + w 5 * sin (5θ + θ 5 ) - ou plusieurs termes si vous le souhaitez, bien sûr.
Alors, comment choisissons-nous les valeurs de w i et θ i ? Eh bien, les θs devraient juste être choisis au hasard dans (0,2π) - en d'autres termes, chaque `` onde '' sur la forme de la surface devrait commencer à un point différent autour de la forme. En ce qui concerne les w, il existe plusieurs choix différents. Choisir w i au hasard parmi (0, w) (pour certains w fixes qui représentent la `` variation globale '' pour donner la forme; je pourrais commencer avec w = 0,25 mais expérimenter avec w = 0,1) pour chaque i conduira à ainsi- appelé bruit blanc , où toutes les fréquences ont le même poids - ce sera de loin le plus blobbiest, avec de grandes variations à toutes les fréquences. Choisir w i au hasard parmi (0, w * (1 / i)) - en d'autres termes,le bruit, où le poids s'éloigne, mais lentement. Ceci est également connu sous le nom de bruit 1 / f , et c'est le bruit «fractal» le plus célèbre. Enfin, le choix aléatoire des poids parmi (0, w * (1 / i ^ 2)) (en d'autres termes, en divisant chaque poids aléatoire par i ^ 2) donne un bruit brownien - c'est le `` plus doux '' des trois, avec le moins de variation par rapport à un cercle - ce sera généralement une forme ovale.
Voici des exemples des trois, en utilisant un «poids total» de w = 0,25, et en utilisant le même ensemble de valeurs aléatoires pour les w i et θ i tirées de random.org :
Blob "White Noise":
Blob "Pink Noise":
Blob "Brownian Noise":
Notez que ces blobs ne seront pas parfaits; en particulier, il leur est impossible de se recroqueviller sur eux-mêmes (car pour chaque θ - en d'autres termes, pour chaque angle par rapport à l'origine - il y a une seule valeur r), et si vous ne choisissez pas vos poids correctement, ils pourraient s'auto - intersection (si r est autorisé à devenir négatif). Mais ils font un travail décent de manière convaincante, et pour la plupart des applications de jeux, les utilisateurs ne remarqueront aucun problème.
la source
Mis à part les autres réponses, vous pouvez utiliser un bruit Perlin avec une atténuation ronde, si vous ajustez un peu les paramètres, vous pouvez facilement créer de belles formes variables.
Si vous voulez que votre code soit rapide, vous pouvez simplement utiliser une bibliothèque de génération de bruit comme libnoise (en supposant que vous utilisez c ++), qui est une bibliothèque de génération de bruit, qui rend les tâches similaires très simples, car elle vous fournit un nœud approche basée sur la génération procédurale basée sur le bruit. Il a également des liaisons avec d'autres langues.
la source