Atan2 на C# (или аналогичном языке)

Может ли кто-нибудь указать мне на хороший пример Atan2, определенного на C# (или что-то смутно близкое к C#), в котором не используются какие-либо внутренние математические методы? Это на .NET Microframework, поэтому нет такой вещи, как внутренняя математическая библиотека. Я уже определил Sin()/Cos(), но у меня большие проблемы с Atain2.

В NETMF есть несколько разрозненных математических библиотек, но я обнаружил, что все они имеют недостатки или сломаны. Один из основных даже не дал правильного определения PI!


person chris12892    schedule 12.11.2010    source источник
comment
Я уже определил Sin()/Cos() разве они уже не во фреймворке? msdn.microsoft.com/en-us/library/cc506479.aspx   -  person Jonas Elfström    schedule 12.11.2010
comment
Есть ли на вашей целевой платформе FPU?   -  person Jonas Elfström    schedule 12.11.2010
comment
В библиотеке Elze Kool был неправильный PI, Sin()/Cos() ARE в фреймворке, но они возвращают целые числа, и моя целевая платформа не имеет FPU, но скорость не проблема.   -  person chris12892    schedule 12.11.2010


Ответы (4)


Реализация должна быть довольно простой, начиная с определения на Wikipedia/atan2 и затем используя бесконечное расширение арктангенса в Википедии.

Просто суммируйте члены в ряду, пока последний член не станет достаточно маленьким для вашего приложения.
Ошибка меньше, чем последний член, так как это строго убывающая функция.

Изменить:
Поскольку вы работаете с платформой .NET Micro, у вас может не хватать вычислительных ресурсов. В зависимости от требуемой точности вы можете предварительно рассчитать таблицу значений cos, sin, atan2 и т. д. и просто использовать простой поиск ближайшего значения. С другой стороны, это тратит немного памяти, если вам нужна слишком высокая точность.

person Albin Sunnanbo    schedule 12.11.2010
comment
На самом деле мне нужна изрядная точность, поэтому таблица поиска не сработает. Мне действительно нужно вычислить это на месте. - person chris12892; 12.11.2010

Рассматривали ли вы/пробовали реализовать алгоритм CORDIC? Это позволит вам реализовать функцию atan, из которой легко сгенерировать функцию atan2.

Описание алгоритма CORDIC находится в Википедии, а подробные сведения — в этой статье. . Кроме того, я вижу GPL C++-версию CORDIC в исходном коде обработки сигналов с использованием C++ ( SPUC) проект. Он включает в себя математическую библиотеку, но может быть изменен, чтобы избежать этого. На кодерах есть удобный листинг кода, если вы хотите увидеть код.

Если вас не интересует скорость, при любой реализации atan(z), возвращающей значения от -pi/2 до pi/2 (или от -90 до 90), вы можете реализовать atan2(y,x), возвращающую значения от 0 до 2pi (или 360) запросто. Вот пример псевдокода:

atan2(y,x){
    if (x < 0){
        return (atan(y/x)+3*pi/2); // subst 270 for 3*pi/2 if degrees
    }else{
        return (atan(y/x)+pi/2); // subst 90 for pi/2 if degrees
    }
}
person sage    schedule 28.12.2010

Это реализация Pascal с числами с фиксированной точкой, если ArcTan уже реализован:

function Fix64ArcTan2(const y, x: fix64): fix64;
// based on http://en.wikipedia.org/wiki/Atan2
// Variation of the arctangent function. For any real arguments x and y not both
// equal to zero, arctan2(x,y) is the angle in radians between the positive x-axis
// of a plane and the point given by the coordinates (x,y) on it.
var
  result: fix64;
begin
  if x = 0.0 then
    if y = 0.0 then
      result := 0.0; // ArcTan2(0,0) is undefined, but I had to return something !!!
    elsif y > 0.0 then
      result := FIX_PIHALF;
    else // y < 0.0
      result := -FIX_PIHALF;
    endif;
  else
    result := Fix64ArcTan(Fix64Div(y,x));
    if x < 0.0 then
      if Y < 0.0 then
        result := result - FIX_PI;
      else // y >= 0.0
        result := result + FIX_PI;
      endif;
    endif;
    if result > FIX_PI then
      result := result - FIX_PITWO;
    endif;
  endif;
  return(result);
end;
person avra    schedule 30.12.2010

Какую доску вы используете. У ребят из GHI есть пространство имен GHI....System, которое определяет MathEx со всеми недостающими математическими функциями.

Извините, что не предоставил ссылки, но я на работе, поэтому дома у меня нет доступа к моему коду .NET MF.

Надеюсь, это поможет.

С Уважением

person Gineer    schedule 13.07.2011