Вращение на основе конечных точек - PullRequest
2 голосов
/ 16 марта 2009

Я использую Pygame, чтобы нарисовать линию между двумя произвольными точками. Я также хочу добавить стрелки в конце линий, которые обращены наружу в направлениях, по которым проходит линия.

Достаточно просто приклеить изображение стрелки в конце, но я понятия не имею, как рассчитать градусы поворота, чтобы стрелки указывали в правильном направлении.

Ответы [ 4 ]

9 голосов
/ 16 марта 2009

Вот полный код, чтобы сделать это. Обратите внимание, что при использовании 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()
2 голосов
/ 16 марта 2009

Мы предполагаем, что 0 градусов означает, что стрелка указывает вправо, 90 градусов означает, что он направлен прямо вверх, а 180 градусов означает, что он направлен влево.

Есть несколько способов сделать это, самый простой, вероятно, использует функцию atan2. если ваша начальная точка (x1, y1), а ваша конечная точка (x2, y2), то угол в градусах линии между ними равен:

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

это угол наклона в диапазоне от -180 до 180, поэтому вам нужен угол от 0 до 360, вы должны позаботиться об этом сами.

1 голос
/ 18 марта 2009

просто для добавления к приведенному выше коду вы, вероятно, захотите цикл обработки событий, чтобы он не завершился сразу:

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

while (running):
    clock.tick()
1 голос
/ 16 марта 2009

Мне нужно было бы найти точные функции, которые нужно использовать, но как насчет создания прямоугольного треугольника, в котором гипотенуза является рассматриваемой линией, а ноги выровнены по оси, и использования некоторой базовой тригонометрии для вычисления угла линии на основе длины сторон треугольника? Конечно, вам понадобятся линии, которые уже выровнены по оси, но это должно быть тривиально.

Кроме того, эта статья в Википедии о склоне может дать вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...