2 голоса
 
109 просмотров
20.02.2020 / 17:29  wRadchuk

Движение по окружности

Есть окружность с радиусом R и известны координаты X, Y центра окружности. Цель получить точку в двух верхних квадрантах окружности в диапазоне +-R окружности. Затем необходимо поместить произвольное изображение в эту точку для движения его от начала левого верхнего квадранта окружности до конца правого верхнего квадранта, тобиш в диапазоне +-R окружности. При этом необходимо поворачивать изображение относительно центра окружности в момент движение.

Есть у меня парочка функций, но что-то в них не то.

  1. public Vector2 getPointInCircle(float horz, Vector2 centerCircle, float radius) {
  2.         double x = (horz - centerCircle.x) / radius;
  3.         double y = Math.sin(Math.acos(x));
  4.         double cx = centerCircle.x + (radius * x);
  5.         double cy = centerCircle.y + (radius * y);
  6.         return new Vector2((float) cx, (float)cy);
  7.     }
  8.  
  9. public double getAngle(Vector2 point, Vector2 pointA) {
  10.         double res = 0;
  11.         double pro_kat_dlina = Math.sqrt((Math.pow(point.x - pointA.x, 2)) + (Math.pow((point.y - pointA.y), 2)));
  12.         double pod_kat_dlina = Math.sqrt((Math.pow((center_x / 2 + radius) - pointA.x, 2)));
  13.         double cos = pod_kat_dlina / pro_kat_dlina;
  14.         double sin = pro_kat_dlina / pod_kat_dlina;
  15.         double arccos = Math.acos(cos);
  16.         double arcsin = Math.asin(sin);
  17.  
  18.         if(point.x>point.x+radius/2) res = (arcsin / Math.PI * 180);
  19.         else res = (arccos / Math.PI * 180);
  20.         return res;
  21.     }
  22.  
  23.  
  24.        // Вызов функций
  25.        Vector2 point = _box.getPointInCircle(circle.getCord().x+p, circle.getCord(), circle.getRadius());
  26.         if(!Float.isNaN(point.x) && !Float.isNaN(point.y)) object.setCord(point.x, point.y);
  27.  
  28.         double ang = angle.getAngle(object.getCord(), new Vector2(object.getCord().x, circle.getCord().y));
  29.  
  30. if(!Double.isNaN(ang)) object.setAngle(45-ang);

И вот демонстрация работы функций Видео на YouTube

З.Ы. В решении подобных мат задач не силён, так что надеюсь получить какую либо помощь. Мои функции часто попадают в NAN и очень странно себя ведут.
Изм. wRadchuk от 20.02.2020 / 17:30
20.02.2020 / 20:43  Витаминыч
Автор ограничил доступ к видео.👍
21.02.2020 / 01:06  vl@volk
Матрицы трансформации
Ответы
 
1 голос
 
# 21.02.2020 / 18:13  Askalite
  1. public float getPointInCircleY(float x, float r){
  2.     x=Math.abs(x);
  3.     return (float)Math.sqrt(r*r-x*x);
  4. }
  5. //Начало нужных методов
  6. public float getAngle(float x, float r){
  7.     return (float)Math.PI-Math.acos(-x/r);
  8. }
  9. public Vector2  getPoint(float x, float r, Vector2 curclePosition){
  10.     return new Vector2((float)(curclePosition.x+x),(float)(curclePosition.y+getPointInCircleY(x,r)));
  11. }
  12. //ВНИМАНИЕ! ВСЕ УГЛЫ В РАДИАНАХ!
Изм. Askalite от 21.02.2020 / 18:14
21.02.2020 / 20:50  wRadchuk
Спасибо, протестирую.
Всего: 1

Реклама

Мы в соцсетях

vk tw tg yt