Преобразования из полярных координат в прямоугольные координаты


Это критическое для производительности. Я измерил и определил, что с помощью корня быстрее, чем используя что способ.

Я знаю, что этот код работает только на некоторых моментах, так что это не проблема.

Точка это система.Чертеж.Точка. _offset также тип точки.

Я предположил, и профайлер, казалось, подтверждали, что попробовать/поймать не замедлит код, если возникает исключение. Пожалуйста, поправьте меня, если что не так.

/// <summary>
/// Convert from polar coordinates to rectangular coordinates.
/// Only works for points to the left of the origin.
/// </summary>
/// <param name="radius">The radius of the point in pixels.</param>
/// <param name="theta">The angle of the point in radians.</param>
/// <returns>The point in rectangular coordinates.</returns>
internal Point PolarToRectangular(
        double radius,
        double theta)
{
    try
    {
        double sin = Math.Sin(theta);

        // This is faster then:
        // double cos = Math.Cos(theta);
        double cos = -Math.Sqrt(1 - (sin * sin));

        Int32 x = _offset.X + (Int32)Math.Round(radius * cos);
        Int32 y = _offset.Y + (Int32)Math.Round(radius * sin);

        return new Point(x, y);
    }
    catch (OverflowException ex)
    {
        ex.Data.Add("Screen polar Radius", radius);
        ex.Data.Add("Screen polar Theta", theta);
        throw;
    }
}


Комментарии
2 ответа

Да я думаю, что это будет довольно быстро. Это может быть заманчивым, чтобы переместить потому что в Calc, так что это полный Пифагор с радиусом. Это позволит сохранить задание, но мне кажется, это требует дополнительного умножения (1*1 уже известно, в текущей версии).

Как вопрос личного стиля (возможно, потому что я код на нескольких языках), но я хотел бы использовать разные имена для Ваш грех и переменные, потому что. большинство языков не согласится на это, и он бы, лично, есть потенциал, чтобы запутать меня.

12
ответ дан 24 января 2011 в 07:01 Источник Поделиться

Я хотел бы рассмотреть, используя таблицу поиска, чтобы найти ваши синусы. Насколько точным углом вы высчитывать? Этот ответ на StackOverflow имеет некоторые интересные сведения о том, как построить один и ориентиры для его использования до двух знаков после запятой. Если вы используете полную точность double, то ваш текущий метод будет быстрее, но если у вас есть фиксированное точности, таблица поиска будет полезным.

Пока исключением является исключительным (и мне кажется, это так) он будет добавить очень маленькие накладные расходы на время выполнения. См.: https://stackoverflow.com/q/52312/487663.

16
ответ дан 25 января 2011 в 03:01 Источник Поделиться