Moje małe pole siłowe
Pole siłowe to pojęcie występujące nie tylko w fizyce czy chemii. Może być ono równiez wykorzystane na wiele twórczych sposobów w sztuce generatywnej.
Czym jest pole siłowe
Jeden z esejów Tylera Hobbsa dotyczy właśnie pola siłowego i pokazuje prosty przykład użycia koncepcji pola do generowania interesujących obrazów. Dzisiaj pójdę za tą inspiracją i spróbuję stworzyć swoje małe pole siłowe.
Z punktu widzenia fizyki pole siłowe jest polem wektorowym, które w każdym punkcie przestrzeni działa na ciało pewną siłą. Pole takie może być opisane jako fukcja, która każdemu punktowi przestrzeni przypisuje pewien wektor. Wektor ten reprezentuje siłę, jaka działa na ciało znajdujące się w danym punkcie przestrzeni.
Najbardziej znanym polem tego typu jest oczywiście pole grawitacyjne. Innymi są pole magnetyczne czy pole elektryczne. Pojęcia te pamiętam jeszcze z podstawówki - dziś wykorzystam je do stworzenia grafiki.
Jak je stworzyć
Nie powinno to być nic trudnego.
- Potraktuję płaszczyznę jak siatkę (wystającą nieco poza obszar obrazu, który zamierzam stworzyć)
- w każdym punkcie (a raczej “kwardacie”) tej siatki zapamiętam siłę, która w tym punkcie działa
- mogę ją zdefiniować przy pomocy funkcji matematycznej lub
- wykorzystać funkcję noise()
Siatka
Statka będzie rozpięta poza obszar rysowania o pewną część szerokości/wysokości obszaru - nazwę tę część offset
(będzie miała wartość 0.3).
Szerokość/wysokość jednego “oczka” siatki również zdefiniuję jako część szrokości/wysokości obszaru - nazwę tę część resolution
(będzie miała wartość 0.05).
W każdym “oczku” siatki będę przechowywać dwie wartości z przedziału (0, 1) - będą to współrzędne dx i dy swobodnego wektora siły “zaczepionego” w środku oczka.
Oto konfiguracja siatki:
|
|
W ten sposób tworzę siatkę (klasa Grid) przekazując w konstruktorze obiekt GridConf
(jako gc
):
|
|
Siła
Wartość dx - czyli pozioma składowa siły - powinna się łagodnie zmieniać na przestrzeni dwuwymiarowej, dlatego do określenia wartości dx w danym “oczku” używam dwuargumentowej funkcji noise(): jako argumenty przekazuję współrzędne płaszczyzny “noise” (przesuwam się po niej krokami dxxoff
w kierunku poziomym i dxyoff
w kierunku pionowym).
Podobnie jest z pionową składową siły - genruję ją poruszając się po płaszczyźnie “noise” krokami dyxoff
oraz dyyoff
.
Oto konfiguracja siatki:
|
|
Siatkę - strukturę dwuwymiarową - reprezentuję jako zwykłą jednowymiarową tablicę, przeliczając współrzędne [kolumna, wiersz] na odpowiedni indeks w tablicy. Służą do tego funkcje
force(c, r)
- zwraca wartość siły dla podanej kolumnyc
i wierszar
setForce(c, r, v)
- ustawia wartośćv
siły dla podanej kolumnyc
i wierszar
|
|
W ten sposób wypełniam tablicę reprezentującą siatkę, przekazując NoiseConf
jako nc
. Wędrówkę po płaszczyźnie “noise” rozpoczynam z “punktów” (0, 0):
|
|
Rysuję wektory siły (od zielonej do czerwonej kropki):
|
|
Zastosowania
Co teraz zrobię z polem siłowym? Jak wykorzystam go do stworzenia czegoś interesującego?
O tym już wkrótce w kolejnym wpisie. Zapraszam!
Ten wpis jest częścią serii strengthfield.
- 2021-11-08 - Wykorzystanie pola siłowego
- 2021-08-08 - Moje małe pole siłowe