Szmtgpes Grafika 3 gyakorlat Programtervez informatikus esti 20092010

  • Slides: 29
Download presentation
Számítógépes Grafika 3. gyakorlat Programtervező informatikus (esti) 2009/2010 őszi félév

Számítógépes Grafika 3. gyakorlat Programtervező informatikus (esti) 2009/2010 őszi félév

Információk • Gyakorlati diák: http: //people. inf. elte. hu/valasek/bevgraf_esti/

Információk • Gyakorlati diák: http: //people. inf. elte. hu/valasek/bevgraf_esti/

Emlékeztető • Röviden megnéztük az osztályokat – erre még később visszatérünk • Alacsony szintű

Emlékeztető • Röviden megnéztük az osztályokat – erre még később visszatérünk • Alacsony szintű utasításokkal megnéztük milyen magasabb szintű parancsokat implementálni • Esetünkben pontkirajzolással szakaszkirajzolást • Most a múlt órai algoritmust finomítjuk

Miből indulunk ki? • A múlt óraihoz hasonló vonalhúzó kódból: http: //people. inf. elte.

Miből indulunk ki? • A múlt óraihoz hasonló vonalhúzó kódból: http: //people. inf. elte. hu/valasek/bevgraf_e sti/03/Vonalhuzo. Alap. zip • Ezt a Dokumentumok/Processing-be kell kitömöríteni

Vonalhuzo. Alap int drag. Start. X, drag. Start. Y; int drag. End. X, drag.

Vonalhuzo. Alap int drag. Start. X, drag. Start. Y; int drag. End. X, drag. End. Y; void setup() { size(400, 400); } void draw() { background(220); line(drag. Start. X, drag. Start. Y, drag. End. X, drag. End. Y); }

