Data: 2010-06-01 17:44:34
ison | [Allegro, C++] kąt między dwoma obiektami
Witam
głowię się już drugą godzinę nad tym problemem i nie mogę dojść do tego co jest tutaj źle... ten kawałek kodu powinien rysować linię wczytywaną z pliku która będzie przechodziła przez 2 punkty. Co więcej ta funkcja działa... prawie działa bo jest jednak zauważalna różnica między tym jak powinno być a jak jest teraz. Tutaj screen z obecnego działania programu: http://img691.imageshack.us/img691/7506/planetyp.jpg
Linie powinny przechodzić przez środki planet
Klasa tychże linii:
class linkST { public: int ID1,ID2; void display() { pivot_sprite(bufor,link_sprite,planet[ID1].x+planet[ID1].s/2, planet[ID1].y+planet[ID1].s/2, 1,1,itofix(angle(planet[ID1].x+planet[ID1].s/2, planet[ID1].y+planet[ID1].s/2,planet[ID2].x+planet[ID2].s/2, planet[ID2].y+planet[ID2].s/2)/PI*180)); } };
dwa argumenty w funkcji pivot_sprite o wartości 1,1 to punkt odniesienia przy obracaniu bitmap. klasa o nazwie planet zawiera zmienną x,y i s odpowiedzialną za rozmiar planety. Dlatego właśnie środek planety to x+s/2;y+s/2;
tutaj moja funkcja angle która zwraca kąt między dwoma obiektami względem ich położenia w przestrzeni:
double angle(double x1, double y1, double x2, double y2) { double d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); return asin((y2-y1)/d); }
bardzo proszę o pomoc gdyż nie mogę kontynuować pracy póki tego nie zrobię 
| Data: 2010-06-01 20:43:09
Piotr Szawdyński |
Co ma wspólnego funkcja obliczająca kąt między planetami z faktem, że linie nie są rysowane z punktu A to punktu B tylko z punktu A do punktu X?
/esit: A tak swoją drogą to zobacz sobie dziedzinę funkcji asin/acos. | Data: 2010-06-01 20:49:50
ison |
Ma wspólnego to że sam ją pisałem i możliwe że tam tkwi błąd... Nie rozumiem zbytnio o co panu chodzi z funkcją asin. Zwraca ona wartość w radianach i zamieniam ją na stopnie przez pomnożenie przez 180 i podzielenie przez PI. Szczerze mówiąc to liczyłem że właśnie pan będzie znał rozwiązanie mojego problemu. No niestety. Czyli błąd tkwi w funkcji obracającej obrazek z allegro? Przecież ta linia powinna z samej zasady przechodzić przez te dwa punkty... | Data: 2010-06-01 21:17:28
Piotr Szawdyński |
Z tego co widzę w swoim kodzie to do obliczenia kąta użyłem funkcji atan... rozwiązanie tkwi w czystej matematyce i rozrysowaniu sobie przypadków w których odcinek tworzy kąt: 1) od 1 do 89 stopni 2) od 91 do 179 stopni 3) od 181 do 269 stopni 4) od 271 do 359 stopni Dodatkowo sprawdzić: 5) 0 stopni 6) 90 stopni 7) 180 stopni 8) 270 stopni Na podstawie tych kilku przykładów możesz wyciągnąć wnioski i napisać sobie funkcję, która w zależności od położenia wierzchołka w układzie współrzędnych zwróci prawidłowy kąt w radianach.
/edit: Dodam, że moja funkcja przyjmuje jeden argument:
double getRadians( const CPoint& point )
Pozbywając się klasy możesz problem rozwiązywać poprzez przekazanie dwóch argumentów.
| Data: 2010-06-01 21:20:32
ison |
Moglby mi pan powiedziec dlaczego moja funkcja jest zła? Pochodzi z twierdzenia sinusów i zwraca wartość arkus sinus w radianach. Jest to zwykły stosunek jednego boku do drugiego. Dlaczego to teoretycznie działa tylko że z kilkustopniowymi błędami? Rozumiałbym jeśli to by wcale nie działało ale to działa... według mnie funkcja jest dobra i zwraca odpowiedni kąt.
/edit Zaraz zarz... jak to możliwe że w pana funkcji w argumencie przyjmowany jest tylko jeden punkt? Czyli liczy kąt między czym a czym?... | Data: 2010-06-01 21:27:24
Piotr Szawdyński |
Drugi punkt to (0,0).
/edit: Czyli jeżeli chcę obliczyć kąt między obiektem A, a B to mogę zrobić:
value = getRadians(A.pos()-B.pos()); lub
value = getRadians(B.pos()-A.pos()); W powyższych przypadkach kąt będzie różny o 180 stopni. Pitagoras Ci się w tym wypadku nie przyda.
| Data: 2010-06-01 21:35:12
ison |
ahh... chyba zrozumiałem mój błąd  dziękuje za pomoc, mam nadzieje ze uda mi sie rozwiazac ten problem | Data: 2010-06-01 21:42:07
Piotr Szawdyński |
Zakładasz, że Twój kąt jest zawsze w pierwszej ćwiartce, tj z przedziału 0..90 a to błąd.
1) Narysuj układ współrzędnych X,Y 2) Narysuj w nim punkty położone na okręgu o środku w punkcie (0,0). 3) Niech każdy punkt będzie przesunięty o 30 stopni. 4) Połącz każdy punkt z punktem (0,0) -> otrzymasz odcinki 5) Oblicz kąt dla każdego odcinka Twoją metodą z osią X (albo Y jeśli używasz osi Y jako kąt = 0 stopni) 6) Podaj wyniki (jeżeli uważasz, że są poprawne) | |
| Statystyki tematu | Ostatnio przeczytali |
|---|
| Czytało użytkowników: | 29 | pixelmaster, maciejo, wiew, szyx_yankez, OSA_PL, wladcaN, michalp, SeaMonster131, madmike44, Czarnt, malan, dmx81, lenrokskate, Piotr Szawdyński, Iname (√ιק), Slawomir_Kozok, skovv, TheLukon | | Przeczytało użytkowników: | 18 | | Czytało osób ogólnie: | 82 | | Przeczytało osób ogólnie: | 41 |
| Ostatnia Aktualizacja| 2010-09-01 19:27:34 (4 dni temu) | |
| Ostatnio aktywni |
|---|
| wiew | 20 min | | Koni | 31 min | | Mateusz124 | 34 min | | fish13 | 61 min | | wiewiorka | 74 min | | lenrokskate | 8 godz | | dmx81 | 10 godz | | steckel | 11 godz | | pixelmaster | 14 godz | | maciejo | 14 godz | | jurasnumeras | 15 godz | | Imperator_Edi | 16 godz |
|