Jesteś zdezorientowany?
Gdy mamy piksele (w postaci trójkolorowych diod LED, w naszym przypadku) ułożone w pierścienie, jedną z rzeczy, które często chcemy zrobić, jest cykliczne włączanie nowego piksela i wyłączanie starego piksela w tym samym czasie. W poprzednich odcinkach mówiliśmy o różnych technikach, których możemy użyć, aby to osiągnąć. Z przykrością muszę jednak stwierdzić, że kilku czytelników wysłało do mnie e-maile z informacją, że nadal są zaskoczeni, zdezorientowani i zakłopotani – być może dlatego, że nie mogliśmy powstrzymać się od wprowadzenia i zbadania rogu obfitości alternatywnych podejść w trakcie naszej wędrówki. Poświęćmy więc chwilę, aby zebrać wszystkie te taktyki w jednym miejscu i zróbmy wszystko, co w naszej mocy, aby je zdemistyfikować.
W przypadku mojego projektu Silnika Prognostycznego pierścienie mają po 16 pikseli. Jednakże, jak zauważyłem w poprzednim odcinku (EdW08/2024), kiedy próbuję coś ogarnąć, najpierw lubię uprościć problem, co – w tym przypadku – oznacza zmniejszenie liczby pikseli. Mając wybór, chcemy znaleźć ogólne rozwiązanie, które może działać dla dowolnej liczby pikseli, więc zazwyczaj wybieram małą liczbę pierwszą, wychodząc z założenia, że jeśli nasze rozwiązanie działa w tym przypadku, to będzie działać we wszystkim.
Tak więc, wyłącznie na potrzeby naszych eksperymentów myślowych, załóżmy, że mamy 5-pikselowy pierścień i że nasze piksele są ponumerowane zgodnie z ruchem wskazówek zegara, zaczynając od 0 na górze (rysunek 1a). Czasami możemy chcieć ustawić pojedynczy piksel ścigający się wokół pierścienia w kierunku zgodnym z ruchem wskazówek zegara (rysunek 1b); innym razem możemy zdecydować się na obrót w kierunku przeciwnym do ruchu wskazówek zegara (rysunek 1c).
Aby zachować ogólność tych dyskusji, załóżmy, że liczba pikseli, którymi gramy, jest zdefiniowana jako NUM_P, która w tym przykładzie będzie wynosić 5. Ponadto, ponieważ nasze piksele są ponumerowane od 0 do 4, załóżmy również, że zdefiniowaliśmy MAX_P jako (NUM_P – 1), ponieważ pozwoli nam to uniknąć konieczności ciągłego odejmowania 1.
Jak omówiliśmy we wcześniejszych odcinkach, jeśli wykonujemy obrót zgodnie z ruchem wskazówek zegara i jeśli jesteśmy obecnie gotowi do aktywacji piksela P, to przez większość czasu chcemy dezaktywować piksel (P – 1). Tylko wtedy, gdy chcemy aktywować piksel 0, musimy dezaktywować piksel MAX_P. Podobnie, jeśli wykonujemy obrót w kierunku przeciwnym do ruchu wskazówek zegara i jeśli obecnie chcemy aktywować piksel P, to przez większość czasu chcemy dezaktywować piksel (P + 1). Tylko wtedy, gdy chcemy aktywować piksel MAX_P, musimy dezaktywować piksel 0.