2009-03-16 17 views
2

Ich benutze Pygame, um eine Linie zwischen zwei beliebigen Punkten zu zeichnen. Ich möchte auch Pfeile an das Ende der Linien anhängen, die nach außen in die Richtungen zeigen, in die die Linie fährt.Drehung basierend auf den Endpunkten

Es ist einfach genug, um ein Pfeilbild am Ende zu halten, aber ich habe keine Ahnung, wie die Grad der Drehung berechnen, um die Pfeile in die richtige Richtung zu halten.

Antwort

8

Hier ist der vollständige Code, um es zu tun. Beachten Sie, dass bei der Verwendung von Pygame die y-Koordinate von oben gemessen wird. Daher verwenden wir das Negativ, wenn Sie mathematische Funktionen verwenden.

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

Ich müsste die genauen Funktionen nachschlagen, aber wie wäre es mit einem rechten Dreieck, wo die Hypotenuse die fragliche Linie ist und die Beine sind achsversetzt, und mit einigen grundlegenden Trigonometrie, um den Winkel des zu berechnen Linie basierend auf den Längen der Seiten des Dreiecks? Natürlich müssen Sie spezielle Linien, die bereits achsversetzt sind, aber das sollte trivial sein.

Auch kann this Wikipedia article on slope Ihnen einige Ideen geben.

+0

IMO, die beste Lösung wäre. Ich könnte falsch liegen, aber IIRC die gewünschte Formel ist Angle = arctan (YDiff/XDiff), wobei Winkel die Drehung eines Pfeils steuert und ((Winkel + 180)% 360) die Drehung des anderen Pfeils steuert. – Sukasa

2

Wir gehen davon aus, dass 0 Grad bedeutet, dass der Pfeil nach rechts zeigt, 90 Grad bedeutet nach oben gerichtet und 180 Grad bedeutet nach links zeigen.

Es gibt mehrere Möglichkeiten, dies zu tun, am einfachsten ist wahrscheinlich die Atan2-Funktion. wenn Ihr Ausgangspunkt ist (x1, y1) und Ihr Endpunkt ist (x2, y2) dann ist der Winkel in Grad von der Linie zwischen den beiden ist:

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

Dies wird Ihnen ein Winkel im Bereich - 180 bis 180 also brauchst du es von 0 bis 360 musst du auf dich aufpassen.

0

nur an den oben genannten Code anhängen, dann würden Sie wahrscheinlich eine Ereignisschleife wollen, damit es nicht sofort verlassen würde:

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

while (running): 
    clock.tick() 
Verwandte Themen