#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. Учитывая диаграмму, я сделаю следующие два предположения:
- Что нижний левый угол равен 90 градусам (что означает, что это равнобедренный прямоугольный треугольник)
- Что нижний правый угол треугольника находится в начале координат (синяя точка на диаграмме).
Используя теорему Пифагора, мы получаем, что 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. Я добавил код в свой вопрос, если это поможет!