Génération de Barrier Island

Les nouvelles de décembre de l' ouragan Florence faisaient souvent référence à des hauts - fonds externes - une série d'îles-barrières au large des côtes de la Caroline du Nord:


Les îles barrières sont des plaques de sable plates ou en blocs formées par les vagues et surfent parallèlement à la côte du continent. Ils prennent souvent la forme de longues chaînes qui peuvent s'étirer sur plusieurs dizaines de kilomètres. Les îles barrières sont généralement séparées par de petits canaux de marée et peuvent former des lagunes entre les îles et le continent.

Selon Wikipedia , les îles barrières peuvent couvrir jusqu'à 15% de la côte, vous pouvez donc vous attendre à les voir sur la plupart des cartes fantastiques, mais en fait, elles sont assez rares. Et en raison de la nature du bruit, ils ne se produisent presque jamais sur des cartes générées de manière procédurale qui utilisent le bruit pour créer un terrain.

Pour comprendre pourquoi il en est ainsi, jetons un coup d'œil à la carte vanille de l'île:


En fait, c'est un cercle déformé par une petite quantité de bruit basse fréquence ajoutée pour diviser une forme circulaire. Essayons maintenant d'utiliser le bruit pour briser la côte et former des îles côtières. Voici le même îlot avec l'ajout de bruit basse fréquence:


Il a des baies et des capes. Les éléments en relief sont assez grands car j'ai utilisé du bruit basse fréquence, qui change lentement. Cependant, le bruit n'est pas assez fort pour créer des îles. Poussons un peu:


Nous avons maintenant créé plusieurs îles, mais ce sont essentiellement des spots circulaires, qui ne s'étendent pas nécessairement le long de la côte. Vous pouvez ajouter du bruit haute fréquence:


Cela peut nous donner des côtes très brisées et de petites îles le long de la côte, mais rien ne ressemblant à une île barrière.

La seule raison à cela est que le bruit n'est pas adapté en x et y, donc bien que le bruit ne soit pas aléatoire en général, les formes qu'il crée sont aléatoires:


Pour certaines choses, c'est bien, mais cela ne convient pas pour créer une forme spécifique, par exemple, des îles le long de la côte.

Comme dans d'autres cas, lorsque je devais générer une certaine forme ou zone, il était nécessaire de créer un masque de la forme requise, puis d'utiliser le bruit à l'intérieur du masque. (Vous pouvez également utiliser le bruit pour déformer le masque et lui donner une forme plus naturelle.) Les îles-barrières sont en fait de longues zones minces qui sont décalées par rapport à la côte. Créons donc un masque de cette forme.

Pour commencer, nous avons défini la partie de la côte sur laquelle l'île barrière sera située. Cela peut être fait en sélectionnant un point aléatoire sur la côte et un deuxième point inférieur, qui sont marqués sur la figure avec une ligne rouge dans le coin supérieur droit:


Pour commencer à créer une île barrière, je peux simplement prendre une ligne droite entre ces deux points et la projeter un peu vers l'extérieur, dans l'eau. Cela me donnera une île très droite et peu naturelle, mais vous pouvez déformer sa forme pour la cacher. Le vrai problème est que l'île ne suivra pas le littoral. Cela semblera probablement normal pour la plupart des tronçons directs de la côte, mais cela semblera étrange sur les côtes sinueuses. Il vaut mieux reproduire le littoral et en faire la base de la forme de l'île.

Pour ce faire, je dois créer une copie du littoral, puis la projeter dans l'océan perpendiculairement au littoral. J'ai déjà une procédure pour calculer les perpendiculaires (normales) aux lignes brisées depuis que j'ai réalisé des lignes manuscrites , et mes côtes vont toujours dans le même sens, donc c'est assez simple:


Ou cela semble simple. Voyons ce qui se passe si je projette le littoral un peu plus vers l'extérieur (pour créer l'autre côté du masque de l'île) sur la partie la moins lisse du littoral:


Deux segments de la ligne projetée se croisent et créent un «huit» effrayant sur le polygone. C'est ce que l'on appelle le problème de la courbe parallèle . Nous ne pouvons pas simplement déplacer la côte à une certaine distance, il est également nécessaire de résoudre les problèmes résultant des angles internes et externes pointus.

