Подтвердить что ты не робот

Расчет точки на окружности круга от угла в С#?

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

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

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. Я думал, что проверил это достаточно хорошо, но, очевидно, этого не сделал. Спасибо всем за их время, надеюсь, что рабочий код выше окажется полезным для кого-то еще.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

версия 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)
}

Ответ 4

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

Ответ 5

-(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;   
    }

Ответ 6

Я не знаю С#, так или иначе, если вы пытаетесь нарисовать точки где-то, вы должны учитывать тот факт, что ось Y сгибается сверху вниз, поэтому ваш sin должен быть -sin (...), а не + sin (...)

так

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

должен стать:

result.Y = centerPoint.Y - (int)Math.Round( distance * Math.Sin( angle ) );

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