Как вычислить положение по кругу с определенным углом?

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

http://i.stack.imgur.com/y1F2y.png

Это начало с информацией, которую я имею. Теперь мне нужно вычислить новые координаты, когда, например, круг повернется на 90 градусов вправо. Как и в следующем изображении:

http://i.stack.imgur.com/ckopK.png

Мне нужно вычислить координаты новой красной точки. (Мне также нужно это с разной степенью, например, 20 градусов).

Для этого мой план состоял в следующем:

  • Рассчитать расстояние между двумя точками
  • Вычислите степень между севером (вверх) и данной точкой
  • Вычислите новое местоположение со степенью (с шага назад) + градусы, которые необходимо повернуть (в изображениях 90 градусов).

Мой первый шаг:

distance = Math.sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y)) 

Часть для вычисления новых градусов:

 double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x); theta += Math.PI/2.0; 

И последняя часть для расчета нового местоположения будет:

 double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta)); double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta)); 

Однако, когда я делаю эти вычисления, например, с 0 градусами, он все равно возвращает другое значение, чем исходные координаты.

Любая помощь будет оценена!

Редактировать для Филиппа Джахода:

Мои значения:

 distance +- 70, currentDegree = 0. PointF point = new PointF((float)mMiddleView.getX(), (float)mMiddleView.getY()); PointF point2 = getPosition(point, (float) distance, currentDegree); 

И мои результаты:

 center: PointF(490.0, 728.0) radius: 78.0 angle: 0.0 new point: PointF(568.0, 728.0) 

Как вы можете видеть, степень равна 0, поэтому точка не должна поворачиваться. Он должен поддерживать координаты 490, 728, но он не сохраняет их.

Solutions Collecting From Web of "Как вычислить положение по кругу с определенным углом?"

Вот как:

 private PointF getPosition(PointF center, float radius, float angle) { PointF p = new PointF((float) (center.x + radius * Math.cos(Math.toRadians(angle))), (float) (center.y + radius* Math.sin(Math.toRadians(angle)))); return p; } 

Этот метод вычисляет положение вокруг центра круга (в центре вашего вида) в зависимости от радиуса и угла. Угол в градусах.

PointF будет содержать координату x и y вычисленной позиции.

Имейте в виду, что 0 градусов находится в самом восточном положении круга, 270 градусов находится в самом северном положении круга:

Введите описание изображения здесь

Поэтому, если центр вашего представления находится в x: 100, y: 100, и вы вычисляете позицию с углом 0 градусов и радиусом 50, результатом будет x: 150, y: 100

Если вы используете угол 90 градусов и радиус 50, результатом будет x: 100, y: 150

Он используется здесь в моей картографической библиотеке, и она работает.

Здесь нужна какая-то математика. Вам нужно знать, перпендикулярны ли две линии друг другу, умножение этих градиентов двух линий должно равняться -1 .

затем

 m1=(770-500)/(540-400)=27/14 

так же

 m2=(y-770)/(x-540) 

(x,y) – это точка, которую вы хотите найти.

Теперь

 m1*m2=-1 

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

Вы можете получить другой, рассматривая радиус круга.

 r=sqrt((540-400)^2+(770-500)^2) 

Так же

 r=sqrl((x-540)^2+(y-770)^2) 

Теперь у вас есть два уравнения и их нужно решить. Это даст вам два набора координат. Так как может быть -90 и 90 градусов.

Один из лучших способов добиться этого – использование сложных чисел, доступных здесь, например.

В псевдокоде:

 z = (x_old + I*y_old)*exp(I*angle); x_new = real(z); y_new = imag(z); 

ПРИМЕЧАНИЕ: angle должен находиться в радианах. ПРИМЕЧАНИЕ 2: это предполагает окружность с центром в (0,0). Просто добавьте сдвиг, если центра нет.