Jeffrey Cross
Jeffrey Cross

Codebox: Istražite rekurziju s obradom

Rekurzija je važna tehnika programiranja koja se može primijeniti na mnoga područja, a ne samo na stvaranju zanimljivih vizualnih slika. Ukratko, rekurzija je tehnika razbijanja složenog problema na manje i jednostavnije verzije sebe (to se naziva "rekurzivni korak") sve dok se problem ne riješi (ovaj trivijalni slučaj se naziva "osnovni slučaj"). Ovaj Codebox nudi niz skica koje će vam pomoći istražiti ovu zabavnu i zanimljivu tehniku ​​koristeći jednostavne geometrijske koncepte.

Mnogi umjetnici su u svom radu koristili rekurzivne teme, osobito M.C. Escher i Rene Magritte. Ova prva skica pokazuje kako se stvaraju slike u stilu Piet Mondriana, koji je najpoznatiji po svojim skladbama šarenih pravokutnika.

Sljedeći program koristi rekurziju za kreiranje lažnog Mondriana. Osnovni slučaj je jednostavan: sve što trebate učiniti je nacrtati ispunjeni pravokutnik s debelom crnom granicom; Boja pravokutnika je odabrana iz malog skupa primarnih boja (crvena, bijela, žuta, itd.). Rekurzivni korak je razbiti ovaj pravokutnik (i sve naredne pravokutnike) u 4 manja pravokutnika odabirom slučajne točke u njenom unutarnjem dijelu. Sljedeća slika trebala bi vam dati ideju o tome kako to radi:

Izlaz će izgledati ovako:

Konačno, ovdje je skica, mondrian.pde:

Piet () funkcija je srce programa i ilustrira kako većina rekurzivnih programa radi. Evo ga:

// Crtanje Mondrian-inspirirane slike pomoću rekurzije void piet (int x0, int y0, int x1, int y1, int N) {if (N == 0) {// Base case - nacrtajte šareni pravokutnik s debelim crna granica int sw = 3; // ovo je širina crte za boju obruba pravokutnika c [] = {# ff0000, # 00ff00, # 0000ff, # ffff00, #ffffff}; // Mondrian color palatte fill (c [int (slučajna (c.length))]); strokeWeight (SW); rect (x0, y0, x1-x0-sw, y1-y0-sw); } else {// Rekurzivni korak - razbijte trenutni pravokutnik na 4 nova slučajna pravokutnika int i = int (slučajni (x0, x1)); int j = int (slučajni (y0, y1)); Piet (x0, Y0, i, j, N-1); // gornji lijevi pravokutnik piet (i, y0, x1, j, N-1); // gornji desni peterokut (x0, j, i, y1, N-1); // donji lijevi pravokutni piet (i, j, x1, y1, N-1); // donji desni pravokutnik}}

Funkcija prihvaća 5 argumenata: koordinate gornjeg lijevog kuta pravokutnika (x0 i y0), koordinate donjeg desnog kuta (x1 i x2) i trenutne rekurzivne dubine (N). Funkcija radi dvije osnovne stvari. Prvo, provjerava je li postignut "osnovni slučaj", kada je N = 0. Ako je tako, onda je sve što je učinio nacrtati pravokutnik koji je nasumično obojen iz osnovne Mondrianove palete boja (crvena, pohlepa, plava, žuta i bijelo). Ako to nije osnovni slučaj, tada odabire slučajnu točku (i, j) unutar trenutnog pravokutnika, a zatim poziva Piet () Još četiri puta, prolazeći kroz različite koordinate koje tvore 4 nova unutarnja pravokutnika. Ovaj pristup "podijeli i osvoji" ima funkciju koja sebe naziva je znak rekurzije.

Jednostavni rekurzivni procesi često se koriste za stvaranje objekata koji izgledaju prirodno. Na primjer, možemo stvoriti biljku koja izgleda prirodno pomoću sljedećeg jednostavnog rekurzivnog procesa gdje svaka "biljka" počinje kao ravna crta. Ova se linija zamjenjuje novom "granom" koja se sastoji od izvorne linije plus 3-4 nove naizmjenične grane. (Točan broj grana određen je varijablom koju možete postaviti). Isti se postupak primjenjuje rekurzivno za svaku novu granu, do dubine koju navedete. Sljedeća slika ilustrira osnovnu ideju:

Linije su prikazane kao vektori. Vektor se sastoji od početne točke definirane varijablama x i y, duljine koju definira varijabla r, te kut definiran varijablom theta. Sljedeća slika prikazuje kako su ove varijable povezane:

Ova slika ilustrira nekoliko jednostavnih "postrojenja" stvorenih ovim osnovnim procesom:

Evo skice, plant.pde:

Konačno, bio bih nemaran bez prikazivanja krivulje Pahuljica, jedne od najpoznatijih rekurzivnih figura. Osnovni slučaj je jednostavan trokut. Svaki rub se zatim zamjenjuje novim skupom od 4 segmenta linije koji su 1/3 duljine izvorne linije. Zatim opetovano zamjenjujete svaki od ovih novih segmenata novim segmentom s 4 retka (ovaj rekurzivni korak). Sljedeća slika trebala bi vam pružiti osnovnu ideju procesa:

Rezultati izgledaju ovako:

Evo skice, snowflake.pde. Imajte na umu da ćete morati dati biblioteku controlP5 za izmjenu rekurzivne dubine (koja se često naziva N) da biste vidjeli kako ona utječe na sliku. (Nažalost, morao sam ograničiti maksimalnu rekurzivnu dubinu na 6, a ne na beskonačnost, budući da knjižnica trenutno ne podržava dijapozitive koji se protežu izvan zaslona monitora i na udaljene dijelove poznatog svemira.)

Više: Pogledajte sve stupce Codeboxa

U skladištu za kavu:


Početak rada s obradom Naučite programiranje računala na jednostavan način s obradom, jednostavnim jezikom koji vam omogućuje da koristite kod za izradu crteža, animacije i interaktivne grafike. Programski tečajevi obično počinju s teorijom, ali ova knjiga omogućuje vam da skočite izravno u kreativne i zabavne projekte. Idealan je za svakoga tko želi naučiti osnovno programiranje i služi kao jednostavan uvod u grafiku za osobe s određenim vještinama programiranja.

Udio

Ostavite Komentar