kategoria: Hollywood
[#1] Współrzędne punktu na okręgu.
Chciałem zapytać o algorytm wyliczania współrzędnych punktu na okręgu gdy mamy daną średnicę okręgu i kąt . Czy jest jakiś prosty i elegancki sposób?
Ja próbowałem to zrobić w ten sposób, że brałem jako środek okręgu punkt 0,0 układu współrzędnych i kąt po miedzy dodatnią częścią osi X i promieniem okręgu, który przesuwałem o daną ilość stopni, na przykład co 30. Następnie za pomocą twierdzenia sinusów i cosinusów wyliczałem wartość współrzędnych. Ale jak wiadomo funkcje te przyjmują wartość zerową więc nie mogę ich użyć żeby wyliczyć współrzędne w kątach 0, 90, 180, 270, 360 itd. Oczywiście w tych punktach nie muszę wyliczać współrzędnych bo mają wartoś albo zero albo równą długości promienia, ale ułatwiało to automatyczne rysowanie i upraszczało pętle.

Uff, sam się zapętliłem w tłumaczeniu. Mam nadzieję, że ci co znają się na rzeczy wiedzą o co mi chodzi .

Ostatnia aktualizacja: 14.02.2018 17:51:56 przez Ferin
[wyróżniony] [#2] Re: Współrzędne punktu na okręgu.

@Ferin, post #1

Funkcje sinus się kłaniają ;)

for(i = 0; i != liczbaPunktow; ++i) {
  fi = i * 2*pi/liczbaPunktow;
  x = cx + R*cos(fi);
  y = cy + R*sin(fi);
}


Całość operuje na radianach, czyli 180 stopni to pi, 360 to 2*pi. Cx, cy to współrzędne środka. Kąt i mnożenie r*cos, r*sin wypadałoby zrobić na floatach, lub na fixed pointach, o ile masz w Hollywood jakiś typ stałoprzecinkowy.

Ostatnia aktualizacja: 14.02.2018 18:13:17 przez teh_KaiN
[#3] Re: Współrzędne punktu na okręgu.

@teh_KaiN, post #2

O, łał, ależ to proste i piękne szczęka opada!, dzięki OK.
Miałem z tym kłopot bo nie używałem radianów, tylko stopni.

Przy okazji, co to są fixed pointy? W Hollywood, wszystkie typy zmiennych są określane dynamicznie bez udziału użytkownika. To znaczy użytkownik deklaruje zmienną, a Hollywood sam się troszczy o jej typ, ba, można nawet zmieniać typ zmiennej, choć to niezalecane. Są jedynie zalecenia co do opisu zmiennych tak żeby łatwiej było je odróżnić, na przykład zmienna tekstowa powinna mieć $ na końcu a zmiennoprzecinkowa !.

Ja tu jeszcze wrócę! Nie raz! Po więcej!
[#4] Re: Współrzędne punktu na okręgu.

@Ferin, post #3

Klasyczny procesor (nie obecne GPU) najlepiej operuje na liczbach całkowitych, bo sobie możesz je w postaci zerojedynkowej przedstawić wprost. Zamiany z dziesiętnego na binarny i odwrotnie możesz się nauczyć w parę minut. Problem w tym, że na liczbach całkowitych liczby 3.14 już nie przedstawisz. I tu podejść jest parę, w tym:

- liczby zmiennoprzecinkowe - coś, co w C nazywa się float lub double - pozwala trzymać liczby zarówno duże jak i bardzo małe, ale ze zmienną dokładnością. Żeby nimi liczyć dobrze jest mieć w Amidze FPU. Tutaj trochę o nich.

- liczby stałoprzecinkowe - fixed pointy - działają dokładnie tak jak liczby całkowite i tak samo szybko się liczą, tylko że część zer i jedynek z tyłu zarezerwowana jest na ułamek. W zależności ile bitów zarezerwujesz, tak dokładny ułamek będzie, ale wtedy skraca Ci się miejsce na trzymanie części całkowitej. Tu linka dobrego nie mam, ale jutub dużo podpowiada filmów - możesz sobie pooglądać ;) Na zachętę powiem że to ich używa PSX i dlatego mu się tekstury tak trzęsą - bo liczbom tym szybko brakuje dokładności.

Ostatnia aktualizacja: 15.02.2018 07:25:22 przez teh_KaiN
[#5] Re: Współrzędne punktu na okręgu.

@Ferin, post #3

To co napisal KaiN jest oczywiscie poprawne ale warto dodac ze liczenie tego na piechote w czasie rzeczywistym to jest spore katowanie procka (w zasadzie chyba na kazdej Motoroli bedzie to odczuwalne). Jesli zamierzasz wykonywac stosunkowo czesto takie operacje to lepsza opcja niz kazdorazowe przeliczanie, bedzie zrobienie sobie tablicy sinusow i cosinusow a nastepnie uzupelnienie jej przeliczonymi wartosciami - przeliczenie zrob na starcie programu i bedziesz mial to z glowy. Inna, o wiele lepsza moim zdaniem opcja jest przeliczenie tego jeden jedyny raz, wypisanie tych wartosci a nastepnie wpakowanie takich uzupelnionych tablic na sztywno do programu (nie tracisz wowczas czasu na przeliczanie tego na starcie).
[#6] Re: Współrzędne punktu na okręgu.

@Axi0maT, post #5

W takim razie po co jest koprocesor matematyczny (FPU = Floating Point Unit)? On potrafi liczyć na liczbach zmiennoprzecinkowych - jest do tego przeznaczony. Zatem jeżeli procesor ma do dyspozycji FPU, nie będzie to katowanie procesora.

O liczbach zmiennoprzecinkowych można poczytać w dokumentacji do bibliotek matematycznych Amigi np. tutaj. Jest tam to opisane wyjątkowo zgrabnie.

W skrócie: liczba zmiennoprzecinkowa składa się z dwóch części: mantysy (M) i wykładnika (E). Mantysa to stałoprzecinkowa wartość z przedziału [0.5,1), czyli wartość większa bądź równa 1/2 i mniejsza niż 1. Wykładnik to wykładnik potęgi pewnej podstawy (zwykle liczby 2 lub 10). Liczba przyjmuje wartość mantysy pomnożonej przez liczbę 2 podniesioną do potęgi. Jeden bit jest przeznaczony na znak liczby.

+/-M*2^E

Przykładowo by zapisać liczbę 1, należy wziąć mantysę 1/2 i wykładnik 1. Wówczas liczba (1/2)*2^1 = 1. Żeby zapisać liczbę 10, trzeba wziąć mantysę 5/8 i wykładnik 4. Wówczas (5/8)*2^4=(5/8)*16=10.

Zaletą tych liczb jest to, że w dość naturalny sposób dają się dodawać, mnożyć itp. używając odpowiednich wzorów matematycznych.

Czasami po operacji wymagana jest tzw. normalizacja mantysy, czyli takie przekształcenie by mantysa mieściła się w przedziale [0.5,1).

Tak jak pisał Teh_KaiN, wadą jest to, że precyzja zależy od wielkości liczby i trzeba umiejętnie nimi operować, by zachować dostateczną precyzję (przydają się tu tzw. metody numeryczne).

Oczywiście takie sztuczki, o których piszesz - czyli umieszczanie wartości tych funkcji w tablicy jest bardzo dobrym zabiegiem optymalizacyjnym, szczególnie gdy procesor nie ma FPU. Jednak Ferin ma, z tego co wiem, mocny procesor klasy PowerPC w swoim komputerze.
[#7] Re: Współrzędne punktu na okręgu.

@Hexmage960, post #6

Polecam zapoznać się z algorytmem Bresenhama, który standardowo służy do rysowania odcinków, ale jest też wersja rysująca okręgi/elipsy. Jego zaletą jest używanie wyłącznie operacji na liczbach stałopozycyjnych (chyba samych dodawań/odejmowań). Szybciej się nie da.
[#8] Re: Współrzędne punktu na okręgu.

@Hexmage960, post #6

Dla FPU zostaje jeszcze cala masa obliczen. Wyliczanie sinusow i cosinusow to nie sa jedyne operacje wspierane przez FPU. Nie wiem tez jaki procek ma Ferin - nie pochwalil sie. Faktem jest jednak ze wynajdywanie kola na nowo niespecjalnie ma sens - po co milion razy liczyc to samo? Metoda z przeliczonymi tablicami przestaje miec sens jedynie wowczas gdy mamy albo bardzo malo pamieci, albo procesor/koprocesor na tyle silny ze nie odczujemy tych przeliczen w czasie rzeczywistym
[#9] Re: Współrzędne punktu na okręgu.

@Axi0maT, post #8

Faktem jest jednak ze wynajdywanie kola na nowo niespecjalnie ma sens - po co milion razy liczyc to samo?

Oczywiście. Jeżeli nie zależy nam na precyzji możemy policzyć np. sinus dla każdego z 360 stopni i nie zajmie to wiele pamięci. Jednak czasami liczenie na żywo ma sens - gdy chcemy np. sinus dla 60 minut dla każdego stopnia (360*60) itp. Czasami rozmiar takiej tablicy staje się zbyt duży. Zatem zależy to od okoliczności.
[#10] Re: Współrzędne punktu na okręgu.

@Hexmage960, post #9

Zgadza sie, wszystko zalezy od tego jaka precyzja jest nam potrzebna. Nie wiadomo do czego Ferinowi to wyliczanie jest potrzebne. Mi osobiscie zazwyczaj skok co 2-3 stopnie w zupelnosci wystarczal i wowczas takie tablice wychodza w miare rozsadne.
[#11] Re: Współrzędne punktu na okręgu.

@Axi0maT, post #10

O matko boska, ale żeście pojechali panowie. Ja tego używam na swojej X5000 ale ogólnie dla systemów NG, a nawet dla pieców i maków, bo kompiluję aplet i każdy może sobie za pomocą playera odpowiedniego dla swojego systemu uruchomić. Dla klasyka też może być dzięki Planamaramie, ale jak to ładnie peceha wykazał w innym wątku, Hollywood jest wolniejszy niż BlitzBasic, więc to chyba tylko sztuka dla sztuki.

Odnośnie optymalizacji algorytmu, to w moim wypadku nie jest potrzebna bo to wyliczenie będzie użyte raz, może dwa, potem będzie leżeć w kącie niepamięci aż do ponownego uruchomienia programu. Aczkolwiek zapamiętam uwagi bo kto wie co przyszłość przyniesie.

Poza tym weźcie pod uwagę, że ja nie jestem programistą, grzebię sobie tylko w Hollywood, bo to łatwe i daje natychmiastowe wyniki, jednocześnie znając i godząc z ograniczeniami. Moja wiedza na temat matematyki wymaga odświeżania za każdym razem gdy robię coś nowego, bo poza przypadkiem użycia jej w Hollywood, nie mam innych okazji do jej wykorzystania, dlatego wam rzeczy wydające się oczywistymi mi zajmują sporo więcej czasu. Ale dzięki temu że mamy sieć, nie muszę grzebać i sam się męczyć i nawet nie chodzi o to, że nie lubię, tylko najnormalniej w świecie nie mam na to czasu i każde takie dochodzenie pożera czas który mogę spędzić na sowje radosnej twórczości. No, to tak, gdybyście zastanawiali się kiedy nowa przeglądarka w Hollywood wyjdzie
[#12] Re: Współrzędne punktu na okręgu.

@Hexmage960, post #9

Ha ;) a mozesz powiedziec na co potrzebny bylby ci taki sinus dla kazdej minuty ;) czy amiga ma taka rozdzielczosc ze da sie te wartosci na kole pokazac? 1 stopien i zmiana co kilka klatek wystarczy do dobrego efektu wg mnie :) a nawet kilka stopni :p zeby byla dynamika - inaczej musialbys zasuwac ze 100 kl/s zeby ruch byl widoczny
[#13] Re: Współrzędne punktu na okręgu.

@Ferin, post #11

O matko boska, ale żeście pojechali panowie.
Gdy w dyskusji pojawia się Hexmage to zawsze się to kończy jałowym sporem teoretyków...
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem