Zakręcone piksele

W ubiegłym miesiącu sprawdzaliśmy za pomocą wahadełka, kamery internetowej i komputera, czy Ziemia rzeczywiście się kręci. Dzisiaj temat łatwiejszy. Zajmiemy się spirografem - narzędziem do wykreślania wyjątkowo efektownych serwetek, zbudowanych z różnych odmian cykloid. Przyjrzymy się algorytmom, według których działają spirografy.

W ubiegłym miesiącu sprawdzaliśmy za pomocą wahadełka, kamery internetowej i komputera, czy Ziemia rzeczywiście się kręci. Dzisiaj temat łatwiejszy. Zajmiemy się spirografem - narzędziem do wykreślania wyjątkowo efektownych serwetek, zbudowanych z różnych odmian cykloid. Przyjrzymy się algorytmom, według których działają spirografy.

Rysunek 1. Spirograf jest wspaniałym przyrządem do wykreślania hipocykloid. Małe kółka toczą się po wewnętrznych obwodach dużych kół, a specjalne ząbki zapobiegają przypadkowym poślizgom. Długopis przełożony przez którąś z dziurek pozostawia na papierze piękny ślad.

Rysunek 1. Spirograf jest wspaniałym przyrządem do wykreślania hipocykloid. Małe kółka toczą się po wewnętrznych obwodach dużych kół, a specjalne ząbki zapobiegają przypadkowym poślizgom. Długopis przełożony przez którąś z dziurek pozostawia na papierze piękny ślad.

Po raz kolejny zajmiemy się poszukiwaniem algorytmów efektownej grafiki. Zacznijmy od problemu matematycznego: jak wykreślić cykloidę na ekranie komputera? Jak znaleźć współrzędne punktu jednocześnie przesuwającego się i wirującego po okręgu? Mam nadzieję, że załączone programy uproszczą obserwację tego zjawiska, a niezbyt złożona teoria matematyczna może zostać pominięta przez tych Czytelników, którzy wolą zajrzeć do jakiegoś poradnika matematycznego.

Niech kreślący cykloidę punkt znajduje się na obwodzie koła o promieniu r, toczącego się z prędkością v z lewej strony ekranu w prawo. Wtedy środek tego koła jest opisany równaniami:

x0 = v * t;

y0 = 200;

Współrzędne (x0, y0) określają początkowe położenie koła w chwili t = 0. Równania te oznaczają, że koło przemieszcza się w kierunku poziomym, ale nie w pionowym. Dobierając konkretne wartości prędkości i położenia w pionie z równań tych wyznaczymy położenie środka koła w każdej chwili.

Obwodowy punkt kreślący cykloidę przemieszcza się wokół przed chwilą wyliczonego punktu - wiruje dookoła niego z prędkością kątową omega:

x = x0 + r * cos( omega * t);

y = y0 + r * sin( omega * t);

Jest jeszcze jedna, bardzo ważna zależność:

v = omega * r;

Rysunek 2. Cykloida jest linią, którą pozostawia punkt wybrany na obwodzie koła toczącego się bez tarcia. W naszych programach raczej będziemy zajmować się nie ubogą cykloidą, a znacznie efektowniejszym śladem całej "rowerowej szprychy". W załączonych materiałach źródłowych jest prosty program, animujący taką sytuację.

Rysunek 2. Cykloida jest linią, którą pozostawia punkt wybrany na obwodzie koła toczącego się bez tarcia. W naszych programach raczej będziemy zajmować się nie ubogą cykloidą, a znacznie efektowniejszym śladem całej "rowerowej szprychy". W załączonych materiałach źródłowych jest prosty program, animujący taką sytuację.

Zależność ta jest zaczerpnięta z fizyki zjawiska i oznacza, że koło toczy się bez poślizgu. Wiąże ona prędkość przemieszczania z prędkością wirowania - każdy przecież wie, że rower przemieszcza się szybciej, gdy szybciej kręcą się jego koła.

W efekcie dochodzimy do wniosku, że punkt obwodowy toczącego się koła definiują dwa następujące równania:

x = x0 + r * cos( v / r * t);

y = y0 + r * sin( v / r * t);

Wykreślenie cykloidy jest już sprawą prostą:

r = 100;

v = 10;

for( t = 0; t < 10; t = t + 0.1)

{

x = x0 + r * cos( v / r * t);

y = y0 + r * sin( v / r * t);

putpixel( x, y);

}

Rysunek 3. W poszukiwaniu efektownej grafiki pchniemy rowerowe koło nie po prostej, a po regularnych krzywych - tutaj wewnątrz innego, dużego koła. Będziemy wykreślać odcinek łączący środek małego koła z punktem na jego obwodzie, oznaczony symbolem R2. Aby uniknąć komplikacji, wyliczanie współrzędnych podzielimy na etapy - najpierw znajdziemy środek małego koła, a potem - względem tego środka - wyznaczymy współrzędne punktu obwodowego.

Rysunek 3. W poszukiwaniu efektownej grafiki pchniemy rowerowe koło nie po prostej, a po regularnych krzywych - tutaj wewnątrz innego, dużego koła. Będziemy wykreślać odcinek łączący środek małego koła z punktem na jego obwodzie, oznaczony symbolem R2. Aby uniknąć komplikacji, wyliczanie współrzędnych podzielimy na etapy - najpierw znajdziemy środek małego koła, a potem - względem tego środka - wyznaczymy współrzędne punktu obwodowego.

