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

Прошло 10 лет с тех пор, как я сделал такую ​​математику ... Я программирую игру в 2D и перемещаю игрока. При перемещении игрока вокруг я пытаюсь вычислить точку на окружности в 200 пикселях от позиции игрока, учитывая положительный ИЛИ отрицательный угол (градус) в диапазоне от -360 до 360. Экран 1280x720, где 0,0 является центральной точкой экрана. Игрок перемещается по всей этой декартовой системе координат. Точка, которую я пытаюсь найти, может быть за кадром.

Я попробовал формулы в статье Найти точку с радиусом и угол , но я не верю, что я понимаю, что такое «Угол», потому что я получаю странные результаты, когда я передаю Угол как -360 до 360 в Cos (угол) или Sin (угол).

Так, например, у меня есть ...

  • 1280x720 на декартовой плоскости
  • Центральная точка (позиция игрока):
    • пусть x = число от минимального -640 до максимального 640
    • let y = число от минимального -360 до максимального 360
  • Радиус круга вокруг игрока: пусть r всегда = 200
  • Угол: пусть a = число, заданное в диапазоне от -360 до 360 (разрешить отрицательному указателю вниз или положительному указателю вверх, чтобы -10 и 350 дали одинаковый ответ)

Какова формула для возврата X по кругу?

Какова формула для возврата Y по кругу?

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

70 голосов | спросил Kyle Anderson 31 MonEurope/Moscow2012-12-31T04:23:13+04:00Europe/Moscow12bEurope/MoscowMon, 31 Dec 2012 04:23:13 +0400 2012, 04:23:13

9 ответов


0

Простые уравнения, которые вы связали, чтобы дать координаты X и Y точки на окружности относительно центра окружности .

X = r * cosine(angle)  
Y = r * sine(angle)

Это говорит о том, как далеко точка смещена от центра круга. Поскольку у вас есть координаты центра (Cx, Cy), просто добавьте вычисленное смещение.

Координаты точки на окружности:

X = Cx + (r * cosine(angle))  
Y = Cy + (r * sine(angle))
ответил yoozer8 31 MonEurope/Moscow2012-12-31T04:28:31+04:00Europe/Moscow12bEurope/MoscowMon, 31 Dec 2012 04:28:31 +0400 2012, 04:28:31
0

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

Однако, поскольку вы упомянули измерение угла в диапазоне от -360 до 360, вы, вероятно, используете неправильные единицы для вашей математической библиотеки. Большинство реализаций тригонометрических функций используют радианы для их ввода. И если вы вместо этого будете использовать градусы ... ваши ответы будут странно неправильными.

x_oncircle = x_origin + 200 * cos (degrees * pi / 180)
y_oncircle = y_origin + 200 * sin (degrees * pi / 180)

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

ответил Seth Battin 31 MonEurope/Moscow2012-12-31T04:27:48+04:00Europe/Moscow12bEurope/MoscowMon, 31 Dec 2012 04:27:48 +0400 2012, 04:27:48
0

Я настоятельно рекомендую использовать матрицы для этого типа манипуляций. Это наиболее общий подход, см. Пример ниже:

// 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
ответил Johan Larsson 2 Jpm1000000pmWed, 02 Jan 2013 22:34:12 +040013 2013, 22:34:12
0
  

Я получаю странные результаты, когда передаю Angle от -360 до 360 в Cos (угол) или Sin (угол).

Я думаю, что ваша попытка не сработала в том, что вы проходили углы в градусах. Тригонометрические функции sin и cos ожидают углы выражается в радианах, поэтому числа должны быть от 0 до 2*M_PI. Для d градусов вы передаете M_PI*d/180.0. M_PI - это константа, определенная в заголовке math.h .

ответил dasblinkenlight 31 MonEurope/Moscow2012-12-31T04:28:41+04:00Europe/Moscow12bEurope/MoscowMon, 31 Dec 2012 04:28:41 +0400 2012, 04:28:41
0

Мне также нужно было это, чтобы сформировать движение стрелок часов в коде. Я попробовал несколько формул, но они не сработали, поэтому я пришел к следующему:

  • движение по часовой стрелке
  • баллы - каждые 6 градусов (потому что 360 градусов, поделенных на 60 минут - это 6 градусов)
  • длина руки - 65 пикселей
  • центр - х = 75, у = 75

