2015-08-20 11 views
0

J'essaie de faire un effet "lampe de poche" dans mon jeu où le joueur ne peut voir que les endroits qui sont dans sa ligne de mire. J'ai la plupart de l'effet fait par raycasting à chaque sommet dans le monde du jeu et raycasts ajoutés et extra + -0.0001 rad, puis les reliant dans le sens horaire pour former this shape in red. J'essaie d'obtenir l'inverse de ce polygone dans les limites du niveau rectangulaire similaire à l'option "Inverse Selection" dans des programmes comme Photoshop (example)Algorithme d'inversion d'un polygone dans un rectangle?

+0

-vous Vous voulez obtenir le polygone blanc de l'image? Ou juste le complément du rouge? – higuaro

Répondre

0

Construire un ensemble pour rectangle et polygone et calculer le symmetric difference (sommets dans soit rectangle ou polygone mais pas dans les deux), par exemple:

rectangle = [(0, 0), (13, 0), (13, 10), (0, 10)] 
polygon = [(0, 5), (0, 10), (2, 6), (8, 6), (11, 0), (13, 0), (13, 10)] 
# "^" is the symmetric difference operator in python 
set(rectangle)^(set(polygon)) 

Retours:

set([(11, 0), (2, 6), (0, 5), (0, 0), (8, 6)]) 

qui correspond à la zone verte (sommets A, I, E, H, J) dans le tableau suivant:

enter image description here

Garde-il obtiendra le complément du polygone rouge qui ne comprend pas la intersection avec le mur dans votre image originale:

enter image description here

Si vous voulez que votre résultat soit le polygone jaune de la figure suivante à la place:

enter image description here

Ensuite, vous devrez faire une intersection rectangle polygone pour chaque mur/bloc dans la scène avec le polygone du complément en utilisant une méthode comme celles décrites dans la question suivante:

Method to detect intersection between a rectangle and a polygon?