我正在使用pygame在两个任意点之间画一条线。我还想在行的方向向外朝向线的末尾添加箭头。
在最后粘贴箭头图像很简单,但我不知道如何计算旋转度以保持箭头指向正确的方向。
答案 0 :(得分:9)
这是完成代码的完整代码。请注意,使用pygame时,y坐标是从顶部开始测量的,因此我们在使用数学函数时采用负数。
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 :(得分:2)
我们假设0度表示箭头指向右侧,90度表示指向上方,180度表示指向左侧。
有几种方法可以做到这一点,最简单的方法是使用atan2函数。 如果你的起点是(x1,y1)而你的终点是(x2,y2)那么两者之间的线的角度是:
import math
deg=math.degrees(math.atan2(y2-y1,x2-x1))
这将是你在-180到180范围内的一个角度,所以你需要从0到360,你需要照顾自己。
答案 2 :(得分:1)
我必须查找要使用的确切函数,但是如何制作一个直角三角形,其中斜边是有问题的线,并且腿是轴对齐的,并使用一些基本的三角函数来计算线的角度根据三角形边长?当然,你必须使用已经轴对齐的特殊情况行,但这应该是微不足道的。
此外,this Wikipedia article on slope可能会给你一些想法。
答案 3 :(得分:1)
只是为了附加上面的代码,你可能想要一个事件循环,所以它不会马上退出:
...
clock = pygame.time.Clock()
running = True
while (running):
clock.tick()