Vonalhuzo. Alap void mouse. Pressed() { if (mouse. Button == LEFT) { drag. Start.

Vonalhuzo. Alap void mouse. Pressed() { if (mouse. Button == LEFT) { drag. Start. X = drag. End. X = mouse. X; drag. Start. Y = drag. End. Y = mouse. Y; } } void mouse. Dragged() { if (mouse. Button == LEFT) { drag. End. X = mouse. X; drag. End. Y = mouse. Y; } }

Általánosított Bresenham function Bres. Gen(x 0, y 0, x 1, y 1) boolean steep

Általánosított Bresenham function Bres. Gen(x 0, y 0, x 1, y 1) boolean steep : = abs(y 1 - y 0)>abs(x 1 - x 0) if steep then swap(x 0, y 0) swap(x 1, y 1) if x 0 > x 1 then swap(x 0, x 1) swap(y 0, y 1) int deltax : = x 1 - x 0 int deltay : = abs(y 1 - y 0) float error : = 0 float deltaerr : = deltay / deltax

Általánosított Bresenham int ystep : = 1 if y 0 > y 1 then

Általánosított Bresenham int ystep : = 1 if y 0 > y 1 then ystep : = -1 int y : = y 0 for x from x 0 to x 1 if steep then point(y, x) else point(x, y) error : = error + deltaerr if error >= 0. 5 then y : = y + ystep error : = error - 1. 0

Feladat 1 • Készítsük el az általánosított Bresenham eljárást Processing-ben!

Feladat 1 • Készítsük el az általánosított Bresenham eljárást Processing-ben!

Probléma • Lebegőpontos számokkal történő műveletek helyett jó lenne egész számokon dolgozni • Az

Probléma • Lebegőpontos számokkal történő műveletek helyett jó lenne egész számokon dolgozni • Az összes nem egész számunkat szorozzuk be deltax-szel! • Probléma: error ≥ 0. 5 • Fordítsuk meg az error jelentését és indítsuk deltax/2 -ről!

Bresenham optimalizált function Bres. Opt(x 0, y 0, x 1, y 1) boolean steep

Bresenham optimalizált function Bres. Opt(x 0, y 0, x 1, y 1) boolean steep : = abs(y 1 -y 0) > abs(x 1 -x 0) if steep then swap(x 0, y 0) swap(x 1, y 1) if x 0 > x 1 then swap(x 0, x 1) swap(y 0, y 1) int deltax : = x 1 - x 0 int deltay : = abs(y 1 - y 0)

Bresenham optimalizált int error : = deltax / 2 int ystep : = 1

Bresenham optimalizált int error : = deltax / 2 int ystep : = 1 int y : = y 0 if y 0 > y 1 then ystep : = -1 for x from x 0 to x 1 if steep then plot(y, x) else plot(x, y) error : = error – deltay if error < 0 then y : = y + ystep error : = error + deltax

Házi Feladat • Írjuk meg a Bresenham optimalizált formáját!

Házi Feladat • Írjuk meg a Bresenham optimalizált formáját!

Bresenham • Az eredeti 1962 -es kód: http: //www. bitsavers. org/1401/progs/brese nham/bresenham. s •

Bresenham • Az eredeti 1962 -es kód: http: //www. bitsavers. org/1401/progs/brese nham/bresenham. s • Nagyon hatékony

Adatszerkezetek • A Processing támogatja alapból a következő tároló típusokat: – Array. List –

Adatszerkezetek • A Processing támogatja alapból a következő tároló típusokat: – Array. List – Hash. Map • Array. List használata pl. : http: //java. sun. com/j 2 se/1. 4. 2/docs/api/jav a/util/Array. List. html

Array. List példa Array. List al = new Array. List(); al. add(new PVector(3, 2));

Array. List példa Array. List al = new Array. List(); al. add(new PVector(3, 2)); al. add(new PVector(35, 22)); for (int i=0; i<al. size(); ++i) { PVector p = (PVector)al. get(i); print(p); }

Feladat 2 • Írjuk programot, ami négy pont kijelölése után összeköti őket egy négyszöggé

Feladat 2 • Írjuk programot, ami négy pont kijelölése után összeköti őket egy négyszöggé • A bal egérgombbal adjunk hozzá új pontot a pontlistához • Négynél ne legyen több pont egyszerre • A négyszögünk csúcsait kis, 10 pixel átmérőjű körök jelezzék (stroke. Weight + point(x, y)) • 1 vastagságú szakaszok legyenek köztük

Feladat 3 • Az előző négyszögrajzoló programot bővítsük ki az alakzatkitöltés lehetőségével:

Feladat 3 • Az előző négyszögrajzoló programot bővítsük ki az alakzatkitöltés lehetőségével:

Kitöltés void fld(x, y, c, bg) if pixel[x, y] = bg AND x >

Kitöltés void fld(x, y, c, bg) if pixel[x, y] = bg AND x > 0 AND y > 0 AND x < width AND y < height then pixel[x, y] : = c flt(x+1, y, c, bg) flt(x-1, y, c, bg) flt(x, y+1, c, bg) flt(x, y-1, c, bg)

Probléma • Mi lehet az oka? • Alakzatkitöltésre más, hatékonyabb algoritmusok vannak

Probléma • Mi lehet az oka? • Alakzatkitöltésre más, hatékonyabb algoritmusok vannak

Szövegkirajzolás • PFont: – A Processing karakterkészlet osztálya – Használat: PFont font = load.

Szövegkirajzolás • PFont: – A Processing karakterkészlet osztálya – Használat: PFont font = load. Font(“fnt. vlw"); • text. Font(PFont): – Az aktuális kirajzolási karakterkészletet a paraméterben kapottra módosítja • text(str, x, y[, w, h, z]) • text. Size(int)

Példa http: //people. inf. elte. hu/valasek/bevgraf_esti/03/fnt. vlw void setup() { size(400, 400); PFont font

Példa http: //people. inf. elte. hu/valasek/bevgraf_esti/03/fnt. vlw void setup() { size(400, 400); PFont font = load. Font("fnt. vlw"); text. Font(font); } void draw() { text("Helló", 15, 30); }

Feladat 4 • Az előző programban a négyszögek csúcspontjainak rajzoljuk ki a csúcspontok mellé

Feladat 4 • Az előző programban a négyszögek csúcspontjainak rajzoljuk ki a csúcspontok mellé

Fájl output • Print. Writer: – Fájlba kiírásra – Használat: Stream. Writer w =

Fájl output • Print. Writer: – Fájlba kiírásra – Használat: Stream. Writer w = create. Writer(“file. txt”); – Eljárások: • • print() println() flush() close()

Feladat 5 • A létrejövő négyszögek koordinátáit írjuk ki egy fájlba (negyszogek. txt)

Feladat 5 • A létrejövő négyszögek koordinátáit írjuk ki egy fájlba (negyszogek. txt)

Fájl input • String[] load. Strings(<file_name>): – Betölti a paraméterben kapott fájlt soronként, visszaadja

Fájl input • String[] load. Strings(<file_name>): – Betölti a paraméterben kapott fájlt soronként, visszaadja a beolvasás eredményét – Használat: • String lines[] = load. Strings("szoveg. txt");

Szövegek feldolgozása • String[] split(str, delim): – String gy = "alma, korte”; String[] l

Szövegek feldolgozása • String[] split(str, delim): – String gy = "alma, korte”; String[] l = split(gy, ', '); • String[] split. Tokens(str, delims): – String gy = "alma, korte; eper”; String[] l = split. Tokens(gy, “, ; ”);

String osztály • Eljárások Java-ból ami ismerős: – substring(int fi, int li); – trim()

String osztály • Eljárások Java-ból ami ismerős: – substring(int fi, int li); – trim() –… • Számmá alakítás: – parse. Int(s); – parse. Float(s);

Feladat 6 • Az „l” billentyű lenyomásával töltődjön be a fájlból az összes elmentett

Feladat 6 • Az „l” billentyű lenyomásával töltődjön be a fájlból az összes elmentett négyszögkoordináta és rajzoljuk ki őket