Question

J'utilise pygame pour tracer une ligne entre deux points arbitraires. Je souhaite également ajouter des flèches à la fin des lignes orientées vers l’extérieur dans les directions empruntées par la ligne.

C’est assez simple de coller une image de flèche à la fin, mais je ne sais pas comment calculer les degrés de rotation pour que les flèches pointent dans la bonne direction.

Était-ce utile?

La solution

Voici le code complet pour le faire. Notez que lorsque vous utilisez pygame, la coordonnée y est mesurée à partir du haut. Nous prenons donc le négatif lorsque nous utilisons des fonctions mathématiques.

import pygame
import math
import random
pygame.init()

screen=pygame.display.set_mode((300,300))
screen.fill((255,255,255))

pos1=random.randrange(300), random.randrange(300)
pos2=random.randrange(300), random.randrange(300)

pygame.draw.line(screen, (0,0,0), pos1, pos2)

arrow=pygame.Surface((50,50))
arrow.fill((255,255,255))
pygame.draw.line(arrow, (0,0,0), (0,0), (25,25))
pygame.draw.line(arrow, (0,0,0), (0,50), (25,25))
arrow.set_colorkey((255,255,255))

angle=math.atan2(-(pos1[1]-pos2[1]), pos1[0]-pos2[0])
##Note that in pygame y=0 represents the top of the screen
##So it is necessary to invert the y coordinate when using math
angle=math.degrees(angle)

def drawAng(angle, pos):
    nar=pygame.transform.rotate(arrow,angle)
    nrect=nar.get_rect(center=pos)
    screen.blit(nar, nrect)

drawAng(angle, pos1)
angle+=180
drawAng(angle, pos2)
pygame.display.flip()

Autres conseils

Nous supposons que 0 degré signifie que la flèche pointe vers la droite, 90 degrés signifie tout droit, 180 degrés signifie vers la gauche.

Il existe plusieurs façons de procéder, la plus simple consiste probablement à utiliser la fonction atan2. si votre point de départ est (x1, y1) et que votre point final est (x2, y2), l'angle en degrés de la ligne qui sépare les deux est:

import math
deg=math.degrees(math.atan2(y2-y1,x2-x1))

cela vous donnera un angle compris entre -180 et 180, vous en aurez donc besoin de 0 à 360. Vous devez vous en occuper vous-même.

Je devrais rechercher les fonctions exactes à utiliser, mais que diriez-vous de créer un triangle rectangle où l'hypoténuse est la ligne en question et les jambes alignées, et d'utiliser une trigonométrie de base pour calculer l'angle de la ligne basé sur les longueurs des côtés du triangle? Bien sûr, vous devrez utiliser des lignes de casse spécial déjà alignées sur un axe, mais cela devrait être trivial.

De même, cet article de Wikipedia sur la pente peut vous donner des idées.

pour ajouter au code ci-dessus, vous voudrez probablement une boucle d'événement pour qu'elle ne se ferme pas immédiatement:

...
clock = pygame.time.Clock()
running = True

while (running):
    clock.tick()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top