2009-03-16 8 views
2

J'utilise pygame pour tracer une ligne entre deux points arbitraires. Je veux aussi ajouter des flèches à la fin des lignes qui sont orientées vers l'extérieur dans les directions que la ligne est en train de parcourir.Rotation basée sur les points d'extrémité

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

Répondre

8

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

Je devrais rechercher les fonctions exactes à utiliser, mais que diriez-vous de faire un triangle rectangle où l'hypoténuse est la ligne en question et les jambes sont alignées sur l'axe, et en utilisant une trigonométrie de base pour calculer l'angle du ligne basée sur les longueurs des côtés du triangle? Bien sûr, vous aurez besoin de lignes spéciales qui sont déjà alignées sur les axes, mais cela devrait être trivial. En outre, this Wikipedia article on slope peut vous donner quelques idées.

+0

Ce serait la meilleure solution OMI. Je peux me tromper, mais IIRC la formule que vous voulez est Angle = arctan (YDiff/XDiff), où l'angle contrôle la rotation d'une flèche, et ((angle + 180)% 360) contrôle la rotation de l'autre flèche. – Sukasa

2

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

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

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

cela vous un angle dans la gamme - 180 à 180 donc vous en avez besoin de 0 à 360 vous devez prendre soin de vous-même.

0

juste à ajouter au code ci-dessus, vous voudrez probablement une boucle d'événement de sorte qu'il ne quitterait pas tout de suite:

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

while (running): 
    clock.tick() 
Questions connexes