2 votes

Rotation basée sur les points finaux

J'utilise pygame pour dessiner une ligne entre deux points arbitraires. Je veux également ajouter des flèches à l'extrémité des lignes qui sont orientées vers l'extérieur dans les directions où la ligne se déplace.

Il est assez simple de coller une image de flèche à l'extrémité, mais je n'ai aucune idée de la manière de calculer les degrés de rotation pour que les flèches pointent dans la bonne direction.

9voto

Nikwin Points 2066

Voici le code complet pour le faire. Notez que lorsque vous utilisez pygame, la coordonnée y est mesurée à partir du haut, et nous prenons donc la valeur négative 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()

2voto

dagw Points 1545

Nous partons du principe que 0 degré signifie que la flèche est dirigée vers la droite, 90 degrés signifie qu'elle est dirigée vers le haut et 180 degrés signifie qu'elle est dirigée vers la gauche.

Il existe plusieurs façons de procéder, la plus simple étant probablement d'utiliser la fonction atan2. Si votre point de départ est (x1,y1) et votre point d'arrivée est (x2,y2), l'angle en degrés de la ligne entre les deux est :

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

Vous obtiendrez un angle compris entre -180 et 180. Si vous avez besoin d'un angle compris entre 0 et 360, vous devez vous en occuper vous-même.

1voto

MattK Points 7319

Il faudrait que je recherche les fonctions exactes à utiliser, mais pourquoi ne pas faire un triangle droit où l'hypoténuse est la ligne en question et les jambes sont alignées dans l'axe, et utiliser une trigonométrie de base pour calculer l'angle de la ligne en fonction des longueurs des côtés du triangle ? Bien sûr, vous devrez prendre en compte les cas particuliers des lignes déjà alignées, mais cela devrait être trivial.

En outre, cet article de Wikipédia sur la pente peut vous donner quelques idées.

1voto

Roy Points 71

Pour compléter le code ci-dessus, il faudrait probablement créer une boucle d'événements pour que le système ne s'arrête pas tout de suite :

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

while (running):
    clock.tick()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X