Sin, Cos, Tan, ATan — вопросы по геометрии на ассемблере

Тема в разделе "WASM.BEGINNERS", создана пользователем Zhelezka, 29 дек 2008.

  1. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    1)
    Вот узнал формулы, что-бы если уже известны x и y, найти угол и радиус:
    Если:
    x=cos(a)*r
    y=sin(a)*r
    Тогда:
    a=arctg(y/x)
    r=y/sin(a)
    В книге по ассемблеру у сопроцессора были указаны только Sin, Cos, SinCis.
    А команды тангенса, арктаннгенса и котангенса есть? Если нет, то как их узнать?
    2)
    Допустим нам надо повернуть точку вокруг определённой оси:
    a=arctg(y/x) ;Узнаём угол по координатам точки относительно оси
    r=y/sin(a) ;Узнаём расстояние от точки до оси
    a=a+45 ;Изменяем угол
    x=cos(a)*r ;Снова находим координаты
    y=sin(a)*r
    Как упростить данное действие?
    3)
    Я постарался сделать фукцию которая по координатам x, y, z сама найдёт координаты этой точки на экране.
    Код (Text):
    1.  Function Find(_px:Float,_py:Float,_pz:Float,_ax:Float,_ay:Float,_sx:Float,_sy:Float,_vx:Float,_vy:Float)
    2. ;_px—Позиция точки по x
    3. ;_py—Позиция точки по y
    4. ;_pz—Позиция точки по z
    5. ;_ax—Поворот камеры по x
    6. ;_ay—Поворот камеры по y
    7. ;_sx—Угол x обзора камеры камеры
    8. ;_sy—Угол y обзора камеры камеры
    9. ;_vx—Ширина экрана
    10. ;_vy—Высота экрана
    11.   Local _tx:Float,_ty:Float
    12.   _tx=ArcTan(_px/_pz)-_cam.ax
    13.   _ty=ArcTan(_py/_pz)-_cam.ay
    14.   While _tx>=360
    15.    _tx=_tx-360
    16.   Wend
    17.   While _tx<0
    18.    _tx=_tx+360
    19.   Wend
    20.   While _ty>=360
    21.    _ty=_ty-360
    22.   Wend
    23.   While _ty<0
    24.    _ty=_ty+360
    25.   Wend
    26.   If _tx>=0 And _tx<_sx And _ty>=0 And _ty<_sy
    27.    dx=_vx*_tx/_sx  ;Позиция x точки
    28.    dy=_vx*_ty/_sy  ;Позиция y точки
    29.   End If
    30.  End Function
    Но когда я опускаю объект, он сплющивается, но не уменьшается по ширине,
    Если двигаю в бок уменьшается по ширине, но высота остаётся той-же.
    Как улучшить функцию? И что-бы она работала правильно?
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Учим тригонометрию, тогда всё ясно станет :) Вообще-то достаточно одной функции, все остальные можно получить из неё.

    Ну и, наконец, по возможности вещественной арифметики и тем более тригонометрии надо избегать: скорость существенно падает. Конечно, бывают случаи, когда без неё никак, но это уж от задачи зависит.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Неверно ты знаки не учел x,y. В компьютере есть для этих целей Arctan2. На асме не помню как пишется но она есть.

    2) Афинные преобразования. Проще всего представить в виде матриц. И матричных операций.
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    можно табличку сделать одной четверти через полградуса sin(a)*0x10000
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Zhelezka
    Возьми библеотеку от intel у них есть алгоритмы быстрого рассчета тригонометрии.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    Zhelezka
    здесь пример вывода вращающейся надписи со всеми преобразованиями
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    AMaths.zip или есть ещё другие?
     
  8. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    MASM32\FPULIB\* Вся тригонометрия. Также хорошо бы иметь мануал по мат. процессору, хороший есть в Зубкове.