Тема: Как с максимальной точностью перевести градусы в радианы?

Как бы вопрос не казался приметивным, а суть в следующем в точности.
Акад оперирует с радианами. Допустим я получил угол между двумя векторами. Теперь я хочу дать пользователю посмотреть на это значение в градусах. Если пользователь внесет изменения, то перевести градусы в радианы и изменить угол между векторами.
Такая вот простая задача. Но во всех примерах я посмотрел и там тупо дефайнят PI. Причем каждый раз с разной точностью. Что может приводить к таким эффектам как - я беру и говорю 90/2*PI - где PI-задефайнено в примере. Потом рисую прямой угол в акаде - спрашиваю у акада угол и получаю другое значение его в радианах в отличие от того что ввел я... с некоторой точностью.
Вопрос. Есть ли в ObjectARX некоторая задефайненная переменная PI, которая используется самим автокадом для перевода из градусов в радианы, а еще лучше api - функции типа перевода в обе стороны...
С Уважением, Константин.

Re: Как с максимальной точностью перевести градусы в радианы?

Насколько я знаю, такой переменной нет.
1) IMHO используется M_PI из math.h.
2) В AutoLISP есть переменная pi, значение которой 3.141592653589793 - можешь пользоваться ею.
3) Если речь идет об общении с пользователем, т.е. ты должен будешь выводить строки, которые представляют градусы, то для этой цели есть пара функций acdbAngToS и acdbAngToF.

Re: Как с максимальной точностью перевести градусы в радианы?

Я не столько сколько про пользователя - сколько про точность.
Типа в приерах с акадом что я нашел.
PI = 3.14159265359
И как раз если юзать 3.141592653589793 из math.h и идут все эти расхождения. Т.е. если я сам поставлю программно угол как angle*PI/180, то он будет отличен от того, если я в акаде в строке запроса вобью angle - т.к. акад юзает свое PI. Но у акада есть еще свои настройки точности - т.е. то что вводит пользователь оно дискретно с некоторой указанной в свойствах точностью, а вот то что я забиваю программно - оно не дискретно (с точностью до цифр с плавающей точкой). Т.е. я могу ввести вектор программно {double, double, double}, который из обычного акада создать нельзя в силу искуственной дискретности ввода (толерантность чтоли зовется) :( :( :(

Re: Как с максимальной точностью перевести градусы в радианы?

С одной стороны я понимаю твои проблемы, которые всегда возникают при работе с плавающими значениями. С другой стороны IMHO нужно поступать так при запросе угла у пользователя:
1) Преобразовать его радианы в строку согласно твоим установкам или установкам пользователя:

double rads; // Вычисленный тобой угол в радианах
char degs[32];
acdbAngToS(rads,0,-1,degs);

После этого ты выводишь значение degs и запрашиваешь новое значение угла. Если пользователь просто нажал ENTER (подтвердил значение - т.е. acedGetAngle возвращает RTNONE), то ты пользуешься значением rads, если нет, то тем, которое он ввел.

Re: Как с максимальной точностью перевести градусы в радианы?

Александр спасибо. Примерно к тем же выводам пришел и я. Только вот запрашиваю угол в диалоговом окошке в эдитбоксе. Там acedGetAngle возвращается в углах в виде double-а. Можно конечно запрашивать в виде строки, потом конвертировать в радианы, но это все от плохой жизни :). Ладно спасибо, я пока забил на точность... если окажется критичным (был прицендент), то придется писать всякоумные переводы.
Более того - PI очень часто нужно при всяких там проверках на попадания в четверть и т.п., страдаю о того что нет автокадовского PI в их библиотеке. Приходится изворачиваться и юзать всякие cross перемножения векторов и т.п. - хотя с мат. точки зрения - это и корректней :)

Re: Как с максимальной точностью перевести градусы в радианы?

Первопричина почему я к этому докопался.
Однажды врубил math.h и решил нарисовать элипс по точкам. Типа цикл:
double delta = 2*PI/30;
for(int i = 0; i <= 30; i++)
{
}
Типа последняя точка i==30 должна попасть на 1-ю. Щас... меняю PI - и наблюдаю как ездит начальная и конечная точка друг относительно друга :) Пришлось в конец массива тупо добавлять первую точку чтоб совпало.

Re: Как с максимальной точностью перевести градусы в радианы?

Я использую в качестве PI = (atan(1.0) * 4.0), где-то в примерах видел, может быть это будет точнее?

Re: Как с максимальной точностью перевести градусы в радианы?

> bkrug
Кстати, на лиспе
(= pi (* (atan 1.0) 4.0))
возвращает T
Короче, лисп использует одну и ту же константу...

Re: Как с максимальной точностью перевести градусы в радианы?

Я пока ввел свою толерантность в проге. Типа углы округляю с точностью до 0.00001 градуса. Наверное действительно это проблема не автокада, а принципиальный вопрос о точностях вычислений. Просто когда в сторонней библиотеке есть функционал с радианами, то неплохо бы разработчикам и свое Pi вставлять.
А получить Pi автокадовсое можно проще.
double Pi = AcGeVector3d(1,0,0).angleTo(AcGeVector3d(-1,0,0));