Serwis został przeniesiony pod nową domenę: http://cpp0x.pl/
PowrótPowrótHistoria odwiedzonych stron
AutorWiadomość
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ę oczko

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 oczko
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)

123



Statystyki tematuOstatnio przeczytali
Czytało użytkowników:29pixelmaster, 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



PowrótPowrótHistoria odwiedzonych stron
Panel Logowania
Login:
Hasło:

Użytkowników
Obecnie aktywnych:11
Zalogowanych:0
Zarejestrowanych:4367
Ostatnie 24h:538
Non-cookie 24h:2685
Wszystkich:214118
Ostatnia Aktualizacja
2010-09-01 19:27:34 (4 dni temu)
Ostatnio aktywni
wiew20 min
Koni31 min
Mateusz12434 min
fish1361 min
wiewiorka74 min
lenrokskate8 godz
dmx8110 godz
steckel11 godz
pixelmaster14 godz
maciejo14 godz
jurasnumeras15 godz
Imperator_Edi16 godz

Wynajem Sopot - wakacje
Pokój 2 osobowy 130zł/doba;
Lokalizacja: Sopot


O portaluArchiwumHistoriaIndeksRegulaminWyszukiwarkaLinki
Kurs HTML - strona WWW za darmoRestauracja "ATOL" - SopotValid HTML 4.01 TransitionalValid CSS!HTML CSS JavaScript FLASH PHP MySQL