Problem programisty - przechylić "ósemkę" na p

Obiekty i przekształcenia geometryczne, opisane za pomocą układu (nie zawsze prostokątnego) współrzędnych.
EDi .:.
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 5 paź 2005, o 17:43
Płeć: Mężczyzna
Lokalizacja: Poznań
Podziękował: 2 razy

Problem programisty - przechylić "ósemkę" na p

Post autor: EDi .:. »

Na początek witam wszystkich, bo zaglądam tu po raz pierwszy. :) W ramach przedstawienia postaci napiszę, że jestem grafikiem i trochę programistą, który od lat prawie nie używał matematyki. Teraz niestety podjąłem pracę bardziej jako programista niż grafik i okazało się, że dalej bez niej nie pojadę. :) Niestety do domu i książek pojadę dopiero w weekend, a przed nim muszę rozwiązać pewnien problem. Mam nadzieję, że będziecie w stanie mi pomóc. Mam też nadzieję, że wybaczycie moją chwilową ignorancję w dziedzinie matematyki. Postaram się szybko nadrobić zaległości, żeby następnym razem przynajmniej wiedzieć o czym piszę. ;)

Problem wygląda tak: Animuję właśnie . Animacja polega na poruszaniu jej dwoma punktami kontrolnymi. Poruszam nimi "po ósemce". Pozycję punktu wyliczam ze wzorów:

posX = sX + sin(2 * i) * r1
poxY = sY + cos(i) * r2

sX i sY to współrzędne środka "ósemki", r1 i r2 to promienie "skręconej" elipsy, która ją tworzy, a 'i' zwiększa mi się systematycznie.

Problem jest taki, że "ósemka", po której porusza się punkt (niebieski kwadrat na "obrazku") jest ustawiona pionowo. A ja chciałbym, aby była pochylona w taki sposób, aby jej "brzuszki" skierowane były w stronę końców krzywej.

Dane mam współrzędne końców krzywej. Nie wiem natomiast jak obliczyć kąt, o jaki mam pochylić "ósemkę", oraz jak zmodyfikować powyższe wzory, aby "ósemka" (czyli wykres funkcji) ułożyła się pod tym właśnie kątem.

Pomożecie? Jeśli nie podając gotowe rozwiązanie, to przynajmniej nakierowując na jakieś źródła, z których mógłbym zaczerpnąć niezbędnej do rozwiązania tego problemu wiedzy. Będę dźwięczny za wszelkie przejawy dobrej woli. :)
drunkard
Użytkownik
Użytkownik
Posty: 204
Rejestracja: 6 kwie 2005, o 14:43
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 23 razy

Problem programisty - przechylić "ósemkę" na p

Post autor: drunkard »

Nie jestem matematykiem (już bardziej programistą, a z grafiki to kompletna noga ze mnie), ale myślę, że najprościej (gorzej z efektywnością) będzie przejść w obliczeniach do wspórzędnych kątowych, obrócić i potem znowy wrócić do x,y.
Jeśli oznaczysz w swoich wzorach:

posX = sX + sin(2 * i) * r1 = sX + dX
poxY = sY + cos(i) * r2 = sY + dY

to tak naprawdę chodzi (jeśli dobrze zrozumiałem) o obracanie tego dx i dy.
Współrzędne kątowe punktu (dx, dy) to (sqrt(x*x+y*y), arctg(y/x)) (chyba że troszkę inaczej określisz kąt), a w drugą stronę, po obróceniu, z (d, fi) przechodzimy do (dsin(fi), dcos(fi)).

To tak na moją głowę (a właściwie to nie jestem w temacie, więc może ktoś podpowie efektywniejsze rozwiązanie). Zasadniczo w ogóle tego typu rysowanie w oparciu o funkcje trygonometryczne nie jest za dobre; np. można trochę wyguglować o efektywnych algorytmach rysowania okręgu itp.
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

Problem programisty - przechylić "ósemkę" na p

Post autor: Fibik »

Musisz to jeszcz obrócić o kąt między odcinkiem łączącym końce krzywej, a osią Y (odchylenie odcinka od pionu)

wzory na obrót o kąt a:
x' = x*cosa + y*sina
y' = -x*sina + y*cosa

kąt 'a' obliczasz tak: a = arctan(w/h), h = Y1-Y2, w = X1-X2;
(X1,Y1) i (X2,Y2) to końce krzywej.
dla h = 0, kąt a = pi/2 lub -pi/2, zależnie od znaku w.

Grafika na monitorze ma odwróconą oś Y, dlatego kierunek obrotu może być inny.
Da się to ustalić eksperymentalnie.
EDi .:.
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 5 paź 2005, o 17:43
Płeć: Mężczyzna
Lokalizacja: Poznań
Podziękował: 2 razy

Problem programisty - przechylić "ósemkę" na p

Post autor: EDi .:. »

Dzięki wielkie. Powalczę, zobaczymy co z tego wyjdzie.
ODPOWIEDZ