Перейти к содержимому

Фото
- - - - -

Не работает функция


  • Закрытая тема Тема закрыта
15 ответов в этой теме

#1 Ferzin

Ferzin
  • Постоялец
  • 1 967 сообщений

Отправлено 05 апреля 2010 - 11:26

Почитал я тут пару тем на форуме и столкнулся с заявлениями некоторых умников что математика вообще не нужна для программирования и в жизни не пригодиться.
Вспомнил об одной нерешённой задаче.

Что требует от функции? Перевести координаты из квантерниона в x,y,z

wiki


неизвестно почему, функция промахивается координатами x,y,z.(Не в обязательном порядке, но частенько)
Последовательности или алгоритма из этих промашек не выходит.

как это решить?

http://pastebin.com/JU8zBGGL
!

Сообщение изменено: Faus (05 апреля 2010 - 11:36 )

  • 0

#2 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 апреля 2010 - 11:37

Варианта два. Либо не хватает точности переменной float, либо надо внимательнее посмотреть тригонометрические преобразования. Может быть ошибка из-за фазы. Точнее сказать не могу, на этом языке не пишу. Математика нужна будет всегда. Это как обувь. Без нее только первобытные обходились. Да и то только в жарких странах.
  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#3 Ferzin

Ferzin
  • Постоялец
  • 1 967 сообщений

Отправлено 05 апреля 2010 - 11:42

Скорее всего из за фазы.
  • 0

#4 shb

shb

    New life, much more options

  • Постоялец
  • 5 253 сообщений
  • Откуда:Таллинн

Отправлено 05 апреля 2010 - 12:07

Faus, почитал тут чуток. Возник вопрос - имеет ли это какой-то практический смысл? Вот именно такая функция :)
  • 0
Мыслящий человек просто обязан время от времени поднимать себя за волосы © Тот самый Мюнгхаузен

Joga Bonito!

#5 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 апреля 2010 - 12:32

Надо ввести блок условия и разбить на два полупериода. Тогда фаза не будет прыгать. Хотя есть еще вариант, что значения, близкие к нулю, могут не правильно обсчитываться. Повнимательнее с тангенсами. Деление на ноль может все портить.
  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#6 Ferzin

Ferzin
  • Постоялец
  • 1 967 сообщений

Отправлено 05 апреля 2010 - 12:35

я занят разработкой межконтинентальной ракеты. это очень важно для меня.
  • 0

#7 shb

shb

    New life, much more options

  • Постоялец
  • 5 253 сообщений
  • Откуда:Таллинн

Отправлено 05 апреля 2010 - 12:41

я занят разработкой межконтинентальной ракеты. это очень важно для меня.

Это-то понятно. Но зачем надо переводить в углы Эйлера, если можно считать сразу в кватернионах?
  • 0
Мыслящий человек просто обязан время от времени поднимать себя за волосы © Тот самый Мюнгхаузен

Joga Bonito!

#8 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 05 апреля 2010 - 12:43

Для континентальной хватит и 4 байт переменной float. Я тут земля-воздух малого радиуса делаю. Мне приходится программно повышать точность до 8 байт на координату. И тут сразу проблема вылезла. Мало какой проц успевает такую математику обработать. А вояки требуют, чтобы ракета через 0.2с после захвата цели уходила. У меня тут два пня четырехядерных работают. Но быстрее 0.5с не выходит. За это время цель уже может с радара скрыться.

Сообщение изменено: Вырвиглаз (05 апреля 2010 - 12:43 )

  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#9 Ferzin

Ferzin
  • Постоялец
  • 1 967 сообщений

Отправлено 05 апреля 2010 - 13:14

Для континентальной хватит и 4 байт переменной float. Я тут земля-воздух малого радиуса делаю. Мне приходится программно повышать точность до 8 байт на координату. И тут сразу проблема вылезла. Мало какой проц успевает такую математику обработать. А вояки требуют, чтобы ракета через 0.2с после захвата цели уходила. У меня тут два пня четырехядерных работают. Но быстрее 0.5с не выходит. За это время цель уже может с радара скрыться.


попробуй использовать для расчётов более простые языки программирования. например lua или pawn. Там функция которая нужна в первом посте выполняется за 1, максимум 3 ms. тики меньше просто не считают.


