Besoin d'idées pour un algorithme pour dessiner des formes irrégulières tachées

8

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!

Yttermayn
la source
2
Je vous aiderais si vous joigniez quelques exemples de telles formes, mais d'après ce que j'ai compris, l' algorithme Marching Squares pourrait être ce que vous recherchez.
Alexander Konstantinov
Par exemple, en toute gravité, pensez aux taches hépatiques: arrondies, aléatoires, mais généralement ovoïdes.
Yttermayn du
6
Cette publication sur mathématique.SE contient quelques exemples qui pourraient vous intéresser: mathématique.stackexchange.com/ questions/3345/… La meilleure réponse fait essentiellement ce que vous faites. un autre trouve la coque convexe de points aléatoires et interpole ensuite une spline à travers, mais cela semble un peu compliqué ...
Jemmy
Merci pour vos réponses! Malheureusement, je pense que je pourrais être un peu au-dessus de ma tête. Je vais peut-être devoir trouver autre chose.
Yttermayn
4
Que diriez-vous de commencer par un cercle proche de la taille souhaitée, puis de le permuter en utilisant du bruit perlin. Soit en déplaçant le pixel sélectionné, soit en atténuant / étendant le cercle.
floAr

Réponses:

1

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.

Ruben
la source
1

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": Une goutte faite de bruit blanc

Blob "Pink Noise": Une goutte faite de bruit rose

Blob "Brownian Noise": Une goutte faite de bruit brownien

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.

Steven Stadnicki
la source
(Notez également: le fait que ces formes soient si proches de symétriques est un artefact de (a) les coefficients des deuxième et quatrième harmoniques étant si petits, et (b) les phases des première, troisième et cinquième harmoniques - combien nous déplaçons les valeurs thêta - étant si proches, à .468, .464 et .443; la plupart des 'blobs' n'auront presque pas autant de symétrie à leur sujet.)
Steven Stadnicki
0

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.

akaltar
la source