2009-06-25 7 views
2

Je dessine tout un tas de Polygons sur une toile, dont la plupart partagent un bord avec au moins un autre polygone. Je voudrais indiquer qu'un polygone est "spécial" en le soulignant, mais en raison des bords qui se chevauchent, le trait d'un polygone a tendance à être partiellement dessiné par un autre polygone, ce qui rend le contour plus mince qu'il ne le devrait par endroits. De plus, en fonction de l'ordre de tirage, un Polygone peut avoir son Contour presque entièrement couvert par ceux qui l'entourent. L'espacement des polygones n'est pas une option très intéressante, car les écarts visibles entre les polygones sont beaucoup moins préférables à ce problème de "coup mince". Je pense que l'effet que je recherche peut être obtenu en générant chaque Polygone comme une paire de Polygones, de telle sorte qu'un Polygone est complètement contenu dans l'autre et que ce plus petit Polygone fonctionne jusqu'à (mais pas chevauchement) le contour externe du polygone. Le polygone interne aurait un remplissage transparent à tout moment, et un contour non transparent seulement quand je souhaite indiquer que la paire de polygones est maintenant "spéciale".Construction d'un effet de "trait interne" à partir d'un polygone

Ma question se résume à; comment puis-je dériver un tel Polygone intérieur de l'extérieur, ou à défaut, comment pourrais-je obtenir cet effet?

Les polygones en question peuvent être contraints au regular polygons si nécessaire, et les traits sont simples 1 lignes pleines d'épaisseur sans mitaines de fantaisie ou similaire. J'aimerais pouvoir ajuster l'épaisseur du Stroke à un moment donné, mais rien de plus fantaisiste que ça.

+0

Le problème de décalage de polygone est discuté ici: http://stackoverflow.com/questions/1109536/an-algorithm-for-inflating-deflating-offsetting-buffering-polygons – user4891

+0

Pouvez-vous contrôler l'ordre de dessin afin que les polygones spéciaux soient dessiné en dernier? –

+0

Il y a beaucoup de Polygones impliqués, donc ce serait cher. Il n'y a également aucune garantie qu'ils ne se limitent pas. –

Répondre

1

Je pense qu'il y a plusieurs façons de réaliser ce que vous voulez. Tout d'abord, avec votre idée originale de dessiner un deuxième polygone légèrement plus petit dans le polygone d'origine; ce n'est pas une mauvaise idée. Pour répondre à votre question initiale sur la façon de générer le plus petit polygone: vous pouvez trouver le centroïde de chaque polygone, et décaler chaque sommet d'un pourcentage de la distance à ce point centroïde du polygone pour obtenir le plus petit polygone. Cela devrait donner un effet agréable.

Une autre façon de procéder serait d'utiliser z-order et de décaler le polygone "thicker" d'une légère z-distance négative.

Encore une autre façon d'aller serait d'exploiter l'ordre de tirage; dessinez vos polygones les plus épais en dernier, ce qui les empêchera d'être trop recouverts par les polygones environnants. Une autre idée qui pourrait fonctionner selon vos besoins pourrait ne pas être de dessiner des polygones, mais de dessiner une série de lignes, en épaississant simplement certaines lignes.

Il y a beaucoup d'options à essayer; J'espère que vous en trouverez un qui fonctionne bien!

+0

Votre idée de mise à l'échelle est intéressante, je vais jouer avec pour voir si c'est réalisable. Les manipulations d'ordre Z et de tirage échoueront si deux polygones "spéciaux" se touchent, ce qui n'est pas assez rare pour être acceptable, je suppose. L'épaississement des lignes est également intéressant, mais je m'inquiète des coûts de performance. –

+0

Les lignes de dessin d'épaisseur variable doivent être considérablement plus rapides que les polygones de dessin, puisque vous dessinez une fois au lieu de deux fois pour chaque bord partagé. –

+0

J'ai fini par aller avec une légère variation sur votre première suggestion. Plutôt que de redescendre, j'ai fait un peu de trig pour savoir exactement jusqu'où chaque point devait se déplacer vers le "centre" de sorte que le nouveau point était StrokeThickness loin de l'ancien. –

Questions connexes