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

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

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, но не сохраняет их.

Ответ 1

Вот как:

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 градусов находится в самом северном положении круга:

enter image description here

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

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

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

Ответ 2

Здесь нужна какая-то математика. Вам нужно знать, перпендикулярны ли две линии друг другу, умножение этих двух градиентов линий должно равняться -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 степени.

Ответ 3

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

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

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

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