Python 基于端点的旋转

Python 基于端点的旋转,python,geometry,pygame,Python,Geometry,Pygame,我用pygame在两个任意点之间画一条线。我还想在直线的末端附加箭头,这些箭头朝向直线行进的方向 在末端粘贴箭头图像非常简单,但我不知道如何计算旋转度以保持箭头指向正确的方向。我必须查找要使用的确切函数,但是制作一个直角三角形,斜边是所讨论的直线,腿是轴对齐的,怎么样,用一些基本的三角法,根据三角形边的长度来计算线的角度?当然,您必须使用已经对齐轴的特殊情况线,但这应该很简单 还有,我可以给你一些想法。我们假设0度表示箭头指向右侧,90度表示箭头指向正上方,180度表示箭头指向左侧 有几种方法可

我用pygame在两个任意点之间画一条线。我还想在直线的末端附加箭头,这些箭头朝向直线行进的方向


在末端粘贴箭头图像非常简单,但我不知道如何计算旋转度以保持箭头指向正确的方向。

我必须查找要使用的确切函数,但是制作一个直角三角形,斜边是所讨论的直线,腿是轴对齐的,怎么样,用一些基本的三角法,根据三角形边的长度来计算线的角度?当然,您必须使用已经对齐轴的特殊情况线,但这应该很简单


还有,我可以给你一些想法。

我们假设0度表示箭头指向右侧,90度表示箭头指向正上方,180度表示箭头指向左侧

有几种方法可以做到这一点,最简单的可能是使用atan2函数。 如果起点为(x1,y1),终点为(x2,y2),则两者之间直线的角度为:

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

这将为您提供一个介于-180到180之间的角度,因此您需要从0到360之间的角度。您必须照顾好自己。

以下是完成此操作的完整代码。请注意,在使用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()

为了附加到上述代码中,您可能需要一个事件循环,这样它就不会立即退出:

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

while (running):
    clock.tick()

这将是最好的解决方案。我可能错了,但IIRC您想要的公式是Angle=arctan(YDiff/XDiff),其中Angle控制一个箭头的旋转,而((Angle+180)%360)控制另一个箭头的旋转。