[#1] Biblioteka matematyczna do 3d
Zmagam się z transformacją 3d w kodzie ale widzę, że generalnie brakuje mi odpowiedniego include zeby mial wszystkie tangensy sin i byl dosyc dokladny. Napewno ktos juz to przerabial ? (gcc klasyk)
[#2] Re: Biblioteka matematyczna do 3d

@arturB, post #1

A to nie korzysta się z gotowanych tablic tg i sin ?
[#3] Re: Biblioteka matematyczna do 3d

@Norbert, post #2

Tak jak Norbert mówi. Wygeneruj sobie czymś tablice gotowych wartości, oszczędzi Ci to masę czasu. Jak chcesz bibliotekę macierzową i masz kompilator zgodny z c++ (Bebbo lub Bartman) to możesz spróbować zmusić to do współpracy z GLM, ale nie wiem jak będzie z wydajnością. Sugeruję jednak robić wszystko samemu, żeby mieć świadomość i kontrolę nad tym gdzie masz mnożenia i ile ich jest.

3D na Amidze to jest bardzo duża ilość precalcu, jeśli chcesz mieć coś więcej niż parę punktów w przestrzeni. Rozglądaj się w algorytmach za tym, co możesz stablicować i to rób.
[#4] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #3

Mam 3 macieże jedna po drugiej przekazujace sobie wyniki - od rotacji w osi Z, rotacji w osi X i od projekcji 3d->2d . Po wprowadzeniu kilku wspolrzednych punktow widzę, ze tylko pierwsza macież (Z) wyrzuca jakies wspolrzedne, ale juz po podstawieniu do kolejnej i nastepnej mam jedną wartosc i absolutnie nic wiecej sie nie zmienia. Stad moje podejrzenie, ze cos jednak źle się liczy. Czy te ami biblioteki liczą normalnie sin cos i tangensy na liczbach float ?
[#5] Re: Biblioteka matematyczna do 3d

@arturB, post #4

Jesli ci to w czyms pomoze to daje linka do jednej z mojej prcedury krecenia szescianem.
Mozesz sobie porownac. Jest tam tylko obracanie w osi X i Z plus ukrywanie odwroconych scian i rzutowanie na 2D.

link
[#6] Re: Biblioteka matematyczna do 3d

@Norbert, post #2

Może nie konkretnie w temacie Amigi,
ale ostatnio pisałem coś pod Win w C Visual Studio,
i też byłem ciekawy jaka będzie różnica miedzy funkcjami a tablicami,
zrobiłem porównanie obliczeń funkcji sin i cos w porównaniu w prekalkulowanymi tablicami..
(coś ok. 1 mln w pętli) efekt był nieporównywalny na korzyść tablic..
[#7] Re: Biblioteka matematyczna do 3d

@mateusz_s, post #6

Funkcje tego typu liczy się przeważnie z szeregu Taylora czy w inny, podobny sposób. Siłą rzeczy jest to seria operacji matematycznych, więc niezależnie czy robi to krzem, czy program, zajmuje to i tak więcej niż pobranie jednej wartości z pamięci. Tablice w zastosowaniach nowożytnych są o tyle niefajne że generujesz je z jakimś krokiem dla wartości kąta, więc gubisz precyzję i jak tych sinusów trochę Ci się ze sobą przemnoży, to masz mocne skoki na wartościach i często z tego powodu animacje się "trzęsą". ;)
[#8] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #7

Z szacunkiem Panowie ale odpłynęliście... od tematu. Problem jest taki, że wyniki sin i cos wychodzą jakieś, że tak powiem ... z czarnego otworu. Myślałem, że się mylę i dałem znajomemu, który koduje zawodowo w C/C++ żeby przejrzał i zrobił mi testy i też wykazał, że to nie są wartości właściwe - a nawet są to niewłaściwe niewartości. Zatem pytanie o co chodzi. Pewnie to nasza niewiedza w materii Amigi ale podejrzewam, że trzeba to jakoś kompilować inaczej?
[#9] Re: Biblioteka matematyczna do 3d

@arturB, post #8

Zatem pytanie o co chodzi.
Pokaż kod, inaczej to zgadywanka.
[#10] Re: Biblioteka matematyczna do 3d

@Krashan, post #9

link
Psze bardzo...
[#11] Re: Biblioteka matematyczna do 3d

@arturB, post #10

Nie wiem czego używasz ale vscode ma opcję autoformatowania kodu. Jak masz mieć taki bajzel to już lepiej używać automatu. ;d

Budowałem na GCC 6.5 od Bebbo (m68k-amigaos-gcc -mcrt=nix20 -O3 Simple3d.c -o simple3d -lm), parę warningów było. Najpierw mi w ogóle floaty w sprintf nie chciały działać, ale jak dolinkowąłem -lm to ruszyło.

Zrobiłem sobie takie coś i wyświetliłem na ekran:

sprintf(szBfr, "sin(0, 90, 180, 270, 360) = %.1f %.1f %.1f %.1f %.1f", sin(0), sin(PI/2), sin(PI), sin(3*PI/2), sin(2*PI));

I pokazał bzdury. Coś mnie tknęło i zrobiłem tak:

sprintf(szBfr, "sin(0, 90, 180, 270, 360) = %.1f %.1f %.1f %.1f %.1f", sinf(0), sinf(PI/2), sinf(PI), sinf(3*PI/2), sinf(2*PI));

Zamarudził że nie ma math.h i poszło. Pewnie by ruszyło z pierwszym wariantem gdybym zrobił %lf. O co chodzi:

- funkcje sin(), cos() operują na double, zwracają tak też wynik
- funkcja sprintf() i inne tego typu korzystają z mechanizmu C va_args, który nie przechowuje informacji o typach.
- wrzucając do sprintf wartości typu double wrzucasz po prostu ich bajty na stos
- funkcje printf-podobne parsując format string dedukują typ danych i odpowiednio czytają bajty ze stosu
- wrzucając %f mówisz funkcji printf że masz na stosie floata, no to czytał floata. Tylko że na stosie miałeś double'a, więc czytał niepoprawnie.
- rozwiązaniem jest użycie funkcji które operują na floatach (potrzebujesz math.h) albo printowanie jako double (%lf)

dodatkowo, warto nie ignorować warningów w kodzie:
- struct Rastport zamień sobie na RastPort
- nie zwracaj NULL w funkcji która zwraca LONG - NULL jest do wskaźników
- czym budujesz że znajduje funkcję itoa? musiałem sobie na szybko przerobić wywołania pod sprintf
- polecam przy Text() nie polegać na stałej długości stringa tylko wstawiać wartość faktyczną. sprintf() zwraca liczbę wpisanych bajtów do bufora, itoa() chyba nie, ale możesz sobie zawsze z zachowaniem licencji zwędzić stringDecimalFromULong(), która już będzie takie coś zwracać.

Nie za bardzo chciało mi się dalej wnikać w kod - daj znać czy to był u Ciebie jedyny problem, czy jeszcze coś jest nie tak. ;)

Ostatnia aktualizacja: 27.01.2021 13:32:58 przez teh_KaiN
[#12] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #11

wrzucając %f mówisz funkcji printf że masz na stosie floata, no to czytał floata. Tylko że na stosie miałeś double'a, więc czytał niepoprawnie.


Nie jest to prawdą. Przy funkcjach typu varargs masz automatyczną promocję typu. Działa to tak dla zmiennych typu całkowitego jak i rzeczywistych. Ja po prostu obstawiam brak math.h i zignorowanie ostrzeżenia o braku deklaracji sin() i cos() przez co kompilator założył że zwracają int -> śmieci.
[#13] Re: Biblioteka matematyczna do 3d

@kiero, post #12

Kain ma racje ofcoz ze najladniej to nie wyglada ale to bardzo roboczy material. Fakt mogly wprosic sie przypadkowe wartosci. Natomiast kiero wskazuje trop ktory zaraz sprawdze bo moze, moze....
[#14] Re: Biblioteka matematyczna do 3d

@kiero, post #12

Już Ci miałem kontrować, że nie masz racji, więc sprawdziłem zachowanie w desktopowym GCC. Nawet sprawdziłem kod printf u Bebbo. Oczywiście byłem w błędzie, dzięki. ;)

Najciekawsze jest jednak to, że po wywaleniu math.h nie krzyczy że nie zna sin(). Coś mocno musi być zepsute w nagłówkach. Ale teraz zrobiłem dodatkowe testy i:

- %f z sin() źle się printuje
- %lf z sin() źle się printuje
- %f z sinf() dobrze się printuje
- %lf z sinf() też się dobrze printuje (faktycznie się promuje do double)

Zakomentowałem w kodzie to:

#include <libraries/mathffp.h>
#include <clib/mathffp_protos.h>
#include <clib/mathtrans_protos.h>

struct Library *MathTransBase;

i nagle sin() zaczął działać poprawnie. Zauważyłem też że MathTransBase nie jest nigdzie inicjowane, więc to może być faktyczna przyczyna.

Uwaga na marginesie do autora wątku - możesz używać bibliotek standardowych i wymusić sprzętowe fpu budując z -mhard-float i minimum -m68020, albo podać -msoft-float i mieć wersję soft fpu, która CHYBA korzysta z fpu jak jest obecne. GCC od Bebbo domyślnie używa soft fp. Pewnie jakiś narzut jest względem hardfloata, ale kto wie czy w ogóle to odczujesz w porównaniu z obsługą soft/hard po swojemu.

Druga uwaga na marginesie jest taka, że dorzuć sobie do flag kompilacji -Wall -Wextra - lepiej poznasz język i zawiłości API Amigi. Jest jeszcze -Wpedantic ale nie warto. ;)

Ostatnia aktualizacja: 27.01.2021 14:47:17 przez teh_KaiN
[#15] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #14

Ok. Zatem jaka diagnoza? jak uzywam math.h to dostaje unknown command przy uruchamianiu. sinf cosf itp notyfikacja jest podswietlana w kodzie jako incompatible.
Czym zatem uruchomic te sinusy zeby dzialaly ?
Niewazne... wyj...em laptopa przez okno.
[#16] Re: Biblioteka matematyczna do 3d

@arturB, post #15

pierwszy post - gcc klasyk - czyli 2.95? Wyrzuć go przez okno i weź się za crosskompilowanie z 6.5 ;)
[#17] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #16

Czy uważasz, że nowszy kompilator rozwiąże problemy? Ja jestem zdania, że nawet SAS/C sprawia mniej problemów przy kompilacji dla Amigi niż GCC.

Co do kodu autora wątku - widzę, że używasz typu FLOAT.

Jest to Amigowy typ liczb zmiennoprzecinkowych, więc może użyj funkcji z bibliotek matematycznych Amigi - SPSin() na przykład z biblioteki: mathtrans.library.

Standardowe sin() pracują na zwyczajnych typach float.
[#18] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #14

Przepraszam, FLOAT i float to to samo.

W pliku <libraries/mathffp.h> wszystkie sin() są przekształcane na FPSin(). One będą działać tylko, gdy odpowiednia biblioteka matematyczna jest otwarta.

Ostatnia aktualizacja: 27.01.2021 17:54:03 przez Hexmage960
[#19] Re: Biblioteka matematyczna do 3d

@Hexmage960, post #17

Kompilator od Bebbo robi fajny kod startowy, który sam inicjuje bibliotekę fp gdy linkujesz -lm. Drugi problem, który jest rozwiązywany to to że jest tam wciąż dopracowywana biblioteka standardowa - a po co wnikać w jakieś amiga-only funkcje sinusowe, skoro można sobie po prostu strzelić sin() z math.h i mieć spokój? ;)
[#20] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #16

Robie na eclipse - cross kompilacja wg opisu Bebo mam zbudowane srodowisko. No ale coś wciąż nie halal.
[#21] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #19

Kompilator od Bebbo robi fajny kod startowy, który sam inicjuje bibliotekę fp gdy linkujesz -lm.

OK, rozumiem - zgoda.

Nawiasem mówiąc, SAS/C i DICE też automatycznie inicjują podstawowe biblioteki. Co do bibliotek zewnętrznych jak medplayer.library, to DICE ładnie sobie radzi z ich importem. W SAS/C jeszcze tego nie robiłem.

Wspomniałem tylko o tych kompilatorach, bo uważam, że nowe wersje GCC są bardziej skomplikowane w użyciu, choć możliwości jakie oferują są rzecz jasna bardzo duże. (pomijając znakomitą jakość kodu).

Drugi problem, który jest rozwiązywany to to że jest tam wciąż dopracowywana biblioteka standardowa - a po co wnikać w jakieś amiga-only funkcje sinusowe, skoro można sobie po prostu strzelić sin() z math.h i mieć spokój? ;)

Słusznie, ale warto mieć na uwadze Amigowe biblioteki matematyczne, bo to jednak właśnie za ich pomocą te funkcje są na Amidze implementowane - i korzystają z FPU 6888x gdy jest obecne, lub emulują - gdy go nie ma.

Bo sin() i cos() to już sprawa kompilatora, czy i jak je implementuje.

Uważam, że jak się koduje na Amidze (lub cross), warto mieć na uwadze standardy Amigi. Ułatwiają życie.
[#22] Re: Biblioteka matematyczna do 3d

@arturB, post #20

Wyłącz na chwilę eclipse i zbuduj z palca jak pisałem wyżej - będąc w cmd w katalogu z kodem:

m68k-amigaos-gcc -mcrt=nix20 -O3 Simple3d.c -o simple3d -lm

żeby widziało Ci w cmd kompilator, musisz dodać do niego ścieżkę do systemowego PATH.
Jak to rozwiążesz na tym poziomie, to potem dopiero odpal eklipsa i zmuś go do budowania w zbieżny sposób. Póki Ty nie będziesz władać IDE, to IDE będzie władać Tobą. Im szybciej się nauczysz nie polegać na jego domyślnej konfiguracji, tym będziesz miał łatwiej i na tej, i na innych platformach. ;)
[#23] Re: Biblioteka matematyczna do 3d

@teh_KaiN, post #22

Ok. Działa... Prawie. Problem został rozwiązany przez stablicowanie sin (cos). Wszystko byłoby pięknie gdyby nie to, że przy wyświetlaniu pokazuje glich tzn tak jakby niektore trojkąty były lekko obrócone lub jakby były widoczne 2 ramki wyrysowane jednocześnie ? Ktoś coś ?
link

Ostatnia aktualizacja: 28.01.2021 18:17:10 przez arturB
[#24] Re: Biblioteka matematyczna do 3d

@arturB, post #23

Ok. Działa... Aktualizacja kąta o jedna klamre nizej...
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