Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

while (running):
    clock.tick()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top