Autor Wątek: Generator "sinusów"  (Przeczytany 5745 razy)

matofesi

  • *****
  • Wiadomości: 1888
  • Miejsce pobytu:
    Toruń/Poland
Generator "sinusów"
« dnia: 2020.05.07, 09:10:21 »
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

  • ***
  • Wiadomości: 116
  • Miejsce pobytu:
    Gdańsk
  • gg: 2830
Odp: Generator "sinusów"
« Odpowiedź #1 dnia: 2020.05.07, 11:24:10 »
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

  • *****
  • Wiadomości: 1888
  • Miejsce pobytu:
    Toruń/Poland
Odp: Generator "sinusów"
« Odpowiedź #2 dnia: 2020.05.07, 12:07:21 »
To nie ma być "fajne". To ma być użyteczne ;) A użyteczny tool nie wymaga "błyskotek" na starcie :)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4321
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Generator "sinusów"
« Odpowiedź #3 dnia: 2020.05.07, 20:41:42 »
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

  • *****
  • Wiadomości: 1888
  • Miejsce pobytu:
    Toruń/Poland
Odp: Generator "sinusów"
« Odpowiedź #4 dnia: 2020.05.08, 09:14:20 »
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".

ZX Freeq

  • *****
  • Wiadomości: 1752
  • Miejsce pobytu:
    Warszawa
Odp: Generator "sinusów"
« Odpowiedź #5 dnia: 2020.05.08, 22:06:30 »
Bardzo fajny tool. Dzięki!
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

matofesi

  • *****
  • Wiadomości: 1888
  • Miejsce pobytu:
    Toruń/Poland
Odp: Generator "sinusów"
« Odpowiedź #6 dnia: 2020.05.10, 12:39:58 »
Tak informacyjnie... Jeśli używacie generatora sugeruję jednak wersję prosto z serwera - cały czas wprowadzam jeszcze poprawki. Owszem - po zakończeniu zmian aktualizuję też zipa, ale oczywiście ściągnięty się nie zaktualizuje w odróżnieniu od wersji z serwera.

A poprawiłem obsługę zapisu wyniku - zmiana nazwy pliku po wygenerowaniu danych zmienia nazwę pliku w przycisku "Save" (dotychczas nazwa była ustawiana tylko po kliknięciu "Generate"). Przycisk "Save" jest też usuwany za każdym razem jak zmienią się jakieś parametry wpływające na generowane dane - dzięki temu unikamy sytuacji w której zapiszą się dane niezgodne z wybranymi parametrami, bo zapomnieliśmy kliknąć "Generate". Zmieniłem też domyślny tryb zapisu z "Clip" na "Normaliaze" - w praktyce wyszło mi, że tego trybu używam częściej ;)

matofesi

  • *****
  • Wiadomości: 1888
  • Miejsce pobytu:
    Toruń/Poland
Odp: Generator "sinusów"
« Odpowiedź #7 dnia: 2020.12.30, 22:54:20 »
Jeśli ktoś jeszcze używa generatora to informuję, że właśnie zrobiłem drobne poprawki:
- generowanie danych zaokrągla liczby "od piątki" a nie jak dotychczas "w dół do najbliższej całkowitej" - powinno to poprawić "gładkość" generowanych danych
- amplituda przy generowaniu powinna działać prawidłowo i dawać w wyniku po normalizacji dane od 0 do (amplituda-1) a nie jak dotychczas do wartości amplitudy (czyli np. generując dla amplitudy 100 dostawaliśmy wartości od 0 do 100 czyli tak na prawdę amplitudę 101)