С++ Преобразование углов в координаты

В настоящее время я пытаюсь преобразовать 2 угла в x, y, z, используя формулу из Matlab из Mathworks, Sph2Cart

http://www.mathworks.com/help/techdoc/ref/sph2cart.html

Алгоритм:

x = r .* cos(elevation) .* cos(azimuth)
y = r .* cos(elevation) .* sin(azimuth)
z = r .* sin(elevation)

In C++

clax = 1 * cos((Altitude/360)*(2*XM_PI)) * cos((Azimuth/360)*(2*XM_PI));
clay = 1 * sin((Altitude/360)*(2*XM_PI));
claz = 1 * cos((Altitude/360)*(2*XM_PI)) * sin((Azimuth/360)*(2*XM_PI));

Но независимо от того, что такое высота и азимут, клаксу, глине и клазу соответствует либо 0, либо 1.

Я уверен, что я сделал ошибку, и я буду смеяться после этого, насколько я был глуп. Но на самом деле я понятия не имею, почему это не работает, почему значения дают только 1 или 0 для каждого из них...


person Miguel P    schedule 12.08.2012    source источник
comment
Не на рабочей станции для проверки, но с первого взгляда я вижу две вещи, которые нужно проверить: 1) Вы выполняете целочисленную математику в вызовах триггеров... вам нужно выполнять математику с плавающей запятой (т.е. высота должна быть double и вы делите на 360.) и 2) убедитесь, что ваши аргументы для триггерных функций указаны в радианах, а не в градусах   -  person K. Brafford    schedule 12.08.2012


Ответы (3)


По всей вероятности, вы объявили clax как некоторый целочисленный тип (например, int, long,...). В противном случае Altitude или Azimuth могут быть объявлены как целые типы. В этом случае вы всегда будете получать кратные 2*pi аргументы тригонометрических функций.

person bitmask    schedule 12.08.2012
comment
@ user1492812: Какой тип у Altitude и Azimuth? - person bitmask; 12.08.2012
comment
Хорошо, они были объявлены как целые числа, изменили их на двойные, теперь значение меняется от 0 до 1 (на самом деле между ними), извините за эту ошибку. - person Miguel P; 12.08.2012

Не уверен, что это полезно, но работает для меня....

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    double XM_PI = 3.14159;
    double Altitude = 32;
    double Azimuth = 24;
    double clax = 1 * cos((Altitude/360)*(2*XM_PI)) * cos((Azimuth/360)*(2*XM_PI));
    double clay = 1 * sin((Altitude/360)*(2*XM_PI));
    double claz = 1 * cos((Altitude/360)*(2*XM_PI)) * sin((Azimuth/360)*(2*XM_PI));
    std::cout << "clax=" << clax << endl;
    std::cout << "clay=" << clay << endl;
    std::cout << "claz=" << claz << endl;
}

Отвечать :

clax=0.774731
clay=0.529919
claz=0.344932

Как уже говорили другие, убедитесь, что все переменные имеют значение float/double. Также проверьте, что такое XM_PI. Если это каким-то образом 0, это объясняет ваш результат.

person Chip    schedule 12.08.2012

Проблема, скорее всего, в делении Altitude/360 и Azimuth/360, когда Altitude и Azimuth являются целыми числами. Это выполнит целочисленное деление, и вы потеряете дроби. В качестве наглядного примера попробуйте этот код

#include <iostream>
#include <cmath>

int main()
{
    int angle = 90;
    std::cout << std::sin((angle/360)*(2*M_PI)) << std::endl;
    std::cout << std::sin((angle/360.0)*(2*M_PI)) << std::endl;
    std::cout << std::sin((angle/360.0)*(2.0*M_PI)) << std::endl;
    return 0;
}

который выводит

0
1
1

Обратите внимание, что первый ноль явно неверен.

Чтобы исправить свой код, просто измените целочисленные константы с 360 на двойные константы 360.0.

person Mehrwolf    schedule 12.08.2012