Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaAlfréd Kocsis Megváltozta több, mint 9 éve
1
Számítógépes Grafika 3. gyakorlat Programtervező informatikus (esti) 2009/2010 őszi félév
2
Információk Gyakorlati diák: http://people.inf.elte.hu/valasek/bevgraf_esti/ http://people.inf.elte.hu/valasek/bevgraf_esti/
3
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
4
Miből indulunk ki? A múlt óraihoz hasonló vonalhúzó kódból: http://people.inf.elte.hu/valasek/bevgraf_e sti/03/VonalhuzoAlap.zip http://people.inf.elte.hu/valasek/bevgraf_e sti/03/VonalhuzoAlap.zip Ezt a Dokumentumok/Processing-be kell kitömöríteni
5
VonalhuzoAlap int dragStartX, dragStartY; int dragEndX, dragEndY; void setup() { size(400, 400); } void draw() { background(220); line(dragStartX, dragStartY, dragEndX, dragEndY); }
6
VonalhuzoAlap void mousePressed() { if (mouseButton == LEFT) { dragStartX = dragEndX = mouseX; dragStartY = dragEndY = mouseY; } void mouseDragged() { if (mouseButton == LEFT) { dragEndX = mouseX; dragEndY = mouseY; }
7
Általánosított Bresenham function BresGen(x0, y0, x1, y1) boolean steep := abs(y1 - y0)>abs(x1 - x0) if steep then swap(x0, y0) swap(x1, y1) if x0 > x1 then swap(x0, x1) swap(y0, y1) int deltax := x1 - x0 int deltay := abs(y1 - y0) float error := 0 float deltaerr := deltay / deltax
8
Általánosított Bresenham int ystep := 1 if y0 > y1 then ystep := -1 int y := y0 for x from x0 to x1 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
9
Feladat 1 Készítsük el az általánosított Bresenham eljárást Processing-ben!
10
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!
11
Bresenham optimalizált function BresOpt(x0, y0, x1, y1) boolean steep := abs(y1-y0) > abs(x1-x0) if steep then swap(x0, y0) swap(x1, y1) if x0 > x1 then swap(x0, x1) swap(y0, y1) int deltax := x1 - x0 int deltay := abs(y1 - y0)
12
Bresenham optimalizált int error := deltax / 2 int ystep := 1 int y := y0 if y0 > y1 then ystep := -1 for x from x0 to x1 if steep then plot(y,x) else plot(x,y) error := error – deltay if error < 0 then y := y + ystep error := error + deltax
13
Házi Feladat Írjuk meg a Bresenham optimalizált formáját!
14
Bresenham Az eredeti 1962-es kód: http://www.bitsavers.org/1401/progs/brese nham/bresenham.s http://www.bitsavers.org/1401/progs/brese nham/bresenham.s Nagyon hatékony
15
Adatszerkezetek A Processing támogatja alapból a következő tároló típusokat: –ArrayList –HashMap ArrayList használata pl.: http://java.sun.com/j2se/1.4.2/docs/api/jav a/util/ArrayList.html http://java.sun.com/j2se/1.4.2/docs/api/jav a/util/ArrayList.html
16
ArrayList példa ArrayList al = new ArrayList(); 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); }
17
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 (strokeWeight + point(x,y)) 1 vastagságú szakaszok legyenek köztük
18
Feladat 3 Az előző négyszögrajzoló programot bővítsük ki az alakzatkitöltés lehetőségével:
19
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)
20
Probléma Mi lehet az oka? Alakzatkitöltésre más, hatékonyabb algoritmusok vannak
21
Szövegkirajzolás PFont: –A Processing karakterkészlet osztálya –Használat: PFont font = loadFont(“fnt.vlw"); textFont(PFont): –Az aktuális kirajzolási karakterkészletet a paraméterben kapottra módosítja text(str, x, y[, w, h, z]) textSize(int)
22
Példa void setup() { size(400, 400); PFont font = loadFont("fnt.vlw"); textFont(font); } void draw() { text("Helló", 15, 30); } http://people.inf.elte.hu/valasek/bevgraf_esti/03/fnt.vlw
23
Feladat 4 Az előző programban a négyszögek csúcspontjainak rajzoljuk ki a csúcspontok mellé
24
Fájl output PrintWriter: –Fájlba kiírásra –Használat: StreamWriter w = createWriter(“file.txt”); –Eljárások: print() println() flush() close()
25
Feladat 5 A létrejövő négyszögek koordinátáit írjuk ki egy fájlba (negyszogek.txt)
26
Fájl input String[] loadStrings( ) : –Betölti a paraméterben kapott fájlt soronként, visszaadja a beolvasás eredményét –Használat: String lines[] = loadStrings("szoveg.txt");
27
Szövegek feldolgozása String[] split(str, delim): –String gy = "alma, korte”; String[] l = split(gy, ','); String[] splitTokens(str, delims): –String gy = "alma, korte; eper”; String[] l = splitTokens(gy,“,;”);
28
String osztály Eljárások Java-ból ami ismerős: –substring(int fi, int li); –trim() –… Számmá alakítás: –parseInt(s); –parseFloat(s);
29
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
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.