Это-то понятно. Но зачем надо переводить в углы Эйлера, если можно считать сразу в кватернионах?


так удобнее обрабатывать, когда все действия происходят в пределах сферы с треугольным основанием.
  • 0

#10 shb

shb

    New life, much more options

  • Постоялец
  • 5 253 сообщений
  • Откуда:Таллинн

Отправлено 05 апреля 2010 - 13:33

Gimbal lock

Нет однозначности при некоторых значениях

Сообщение изменено: shb (05 апреля 2010 - 13:36 )

  • 0
Мыслящий человек просто обязан время от времени поднимать себя за волосы © Тот самый Мюнгхаузен

Joga Bonito!

#11 karlychev

karlychev
  • Пользователь
  • 98 сообщений
  • Откуда:Tallinn

Отправлено 05 апреля 2010 - 13:35

...Математика нужна будет всегда. Это как обувь.
Без нее только первобытные обходились. Да и то только в жарких странах.

без математики или без обуви они обходились? :blink:

шЮтка! ^_^


в своё время, с одним студентом произошёл такой случай:
после бурной ночи, проведённой в объятиях красавицы,
опаздал он короче на экзамен по математике минут 20-ть.
он был, как водится, не единственный опоздавший :lol:

ну,препод был кстати сам молодой и решил ему сходу дать шанс -
"чему равен корень из единицы?" ответ - "ой! надо подумать!"
"ну, иди, садись и подумай"... через минуту до него дошло... ^_^

если бы студент ответил сразу "единица", то получил бы пять!

он был, как водится, не единственный опоздавший :lol:
и всем опоздавшим препод задавал этот вопрос.
никто не ответил сразу! :wacko:

вот и думай после, что практического применения математике нет... :D
  • 0

#12 Mr. Positive

Mr. Positive
  • Постоялец
  • 850 сообщений

Отправлено 05 апреля 2010 - 20:22

karlychev,
а ведь правильный ответ плюс/минус единица? :)

P.S. Смотря где математика и на сколько нужна. Безусловно, математика развивает мозг, но смысл в том, что для того, что бы клепать простенькие веб-сайтики математики на уровни школы в принципе хватает. Другое дело, что сложные задачи требуют дополнительных знаний и т.д. и т.п.. Но тут опять же такая вещь: те, кто орут разрывая глотку о том, что программистам математика не нужна, как правило выше клепания веб-сайтов и не подымаются(ну или аналогичное по сложности задание).
  • 0
Former IAPB 8X.
Bachelor of Eternity

#13 karlychev

karlychev
  • Пользователь
  • 98 сообщений
  • Откуда:Tallinn

Отправлено 05 апреля 2010 - 23:45

karlychev,
а ведь правильный ответ плюс/минус единица? :)

это детали...

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

верно сказано!

IMHO:
математика+физика.
  • 0

#14 Ferzin

Ferzin
  • Постоялец
  • 1 967 сообщений

Отправлено 06 апреля 2010 - 14:17

проблема была в вычислениях, всё работает на ура.
  • 0

#15 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 05 мая 2010 - 13:17

Однажды, когда реализовывал такую штуку на С/С++ тоже сталкнулся с проблемой промахов, сначала грешил на гимбал лок. Оказалось, что дело было в точности float'a. Потому что даже если распечатаный флоут показавыет 0.00000... он в реале может быть -0.00...0001 что вызывало ошибку EDOM (типа out of range) в одной из математических формул. Проверка на >= 0 всё исправила.
  • 0

#16 Ferzin

Ferzin
  • Постоялец
  • 1 967 сообщений

Отправлено 05 мая 2010 - 16:29

проблема в подсчётах.


ex = 90.0 - atan2(-sqy - sqx + sqz + sqw, 2.0 * (qy * qz + qx * qw));
ey = asin(-2.0 * (qx * qz - qy * qw));
ez = 90.0 - atan2(sqy - sqx - sqz + sqw, 2.0 * (qx * qy + qz * qw));

правильный вариант:

ex = atan2(-sqy - sqx + sqz + sqw, 2.0 * (qy * qz + qx * qw)) - 90.0;
ey = asin(-2.0 * (qx * qz - qy * qw));
ez = atan2(sqy - sqx - sqz + sqw, 2.0 * (qx * qy + qz * qw)) - 90.0;
  • 0