Przemyślałem sprawę jeszcze raz i oto do czego doszedłem
Pisze o konkretnym przypadku przytoczonym przez gorgh'a. Jest tam użyty tryb antica 7 (graphics 2) 20 znaków w linii 8x8 pixli podwójnej wysokości. Ekran mieści się w 2 zestawach znaków, ale pisane jest po zestawie znaków jako pamięci ekranu.
Spójrzmy na to tak, że tak powiem od dupy strony:
Nie optymalizować algorytmu, tylko wykorzystać właściwości sprzętu i szachownicy.
Obracamy kwadrat.
Kwadrat po obrocie o 90 stopni ... jest takim samym kwadratem. Wiec z 64 faz obrotu zostaje już tylko 16.
Zamiast obracać kwadrat obróćmy teraz jego boki przedłużone w nieskończoność, i okazuje się że mamy już prawie szachownicę. Wystarczy teraz proste powielić ... i mamy kratownicę (prawie szachownicę). Trzeba ją tylko pokolorować.
Idąc dalej, aby narysować KRATOWNICĘ, wystarczy obliczyć, korzystając ze skali i kąta obrotu odległość w poziomie i pionie pomiędzy kolejnymi liniami. (podstawy trygonometrii z liecum) i narysować rzędy równoległych linii.
Teraz trzeba wykorzystać trochę szachownicę.
Jakakolwiek linia dzieląca pola szachownicy, w bitowym odwzorowaniu ekranu w zakresie 1 bajtu, ma po jednej stronie same zera a po drugiej same jedynki lub odwrotnie.
Czyli jest całe 8 możliwych wartości (0b00000000, 0b00000001, 0b00000011, 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111, 0b11111111) i drugie 8 w drugą stronę najzwyczajniej w świecie zanegowane wszystkie bity.
Ustawiając te patterny w odpowiedniej kolejności można uzyskać linie nachylone pod każdym kątem.
Extremalny przypadek, węzeł czy jak to nawać miejsce gdzie spotykają się 2 linie (Pamiętając że jest to szachownica). w najgorszym przypadku, będzie to coś w rodzaju 0b00111000 co jest niezwykle łatwe do obliczenia.
2 linie:
pierwsza linia 0b00111111
druga linia 0b00000111
------------
eor na bitach: 0b00111000
Nie ma możliwości, przy założeniu że linie nie zbliżą się do siebie na mniejszą odległość niż jakieś 9 pixli w poziomie aby w 1 bajcie pamięci ekranu pojawiła się inna wartość niż zera-jedynki-zera, jedynki-zera, zera, lub ich negacja.
Idąc dalej, wszystko sprowadza się do nałożenia na siebie i eor'owania 2 pasów śćiśle ze sobą powiązanych. (nachylonych względem siebie o 90 stopni)
Przykład dla zobrazowania bo sam się zamotałem nieco:
1 pas
. . . . . . . o
. . . . . . o o
. . . . . . o o
. . . . . o o o
. . . . . o o o
. . . . o o o o
. . . . o o o o
. . . o o o o o
2 pas (zawsze obrócony o 90 stopi wzgeldem 1 szego)
. . . . . . . .
. . . . . . . .
o . . . . . . .
o o o . . . . .
o o o o o . . .
o o o o o o o .
o o o o o o o o
o o o o o o o o
Wynik eorowania:
. . . . . . . o
. . . . . . o o
o . . . . . o o
o o o . . o o o
o o o o o o o o
o o o o . . . o
o o o o . . . .
o o o . . . . .
Korzystając z gotowych patternów linii nachylonych pod jednym z 16 kątów + eor'owanie ich można uzyskać efekt operując na bajtach nie na pixelach.
Nie analizowałem jak program działa, przyjrzałęm się tylko zgrubnie że działanie polega na kopiowaniu patternów i ich wzajemnym eorowaniu. Resztę wymyśliłem w trakcie pisania.
Zamieniając patterny na patterny z ustawionym tylko 1 bitem, oraz eor na or, powinno się dać uzyskać efekt 'kartki w kratkę'.
Zmieniająć 1 bajt w powyższym demie z $ff na $01 w generatorze patternów uzyskałem rządany efekt :) No prawie :D ale idee widać. Potwierdza to trafność metody.
Co ciekawe generator paternów generuje 8 bajtów danych, korzystając z 11 bajtów kodu.
Qrde może dema zaczne pisać :D
Whisky wyszła czas iść spać.
Pozdrawiam
Willy.
Post's attachmentskratka_.png 5.9 kb, nikt jeszcze nie pobierał tego pliku.
Tylko zalogowani mogą pobierać załączniki.
"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce"
https://github.com/willyvmm/mouSTerjmp $e477