Как рассчитать положение по кругу с определенным углом?
Я пытаюсь понять, как я могу вычислить координаты по кругу. Для простоты я сделал несколько изображений.
![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). Просто добавьте сдвиг, если центр отсутствует.