Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Vector to Angle (проблема с трегонометрией) [Delphi, OpenGL, Windows]


Кефир87 ©   (2005-06-06 18:54:00) 

Не большая проблемка. Есть:

 CWEVector = record
   nx,ny,nz:GLfloat;
 end;

 CWEAngle3d = record
   xang,yang : GLfloat;
 end;


С преобразованием углов в вектор все нормально:
function  cweGenVectora(xang,yang:Glfloat):CWEVector;
var
 a : GLfloat;
begin
 a := cweCos(yang);
 Result.nx := cweCos(xang)*a;
 Result.nz := cweSin(xang)*a;
 Result.ny := cweSin(yang);
end;

Есть и другая интерпретация но думаю все понятно...

Вот теперь мне нужно из вектора получать обратно два угла. Ну во так вот мне нужно.
Ясно что нужны arcsin и arccos но где?...


frame   (2005-06-07 23:44:00) [1]

Всё очень просто: считаем арктангенс, если меньше нуля - прибавляем 2*пи. Если всё-таки нужны арксинусы-косинусы, не используй math(просто зря увеличивает размер программы), возьми вот это:

function ArcCos(X:Extended):Extended;assembler;
asm
  fld1    
  fld X
  fmul st,st
  fchs
  faddp
  fsqrt
  fld X
  fpatan
  fwait
end;

function ArcSin(X:Extended):Extended;assembler;
asm
  fld X
  fld1
  fld X
  fmul st,st
  fchs
  faddp
  fsqrt
  fpatan
  fwait
end;

В math.pas это всё есть на паскале, по я прошёлся отладчиком - код и по размеру и по скорости не выдерживает никакой критики)


Кефир87   (2005-06-07 22:58:00) [2]

У меня по ассемблеру только базовые знания... Но что, черт возьми, это за комманды? Однако попробую, спасибо 8)


frame   (2005-06-07 21:43:00) [3]

ArsSin и Arccos считаются через ArcTan, намного проще считать через него,вообще попробуй мою реализацию

function GetAngle(dX,dY:Extended):Extended;assembler;
asm
fld dY
fld dX
fpatan
ftst
fstsw ax
sahf
jnbe @@exit
fldpi
fadd st,st
faddp
@@exit:
fwait
end;


keal   (2005-06-07 13:16:00) [4]

где-то у меня есть исходники работающего вычисления, не могу найти... попробуй так

yang := ArcSin(Result.ny);

xang := ArcSin(Result.nz / cweCos(yang));
 или  
xang := ArcCos(Result.nx / cweCos(yang));


Zer0   (2005-06-07 00:59:00) [5]

для начала нужно определить: относительно каких векторов будем мерять углы и в какой системе координат(бывают сферические, цилиндрические, декартовы, биконические и проч.)


Кефир87   (2005-06-06 22:12:00) [6]

Видать не только у меня проблемы 8) Или эта задача не имеет решения...


Наверх

Титульная страница Поиск, карта сайта Написать письмо