В Pygame 2-мерная векторная арифметика реализована в pygame.math.Vector2
.
Определить объект Vector2
для положения мыши и центра треугольника.Вычислить угол вектора от центральной точки до положения мыши (.angle_to()
):
vMouse = pygame.math.Vector2(mouse_pos)
vCenter = pygame.math.Vector2(center)
angle = pygame.math.Vector2().angle_to(vMouse - vCenter)
Определить 3 точки треугольника вокруг (0, 0) и повернутьих под углом (.rotate()
)
points = [(-0.5, -0.866), (-0.5, 0.866), (2.0, 0.0)]
rotated_point = [pygame.math.Vector2(p).rotate(angle) for p in points]
Чтобы вычислить конечные точки, точки должны быть масштабированы и переведены по центру треугольника:
triangle_points = [(vCenter + p*scale) for p in rotated_point]
См. Пример:
import pygame
import math
def rotate_triangle(center, scale, mouse_pos):
vMouse = pygame.math.Vector2(mouse_pos)
vCenter = pygame.math.Vector2(center)
angle = pygame.math.Vector2().angle_to(vMouse - vCenter)
points = [(-0.5, -0.866), (-0.5, 0.866), (2.0, 0.0)]
rotated_point = [pygame.math.Vector2(p).rotate(angle) for p in points]
triangle_points = [(vCenter + p*scale) for p in rotated_point]
return triangle_points
disp=pygame.display.set_mode((200,200))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
mouse_position = pygame.mouse.get_pos()
points = rotate_triangle((100, 100), 10, mouse_position)
pygame.Surface.fill(disp, (255,255,255))
pygame.draw.polygon(disp, (0,0,0), points)
pygame.display.update()
Версия алгоритма, без использования pygame.math.Vector2
, выглядит следующим образом:
def rotate_triangle(center, scale, mouse_pos):
dx = mouse_pos[0] - center[0]
dy = mouse_pos[1] - center[1]
len = math.sqrt(dx*dx + dy*dy)
dx, dy = (dx*scale/len, dy*scale/len) if len > 0 else (1, 0)
pts = [(-0.5, -0.866), (-0.5, 0.866), (2.0, 0.0)]
pts = [(center[0] + p[0]*dx + p[1]*dy, center[1] + p[0]*dy - p[1]*dx) for p in pts]
return pts
Обратите внимание, что эта версия, вероятно, быстрее.Требуется операция math.sqrt
, по сравнению с math.atan2
, который, вероятно, используется .angle_to()
и math.sin
, соответственно math.cos
, который, вероятно, используется .rotate()
, из предыдущего алгоритма.Координаты результата совпадают.