Знаете разницу между двумя углами только с их синусом и косинусом? - PullRequest
0 голосов
/ 27 августа 2018

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

У меня был способ сделать это, но он был неэффективен, так как мне приходилось разбираться в арксинусе, зная угол закругления и угол синуса, затем синус и косинус этого угла.Я думал о том, чтобы просто вернуть косинус и синусный угол, но есть одна проблема.После того, как я получил косинус и синус, мне нужно знать, слишком ли он отличается от моего текущего состояния.

С углом зрения это было бы легко, так как я бы просто увидел разницу, вот модель программы (код, который у меня сейчас есть, использует угол и не очень полезен).Я пытался изобразить синус и косинус и попытаться наблюдать какие-либо закономерности, не было выявлено ни одного очевидного.

import math
def sendTargRot():
    #I actually use a fairly long method to find it's current rotation, but a random.random() is a fair replacement, so in my real thing there would be no angle calculation
    pretendAngle =  math.pi*random.random()-math.pi
    pretendCosedX = math.cos(pretendAngle)
    pretendSinedX = math.sin(pretendAngle)
def changeDotAngle():
    targRot = sendTargRot
    #make sure targRot is not too much from current rotation
    #do stuff with the angle, change dot's rotation

Если вы хотите просто дать мне алгоритм без кода, который так же приемлем!

РЕДАКТИРОВАТЬ: Я не могу действительно изменить sendTargRot, поэтому он дает правильное вращение, потому что это потребовало бы от меня знания текущего угла, и на самом деле это просто перемещает проблему.

1 Ответ

0 голосов
/ 27 августа 2018

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

 angle = Math.atan2(a.x * b.y - a.y * b.x, a.x * b.x + a.y * b.y)

, если у вас уже есть косинусы и синусы (такие же, как у координат на единичной окружности):

 angle = Math.atan2(cos(a) * sin(b) - sin(a) * cos(b), cos(a) * cos(b) + sin(a) * sin(b))

Этот подход дает угол, необходимый для поворота a, пока он не совпадет с b с учетом направления (в диапазоне -Pi..Pi)

...