Тригонометрия с Java - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь сделать некоторые основные тригонометрии с Java и LibGDX на Android. Я долго гуглил "Как найти угол в прямоугольных треугольниках". Я до сих пор не очень понимаю: (

Я хочу дать подклассу Actor случайное направление для подражания. Так что же такое угол - и что я должен установить xSpeed ​​и ySpeed, чтобы двигаться под правильным углом.

Я начал писать приложение, чтобы понять, как оно работает.

Есть два объекта - исходная точка и точка касания. Пользователь нажимает на экран, TouchPoint перемещается туда, где пользователь коснулся. Методы стрельбы, чтобы выяснить соответствующие значения. Я знаю XDistance и YDistance между двумя точками. Это означает, что я знаю противоположную длину и соседнюю длину. Так что все, что мне нужно сделать, это загар-1 (противоположный / соседний), я прав?

Я просто не понимаю, что делать с числами, которые выдает моя программа.

Код:

В событии создания основного класса:

stage.addListener(new ClickListener() {
         @Override
         public void touchDragged(InputEvent event, float x, float y, int pointer) {
            touchPoint.setX(x);
            touchPoint.setY(y);
            touchPoint.checkDistance(); // saves x and y distances from origin in private fields
            atan2D = getAtan2(touchPoint.getYDistance(), touchPoint.getXDistance());
            tanhD = getTanh(touchPoint.getYDistance(), touchPoint.getXDistance());
            xDistanceLbl.setText("X Distance: " + touchPoint.getXDistance());
            yDistanceLbl.setText("Y Distance: " + touchPoint.getYDistance());
            atan2Lbl.setText("Atan2: " + atan2D);
            tanhLbl.setText("Tanh: " + tanhD);
            angleLbl.setText("Angle: No idea");
         }
      })

...

private double getAtan2(float adjacent, float opposite) {
      return Math.atan2(adjacent, opposite);
   }

   private double getTanh(float adjacent, float opposite) {
      return Math.tanh((adjacent / opposite));
   }

Эти две функции дают мне числа от (atan2: -pi до pi) и (tanh: от -1,0 до 1,0)

Как я могу превратить эти значения в углы, из которых я могу затем работать в обратном направлении и снова получать противоположные и смежные? Это должно позволить мне создавать объекты со случайным направлением, которые я могу использовать в 2D играх.

1 Ответ

2 голосов
/ 10 мая 2019

atan2 дает вам направление в радианах.Направление от происхождения (0,0) до touchPoint.Если вам нужно направление от какого-либо объекта к touchPoint, то вычтите координаты объекта.Возможно, вы также хотите увидеть направление в градусах (это только для человеческих глаз)

dx = x - o.x
dy = y - o.y
dir = atan2(dy, dx)
dir_in_degrees = 180 * dir / Pi

Если у вас есть направление и вы хотите получить координаты, вам нужно сохранить расстояние

distance = sqrt(dx*dx + dy*dy)
later
dx = distance * cos(dir) 
dy = distance * sin(dir) 

Но обратите внимание, что часто лучше хранить dx и dy, потому что некоторые вычисления могут выполняться без тригонометрических функций


Только что заметил - использование tanh совершенно неверно, это гиперболическая касательная функция, он не имеет отношения к геометрии.

Вы можете использовать arctan, но он дает угол только в половинном диапазоне (по сравнению с atan2)

...