Atan2 в C # (или аналогичный язык) - PullRequest
2 голосов
/ 12 ноября 2010

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

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

Ответы [ 4 ]

3 голосов
/ 12 ноября 2010

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

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

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

0 голосов
/ 13 июля 2011

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

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

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

С уважением

0 голосов
/ 30 декабря 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;
0 голосов
/ 29 декабря 2010

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

Описание алгоритма CORDIC приведено в Википедии, а более подробные сведения приведены в этой статье . Кроме того, я вижу версию CORDIC GPL для C ++ в исходном коде проекта обработки сигналов с использованием 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
    }
}
...