Найти точку на окружности с заданной центральной точкой, радиусом и степенью


прошло 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 66

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);

ответ должен быть прямо противоположным.

X = Xc + rSin (угол)

Y = Yc + rCos (угол)

где Xc и Yc-координаты центра круга, а r-радиус.

рекомендую:

 public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 
pivot, Vector3 angles)
    {
	    return Quaternion.Euler(angles) * (point - pivot) + pivot;
    }