Найти точку на круге с заданной центральной точкой, радиусом и степенью
Прошло 10 лет с тех пор, как я сделал математику, как это... Я программирую игру в 2D и перемещая игрока. Когда я перемещаю игрока вокруг, я пытаюсь вычислить точку на круге на 200 пикселей от позиции игрока, учитывая положительный или отрицательный угол (градус) между -360 и 360. Экран 1280x720 с 0,0, являющийся центральной точкой экрана. Игрок перемещается по всей этой картезианской системе координат. То, что я пытаюсь найти, может быть выключено.
Я попробовал формулы на статье Найти точку с радиусом и углом, но я не верю, что понимаю, что такое "Угол", потому что я получаю странные результаты когда я пропускаю Угол от -360 до 360 в угол (угол) или грех (угол).
Так, например, у меня есть...
- 1280x720 на картезированной плоскости
- Центральная точка (позиция игрока):
- пусть x = число от минимального -640 до максимума 640
- пусть y = число от минимум -360 до максимального 360
- Радиус круга вокруг игрока: пусть r всегда = 200
- Угол: пусть a = число, заданное между -360 и 360 (разрешить отрицательному указывать вниз или положительно, чтобы указать вверх, чтобы -10 и 350 дали тот же ответ)
Какова формула для возврата X в круг?
Какова формула для возврата Y по кругу?
![enter image description here]()
![enter image description here]()
Ответы
Ответ 1
Простые уравнения из вашей ссылки дают координаты X и Y точки на окружности относительно центра окружности.
X = r * cosine(angle)
Y = r * sine(angle)
Это говорит вам, насколько далеко точка смещена от центра круга. Поскольку у вас есть координаты центра (Cx, Cy), просто добавьте вычисленное смещение.
Координаты точки на окружности:
X = Cx + (r * cosine(angle))
Y = Cy + (r * sine(angle))
Ответ 2
Вы должны опубликовать код, который используете. Это поможет точно определить проблему.
Однако, поскольку вы упомянули измерение своего угла в пределах от -360 до 360, вы, вероятно, используете неправильные единицы для своей математической библиотеки. Большинство реализаций тригонометрических функций используют радианы для их ввода. И если вы используете графы вместо... ваши ответы будут странно неправильными.
x_oncircle = x_origin + 200 * cos (degrees * pi / 180)
y_oncircle = y_origin + 200 * sin (degrees * pi / 180)
Обратите внимание, что вы также можете столкнуться с обстоятельствами, когда квадрант не то, что вы ожидаете. Это можно зафиксировать путем тщательного выбора нулевого угла или путем ручной проверки квадранта, который вы ожидаете, и применения ваших собственных знаков к значениям результата.
Ответ 3
Я настоятельно рекомендую использовать матрицы для такого типа манипуляций. Это наиболее общий подход, см. Пример ниже:
// 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
Ответ 4
Я получаю странные результаты, когда пропускаю Угол от -360 до 360 в угол (угол) или грех (угол).
Я думаю, причина, по которой ваша попытка не срабатывала, заключается в том, что вы проходили углы в градусах. Тригонометрические функции sin
и cos
ожидают углы, выраженные в радианах, поэтому числа должны быть от 0
до 2*M_PI
. Для d
градусов вы пройдете M_PI*d/180.0
. M_PI
- константа, определенная в заголовке math.h
.
Ответ 5
Мне также понадобилось это, чтобы сформировать движение рук часов в коде. Я попробовал несколько формул, но они не сработали, поэтому вот что я придумал:
- движение - по часовой стрелке
- - каждые 6 градусов (потому что 360 градусов, разделенных 60 минутами, составляет 6 градусов).
- длина руки - 65 пикселей
- center - 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 - количество градусов.
Ответ 6
Вот реализация С#. Метод возвращает круговые точки, которые принимают 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);
Ответ 7
Я хотел бы поделиться тем, как ваш вклад помог мне создать ЖК-компас Arduino. Надеюсь, это правильный этикет... Я только что присоединился к stackoverflow, чтобы поблагодарить вас, ребята.
Стоя на плечах геометрических гигантов выше, я смог изготовить этот образец компаса: Arduino TFT компас с несколькими подшипниками
Код для функции, которую я вызывал неоднократно (для разных ориентиров, которые вы видите в крошечном желтом тексте), написан на 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);
}
Ответ 8
Ответ должен быть совершенно противоположным.
X = Xc + rSin (угол)
Y = Yc + rCos (угол)
где Xc и Yc - координаты центра круга, а r - радиус.
Ответ 9
Рекомендуют:
public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3
pivot, Vector3 angles)
{
return Quaternion.Euler(angles) * (point - pivot) + pivot;
}
Ответ 10
Вы можете использовать это:
Уравнение круга
где
(x-k)2+(y-v)2=R2
где k и v постоянны, а R является радиусом