artykuły

Delphi - Transformacje grafiki - Efekt fali cosinusoidalnej

21:36
Fri, 10 December 2004
Artykuł w jasny i przystępny dla każdego sposób obrazuje tworzenie filtra graficznego odpowiedzialnego za efekt "falowania obrazu".

Wstęp

Czytając tytuł, macie pewnie na uwadze mój ostatni artykuł. Tam jednak zajmowaliśmy się rysowaniem. Dziś przyszedł czas na transformacje grafiki, dlatego zaznaczam, że ten efekt będzie zupełnie różny od imiennika. Niektórych przerazić może słówko "cosinus" w tytule. Zapewniam, że nie ma się czego obawiać. Starałem się wszystko możliwie jak najdokładniej tłumaczyć. Przed rozpoczęciem, przypomnimy sobie wykres cosinusa. Wykres funkcji cosinus Póki co "brawo" dla Excela ;), a my...
...zaczynamy!

Piszemy program

Fajnie by było, gdyby obrazek nie był wyświetlany na "sztywno", ale np. falował. Dziś spróbujemy napisać, a przede wszystkim zrozumieć omawiany efekt. Utwórz folder, w którym będziesz przechowywał pliki programu. Przygotuj małą bitmapę (najlepiej jakieś zdjęcie) np. 100x150 pikseli (nie za wielką!) i zapisz ją do folderu z programem. Nadaj bitmapie nazwę "obrazek.bmp" Uruchom Delphiego Na formularzu umieść przycisk (Button). Kliknij nań dwukrotnie, przechodząc tym samym do "Edytora kodu", który czeka na nas z nowo-wygenerowaną procedurą ;) Przed słówkiem begin tworzymy nową sekcje var, do której wpisujemy wszystkie potrzebne nam zmienne. Potrzebujemy takich zmiennych: obrazek : TBitmap; x, y : integer; cosinus : integer; amplituda : integer; Po słówku begin wpisujemy natomiast coś takiego: obrazek := TBitmap.Create; obrazek.LoadFromFile('.\obrazek.bmp'); amplituda := 50; repeat if amplituda > 0 Then Dec(amplituda); for y:=0 To obrazek.Height-1 Do for x:=0 To obrazek.Width-1 Do begin cosinus := Round(Cos(y*50)*amplituda)+x; Canvas.Pixels[cosinus,y] := obrazek.Canvas.Pixels[x,y]; end; Application.ProcessMessages; until (Application.Terminated) or (amplituda <= 0); To już wszystko! Zapiszcie program w utworzonym przed chwilą folderze, odpalcie i sprawdźcie czy działa!
Fakt, troszkę to skomplikowane, ale zaraz powinno się wszystko wyjaśnić.Pierwsza linia:tworzy zmienną "obrazek" typu TBitmap, którą zadeklarowaliśmy wcześniej.
Druga linia:wczytuje do zmiennej "obrazek" obrazek ;) (Twoją bitmapę, którą umieściłeś wcześniej w folderze z programem)
Trzecia linia:przypisanie do zmiennej "amplituda" wartości 50 (amplituda to największe wychylenie ciała wprawionego w ruch drgający, w naszym wypadku "pożyczymy" ten termin aby oznaczyć nim wysokość fali)
Czwarta linia:rozpoczyna się pierwsza pętla - typ REPEAT Piąta linia: jeśli amplituda jest większa od zera...
Szósta linia:... to ją pomniejsz o jeden (można także zapisać amplituda := amplituda - 1, ale polecenie DEC działa znacznie szybciej)
Siódma linia:rozpoczyna się druga pętla - typ FOR, która "chodzi nam" kolejnych wierszach obrazka (czerwona linia):
Zobrazowanie pętli przechodzącej przez kolejne wiersze obrazka Ósma linia:rozpoczyna się trzecia pętla - typ FOR, która przebiega po pikselach danego wiersza (granatowa kropka):
Zobrazowanie pętli przechodzącej przez wszystkie piksele danego wiersza obrazka Gdy trzecia pętla FOR zakończy swoje działanie (gdy kropka będzie na końcu, po prawej), wówczas następuje przejście do kolejnej linii i ponowne uruchomienie pętli trzeciej, itd..., itd..., dopóki pętla druga nie osiągnie końca obrazka (linia zejdzie do samego dołu).
Dziewiąta linia:begin - cóż, begin to begin ;)
Dziesiąta linia:zmienna "cosinus" ma się równać: cosinusowi (aktualnego numeru linii (y) powiększonego 50-sięciokrotnie) przemnożonego przez amplitudę* do tego wszystkiego dodajemy dotychczasową pozycję piksela w aktualnym wierszu.
* wiemy z wykresu, że największa wartość cos = 1, dlatego wynik cosinusa przemnożony przez amplitudę nigdy nie będzie większy od niej samej.
Jedno pytanie: Dlaczego powiększonego 50-sięciokrotnie? Bo tak najładniej wygląda ;) Możecie wpisać byle co np. 600 (też fajne).
Jedenasta linia:Narysowanie piksela przesuniętego o wartość zmiennej consinus, o kolorze aktualnego piksela bitmapy pamięciowej, czyli [x,y].
Dwunasta linia:Nic ciekawego
Trzynasta linia:Daj oddychnąć systemowi
Czternasta linia:Zakończ działanie pierwszej pętli gdy użytkownik chce wyjść z aplikacji, bądź amplituda jest mniejsza lub równa zeru (czyli operacja została wykonana).
Kod źródłowy, dołączony do artykułu znajdziecie w tym miejscu.

Zakończenie

Efekty graficzne to jedna z ulubionych dziedzin programistów. Tych, którzy już zaczęli z nimi zabawę. Jednak aby coś polubić, najpierw trzeba samodzielnie tego spróbować i zrozumieć, aby później nie wzbudzało to już w nas takiego wytrzeszczu. Przecież zwykle, boimy się tego, czego nie rozumiemy. Dlatego postanowiłem udowodnić, że programowanie grafiki jest przyjemniejsze i często prostsze od wszystkiego z czym się do tej pory w programowaniu zetknęliśmy. W kolejnych artykułach, nie będzie ani sinusów, ani cosinusów. Użyjemy jedynie dodawania, czasami mnożenia czy dzielenia - czyli - podstawowych operatorów. To dzięki nim nałożymy na siebie dwa obrazki, w ten sposób, by widoczne były oba jednocześnie, dzięki nim przyciemnimy lub przejaśnimy zdjęcie, a przy tym wszystkim nauczymy się korzystać z wyobraźni i tworzyć jej odbicie - bo przecież to w tym wszystkim jest najfajniejsze...

12345
Delphi - Transformacje grafiki - Efekt fali cosinusoidalnej Autor opinii: Czytelnicy, data przesłania: 0

Podobne artykuly:

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    Nie ma jeszcze żadnych komentarzy.
    Dexter