J'ai besoin de créer un bitmap binaire à partir d'un polygone 2D fermé représenté comme une liste de points. Pourriez-vous s'il vous plaît me signaler des algorithmes efficaces et suffisamment simples de faire cela, ou encore mieux, certains CODE C ++? P>
Merci beaucoup! P>
PS: J'aimerais éviter d'ajouter une dépendance à mon projet. Toutefois, si vous suggérez une bibliothèque open source, je peux toujours regarder le code, afin que cela puisse être utile aussi. P>
4 Réponses :
La phrase Google magique que vous souhaitez soit "règle d'enroulement non nulle" ou "Remplissage de polygone pair". P>
Voir les entrées Wikipedia pour: P>
Les deux sont très faciles à mettre en œuvre et suffisamment rapides à la plupart des fins. Avec une certaine intelligence, ils peuvent également être fabriqués de manière antialiasée. P>
@plinth: n'est-ce pas sur-tuer pour des polygones simples?
Qu'est-ce qu'un simple polygone? @STICTIC_RTTI ne spécifie pas le nombre de points ou si les polygones seront toujours convexes, une solution générale est donc la bonne réponse. NZW et EO sont des fesses simples et se prêtent à des solutions orientées numériques, etc., etc., etc.
@plinth: Merci, c'est exactement ce que je cherchais! Des trucs Googling peuvent être délicats quand vous n'avez pas cette phrase magique :-)
@plinth: Un simple polygone est celui dont les segments ne se croisent pas. Voir EN.Wikipedia.org/wiki/simple_polygon
La complexité est O (zone en pixels) p>
Comment rasérez-vous les triangles obtenus? Un par un en parcourant toute l'image à chaque fois? N'est-ce pas susceptible d'être très lent?
@STICTIC_RTTI: Que voulez-vous dire traverser toute l'image à chaque fois?
@STICTIC_RTTI: J'ai ajouté une explication de la façon de rasteriser un triangle
Le point crucial ici est "Calculer les segments gauche et droit". Le faire séparément pour chaque ligne de balayage est prohibitif lente; Un meilleur moyen est de calculer l'incrément et de l'appliquer à la valeur de départ.
Je pense que cette réponse glousse sur la complexité impliquée dans la triangulation du polygone. Pour de simples polygones, ce n'est pas si mauvais. Mais pour les polygones auto-intersectés, cela est plutôt impliqué. - Voir angusj.com/delphi/clipper.php à titre d'exemple.
Vous pouvez consulter la routine de remplissage de polygone dans Pygame. Regardez le
1 commentaires
Pas trop liée mais BTW Pete Vous êtes génial pour faire pygame :)
Pour une implantation robuste du "Règle pair" p>
voir Remplissage efficace de polygone de Darel Rex Finley , ou Version de Blender de celui-ci. P>
Il s'agit d'une méthode de remplissage impair / voire qui prend en charge les lignes d'auto-intersection, sans avoir besoin de code complexe pour détecter de telles situations et ne dépend pas de l'enroulement (le polygone peut être inversé et donner les mêmes résultats) em>. p>
Mise à jour, j'ai créé une version optimisée de la méthode de Darel Rex qui évite de boucler sur implémentations autonomes autonomes: p>