Вычислить точку на окружности окружности от угла в C #? - PullRequest
40 голосов
/ 23 марта 2009

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

Мой текущий код:

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 ]

34 голосов
/ 23 марта 2009

Вы забыли добавить центральную точку:

result.Y = (int)Math.Round( centerPoint.Y + distance * Math.Sin( angle ) );
result.X = (int)Math.Round( centerPoint.X + distance * Math.Cos( angle ) );

Остальное должно быть в порядке ... (какие странные результаты вы получали?

6 голосов
/ 23 марта 2009

Во-первых, поскольку вы находитесь в радианах, вероятно, полезно определить угол так:

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);
3 голосов
/ 08 августа 2017

Версия 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)
}
1 голос
/ 20 сентября 2012
-(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;   
    }
1 голос
/ 23 марта 2009

Без дополнительной информации о точных ошибках трудно сказать, что не так. Уравнения выглядят правильно и должны работать. Вы уверены, что углы, в которых вы проходите, верны для углов> 90 градусов? Единственное, о чем я мог подумать, это то, что вы умножаете расстояние (целое число) на результат Math.sin (double), но это не должно быть проблемой.

0 голосов
/ 23 марта 2009

Я не знаю 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 ) );

Если вы не пытаетесь их нарисовать, я не могу представить, в чем проблема, вы можете привести пример?

...