Таким образом, формула будет

x=Cx+(r*cos(d/(180/PI))
y=Cy+(r*sin(d/(180/PI))

где x и y - точки на окружности круга, Cx и Cy - координаты x, y центра, r - радиус, а d - количество градусов.

ответил Wraithious 14 SunEurope/Moscow2014-12-14T09:45:50+03:00Europe/Moscow12bEurope/MoscowSun, 14 Dec 2014 09:45:50 +0300 2014, 09:45:50
0

Вот реализация 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);
ответил MD. Nazmul Kibria 19 AMpThu, 19 Apr 2018 08:17:04 +030017Thursday 2018, 08:17:04
0

Я хотел бы рассказать о том, как ваш вклад помог мне создать ЖК-компас Arduino. Надеюсь, это правильный этикет ... Я только что присоединился к stackoverflow, чтобы поблагодарить вас, ребята.

Стоя на плечах геометрических гигантов выше, я смог создать образец этого компаса: TFT-компас Arduino с несколькими подшипниками

Код для функции, которую я неоднократно вызывал (для разных ориентиров, которые вы видите в крошечном желтом тексте), написан на Arduino (вроде «C») ... и довольно переводим:

void PaintCompassNeedle( int pBearingInDegrees, int pRadius, TSPoint pCentrePt ) {
    // ******************************************************************************
    // * Formula for finding pointX on the circle based on degrees around the circle:
    // * x_oncircle = x_origin + radius * cos (degrees * pi / 180)  
    // * y_oncircle = y_origin - radius * sin (degrees * pi / 180) //minus explained
    // * Thanks to folks at stackoverflow...standing on the shoulders of giants. :) 

    float bearingInRads = (pBearingInDegrees) * PI / 180; 
    // Degrees vs Rads...The math folks use Rads in their formulas

    // *******************************************************************
    // * bearingPt is the point on the circle that we are trying to find
    TSPoint bearingPt;
    // Find the X on the circle starting with orgin (centre)
    bearingPt.x = pCentrePt.x + pRadius * sin(bearingInRads); 
    // Notice the "minus" R * cos()...because TFT the y is upside down bearingPt.y = 
    pCentrePt.y - pRadius * cos(bearingInRads); 
    // * Extra Explanation: The TFT is the graphical display I'm using and it
    // * calculates x & y from the top left of screen (portrait mode) as (0,0)
    // * ...so by Subtracting from the Y orgin...I flip it vertically
    // * Other folks using x,y as increasing to the right and up respectively
    // * would keep the plus sign after the pCentrePt.y
    // *************************************************************************

    // ***************************************************************
    // * This part will change for the final product...but leaving
    // * it because when call numerous times it shows it working for
    // * a number of different quadrants (displaying yellow degrees text)
    tft.fillCircle( bearingPt.x, bearingPt.y, 5, RED); 
    tft.setCursor( bearingPt.x, bearingPt.y );
    tft.setTextSize( 1 );
    tft.setTextColor( YELLOW );
    tft.print( pBearingInDegrees );

    TSPoint innerPt;
    innerPt.x = pCentrePt.x + pRadius/2 * sin(bearingInRads);
    innerPt.y = pCentrePt.y - pRadius/2 * cos(bearingInRads);
    tft.drawLine(innerPt.x, innerPt.y, bearingPt.x, bearingPt.y, RED);

}
ответил TomOfMilton 30 SunEurope/Moscow2018-12-30T22:54:04+03:00Europe/Moscow12bEurope/MoscowSun, 30 Dec 2018 22:54:04 +0300 2018, 22:54:04
0

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

X = Xc + rSin (угол)

Y = Yc + rCos (угол)

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

ответил Aditya Aggarwal 8 Jam1000000amSun, 08 Jan 2017 06:57:14 +030017 2017, 06:57:14
0

Рекомендуют:

  public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 
pivot, Vector3 angles)
    {
	    return Quaternion.Euler(angles) * (point - pivot) + pivot;
    }
ответил kid 15 AM00000090000001331 2017, 09:25:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132