ZX Spectrum > PROGRAMOWANIE

Generator "sinusów"

(1/2) > >>

matofesi:
Programując w assemblerze - zwłaszcza dema - czasem/często (zależnie od tego, co robimy ;)) potrzebna jest nam tablica "sinusów" (albo innych okresowych funkcji). Przydaje się do różnego rodzaju scrollerów, kulek kręcących się w kółko, podskoków itp. Dotychczas zwykle jak było mi potrzebne coś takiego dłubałem pętlę w BASICu Spectrum i dopasowywałem to co widzę do tego, co jest mi potrzebne. Działało to tak sobie - wolno, niewygodnie a do tego przy braku "wyobraźni matematycznej" dojście do właściwych kształtów zajmowało dużo czasu. Patrzyłem przez chwilę na różne dostępne w sieci narzędzia, ale żadne nie spełniało do końca moich wymagań (głównie chodziło o "przeglądarkowość" i "wizualność") więc w chwilach wolnego czasu przysiadłem i napisałem coś, co być może przyda się nie tylko mnie: singen.

Pierwsze podstawowe zastrzeżenie - program pisałem dla siebie w związku z tym nie daję żadnej gwarancji że na innej niż Chrome przeglądarce na innym niż moje komputerze będzie działał/wyglądał poprawnie ;)

Program pozwala "zwizualizować" dwie funkcje oraz ich złożenie. Każda z funkcji używa swojej zmiennej (nie da się zrobić funkcji dwóch zmiennych) i jest wyświetlana w panelu 320x200 lub 200x320 pikseli w który wpisywany jest jeden pełny okres sinusa (2*pi) oraz amplituda od -1 do 1. Jeśli wpisana funkcja wychodzi poza te wartości zostanie po prostu przycięta. Jeśli wpisana funkcja nie daje się "wyliczyć" zostanie podświetlona na czerwono. W funkcjach można używać standardowych funkcji matematycznych z Math Javascriptu (Math object).

Trzeci panel wizualizuje złożenie obu funkcji - domyślnie w postaci krzywej Lissajous, po kliknięciu w formie "pseud-plazmy" (suma wartości funkcji dla danych współrzędnych zamieniona na poziom szarości). W polu "Animation" możemy kliknąć na "[off]" (co przełączy link na "[on]") i włączyć animację wizualizacji parametry "Start" pozwalają przesunąć początek okresu funkcji, "Diff" określają przeskok przy kolejnej klatce czyli prędkość animacji dla danej funkcji. Przycisk "[reset]" przywraca te wartości do stanu początkowego.

Cała wizualizacja nie jest jednak specjalnie przydatna jeśli nie da się jej wyniku użyć we własnym programie. Do tego służy panel "Output parameters" - ustalamy tam w jakiej formie chcemy dostać wygenerowane dane. Najpierw wybieramy którą funkcję chcemy wyeksportować, jej długość i amplitudę. Długość określa liczbę pozycji w wygenerowanej tablicy, amplituda maksymalną wartość jaką mogą - zwykle - osiągać wygenerowane dane. Zwykle, bo kolejny parametr może to trochę zmienić - "Mode" określa jak mają być generowane dane.
W trybie "Clip" to co widzimy w panelu funkcji zostanie "przeskalowane" tak, że wartość -1 będzie odpowiadała wartości 0, a wartość 1 podanej amplitudzie. Jeśli funkcja wykracza poza zakres od -1 do 1 wartości zostaną przycięte. W trybie "Normalize" funkcja zostanie przeliczona i ustalone minimum i maksimum wartości a następnie zostanie ona przeskalowana tak, że nimimum będzie odpowiadało wartości 0 a maksimum podanej amplitudzie. Tryb "As is" może zmienić maksymalną wygenerowaną wartość - ustala on również minimum i maksimum dla funkcji a następnie przesuwa ją "w górę" tak, że minimum odpowiada wartości 0 jednak nie skaluje do amplitudy wartości maksymalnej tylko zakres od -1 do 1 a jeśli znajdzie wartości poza ten zakres wykraczające to zwiększy amplitudę.
Parametr "Format" pozwala wybrać czy chcemy mieć dane szesnastkowe czy dziesiętne. Jeśli wybierzemy szesnastkowe w następnym parametrze możemy zdecydować jak mają być prezentowane (zależnie od używanego assemblera) a w kolejnym możemy wybrać czy chcemy dane ośmio czy szesnasto bitowe - jeśli amplituda jest większa niż 255 to musimy wybrać 16 bitów, jeśli w trybie "As is" wyliczona zostanie amplituda powyżej 255 to tryb zmieni się automatycznie. Ostatni parametr to nazwa pliku wynikowego. Po kliknięciu "Generate" sformatowane dane wynikowe pojawią się w panelu po prawej a dodatkowo pojawi się przycisk "Download", który pozwoli nam zapisać wygenerowany plik na dysk.

Program jest przeglądarkowy, ale działa bezpośrednio w przeglądarce - archiwum można ściągnąć tu: singen.zip. Po rozpakowaniu otwieramy w przeglądarce index.html z katalogu singen i powinna nam się uruchomić wersja off-line (nie całkiem - doładowuje z sieci jakieś fonty itp.). I tak... archiwum ma prawie 8 mega - program był pisany w Darcie, który kompiluje wynik do Javascriptu dodając do niego swój runtime ;)

zibi:
Fajne.

Z feature requestów na start wrzuciłbym animację - opcję powiązania x i y jakimś równaniem i puszczenie zmian na jednej z tych zmiennych, żeby na żywo zobaczyć, co się dzieje.

matofesi:
To nie ma być "fajne". To ma być użyteczne ;) A użyteczny tool nie wymaga "błyskotek" na starcie :)

Tygrys:
Dzięki za namiary. Zwykle do generowania odpowiednich dla mnie sinusów używam mojego systemu do prototypowania efektów / gier, ale wyżej wymienione 'wizualizatory' na pewno będą pomocne każdemu, kto nie często potrzebuje stablicowanego sinusa ;)

matofesi:
Nowa wersja z dodanym zapisem parametrów w pamięci przeglądarki. Zapisywane jest wszystko łącznie ze stanem animacji wystarczy więc raz włączyć animację i będzie się kręciła przy każdym wejściu do aplikacji ;)
Do tego przycisk "Reset all", który przywraca wszystkie parametry do domyślnych wartości. I kosmetyczna zmiana - przycisk "Download" to teraz "Save".

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej