Найти точку на окружности с заданной центральной точкой, радиусом и степенью
прошло 10 лет с тех пор, как я делал такую математику... Я программирую игру в 2D и перемещаю игрока. Когда я перемещаю плеер, я пытаюсь вычислить точку на круге в 200 пикселях от позиции игрока, учитывая положительный или отрицательный угол(градус) между -360 до 360. Экран 1280x720 с 0,0 является центральной точкой экрана. Игрок перемещается вокруг всей этой декартовой системы координат. Точка, которую я пытаюсь найти, может быть вне экрана.
Я пробовал формулы на статье найти точку с радиусом и углом но я не верю, что понимаю, что такое "угол", потому что я получаю странные результаты, когда я передаю угол от -360 до 360 в Cos(угол) или Sin(угол).
так, например, у меня...
- 1280x720 на декартовой плоскости
- центральная точка (положение игрока):
- пусть x = число от минимального -640 до максимальное 640
- пусть y = число от минимального -360 до максимального 360
- радиус окружности вокруг игрока: пусть r всегда = 200
- угол: пусть a = число, заданное от -360 до 360 (позвольте отрицательному указывать вниз или положительному указывать вверх, поэтому -10 и 350 дадут тот же ответ)
какова формула для возврата X на круг?
какова формула для возврата Y круг?
8 ответов:
простые уравнения, которые вы связали, чтобы дать координаты X и Y точки на окружности относительно центра окружности.
X = r * cosine(angle) Y = r * sine(angle)
Это говорит вам, как далеко точка смещается от центра круга. Поскольку у вас есть координаты центра (Cx, Cy), просто добавьте вычисленное смещение.
координаты точки на окружности являются:
X = Cx + (r * cosine(angle)) Y = Cy + (r * sine(angle))
вы должны размещать код, который вы используете. Это поможет точно определить проблему.
однако, поскольку вы упомянули измерение вашего угла с точки зрения -360 до 360, вы, вероятно, используете неправильные единицы для своей математической библиотеки. Большинство реализаций функций тригонометрии используют радианы для их ввода. И если вы используете Градусы вместо этого...ваши ответы будут не так странно.
x_oncircle = x_origin + 200 * cos (degrees * pi / 180) y_oncircle = y_origin + 200 * sin (degrees * pi / 180)
обратите внимание, что вы также можете столкнуться с обстоятельством, когда квадрант не то, что вы ожидаете. Это можно исправить, тщательно выбрав, где угол равен нулю, или вручную проверяя квадрант, который вы ожидаете, и применяя свои собственные знаки к значениям результата.
Я настоятельно рекомендую использовать матрицы для такого рода манипуляций. Это самый общий подход, см. пример ниже:
// The center point of rotation var centerPoint = new Point(0, 0); // Factory method creating the matrix var matrix = new RotateTransform(angleInDegrees, centerPoint.X, centerPoint.Y).Value; // The point to rotate var point = new Point(100, 0); // Applying the transform that results in a rotated point Point rotated = Point.Multiply(point, matrix);
- боковое Примечание, соглашение заключается в измерении угла против часовой стрелки начальной формы (положительной) оси X
Я получаю странные результаты, когда я передаю угол от -360 до 360 в Cos(угол) или Sin (угол).
Я думаю, что причина, по которой ваша попытка не сработала, заключается в том, что вы проходили углы в градусах. Элемент
sin
иcos
тригонометрические функции ожидают углы, выраженные в радианах, поэтому числа должны быть от0
до2*M_PI
. Ибоd
градусов передатьM_PI*d/180.0
.M_PI
- это константа, определенная в .
мне также нужно было это, чтобы сформировать движение стрелок часов в коде. Я попробовал несколько формул, но они не работали, так что это то, что я придумал:
- движения - по часовой стрелке
- очки-каждые 6 градусов (потому что 360 градусов, разделенных на 60 минут составляет 6 градусов)
- длина руки-65 пикселей
- центр-x=75, y = 75
Так что формула будет
x=Cx+(r*cos(d/(180/PI)) y=Cy+(r*sin(d/(180/PI))
где X и y-точки На окружность круга, Cx и Cy-координаты x,y центра, r-радиус, А d-количество градусов.
вот реализация c#. Метод вернет круговые точки, которые принимает
radius
,center
иangle interval
в качестве параметра. Угол передается как Радиан.public static List<PointF> getCircularPoints(double radius, PointF center, double angleInterval) { List<PointF> points = new List<PointF>(); for (double interval = angleInterval; interval < 2 * Math.PI; interval += angleInterval) { double X = center.X + (radius * Math.Cos(interval)); double Y = center.Y + (radius * Math.Sin(interval)); points.Add(new PointF((float)X, (float)Y)); } return points; }
и вызывающий пример:
List<PointF> LEPoints = getCircularPoints(10.0f, new PointF(100.0f, 100.0f), Math.PI / 6.0f);