Autor Wątek: Funkcje cyklometryczne  (Przeczytany 957 razy)

Offline Bounty

  • Użytkownik

# Kwiecień 11, 2010, 00:09:58
Witam!
Mam problem związany z obliczeniem parametów kamery. A mianowicie sprawa wygląda następująco:
Mam klasę kamery a w niej kilka metod, jedą z nich jest funkcja, która zmienia pozyję punktu, na który kamera się "patrzy". Owa metoda może w parametrach przyjmować zarówno dokładną pozyję punktu lub o ile stopni ma być obrócona w prawo a o ile w górę. Klasa ta posiada także kilka zmiennych m.in. punkt, na który kamera się patrzy oraz o ile jest obrócona w górę a o ile w prawo, zmienne te muszą być zawsze zauktualizowane. Kiedy w owej funkcji parametrem będzie dokładna pozycja punktu na który patrzy się kamera trzeba go zaktualizować oraz policzyć o ile stopni jest obrócona. Analogicznie jeżeli podam o ile jest obrócona trzeba to zaktualizować oraz policzyć gdzie się patrzy. W drugim przypadku sprawa wygląda banalnie prosto wystarczy użyć funkcji trygonometrycznych, jednak w pierwszym cyklometrycznych. I tu pojawia się problem: program nauczania w gimnazjum nie obejmuje ani funkcji trygonometrzycznych, których podstawy jako tako rozumiem, ani funkcji cyklometrycznych o których nie wiem kompletnie nic(wiem tylko, że to funkcje odwrotne do trygonometrycznych).
I moja proźba: czy mógłby ktoś podać wzór na obliczenie kątów obrotu kamery znając jej pozycję oraz pozycję punktu na który patrzy?
Pozdrawiam, Bounty.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Groshu

  • Użytkownik

# Kwiecień 11, 2010, 00:22:12
Jeśli piszesz w C/C++ w nagłówku math.h masz sin(), cos(), asin(), i acos() :)
« Ostatnia zmiana: Kwiecień 11, 2010, 00:24:40 wysłana przez Groshu »

Offline Haxy.M

  • Użytkownik

# Kwiecień 11, 2010, 00:28:03
Zasadniczo masz już wiele :) w bibliotece standardowej masz funkcję atan2, gdzie podajesz x i y i otrzymujesz kąt między nimi i nie musisz się o nic martwić.
Jakbyś bardzo chciał więcej, potrzebował czegoś specjalnego, ja rozwiązałem to tak:
template <class T> inline T shMath :: atan(const T& a)
{
 unsigned int i = 1;
 T sum = a;
 T ans = a;
 const T temp = (a * a);
 for(;i <= shMath :: ITERATION_NUM/*ilość iteracji*/;++i)
 {
  sum *= temp;
  ans += ((i & 1) == 1) ? ((T)(-1.0l / ((2.0l * (long double)(i)) + 1.0l)) * sum) : ((T)(1.0l / ((2.0l * (long double)(i)) + 1.0l)) * sum);
 }
 return ans;
}

Możesz jeszcze zawsze poczytać o metodize Newtona, rozwiązywania równań nieliniowych. W załozeniu wygląda to tak, że jeśli f(x) = 0 to mozesz robić sobie kolejne przybliżenia x wzorem xn + 1 = xn - (f(xn) / f`(xn))

W tym momencie Twoje f(x) to jakaś funkcja trygonometryczna, dla przykładu sin(x) zatem chcesz policzyć że skoro sin(x) = a to ile jest x. Stwierdzasz zatem, że sin(x) - a = 0 i jeszczesz. za f(x) wstawiasz sin(x) - a. f`(x) w tym wypadku będzie cos(x). Zostaje jeszcze problem x0. Na szczęście ta wartość jest tutaj w miarę dowolna, więc mozesz sobie założyć a na początek. sin i cos masz w bibliotece standardowej, ale jakbyś chciał to da się je razem policzyć w jędnej pętli (poczytaj o wzorze Taylora - jeśli go zrozumiesz to jesteś w domu)

Ogólnie powodzeniai dobrej zabawy z tym :)

Offline Bounty

  • Użytkownik

# Kwiecień 11, 2010, 16:15:59
Funkcja atan2() to wszystko czego potrzebowałem.
Dziękuję i pozdrawiam, Bounty.