Algorytm ten wykreśla co 0,1 sekundy punkt cykloidy pozostawianej przez koło o promieniu 100 metrów, toczące się z prędkością 10 metrów na sekundę. Tyle fizyka.

Punkty-ślady cykloidy nie tworzą efektownej grafiki. Już lepiej kreślić szprychy toczącego się koła, czyli linie łączące jego środek z punktem obwodowym. Oto odpowiedzialny za grafikę algorytm, kreślący tym razem nie punkty, a szprychy:

...

x = x0 + r * cos( v / r * t);

y = y0 + r * sin( v / r * t);

line( x0, y0, x, y);

...

Zresztą ani punkt, ani szprycha specjalnie nie będzie wiązać nam rąk. Jeśli zechcemy, wykreślimy odcinek dwóch szprych składających się na średnicę albo nawet obraz dowolnie przedłużonej szprychy, czyli linię zawierającą szprychę. To uogólnienie już nie znajdzie analogii z jazdą na rowerze - nie da się jechać na kołach, z których wystają, drą ziemię i ze świstem tną powietrze dziesięciometrowe szprychy... Ale program napisać można:

...

x1 = x0 - r * cos( v / r * t);

y1 = y0 - r * sin( v / r * t);

x2 = x0 + r * cos( v / r * t);

y2 = y0 + r * sin( v / r * t);

line( x1, y1, x2, y2);

...

Ktoś, kto zaimplementuje powyższe algorytmy, otrzyma nadal nieciekawą grafikę, zaprezentowaną na rysunku 2. (w materiałach źródłowych znajduje się odpowiedni program, w którym zmienną t porusza nie pętla for(), a systemowy zegar. W efekcie otrzymujemy namiastkę animacji). Kluczowym odkryciem jest porzucenie prostego toru jazdy na rzecz dużego okręgu - taka jazda w beczce śmierci lub nawet na jej zewnętrznym obwodzie! Grafika staje się zamknięta, ograniczona, powtarzalna i zaczyna przypominać serwetki.

Rysunek 4. W załączonych materiałach źródłowych znajduje się program, animujący wykreślanie cykloidy wewnętrznej, czyli hipocykloidy. Tajemnica piękna wykreślanej grafiki tkwi w doborze stosunku promieni obydwu kół. Zamiast punktu czy promienia małego koła będziemy wykreślać znacznie dłuższy odcinek, zawierający ten promień.

Rysunek 4. W załączonych materiałach źródłowych znajduje się program, animujący wykreślanie cykloidy wewnętrznej, czyli hipocykloidy. Tajemnica piękna wykreślanej grafiki tkwi w doborze stosunku promieni obydwu kół. Zamiast punktu czy promienia małego koła będziemy wykreślać znacznie dłuższy odcinek, zawierający ten promień.

W algorytmie zmienią się równania ruchu środka toczącego się koła. Rachunek nie jest trudny, ale przytoczymy tylko gotowe wzory, trzymając się oznaczeń z rysunku 3. Niech duże koło (tor jazdy) spoczywa w punkcie (x1, y1) i ma promień R1. Niech środek małego, toczącego się po torze koła ma współrzędne (x2, y2) i promień R2 oraz niech jego jazda odbywa się z prędkością v. Szukany punkt obwodowy niech ma współrzędne (x3, y3). Oto równania ruchu tego punktu, czyli cykloida w beczce śmierci, zwana hipocykloidą:

...

x2 = x1 + (R1 - R2) * cos( v * t / R2);

y2 = y1 + (R1 - R2) * sin( v * t / R2);

x3 = x2 + R2 * cos( -v * t * (R1-R2)/(R2*R2));

y3 = y2 + R2 * sin( -v * t * (R1-R2)/(R2*R2));

...

Równie efektownie będzie wyglądała cykloida (zwana epicykloidą), kreślona na zewnątrz dużego koła:

...

x2 = x1 + (R1 + R2) * cos( v * t / R2);

y2 = y1 + (R1 + R2) * sin( v * t / R2);

x3 = x2 + R2 * cos( v * t * (R1+R2)/(R2*R2));

y3 = y2 + R2 * sin( v * t * (R1+R2)/(R2*R2));

...

Rysunek 5. Epicykloida, czyli cykloida zewnętrzna, tutaj wykreślana nie punktami, a średnicami toczącego się koła.

Rysunek 5. Epicykloida, czyli cykloida zewnętrzna, tutaj wykreślana nie punktami, a średnicami toczącego się koła.

Równania epicykloidy różnią się w dwóch miejscach - punkt obwodowy może się oddalić na odległość R1 + R2, stąd suma promieni (wcześniej była różnica) i kierunek wirowania małego koła jest zgodny z kierunkiem prędkości - stąd dodatnie wyrażenia w funkcjach trygonometrycznych (wcześniej były ujemne).

Epicykloidę ilustruje program przedstawiony na rysunku nr 5., jednak jest to figura wykreślana odcinkami średnic toczącego się koła, nie jednym, wybranym punktem. Z artystycznego punktu widzenia jest to bardzo ważne uogólnienie, a dochodzimy do niego następująco:

...

x2 = x1 + (R1 + R2) * cos( v * t / R2);

y2 = y1 + (R1 + R2) * sin( v * t / R2);

x3 = x2 - R2 * cos( v * t * (R1+R2)/(R2*R2));

y3 = y2 - R2 * sin( v * t * (R1+R2)/(R2*R2));

x4 = x2 + R2 * cos( v * t * (R1+R2)/(R2*R2));

y4 = y2 + R2 * sin( v * t * (R1+R2)/(R2*R2));

...


Zobacz również