Pygame — найдите x и y с учетом гипотенузы и угла

#python #math #trigonometry

Вопрос:

Поэтому я просматриваю учебник по python, где мне нужно найти x и y по заданной гипотенузе = 40 и углу = 45 градусов. Кто-нибудь может объяснить, как найти x и y? треугольник

Вот код на python. Посмотрите на функцию movePlayer. Поиск новых x и y выполняется по-разному. Угол сначала вычитается из 180, а затем делится на 2, что пока не имеет смысла, но это работает.

 import pygame, math  pygame.init()  def movePlayer(direction, radius, absRot):  yChange = 5  # how many degrees to move in either side   deltaTheta = int(90/(radius / yChange))   if direction == 'left':  deltaTheta *= -1   # convert degrees to radians  finalRot = (absRot   deltaTheta) * math.pi / 180   hypotenuse = (radius * math.sin(finalRot) / (math.sin((math.pi - finalRot) / 2)))    # why these work  newX = hypotenuse * math.cos(math.pi/2-(math.pi - finalRot)/2)  newY = hypotenuse * math.sin(math.pi/2-(math.pi - finalRot)/2)    # these don't work  #newX = hypotenuse * math.cos(math.pi/2-finalRot)  #newY = hypotenuse * math.sin(math.pi/2-finalRot)    return newX, newY,absRot   deltaTheta   WIDTH = 900 HEIGHT = 700 SCREEN_SIZE = (WIDTH, HEIGHT) screen = pygame.display.set_mode(SCREEN_SIZE)   player = pygame.Surface((64,64))  playerStart = player currentRotation = 0  ball = pygame.Surface((32,32)) ball.fill('red')  playerX = WIDTH // 2 playerY = 530 playerXOriginal = playerX playerYOriginal = playerY  ballX = WIDTH // 2 - ball.get_rect().width // 2 ballY = 450 - ball.get_rect().height // 2  radius = playerY - ballY  FPS = 30 clock = pygame.time.Clock()  running = True while running:  for event in pygame.event.get():  if event.type == pygame.QUIT:  running = False  if event.type == pygame.KEYDOWN:  if event.key == pygame.K_ESCAPE:  running = False   pressedKeys = pygame.key.get_pressed()  if pressedKeys[pygame.K_LEFT]:  changeX, changeY, currentRotation = movePlayer('left', radius, currentRotation)  playerX = playerXOriginal   changeX  playerY = playerYOriginal - changeY  print('left')  elif pressedKeys[pygame.K_RIGHT]:  changeX, changeY, currentRotation = movePlayer('right', radius, currentRotation)  playerX = playerXOriginal   changeX  playerY = playerYOriginal - changeY  print('right')     screen.fill('white')  screen.blit(ball, (ballX,ballY))  screen.blit(player, (playerX - player.get_rect().width //2,playerY - player.get_rect().height // 2))    pygame.display.update()  clock.tick(FPS)  pygame.quit()  

Комментарии:

1. Это математическая задача. Для 45 градусов x и y одинаковы, и x^2 y^2 = h^2

Ответ №1:

Несколько базовая тригонометрия (при условии, что ang выражен в радианах и нулевой угол указывает на x).

 x = cos(ang) * h y = sin(ang) * h  

Комментарии:

1. Вероятно, вам следует указать, что угол, ожидаемый cos и sin должен быть в радианах, а не в градусах. Операция имеет угол 45 градусов. Углы в градусах можно преобразовать в радианы, умножив их на math.pi / 180 . В случае 45 градусов или радианов pi/4 известно, что и косинус, и синус равны (цифра в вопросе вводит в заблуждение), и их точное значение равно sqrt(2)/2 .

2. @Stef Да, я… действительно указывал на это. «предполагая, что ang находится в радианах».

3. Ну, глядя на комментарии ОП по другим ответам, ОП, похоже, действительно не понял, что это значит, и запутался, потому что они добавляют углы в градусах к углам в радианах.

Ответ №2:

В вашем случае у вас угол 45 градусов, следовательно, у вас есть прямоугольный равнобедренный треугольник.

Общая формула Пифагора такова : h^2 = x^2 y^2. поскольку треугольник равнобедренный, то :

 x = y =gt; h^2 = 2 * x^2 =gt; x = y = (sqrt(2)/2)*h  

В более общем случае, когда треугольник не равнобедренный:

 x = cos(ang) * h y = sin(ang) * h  

На языке python:

 import math  def triangleSides(hypotenuse,angleindegrees):  angleinradians = (angleindegrees * math.pi / 180)  (x,y) = hypotenuse* math.cos(angleinradians),hypotenuse* math.sin(angleinradians)  return (x,y)  

Комментарии:

1. Спасибо. Однако инструктор делает это так: x = гипотенуза * математический cos( математический pi/2-(математический pi — ang)/2 ) y = гипотенуза * математический грех( математический pi/2-(математический pi — ang)/2 ) Теперь понятно, почему из 180 мы вычитаем угол, а затем делим на 2?

2. @IvanYosifov но получает ли инструктор тот же результат? потому что, что бы это ни было, это кажется совершенно неправильным, в зависимости от того, как ang вычисляется, но даже тогда эти выражения могут быть упрощены до math.sin(ang/2) и то же самое для cos

3. @Matiiss — да, его код работает. Я добавил весь код в свой вопрос. Если я попытаюсь реализовать это так, как должно быть, это не сработает так, как ожидалось

Ответ №3:

Чтобы получить координаты x,y, удобно провести прямую линию от (x,y), чтобы сделать прямой угол с осью x. Учитывая диаграмму, я сделаю следующие два предположения:

  1. Что нижний левый угол равен 90 градусам (что означает, что это равнобедренный прямоугольный треугольник)
  2. Что нижний правый угол треугольника находится в начале координат (синяя точка на диаграмме).

Используя теорему Пифагора, мы получаем, что x = — (40 / sqrt(2)) и y = 40 / sqrt(2).

Чтобы использовать тригонометрию, мы получаем:

 a, h = math.pi/4, 40 x, y = - h * cos(a), h * sin(a)  

Комментарии:

1. Спасибо. Чего я не понимаю, так это как получить нужный ракурс. Инструктор делает это так: x = гипотенуза * математический cos( математический pi/2-(математический pi — ang)/2 ) y = гипотенуза * математический грех( математический pi/2-(математический pi — ang)/2 ) математический pi равен 180, математический pi/2 равен 90. Так почему же из 180 мы вычитаем угол, а затем делим на 2?

2. @JaredJunyoungLim это можно упростить, в ang/2 чем все еще нет смысла

3. Я согласен, что ang/2 это не имеет смысла, если только ang речь не идет о чем-то другом, кроме отмеченного синим цветом угла на диаграмме.

4. Я добавил код в свой вопрос, если это поможет!