Je cherchais du code Javascript pour résoudre ce problème, mais le seul exemple trouvé (à partir d'ici ) se bloquait étonnamment même sur des échantillons assez simples. J'ai donc écrit le mien. En général, la solution consiste à déplacer chaque point le long de la normale, mais vérifiez ensuite si le nouveau point crée une ligne coupant l'une des lignes existantes. Si c'est le cas, nous coupons la boucle et insérons une nouvelle ligne composée du point d'intersection et du nouveau point. Dans les cas de test que j'ai testés, ce système fonctionnait assez bien pour mes besoins.

Alors maintenant, je peux générer des masques simples (pas de boucles) pour les îles:


C'est trop uniforme, donc je vais déformer les contours:


Les contours peuvent toucher la côte à certains endroits, mais c'est normal; cela se trouve souvent sur les îles barrières.

L'étape suivante consiste à remplir le contour de terre, mais avant de le faire, je veux allonger les îles et ajouter la logique d'éviter les îles qui se croisent en cas de création de plusieurs îles barrières sur le même littoral.


Essayons maintenant d'ajouter du terrain. Pour ce faire, je vais élever la hauteur de tout emplacement terrestre (qui sont des triangles de Delaunay) au-dessus du niveau de la mer:


Ici, il convient de noter quelques aspects. Tout d'abord, dans le coin supérieur gauche, il y a une île barrière assez réussie. Cependant, l'île ne semble pas bien remplir la décharge. De nombreux triangles terrestres sont «activés» en raison de la présence de leurs centres à l'intérieur du polygone. Cela ajoute un caractère aléatoire à la forme de l'île. Deuxièmement, on peut remarquer que les deux autres îles étaient si proches de la côte qu'elles ont simplement fusionné avec elle. Comme je veux créer des îles ici, je n'ai pas besoin que cela se produise trop souvent, donc je vais configurer la génération pour obtenir un plus grand écart d'eau entre le littoral et l'île. (Plus tard, j'ajouterai une vérification pour éviter que cela ne se produise.)


L'une des bonnes choses à propos des triangles irréguliers terrestres est qu'ils créent naturellement des canaux de marée typiques des îles-barrières. La mauvaise chose à leur sujet est qu'ils créent généralement des îles tachetées qui ressemblent à des perles déformées sur une chaîne. Ils ne sont pas très similaires aux îles barrières, et si vous prenez beaucoup de triangles individuels, ils ont l'air très peu naturels.

Si j'augmente la largeur des îles, les deux effets disparaissent et j'obtiens des îles plus naturelles, mais sans canaux de marée:


Mais je voudrais apprendre à générer des îles très étroites. Une autre approche consiste à augmenter (de manière significative) le nombre d'emplacements dans le monde pour augmenter la résolution:


Nous pouvons donc obtenir des îles incroyablement fines et détaillées, mais cela augmente considérablement le temps et la mémoire nécessaires pour créer une carte.

Dans ces deux méthodes, il y a de fortes chances que certaines parties de l'île soient très inégales:


Cela se produit parce que le chemin coupe les deux côtés (et parfois les trois côtés) des triangles Delaunay sous-jacents. C'est un problème inhérent à l'utilisation de la triangulation de Delaunay dans la génération de cartes, mais pour une raison quelconque, ils en discutent rarement! Cela se produit sur les côtes de mon jeu pas très souvent, car pour réduire le nombre de ces cas, j'ai délibérément ajouté une étape de lissage, mais cette étape a tendance à détruire des îles étroites. Une solution potentielle est de créer des îles légèrement plus larges et d'utiliser l'anti-aliasing - si elles sont correctement configurées, vous pouvez obtenir des îles plus minces sans beaucoup d'artefacts triangulaires:


Cependant, avec cette approche, il y a encore des limites sur l'étroitesse des îles. De plus, cela signifie que nous n'aurons jamais de côtes véritablement fractales.

Parfois, l'algorithme de lissage conduit à la division du long îlot barrière en plusieurs petits (comme dans le coin inférieur gauche de l'image ci-dessus), mais il serait pratique d'avoir une option qui vous permet de le faire de force:


Il ne reste plus qu'à donner des noms aux îles et à les cartographier. Le seul aspect subtil ici est que je ne veux pas donner de noms à toutes les îles de la chaîne des îles barrières. Dans de véritables chaînes d'îles-barrières, les îles individuelles ont souvent des noms, ce qui conduit au chaos sur la carte:


Par conséquent, lors de la création d'une île barrière, je prends en compte tout l'arc et y attache un nom, même si par conséquent la génération divise l'arc en plusieurs îles:


Habituellement, les îles barrières sont appelées «banques» ou «puits» (barres), de sorte que ces mots se trouvent dans les noms de variantes.

Cet exemple montre un problème potentiel d'îlot barrière:


Ici, l'île barrière a été créée à l'intérieur de la baie. Ceci est illogique (en plus, conduit à l'intersection des noms). Pour éviter cela, je peux utiliser ma logique de reconnaissance des baies et sauter ces sections du littoral. Il n'y a probablement aucune protection contre le fou dans cette méthode, mais cela fonctionne bien pour cette carte:

Source: https://habr.com/ru/post/fr439198/


All Articles