2016-06-24 2 views
0

Чтобы лучше понять, как работает тригонометрия в разработке игр, я создавал небольшие фрагменты javascript для CodePen.Вращение изображения в точку мыши с использованием ATAN вместо ATAN2

Мне удалось создать пример, который использует Math.atan2(), чтобы нарисовать пистолет-пистолет с курсором мыши.

Теперь я пытаюсь выполнить ту же самую вещь, используя функцию Math.atan(), но она не работает должным образом.

Вот логика код, я использую:

canvas.onmousemove = function(event) { 
    Mouse = { 
    x: event.pageX, 
    y: event.pageY 
    } 

    // These length variables use the distance formula 
    var opposite_length = Math.sqrt((Mouse.x - Mouse.x) * (Mouse.x - Mouse.x) + (Mouse.y - y) * (Mouse.y - y)); 

    var adj_length = Math.sqrt((Mouse.x - x) * (Mouse.x - x) + (y - y) * (y - y)); 


    var angle_in_radians = Math.atan(opposite_length/adj_length); 

    //var angle_in_radians = Math.atan2(Mouse.y - y, Mouse.x - x); 

    angle = angle_in_radians * (180/Math.PI); 
} 

ИН моей ничьи функции(), я повернуть пистолет в угол вар с помощью:

cxt.rotate(angle*(Math.PI/180));

Если вы раскомментировать линия, начинающаяся с // var angle_in_radians, все будет работать.

Итак, atan2 работает, но atan производит результат, который я хочу.

Я знаю, что opposite_lengt h и adj_length являются точными, потому что когда i console.log() они являются правильными значениями.

Вы можете проверить используемый код on CodePen для примера.

Там много инициализации вещи, но вы только действительно необходимо сосредоточить внимание на секции canvas.onmousemove = function(event), начиная от линии 50. Вы также можете проверить свою функцию отрисовки на линии 68.

+0

Ваш расчет переменной variable_length выглядит некорректным. '(Mouse.x - Mouse.x) * (Mouse.x - Mouse.x)' всегда будет равен нулю. Либо вам не нужна эта часть вычисления, либо некоторые из этих значений «Mouse.x», вероятно, должны быть «x». – RickyTomatoes

+0

Противоположная сторона треугольника будет находиться на одном и том же значении x. Мне не нужно было включать точку Mouse.x-Mouse.x, потому что, как вы сказали, она равна нулю, но я сохранил ее только ради формулы расстояния. После того, как 'console.log'ы указали значение длины стороны, я увидел, что они были правильными. –

ответ

1

Обратите внимание, что ваш расчет Атан эквивалентно до

atan2(abs(mouse.y-y), abs(mouse.x-x)) 

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

atan2(y-mouse.y, mouse.x-x) 
+0

Atan2 Я отлично работаю. Это простой анан, я пытаюсь работать. Возможно ли использовать обычную функцию Math.atan, хотя она будет включать еще пару строк кода? –

+0

Почему вы хотите использовать atan? atan (y/x) = atan2 (y, x) для всех (x, y) в квадранте 1. и 4. в квадранте atan 2 и 3. имеет неправильный знак. В большинстве случаев вам лучше использовать atan2. – LutzL

+0

В образовательных целях. Вы правы, хотя! 'var angle_in_radians = Math.atan ((Mouse.y - y)/(Mouse.x - x));' решил его :) Не слишком уверен, почему это так. Я решил, что могу найти угол положения мыши и положение пистолета, используя арктангенс с противоположной стороной, разделенной смежной стороной. Это не сработает? –

Смежные вопросы