Domanda

Sto usando pygame per tracciare una linea tra due punti arbitrari. Voglio anche aggiungere frecce alla fine delle linee rivolte verso l'esterno nelle direzioni in cui la linea sta viaggiando.

È abbastanza semplice attaccare un'immagine di una freccia alla fine, ma non ho idea di come calcolare i gradi di rotazione per mantenere le frecce puntate nella giusta direzione.

È stato utile?

Soluzione

Ecco il codice completo per farlo. Nota che quando usi pygame, la coordinata y viene misurata dall'alto, quindi prendiamo il negativo quando utilizziamo le funzioni matematiche.

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()

Altri suggerimenti

Supponiamo che 0 gradi significhi che la freccia punta verso destra, 90 gradi significa che punta verso l'alto e 180 gradi significa che punta verso sinistra.

Esistono diversi modi per farlo, il più semplice sta probabilmente usando la funzione atan2. se il punto iniziale è (x1, y1) e il punto finale è (x2, y2), l'angolo in gradi della linea tra i due è:

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

questo ti offrirà un angolo compreso tra -180 e 180, quindi ne avrai bisogno da 0 a 360, dovrai prenderti cura di te stesso.

Dovrei cercare le esatte funzioni da usare, ma che ne dici di fare un triangolo rettangolo in cui l'ipotenusa è la linea in questione e le gambe sono allineate agli assi, e usando un po 'di trigonometria di base per calcolare l'angolo della linea basato sulle lunghezze dei lati del triangolo? Ovviamente, dovrai utilizzare le linee del caso speciale che sono già allineate agli assi, ma dovrebbe essere banale.

Inoltre, questo articolo di Wikipedia sulla pendenza potrebbe darti alcune idee.

solo per aggiungere al codice sopra, probabilmente vorresti un loop di eventi in modo che non si chiudesse immediatamente:

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

while (running):
    clock.tick()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top