Autor Wątek: Obiekt poruszający się po okręgu w przestrzeni 2d  (Przeczytany 5434 razy)

gorini

  • Gość
# Czerwiec 03, 2007, 11:55:35
Cytuj
i nie ma potrzeby ich zamykać w  zakresie od 0 do 360 stopni.
To oczywiste, ze dla tych obliczen nie jest to wymagane. Ale czasami katy wykorzystuje sie tez do innych rzeczy, gdzie zakres [0, 360] jest bardzo pozadany :)
To oczywiste, ze dla tych obliczeń nie jest to wymagane. Ale czasami kąty wykorzystuje sie też do innych rzeczy, gdzie zakres większy niż 360 jest bardzo pożądany. :)

Offline Mr. Spam

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

gorini

  • Gość
# Czerwiec 03, 2007, 14:32:10
Np. gdy chcemy policzyc ilosc obrotow? :)
Bo generalnie nie widze specjalnie duzej ilosc zastosowan zakresu [-INF, INF] jesli idzie o katy, bardziej przydaje sie chyba jednak zakres [0, 360] - ale co ja tam wiem, mlody i niedoswiadczony jestem ;)

Offline Humman

  • Użytkownik

# Czerwiec 03, 2007, 19:17:53
Ale zakres 0 -360 jest mało wygodny, znacznie lepiej sprawdza się zakres 0-1 który reprezętuje liczba typu float czy real zależnie od języka. Na przykład aby obrócić coś o 2,5 obrotu w prawo | lewo wystarczy dodać do wortości obrotu + | - 2,5 a nie bawić się z setkami,tysiącami stopnii.
Najlepiej do liczenia pozycji 2d czegoś tam po obrocie stworzyć funkcję, metodę która po podaniu kąta relatywnie lub absolutnie w zakresie 0-1 przesunie to coś o dany kąt.
Wewnątrz nie wystarczy zrobić
// pi to stała 3,1416....
// kąt i promien typu float
pozycjaX = sirodekX + sin( kat_obrotu * pi * 2) * promien;
pozycjaY = sirodekY + cos( kat_obrotu * pi * 2) * promien;

gorini

  • Gość
# Czerwiec 03, 2007, 23:58:51
Przy ciagłym obrocie w końcu wyskoczysz poza zakres. Co z tym zrobisz to twoja sprawa. API... musi to obsługiwać. Więc jesli ktoś zechce obrócić o 720 stopni to nie ma problemu. I to bez różnicy czy zrobi to 2 * 360 czy poda 720.

A moja uwaga odnosiła się do tego że zastosowań jest multum. I w zalezności od potrzeby dobierzesz taką, a nie inną metodę. Przy rysowaniu oczywiście lepiej okrąg "zamknąć". Po co ma iteracje dalej prowadzić. Ale chcąc zapisać parametrycznie jakąś serie obrotów, już można coś przykombinować.

Takie stwierdzenie że 0 - 1 jest lepsze od 0 - 360, jest w twojej opinii lepsze, znaczy się jest wygodniejsze. Ale oczywiście dużo bardziej wydajnym jest używanie natywnych wartości dla danego API, zazwyczaj radiany. Wtedy nie ma ani "clamp"... ani innego niepotrzebnego matematycznego śmiecia potrzebnego do konwersji.

Offline Humman

  • Użytkownik

# Czerwiec 04, 2007, 11:12:49
W radianach natywna wartość kąta wynosi od 0 do 2*p, wiec można używać takiej skali albo przemnożyć liczę z zakresu 0-1 prez 2*pi. W przypadku stopni trzeba mnożyć przez pi/180, oczywiście te wartości mogą być stałymi ale w przypadku stopni tym sposobem nie da się obrócić o mniej niż 1 stopień, chyba żeby dzielić przez 1800 a liczbę stopni mnożyć przez 10.

gorini

  • Gość
# Lipiec 15, 2007, 11:09:12
Witam

Mam problem :
tak obliczam :

  rX = gX + promien * sin(kat*pi/180);
  rY = gY - promien * cos(kat*pi/180);

rysuje linie :

  line(bufor,gX,gY,rX,rY,makecol(255,0,0));

a kiedy zmienna kat dojdzie do 15 to sie linia obraca o 1 kąt a kiedy dojdzie do 72 to o 2 kąt

o co w tym chodzi bo przecież jeżeli zmienna kat by wynosiła 23 to kąt obrotu linii powinien tez wynosi 23.
a tak nie jest.

Używam allegro.h i pisze na c++

Pozdrawiam i z góry dziękuje za pomoc

« Ostatnia zmiana: Lipiec 15, 2007, 11:10:50 wysłana przez gorini »

Offline Humman

  • Użytkownik

# Lipiec 15, 2007, 11:20:40
A nie powinno być sin( (kat / 180) *pi) i tak samo w cos, jeśli kat jest w stopniach. W tedy po podziale kąt wynosi od 0 do 2 a po pomnożeniu go przez pi, argument sinusa to 0  -  2pi czyli wartosc w radianach wymagana dla tej funkcji. 

gorini

  • Gość
# Lipiec 15, 2007, 14:27:57
Witam.

Sprawdziłem to i linia nic a nic się nie porusza cały czas stoi pod kątem 0.

Offline spacja

  • Użytkownik

# Lipiec 15, 2007, 16:31:43
Zaglądnij tu
http://forum.unit1.pl/DelphiOmega-Kolizje-w-OmegaMap-t1463.html
Masz tam gotowy kod tego czego szukasz. Jest ruch, są kolizje , są zakręty, jest implementacja toru. Prosty przykład . Napisany w Delphi.

gorini

  • Gość
# Lipiec 16, 2007, 09:03:01
Już naprawiłem, mój błąd nie dodałem biblioteki cmath xD
ale dzięki za pomoc