Вычислить точку на окружности окружности от угла в C#?
Я думаю, что это простой вопрос, но я получаю некоторые странные результаты с моим текущим кодом, и у меня нет математического фона, чтобы полностью понять, почему. Моя цель проста, как указано в заголовке: я просто хочу найти точку на некотором расстоянии и под углом от центральной точки.
Мой текущий код:
Point centerPoint = new Point ( 0, 0 );
Point result = new Point ( 0, 0 );
double angle = 0.5; //between 0 and 2 * PI, angle is in radians
int distance = 1000;
result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );
result.X = centerPoint.X + (int)Math.Round( distance * Math.Cos( angle ) );
В общем, это, кажется, работает довольно разумно, но у меня возникают проблемы в разных точках, особенно когда угол соответствует точкам на отрицательной оси x и y. Очевидно, я делаю что-то не так - мысли о том, что это такое?
ОБНОВЛЕНИЕ: Это была моя ошибка, этот код работает отлично - несколько неработающих выбросов фактически были из-за ошибки в вычислении угла для 1,5PI. Я думал, что проверил это достаточно хорошо, но, очевидно, не сделал. Спасибо всем за уделенное время, надеюсь, что приведенный выше рабочий код окажется полезным для кого-то еще.
6 ответов
Вы забыли добавить центральную точку:
result.Y = (int)Math.Round( centerPoint.Y + distance * Math.Sin( angle ) );
result.X = (int)Math.Round( centerPoint.X + distance * Math.Cos( angle ) );
Остальное должно быть в порядке... (какие странные результаты вы получили? Можете ли вы дать точную информацию?)
Во-первых, так как вы находитесь в радианах, вероятно, полезно определить ваш угол так:
double angle = (Math.PI / 3); // 60 degrees...
Сами функции работают нормально. Округление повлияет на ваш ответ, только если ваше расстояние достаточно мало. Кроме этого, ответы должны выходить просто отлично.
Если вас беспокоит округление, помните, что по умолчанию.NET выполняет банковское округление, и вы можете захотеть:
result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle), MidpointRounding.AwayFromZero);
result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle), MidpointRounding.AwayFromZero);
вместо.
Кроме того, в вопросе вы хотите расстояние X и угол Y... я предполагаю, что вы не относите это к точке (X,Y)
потому что это совсем другое.
Формула расстояния:
double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2);
Версия Swift3
func pointOnCircle(radius: Double, angleInDegrees: Double, origin: CGPoint) -> CGPoint {
let x = abs(Double(origin.x) + radius * cos(angleInDegrees * (.pi / 180)))
let y = abs(Double(origin.y) - radius * sin(angleInDegrees * (.pi / 180)))
return CGPoint(x: x, y: y)
}
-(NSMutableArray *)GetPointsForCircle
{
NSMutableArray *Points = [[NSMutableArray alloc] init];
CGPoint CenterPoint = CGPointMake(160, 230);
CGPoint Point;
for (float Angel = 0; Angel <= 360; Angel+= 60)
{
Point.x = CenterPoint.x + 100 * cos(Angel);
Point.y = CenterPoint.y + 100 * sin(Angel);
[Points addObject:[NSValue valueWithCGPoint:Point]];
}
return Points;
}
- (CGPoint)pointOnCircle:(int)thisPoint withTotalPointCount:(int)totalPoints
{
CGPoint centerPoint = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
float radius = 100.0;
float angle = ( 2 * M_PI / (float)totalPoints ) * (float)thisPoint;
CGPoint newPoint;
newPoint.x = (centerPoint.x) + (radius * cosf(angle));
newPoint.y = (centerPoint.y) + (radius * sinf(angle));
return newPoint;
}
Без дополнительной информации о точных ошибках трудно сказать, что не так. Уравнения выглядят правильно и должны работать. Вы уверены, что углы, в которых вы проходите, верны для углов> 90 градусов? Единственное, о чем я мог подумать, это то, что вы умножаете расстояние (целое число) на результат Math.sin (double), но это не должно быть проблемой.
Я не знаю C#, в любом случае, если вы пытаетесь нарисовать точки где-то, вы должны учитывать тот факт, что ось Y сгибается сверху вниз, поэтому ваш элемент sin должен иметь значение -sin (...) а не + грех (...)
так
result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );
должен стать:
result.Y = centerPoint.Y - (int)Math.Round( distance * Math.Sin( angle ) );
Если вы не пытаетесь их нарисовать, я не могу представить, в чем проблема, не могли бы вы привести пример?