Raytracing tutorial, avagy suga rko vete s alapfokon

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "Raytracing tutorial, avagy suga rko vete s alapfokon"

Átírás

1 Raytracing tutorial, avagy suga rko vete s alapfokon (Írta és rendezte: Farkas Ádám [wolfee] Nyelvtani segítséget nyújtott: Ludányi Zsófi) Ebben a tutorialban el fogom magyarázni a sugárkövetés alapjait, egy próbakódon is végiggyalogolunk, és a végén szép képeket fogunk előállítani. Nem célom ezzel az útmutatóval/cikkel/írással a grafika tárgyat hallgatók helyett megoldani a feladatot konkrét feladathoz kapcsolódó kódot nem is fogok mutatni, a célom az, hogy az olvasó megértse a sugárkövetés alapjait, és ebből kiindulva egyéb érdekes programokat fejlesszen. Meg hogy át tudjon jutni a grafika sugárkövetős háziján.

2 Síkra vetődött Kezdjük a dolgot egy kis elméleti alapozással, konkrétan azzal, hogy mit is csinálunk sugárkövetéskor! Ahhoz, hogy a valóságot közelíteni tudjuk, először meg kell nagyjából értenünk a valóság működését. Nem fogok kusza matematikai fizikai képleteket használni, csak amennyi feltétlenül muszáj. Tegyük fel, hogy egy szobában vagyunk, ahol van egy darab fényforrás, pár gömbölyű tárgy (pl. labda), és a szoba falai. A fényforrás egységnyi idő alatt végtelen sok fotont emittál (ereszt ki magából), ezek a fénysugarak pedig elindulnak a térben, visszaverődnek a falakról, a gömbökről, miközben energiát veszítenek, és a fotonok egy része a verődések után a szemünkbe jut. Ez alakítja ki a szemünkben azt az érzést, hogy látunk. A szembeérkező fénysugarak energiája pedig a színérzetet alakítja ki. Tehát minél kisebb energiájú fény jut a szemünkbe, annál sötétebbnek látjuk a világot. Ebből adódhatna a megoldás nulladik szintű közelítése: vegyünk fel a virtuális terünkben egy fényforrást, és eresszünk ki belőle mennyi fotont is? A számítógép egy véges erőforrású eszköz. Ilyen szempontból nagyon is véges. Oké, akkor eresszünk ki nagyon-nagyon sokat, majd szép lassan leszámlálódik úgyis. A probléma a megoldással a következő: sokat számolunk fölöslegesen. Ahogy a valóságban, úgy itt is, a kilőtt fénysugarak csak nagyon kis része jutna el a szemünkbe. A többi egyszerűen nem a virtuális szemünkben fog landolni. A 19. században élt egy Helmholtz nevű német úriember, orvos-fizikus, aki rájött, hogy a fény iránya megfordítható. Tehát ha van egy tükröm, mindegy, hogy a jobb oldalán van a szemem, és a bal oldalán van az égő, vagy fordítva, mindkét esetben ugyanúgy ki tudom égetni a retinámat. Ebből következik, hogy a fény visszaverődése a fény beérkezési szögétől függ. Ez azért nagyszerű hír, mert így mi is meg tudjuk fordítani a sugárkövetésünket. Tehát indítsunk ki a fénysugarakat a szemünkből, és kövessük vissza az útját egészen a fényforrásig! Na de mennyit? És merre? És hogyan? Ezek a kérdések vetődhetnek fel, ha valaki olyan vadságokat mond, hogy világítsunk a szemünkkel. Ennek megértéséhez kicsit nyúljunk vissza az első megközelítéshez, amely jobban illusztrálja a valóságot. Tehát tegyük fel, hogy van egy fényforrásunk, meg egy szobánk. És mi egy pixeles képet akarunk róla csinálni. Ezt el tudjuk érni, ha a szobába belenyomunk egy as ernyőt, amelyre felfogjuk a fotonokat. Tulajdonképpen úgy működhetne, mint egy fényképezőgép, ahogy a lenti ábrán is látszik.

3 Csináljuk tehát a következőt: vegyünk egy kamerát (virtuális szemünket), egy síkot, amelyre leképezzük a képet (ezt osszuk fel pixelre), és a kamerából a sík egyes pontjain keresztül lőjünk sugarakat a színtérbe! Ha ennek a működését sikerült megérteni, akkor hatalmas lépést tettünk a sugárkövetés megértése felé!

4 Nekem Szebi tanította a progkettőt! Az OOT ha tetszik, ha nem jó dolog. Viszont ebben a tutorialban a kevesebb kód érdekében az adatrejtést nem fogjuk kihasználni, majdnem minden publikus lesz. Legyen a programunknak a következő a felépítése: Feltételezzük én feltételezem, hogy létezik egy Color osztály, amelynek van R, G, B double számhármasa, valamint megfelelő műveletei, illetve létezik egy Vec vektor osztály is, x, y, z double hármassal, és megfelelő műveletekkel. Mit is csinálunk tulajdonképpen? Legyen egy Scene osztályunk, amely tároljon egy tömbben Objectre mutató pointereket. Mivel Object bárhol helyettesíthető a leszármazottaival, ezért megcsinálhatjuk, hogy Object_type_1-et és Object_type_2-t teszünk a helyére. Jól látható a heterogén kollekció. Aki nem látja, nos, azzal nem tudok mit kezdeni. Csináljuk meg az osztályokat, és benne függvényeket, üres törzzsel! Segítségként megadom néhány alap dolog implementációját, amiket ujjgyakorlatként bármikor meg kell tudni írni annak, aki elvégezte a progkettőt.

5 #include <math.h> #include <iostream> using namespace std; const double epsilon = 1e-4; // a hiba mértéke, a számítási hibák elkerülése miatt #define PI // elég pontos PI #define DMAX 5 // a rekurzió maximális mélysége // Color osztály, néhány alap metódussal. class Color public: double r; double g; double b; Color(double gr = 0.0, double gg = 0.0, double gb = 0.0) r = gr; g = gg; b = gb; Color(Color& theother) r = theother.r; g = theother.g; b = theother.b; Color& operator=(color& theother) r = theother.r; g = theother.g; b = theother.b; return *this; Color operator+(color& theother) Color ret; ret.r = r + theother.r; ret.g = g + theother.g; ret.b = b + theother.b; return ret; ; Color operator/(double d) Color ret; ret.r = r / d; ret.g = g / d; ret.b = b / d; return ret; // Vektor osztály néhány alap metódussal class Vec public: double x, y, z; Vec(double x0 = 0, double y0 = 0, double z0 = 0) x = x0; y = y0; z = z0; Vec operator+(const Vec &b) const

6 return Vec(x + b.x, y + b.y, z + b.z); Vec operator-(const Vec &b) const return Vec(x - b.x, y - b.y, z - b.z); Vec operator*(double b) const return Vec(x * b, y * b, z * b); Vec operator/(double b) const return Vec(x / b, y / b, z / b); Vec mult(const Vec &b) const return Vec(x * b.x, y * b.y, z * b.z); Vec& norm() return *this = *this * (1 / sqrt(x * x + y * y + z * z)); double length() return sqrt(x * x + y * y + z * z); double dot(const Vec &b) const return x * b.x + y * b.y + z * b.z; ; Vec operator%(vec &b) return Vec(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x); // Sugár osztály class Ray public: Vec P0; // kezdőpont Vec dv; // irányvektor ; // Fény osztály class Light public: Color color; // színe Vec P0; // helyzete ; // Kamera osztály class Camera public: Vec P0; // kamera helyzete ;

7 // Általános objektum osztály class Object public: Color color; // szín Color Kr; // Fresnel-együttható (számolandó) Color fr; // törési tényező Color kappa; // Kioltási tényező bool isreflective; // tükröző felület? bool isrefractive; // törő felület? virtual double intersect(ray& ray) = 0; // metsző függvény. Tisztán virtuális, tehát minden leszármazottnak meg kell valósítania virtual Vec getnormal(vec& intersect) = 0; // a felületi normálist adott pontban lekérdező függvény ; void computefresnel(double costheta) // Fresnel-együtthatót számoló függvény // Színtér objektum class Scene public: Object* objects[100]; // Általános objektumokra mutató pointerek (leszármazottakat fogunk beletenni) int objcount; // tárolt objektumok száma Light light; // fény a színtérbe // konstruktor Scene() objcount = 0; // színtérhez adás void add(object* object) objects[objcount] = object; objcount++; ; // a sugárkövetőnk lelke Color Trace(Ray& ray, int iterat) int main() return 0;

8 Az első laszti Nos, mint mondtam a legelején, gömbökkel fogunk foglalkozni, mivel ennek a testnek viszonylag egyszerű az egyenlete, mégis nagyon jól látszik rajta a tükröződés, fénytörés. Egy kis matematika az elejére: Az OpenGL-t most teljes mértékben kihagyjuk a buliból, csak a kép megjelenítésére fogjuk használni. Tehát a -1,1-es koordinátarendszert el lehet felejteni, mi rendes koordinátarendszerben fogunk dolgozni, ahol a képünk egység lesz (ekkora lesz a már korábban megbeszélt ernyőnk). A gömb a következő alaptulajdonságokkal rendelkezik matematikailag: Van neki egy középpontja, és egy sugara. Valamint van neki egy tök jó egyenlete, ami így néz ki: (x x0) 2 + (y y0) 2 + (z z0) 2 < r 2 Tulajdonképpen mit is akarunk? Beletesszük a gömböt a színtérbe, a kameránkból sugarakat indítunk az ernyőnkön keresztül, és ha eltaláljuk vele a gömböt, akkor kirajzoljuk a gömb színét az ernyő megfelelő pontjára. A fenti ábrából egyelőre képzeletben hagyjuk el a fényforrást! A sugarunknak szüksége van egy kezdőpontra és egy irányra. A kezdőpontja (P0) legyen az ernyő megfelelő pontja, az iránya (dv) pedig a kamerából a kezdőpontba mutató vektor. Ekkor az egyenes egy tetszőleges pontja a P1 = P0 + t * dv egyenlettel megadható, ahol t egy tetszőleges valós paraméter. A gömb egyenletéből és a sugárról tudott információk alapján le lehet vezetni, hogy hogyan kell kiszámolni a t -t, hogy a sugarunk elmetssze a gömböt. Én most ettől eltekintek, higgyétek el

9 nekem, hogy amit leírok, az úgy van. Egyébként a (x x0) 2 + (y y0) 2 + (z z0) 2 - r 2 = P0 + t * dv egyenletet kell megoldani t-re. Ha megvan a sugarunkhoz tartozó t, akkor ki tudjuk azt is számolni, hogy a térben hol van a metszéspont. Ezt majd a későbbiekben ki fogjuk számolni. De most lépjünk tovább! Az objektumvázlatainkhoz a következőt adjuk hozzá: // Gömb objektum class Sphere : public Object public: Vec origo; // középpont double radius; // sugár // kontruktor. Egy középpontot és egy sugarat vár paraméterként. Sphere(Vec o = 0, double r = 1) origo = o; radius = r; // Metszi-e függvény. ha nem mentszünk, -1 -et adunk vissza. double intersect(ray& ray) double dx = ray.dv.x; double dy = ray.dv.y; double dz = ray.dv.z; double x0 = ray.p0.x; double y0 = ray.p0.y; double z0 = ray.p0.z; double cx = origo.x; double cy = origo.y; double cz = origo.z; double R = radius; double a = dx * dx + dy * dy + dz * dz; double b = 2 * dx * (x0 - cx) + 2 * dy * (y0 - cy) + 2 * dz * (z0 - cz); double c = cx * cx + cy * cy + cz * cz + x0 * x0 + y0 * y0 + z0 * z0-2 * (cx * x0 + cy * y0 + cz * z0) - R * R; double d = b * b - 4 * a * c; if(d < 0) return -1.0; double t = ((-1.0 * b - sqrt(d)) / (2.0 * a)); if(t > epsilon) // ha nem csak számolási hibát vétettünk... return t; else return 0.0; // ha a 0 epsilon sugarú környezetében van az érték, az nagy valószínűséggel számolási hiba ; // adott pontban vett normálist visszaadó függvény Vec getnormal(vec& intersect) return (intersect - origo).norm(); Ez a gömb implementációja jelenleg.

10 A Trace függvényünket egyelőre a következő módon írjuk meg: Color Trace(Ray& ray, int iterat) Color color; // a majdani visszatérési szín color.r = color.g = color.b = 0; // alapból feketére állítjuk double t; // az intersect függvény megoldása int index = -1; // objektumok indexeléséhez for(int i = 0; i < objcount; i++) t = -1.0; // kezdeti értékre állítjuk (-1: nem volt metszés) t = objects[i]->intersect(ray); // megpróbáljuk elmetszeni if(t >= 0) // ha sikeresen elmetszettük index = i; //megjegyezzük az indexet if(t >= 0) // ha sikeresen elmetszettük valakit color = objects[index]->color; // az elmetszettnek a színét vesszük return color; // visszaadjuk a színt A main függvényünk pedig a következőképpen nézzen ki: int main() int width = 600; // kép szélessége int height = 600; // kép magassága int w2 = width / 2; // szélesség / 2 int h2 = height / 2; // magasság / 2 Color** wo; // Color tömb. Ez fogja játszani az ernyő szerepét. wo = new Color*[width]; for(int i = 0; i < width; i++) wo[i] = new Color[height]; Camera cam; // kamera objektum cam.p0.x = 0; cam.p0.y = 0; cam.p0.z = -500; Scene scene; // színtér scene.add(new Sphere(Vec(0, 0, 300), 100)); // egy új gömb hozzáadás scene.objects[0]->color = Color(200, 25, 70); // az új elem színének beállítása // sugarak előállítása és a sugárkövetés elindítása // végigpásztázzuk az egész ernyőnket, és a kamerából az ernyő diszkrét pontjain át // sugarakat lövünk a színtérbe. a sugarak kezdőpontja az ernyő megfelelő pontja, a // sugarak irányvektora pedig a kamera és a sugár kezdőpontja közötti vektor for(int i = 0; i < height; i++) for(int j = 0; j < width; j++) Ray ray; ray.p0 = Vec((j - w2), (i - h2), 0); ray.dv = (ray.p0 - cam.p0); ray.dv.norm(); wo[i][j] = scene.trace(ray, 0); // egy PPM fájlba írom ki az eredményt, amit pl az irfanview programmal lehet megnézni FILE* f; f = fopen("myray.ppm", "w"); fprintf(f, "P3\n%d %d\n255\n ", width, height);

11 for(int i = 0; i < height; i++) for(int j = 0; j < width; j++) fprintf(f, "%d ", min((unsigned int)(wo[i][j].r + 0.5), (unsigned)255)); fprintf(f, "%d ", min((unsigned int)(wo[i][j].g + 0.5), (unsigned)255)); fprintf(f, "%d ", min((unsigned int)(wo[i][j].b + 0.5), (unsigned)255)); fclose(f); // rendet rakunk magunk után for(int i = 0; i < width; i++) delete[] wo[i]; delete[] wo; return 0; Ha eddig eljutottunk, akkor nagy valószínűséggel egy lila korongot kell látnunk a képernyőn. Higgyétek el, hogy ez egy sugárkövetett gömb!

12 Szétszórt árnyakban Az eddig megjelenített napkorong azért valljuk be kicsit karcsú. Jó lenne látni, hogy ez tényleg egy gömb. Ezért ebben a fejezetben a diffúz árnyalásról, inglisül diffuse shadinggel fogunk foglalkozni. Mire is van szükségünk? Kell egy jó árnyalási modell, amitől a körünk gömbölyödni fog. A valóságnak egy viszonylag jó megközelítése a Labmert-törvény, más nevén a diffúz árnyalás. Az árnyalásnak van egy matematikailag korrekt egyenlete, mégpedig a L λ = L λ in * k d, λ * cosθ Ez az egyenlet amennyire fellengzősen hangzik, jelen formájában pont annyira érthetetlen. Tegyük fel, hogy van egy matt felületünk, például az asztal lapja, amely még véletlenül sincsen lelakkozva, lecsokizva, lesörözve stb. Ha fogunk egy elemlámpát/mobilt, és a sötét szobában megvilágítjuk az asztalt, figyelve arra, hogy mindig más szögből érje a fény a lapját, akkor két dolog fog megtörténni: egyrészt szüleink sajnálkozó arcát fogjuk látni, miközben próbáljuk magyarázni, hogy ez egy feladathoz kell, másrészt pedig észrevesszük, hogy az asztallap színe függött a megvilágítás irányától. Ezek után ki lehet találni, hogy a fenti egyenletből mi a cosθ. Igen, ez a felületi normálishoz mért beérkezési szög koszinusza, amely mindig -1 és 1 közötti szám, de mi csak a 0 1 tartományát vesszük figyelembe. A többi betű jelentése a következő: L λ : a kimenő fény intenzitása; L λ in : a bejövő fény intenzitása; k d, λ : az anyag diffúz fénytulajdonsága, azaz a színe. A bejövő fény intenzitása a beérkező fény színének feleltethető meg, a kilépő fényintenzitás pedig a kimeneti színnek. Már csak a beérkezési szögről nem beszéltem: ez a metszési pontban vett felületi normális, és a fénysugárból a beérkezési pontba menő vektor skaláris szorzata. Ha az elméletet nagyjából sikerült feldolgozni, akkor nézzük meg, hogy ez kódban hogyan fog kinézni! A Scene osztály konstruktorát a következő módon egészítsük ki (a fény beállításával): Scene() light.color = Color(255, 128, 60); light.p0 = Vec(200, -200, 0); objcount = 0; A main függvényben ne lila, hanem fehér gömböt hozzunk létre: scene.objects[0]->color = Color(255, 255, 255); // az új elem színének beállítása

13 És végül a trace függvényt a következő módon módosítsuk: Color Trace(Ray& ray, int iterat) Color color; // a majdani visszatérési szín color.r = color.g = color.b = 0; // alapból feketére állítjuk double t; // az intersect függvény megoldása int index = -1; // objektumok indexeléséhez for(int i = 0; i < objcount; i++) t = -1.0; // kezdeti értékre állítjuk (-1: nem volt metszés) t = objects[i]->intersect(ray); // megpróbáljuk elmetszeni if(t >= 0) // ha sikeresen elmetszettük index = i; //megjegyezzük az indexet if(t >= 0) // ha sikeresen elmetszettük valakit Vec intersectpoint; // a metszéspont intersectpoint = ((ray.p0) + (ray.dv * t)); // ez lesz a pontos helye Vec normal = objects[index]->getnormal(intersectpoint); // a felület normálisa Ray iray; // egy sugár, ami a metszéspontból a fény felé fog majd nézni iray.p0 = intersectpoint + normal * 0.01; // kicsit "arrébb" húzzuk, hogy biztos ne legyen a gömbünkben a sugár kezdőpontja iray.dv = light.p0 - intersectpoint; // beállítjuk az irányvektorát iray.dv.norm(); // normalizálunk double factor = normal.dot(iray.dv); // ez a cos(theta) if(factor < 0) // csak a 0..1 tartományt vesszük figyelembe factor = 0; color = objects[index]->color; // az elmetszettnek a színét vesszük. // és vesszük a Lambert-törvény által meghatározott árnyalást // a fény egyes komponenseinek értékét azért kellett 255-tel osztani, mert én // a értékekkel szeretek dolgozni, viszont a képletbe egy értéknek // kell kerülnie color.r = color.r * (light.color.r / 255.0) * factor; color.g = color.g * (light.color.g / 255.0) * factor; color.b = color.b * (light.color.b / 255.0) * factor; return color; // visszaadjuk a színt.

14 Tyúk vagy tojás? Bizony a sorrendiség sehol sem mindegy. Tegyünk be a színterünkbe még egy gömböt, lehetőleg az első gömb mögé valahova (z koordinátája legyen nagyobb), és gondoljuk végig, hogy mi fog történni! A trace függvényünk szépen elkezdi a betétel sorrendjében elmetszegetni az objektumainkat, és a legutoljára megtaláltat fogja nekünk visszaadni. Magyarán jelenleg nem az objektumok Z-sorrendje (mélység szerinti sorrendje) számít, hanem az, hogy mikor tettük bele őket a színtérbe. Ez így nagyon nem jó. A megoldást az fogja jelenteni, ha elmetsszük az összes objektumot a színtérben, és megjegyezzük a legkisebb pozitív t -hez tartozó indexet. Ez az én kódomban a következő módon jelenik meg: A main-ben adjunk még egy gömböt a színtérhez Scene scene; // színtér scene.add(new Sphere(Vec(0, 0, 300), 100)); // egy új gömb hozzáadás scene.objects[0]->color = Color(255, 255, 255); // az új elem színének beállítása scene.add(new Sphere(Vec(150, 0, 500), 100)); scene.objects[1]->color = Color(255, 255, 0); A trace függvényt pedig a következő szerint módosítottam: Color Trace(Ray& ray, int iterat) Color color; // a majdani visszatérési szín color.r = color.g = color.b = 0; // alapból feketére állítjuk double t = -1; // az egyenlet megoldása double mint = ; // a minimális "t"-t egy jó nagy számra inicializáljuk int minindex = -1; // a mint-hez tartozó index for(int i = 0; i < objcount; i++) t = objects[i]->intersect(ray); // elmetsszük if(t > epsilon) // csak a pozitív megoldások érdekelnek if(t < mint) // az olyanok, amik közelebb vannak, mint az eddig megtalált legközelebbi mint = t; // átállítjuk minindex = i; // a minimálisra vonatkozó információkat if(minindex >= 0) // ha sikeresen elmetszettük valakit t = mint; // a t legyen a minimálisnak talált Vec intersectpoint; // a metszéspont intersectpoint = ((ray.p0) + (ray.dv * t)); // ez lesz a pontos helye Vec normal = objects[minindex]->getnormal(intersectpoint); // a felület normálisa Ray iray; // egy sugár, ami a metszéspontból a fény felé fog majd nézni iray.p0 = intersectpoint + normal * 0.01; // kicsit "arrébb" húzzuk, hogy biztos ne legyen a gömbünkben a sugár kezdőpontja iray.dv = light.p0 - intersectpoint; // beállítjuk az irányvektorát iray.dv.norm(); // normalizálunk double factor = normal.dot(iray.dv); // ez a cos(theta) if(factor < 0) // csak a 0..1 tartományt vesszük figyelembe factor = 0; color = objects[minindex]->color; // az elmetszettnek a színét vesszük.

15 // és vesszük a Lambert-törvény által meghatározott árnyalást // a fény egyes komponenseinek értékét azért kellett 255-tel osztani, mert én // a értékekkel szeretek dolgozni, viszont a képletbe egy értéknek // kell kerülnie color.r = color.r * (light.color.r / 255.0) * factor; color.g = color.g * (light.color.g / 255.0) * factor; color.b = color.b * (light.color.b / 255.0) * factor; return color; // visszaadjuk a színt

16 Görbe tükör Ha eddig eljutott valaki, akkor innen már nem nehéz, ezt tudom ígérni. Ebben a fejezetben a tükröző felületekkel fogunk foglalkozni, és megértjük, hogy miért is hívják a rekurzív sugárkövetést rekurzívnak. Kis kitérő: a sík Hogy a munkánk látványosabb legyen, építsünk egy sík osztályt, amit majd tudunk talajként használni. Én egy kicsit előre dolgoztam, szóval az én sík osztályom így néz ki: // Sík osztály class Plane : public Object public: Vec point; // a sík egy pontja Vec normal; // a sík normálvektora // konstruktor Plane(Vec p, Vec n) point = p; normal = n; // metszi-e double intersect(ray& ray) double d = normal.dot(ray.dv); if(d == 0.0) return -1.0; double nx = normal.x; double ny = normal.y; double nz = normal.z; double Psx = point.x; double Psy = point.y; double Psz = point.z; double dvx = ray.dv.x; double dvy = ray.dv.y; double dvz = ray.dv.z; double Pex = ray.p0.x; double Pey = ray.p0.y; double Pez = ray.p0.z; double t = -1.0 * ((nx * Pex - nx * Psx + ny * Pey - ny * Psy + nz * Pez - nz * Psz) / (nx * dvx + ny * dvy + nz * dvz)); if(t > epsilon) return t; if(t > 0) return 0; return -1; ; // normálvektor Vec getnormal(vec&) return normal;

17 A main függvényben adjunk is hozzá egy talajt a színtérhez, olyan helyre, hogy a talajunk a vetítősíkunkat a as ablak alján metssze. Ehhez az kel, hogy függőleges irányban 300 egységgel lefele toljuk a síkot. Ezen kívül a gömbjeinket tegyük le a síkra, ne a levegőben lógjanak! Ez kódban így valósul meg: Scene scene; // színtér scene.add(new Sphere(Vec(0, 200, 300), 100)); // egy új gömb hozzáadás scene.objects[0]->color = Color(255, 255, 255); // az új elem színének beállítása scene.add(new Sphere(Vec(150, 200, 500), 100)); scene.objects[1]->color = Color(255, 255, 0); scene.add(new Plane(Vec(0, 300, 0), Vec(0, -1, 0))); scene.objects[2]->color = Color(0, 255, 0); Ezek után valami ilyesmi képet kéne kapnunk: Ezzel vége ennek a kitérőnek.

18 Nagy kitérő: Fresnel? Nem, sima nátha. Ha emlékszünk az Object osztály felépítésére, akkor észrevehetjük, hogy volt benne kappa meg Kr változó, törésmutatót jelentő fr, illetve egy computefresnel függvény. Ha valaki nem emlékszik rá, akkor olvasson vissza A lányok tudják, hogy az ideális tükör olyan, ami tökéletesen adja vissza az ő karcsú, hosszú combú, bőrhibától mentes alakjukat. Ilyen tükör sajnos a valóságban nincs. Kicsit komolyabban véve a dolgot: az ideális tükör olyan, ami a fény minden hullámhosszán ugyanazt az intenzitást veri vissza, azaz egyáltalán nincs elnyelése, a kilépő fény színe ugyanaz, mint a belépőé. Ez a valóságban nincs így, minden tükröző anyag elnyel valamennyit. Azt, hogy ezt mennyire teszi, az úgynevezet Fresnelegyütthatóval fejezhetjük ki. Egy anyag adott pontban vett Fresnel-együtthatója függ a fény belépési szögétől, illetve az anyag törésmutatójától. Hogy az életünk cseppet se legyen egyszerű, ezért a fizikusok kitalálták, hogy a törésmutató komplex szám, ezért mi azt az fr + kappa * j alakban fogjuk használni. A Fresnel egyenlettel számolni kifejezetten nehéz, de van egy jó közelítése, amit Lazányi- Schlick képletnek hívnak: Kr(r) ~ [ (fr(r) 1) 2 + (kappa(r) 2 ) + (1 cosθ) 5 * 4fr(r) ] / [(fr(r) + 1) 2 + (kappa(r) 2 ) ] Ebben az egyenletben az r a vörös színkomponenst jelöli. Értelemszerűen ugyanígy kiszámolható a kék és a zöld színtartományra is a Fresnel-együttható. Az alább megadom a Fresnel-együtthatók számolásának egy lehetséges megvalósítását (Object osztály): void computefresnel(double costheta) // Fresnel-együtthatót számoló függvény Kr.r = ((pow((fr.r - 1.0), 2)) + (pow(kappa.r, 2)) + (pow((1.0 - costheta), 5)) * (4 * fr.r)) / ((pow((fr.r + 1.0), 2)) + (pow(kappa.r, 2))); Kr.g = ((pow((fr.g - 1.0), 2)) + (pow(kappa.g, 2)) + (pow((1.0 - costheta), 5)) * (4 * fr.g)) / ((pow((fr.g + 1.0), 2)) + (pow(kappa.g, 2))); Kr.b = ((pow((fr.b - 1.0), 2)) + (pow(kappa.b, 2)) + (pow((1.0 - costheta), 5)) * (4 * fr.b)) / ((pow((fr.b + 1.0), 2)) + (pow(kappa.b, 2))); A rekurzi jó! A rekurzív sugárkövetés ötlete a tükröző felületek megjelenésével terjedt el. Az ötlet nagyon egyszerű: vegyük a beérkezési pontot, majd ne az elmetszett test színét adjuk vissza, hanem a beérkezési pontból indítsunk egy új sugarat, és ennek a visszatérési értékét adjuk hozzá az eredeti színhez! Mivel nem akarjuk, hogy a rekurziónk több tükröző felület esetén a végtelenbe tartson, ezért meghatározunk egy iterációs mélységet, amit a kódban DMAX-szal jelölünk. Próbáljuk meg jelen esetben a kódból megérteni, hogy mi is történik a rekurzió és a visszaverődés folyamán: Először a main függvényben állítsuk jól be a paramétereket Scene scene; // színtér scene.add(new Sphere(Vec(0, 200, 300), 100)); // egy új gömb hozzáadás scene.objects[0]->color = Color(255, 255, 255); // az új elem színének beállítása scene.objects[0]->isreflective = false; scene.add(new Sphere(Vec(150, 200, 500), 100)); scene.objects[1]->color = Color(255, 255, 0); scene.objects[1]->isreflective = false;

19 scene.add(new Plane(Vec(0, 300, 0), Vec(0, -1, 0))); scene.objects[2]->color = Color(255, 255, 255); // a szín a visszaverő tulajdonsága miatt mindegy scene.objects[2]->fr = Color(0.17, 0.35, 1.5); // legyen ez a törési mutatója (aranyra jellemző) scene.objects[2]->kappa = Color(3.1, 2.7, 1.9); // legyen ez a kappa (aranyra jellemző) scene.objects[2]->isreflective = true; // legyen tükröző felület Majd pedig a Trace függvényt módosítsuk. Color Trace(Ray& ray, int iterat) Color color; // a majdani visszatérési szín color.r = color.g = color.b = 0; // alapból feketére állítjuk if(iterat < DMAX) // ha még nem léptük át az iterációs határt iterat++; // megnöveljük eggyel az iteráció számát double t = -1; // az egyenlet megoldása double mint = ; // a minimális "t"-t egy jó nagy számra inicializáljuk int minindex = -1; // a mint-hez tartozó index for(int i = 0; i < objcount; i++) t = objects[i]->intersect(ray); // elmetsszük if(t > epsilon) // csak a pozitív megoldások érdekelnek if(t < mint) // az olyanok, amik közelebb vannak, mint az eddig megtalált legközelebbi mint = t; // átállítjuk minindex = i; // a minimálisra vonatkozó információkat if(minindex >= 0) // ha sikeresen elmetszettük valakit t = mint; // a t legyen a minimálisnak talált Vec intersectpoint; // a metszéspont intersectpoint = ((ray.p0) + (ray.dv * t)); // ez lesz a pontos helye Vec normal = objects[minindex]->getnormal(intersectpoint); // a felület normálisa Ray iray; // egy sugár, ami a metszéspontból a fény felé fog majd nézni iray.p0 = intersectpoint + normal * 0.01; // kicsit "arrébb" húzzuk, hogy biztos ne legyen a gömbünkben a sugár kezdőpontja iray.dv = light.p0 - intersectpoint; // beállítjuk az irányvektorát iray.dv.norm(); // normalizálunk double factor = normal.dot(iray.dv); // ez a cos(theta) if(factor < 0) // csak a 0..1 tartományt vesszük figyelembe factor = 0; color = objects[minindex]->color; // az elmetszettnek a színét vesszük. // és vesszük a Lambert-törvény által meghatározott árnyalást // a fény egyes komponenseinek értékét azért kellett 255-tel osztani, mert én // a értékekkel szeretek dolgozni, viszont a képletbe egy értéknek // kell kerülnie if(!objects[minindex]->isreflective) // ha nem visszaverő color.r = color.r * (light.color.r / 255.0) * factor; // akkor a diffúz árnyalást használjuk color.g = color.g * (light.color.g / 255.0) * factor; color.b = color.b * (light.color.b / 255.0) * factor; if(objects[minindex]->isreflective) // ha tükröző objects[minindex]->computefresnel(factor); // kiszámoljuk az adott pontban vett Fresnel-eh.-kat // factor még mindig cos(theta) double costheta2 = -1.0 * ray.dv.dot(normal); // costheta2, a beérkező sugár és a normális skaláris szorzata

20 Ray rray; // visszavert sugarunk rray.p0 = intersectpoint + normal * epsilon; // kezdeti pontja a metszés pont egy kicsit eltolva rray.dv = ray.dv + normal * 2 * costheta2; // az irányát így számoljuk rray.dv.norm(); // normalizáljuk sugarunkat eddig színhez Color pluscolor = Trace(rRay, iterat); // elindítjuk az új color = color + pluscolor; // majd az eredményt hozzáadjuk az color.r = color.r * objects[minindex]->kr.r; // vesszük a szín Fresnel-eh.-s szorzatát color.g = color.g * objects[minindex]->kr.g; // ettől lesz tulajdonképpen színe color.b = color.b * objects[minindex]->kr.b; // a felületnek return color; // visszaadjuk a színt. Valami ilyesminek kéne kijönnie:

21 A távolságot mint üveggolyót megkapod Eddig eljutottunk oda, hogy már tudunk tükrözni, diffúz felületeket létrehozni, szóval már egy szép képet össze tudnánk állítani. Viszont eszünkbe jut gyerekkorunkból (legalábbis nekem az enyémből) az üveggolyó, és hogy hányszor néztünk keresztül rajta, mert vicces volt. Ezért nézzük át, hogy mi is történik, ha fénytörő felületeket akarunk implementálni! A matematikai és fizikai levezetést ha nem haragszotok megint el fogom kerülni, csupán a leglényegesebb dolgokat vesszük sorra. Nézzük meg, mi is történik a valóságban! A fénytörés akkor jön létre, ha a foton két különböző sűrűségű felület határára ér. Két dolog fordulhat elő: vagy a ritkábból a sűrűbb, vagy a sűrűbből a ritkább anyag felé megyünk. Minden közegnek van egy rá jellemző értéke, ezt nevezzük törésmutatónak, és a határátlépés irányától függően (sűrűbből ritkábba, vagy fordítva) vesszük ezt a törésmutatót, vagy a reciprokát. A légmentes térnek 1 a törésmutatója, mindent ehhez viszonyítunk. A levegőnek annyira kicsivel több a törésmutatója, hogy általában azt is 1-nek választjuk. A fénytörés érdekességét tulajdonképpen a kilépési szög adja, azaz hogy a beérkező fény az új közegben mekkora szöget fog bezárni a felületi normálissal. Ezt jól szemlélteti az alábbi ábra: A Snellius-Descartes törvény értelmében sin(θ i ) / sin(θ f ) = fr, ahol az fr annak az anyagnak a törésmutatója, amelyiket elmetszi a sugarunk. Felmerül a kérdés, hogy akkor most hogyan van ez, a levegő törésmutatója hogyan jön a képbe? A válasz: sehogy. Egy egyszerű példa: két koncentrikus gömbünk van, eltérő sugarakkal, és eltérő sűrűséggel (ebből következően eltérő törésmutatóval). Amikor belépünk a külső gömbbe, akkor értelemszerűen a külső gömb törésmutatójával dolgozunk. Ezután elmetsszük a belső gömböt, akkor annak a törésmutatójával dolgozunk. Elérjük a középpontot, megyünk kifele, és itt jön a vicc: először a belső gömböt metsszük, tehát annak a törésmutatójával fogunk foglalkozni. A példából talán érthető, hogy a levegőnek a törésmutatójával akkor dolgoznánk, ha kilépnénk a levegős közegből a légüres térbe. Tehát a következőt fogjuk csinálni: elmetsszük a testünket, megnézzük, hogy törő felület-e, megnézzük, hogy a testünk belsejében vagyunk-e vagy nem (merre áll a normálvektor), ha belül vagyunk, akkor átállítjuk a törésmutatót, és a normálvektort, majd megnézzük, hogy be tudunk-e törni a testbe, és ha igen, akkor új sugarat hozunk létre, és rekurzívan lekövetjük.

22 Azt, hogy a fénysugarunk bejut-e a testbe, vagy túl lapos szögben érkezik-e, és lepattan, a törésmutató határozza meg (egész pontosan azt mutatja meg a törésmutató, hogy mennyi az a túl lapos szög ). Ezt egy képletnek a visszatérési értéke adja meg, mégpedig ha a disc = ((1.0 - cosalpha * cosalpha ) / (n * n)) összefüggésben a disc kisebb, vagy egyenlő, mint nulla, akkor nem sikerült betörnünk az anyagba. A képletben a cosalpha a -1 * bejövő sugár iránya * normális, az n pedig a törésmutató. Innen már csak a visszavert sugár irányának kiszámítása kell, amire a teljesség igénye nélkül megadok itt egy egyenletet: dv = ray.dv / n + tnormal * (cosalpha / n - sqrt(disc)) Ahol a ray.dv a beérkező fény irányvektora, n a törésmutató, tnormal a megfelelő irányba álló normálvektor, cosaplha pedig a fent meghatározott. Nézzük meg, hogy ez kódban hogyan néz ki: A Trace függvényt így egészítjük ki: Color Trace(Ray& ray, int iterat) Color color; // a majdani visszatérési szín color.r = color.g = color.b = 0; // alapból feketére állítjuk if(iterat < DMAX) // ha még nem léptük át az iterációs határt iterat++; // megnöveljük eggyel az iteráció számát double t = -1; // az egyenlet megoldása double mint = ; // a minimális "t"-t egy jó nagy számra inicializáljuk int minindex = -1; // a mint-hez tartozó index for(int i = 0; i < objcount; i++) t = objects[i]->intersect(ray); // elmetsszük if(t > epsilon) // csak a pozitív megoldások érdekelnek if(t < mint) // az olyanok, amik közelebb vannak, mint az eddig megtalált legközelebbi mint = t; // átállítjuk minindex = i; // a minimálisra vonatkozó információkat if(minindex >= 0) // ha sikeresen elmetszettük valakit t = mint; // a t legyen a minimálisnak talált Vec intersectpoint; // a metszéspont intersectpoint = ((ray.p0) + (ray.dv * t)); // ez lesz a pontos helye Vec normal = objects[minindex]->getnormal(intersectpoint); // a felület normálisa Ray iray; // egy sugár, ami a metszéspontból a fény felé fog majd nézni iray.p0 = intersectpoint + normal * 0.01; // kicsit "arrébb" húzzuk, hogy biztos ne legyen a gömbünkben a sugár kezdőpontja iray.dv = light.p0 - intersectpoint; // beállítjuk az irányvektorát iray.dv.norm(); // normalizálunk double factor = normal.dot(iray.dv); // ez a cos(theta) if(factor < 0) // csak a tartományt vesszük figyelembe factor = 0;

23 color = objects[minindex]->color; // az elmetszettnek a színét vesszük. // és vesszük a Lambert-törvény által meghatározott árnyalást // a fény egyes komponenseinek értékét azért kellett 255-tel osztani, mert én // a értékekkel szeretek dolgozni, viszont a képletbe egy értéknek // kell kerülnie if(!objects[minindex]->isreflective &&!objects[minindex]->isrefractive) // ha nem visszaverő, és nem törő color.r = color.r * (light.color.r / 255.0) * factor; // akkor a diffúz árnyalást használjuk color.g = color.g * (light.color.g / 255.0) * factor; color.b = color.b * (light.color.b / 255.0) * factor; if(objects[minindex]->isreflective) // ha tükröző objects[minindex]->computefresnel(factor); // kiszámoljuk az adott pontban vett Fresnel eh.-kat // factor még mindig cos(theta) double costheta2 = -1.0 * ray.dv.dot(normal); // costheta2, a beérkező sugár és a normális skaláris szorzata Ray rray; // visszavert sugarunk rray.p0 = intersectpoint + normal * epsilon; // kezdeti pontja a metszés pont egy kicsit eltolva rray.dv = ray.dv + normal * 2 * costheta2; // az irányát így számoljuk rray.dv.norm(); // normalizáljuk sugarunkat eddig színhez fresnel-eh -s szorzatát tulajdonképpen színe Color pluscolor = Trace(rRay, iterat); // elindítjuk az új color = color + pluscolor; // majd az eredményt hozzáadjuk az color.r = color.r * objects[minindex]->kr.r; // vesszük a szín color.g = color.g * objects[minindex]->kr.g; // ettől lesz color.b = color.b * objects[minindex]->kr.b; // a felületnek if(objects[minindex]->isrefractive) // ha törő felülettel van dolgunk double n = objects[minindex]->fr.r; // vesszük a törésmutatót // a példánkban a törő felület minden hullámhosszon ugyanúgy tör // ezért elég csak a vörös komponenst venni // értelemszerűen minden fénytartományra külön kiszámolható lenne a törés Vec tnormal = normal; // csinálunk egy temporális normálvektort double cosalpha = -1.0 * ray.dv.dot(tnormal); // vesszük a beesési szög koszinuszának -1-szeresét if(cosalpha < 0) // ha ez kisebb, mint 0, akkor a testünk belsejében vagyunk n = 1.0 / n; // vesszük a törésmutató reciprokát tnormal = tnormal * -1.0; // és a normálvektort megfordítjuk cosalpha = -1.0 * ray.dv.dot(tnormal); // majd megint kiszámoljuk cosaplhát double disc = ((1.0 - cosalpha * cosalpha ) / (n * n)); // megnézzük, hogy sikerül-e betörni

24 if(disc > 0) // ha igen Ray fray; // létrehozunk egy új sugarat fray.p0 = intersectpoint + tnormal * epsilon * -1.0; // az új sugár kezdőpontja ne pontosan // ott legyen, ahol a beérkezési pont a sqrt(disc)); // a tört sugár iránya // számolási pontatlanságok elkerülése végett fray.dv = ray.dv / n + tnormal * (cosalpha / n - fray.dv.norm(); // normalizáljuk Color pluscolor = Trace(fRay, iterat); // rekurzívan elindítjuk color = pluscolor; return color; // visszaadjuk a színt. A main függvénybe pedig ezt tegyük pluszba: Scene scene; // színtér scene.add(new Sphere(Vec(0, 200, 300), 100)); // egy új gömb hozzáadás scene.objects[0]->color = Color(255, 255, 255); // az új elem színének beállítása scene.objects[0]->isreflective = false; scene.objects[0]->isrefractive = false; scene.add(new Sphere(Vec(150, 200, 500), 100)); scene.objects[1]->color = Color(255, 255, 0); scene.objects[1]->isreflective = false; scene.objects[1]->isrefractive = false; scene.add(new Plain(Vec(0, 300, 0), Vec(0, -1, 0))); scene.objects[2]->color = Color(255, 255, 255); // a szín a visszaverő tulajdonsága miatt mindegy scene.objects[2]->fr = Color(0.17, 0.35, 1.5); // legyen ez a törési mutatója (aranyra jellemző) scene.objects[2]->kappa = Color(3.1, 2.7, 1.9); // legyen ez a kappa (aranyra jellemző) scene.objects[2]->isreflective = true; // legyen tükröző felület scene.objects[2]->isrefractive = false; scene.add(new Sphere(Vec(75, 200, 100), 100)); scene.objects[3]->color = Color(0, 0, 0); scene.objects[3]->fr = Color(1.13, 1.13, 1.13); // alacsony törési index scene.objects[3]->kappa = Color(1.0, 1.0, 1.0); // egységnyi kappa scene.objects[3]->isreflective = true; // legyen viszaverő scene.objects[3]->isrefractive = true; // és törő

25 Halszemmel a diszkóban Ugye megállapodtunk abban, hogy a vetítősíkunkból egy as ablakot fogunk kivágni, és azon keresztül fogunk benézni a színtérbe. Ha túl közel van a szemünk az ablakhoz, akkor túl nagy szögben fogunk benézni, ha messze vagyunk, akkor túl kis szögben, és meglehetősen érdekesen fog akkor torzulni a tér. Ki lehet próbálni. A megoldást az jelenti, ha kiszámoljuk, hogy milyen távol álljunk a vászontól. Ehhez egy lehetséges algoritmus a következő: float FOV = 60; float FOV2 = (float)(fov / 2.0); float L = (float)w2 / (float)tan(fov2 * PI / 180.0); A FOV-val jelöljük, hogy milyen szögben akarunk betekinteni a színtérbe, és az L adja meg, hogy milyen messze kell állnunk a vászontól.

26 Lapátoljunk össze Megtanultuk, hogy mi a sugárkövetés optikai alapja, miért úgy épül fel, ahogy. Megnéztük, hogy hogyan tudunk diffúz felületeket létrehozni, hogyan épülnek fel a tükröző felületek, és mi történik fénytörésnél. Megszüntettük a halszemeffektust, és felépítettünk egy olyan osztályhierarchiát, amellyel könnyen tudunk dolgozni. Remélem, van pár ember, akinek felkeltettem az érdeklődését, és szép képeket fogtok előállítani sugárkövetéssel. További sok sikert, és jó programozást!

Hajder Levente 2018/2019. II. félév

Hajder Levente 2018/2019. II. félév Hajder Levente hajder@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2018/2019. II. félév Tartalom 1 2 3 4 5 Albrecht Dürer, 1525 Motiváció Tekintsünk minden pixelre úgy, mint egy kis ablakra

Részletesebben

Hajder Levente 2014/2015. tavaszi félév

Hajder Levente 2014/2015. tavaszi félév Hajder Levente hajder.levente@sztaki.mta.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2014/2015. tavaszi félév Tartalom 1 2 3 4 5 Albrecht Dürer, 1525 Motiváció Tekintsünk minden pixelre úgy, mint

Részletesebben

Vektorgeometria (2) First Prev Next Last Go Back Full Screen Close Quit

Vektorgeometria (2) First Prev Next Last Go Back Full Screen Close Quit Vektorgeometria (2) First Prev Next Last Go Back Full Screen Close Quit 1. Tekintsünk a térben egy P (p 1, p 2, p 3 ) pontot és egy v = (v 1, v 2, v 3 ) = 0 vektort. Ekkor pontosan egy egyenes létezik,

Részletesebben

Hajder Levente 2017/2018. II. félév

Hajder Levente 2017/2018. II. félév Hajder Levente hajder@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2017/2018. II. félév Tartalom 1 Sugár és sík metszéspontja Sugár és háromszög metszéspontja Sugár és poligon metszéspontja

Részletesebben

Számítógépes Grafika mintafeladatok

Számítógépes Grafika mintafeladatok Számítógépes Grafika mintafeladatok Feladat: Forgassunk a 3D-s pontokat 45 fokkal a X tengely körül, majd nyújtsuk az eredményt minden koordinátájában kétszeresére az origóhoz képest, utána forgassunk

Részletesebben

I. Vektorok. Adott A (2; 5) és B ( - 3; 4) pontok. (ld. ábra) A két pont által meghatározott vektor:

I. Vektorok. Adott A (2; 5) és B ( - 3; 4) pontok. (ld. ábra) A két pont által meghatározott vektor: I. Vektorok 1. Vektorok összege Általánosan: Az ábra alapján Adott: a(4; 1) és b(; 3) a + b (4 + ; 1 + 3) = (6; ) a(a 1 ; a ) és b(b 1 ; b ) a + b(a 1 + b 1 ; a + b ). Vektorok különbsége Általánosan:

Részletesebben

3. Osztályok II. Programozás II

3. Osztályok II. Programozás II 3. Osztályok II. Programozás II Bevezető feladat Írj egy Nevsor osztályt, amely legfeljebb adott mennyiségű nevet képes eltárolni. A maximálisan tárolható nevek számát a konstruktorban adjuk meg. Az osztályt

Részletesebben

Tartalom. Tartalom. Raycasting. Hajder Levente 2017/2018. II. félév. Raycasting. Raycasting. Sugár és háromszög metszéspontja

Tartalom. Tartalom. Raycasting. Hajder Levente 2017/2018. II. félév. Raycasting. Raycasting. Sugár és háromszög metszéspontja Hajder Levente hajder@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2017/2018. II. félév 1 2 1 2 Albrecht Dürer, 1525 Tekintsünk minden pixelre úgy, mint egy kis ablakra a világra Milyen színértéket

Részletesebben

Transzformációk. Grafikus játékok fejlesztése Szécsi László 2013.02.26. t05-transform

Transzformációk. Grafikus játékok fejlesztése Szécsi László 2013.02.26. t05-transform Transzformációk Grafikus játékok fejlesztése Szécsi László 2013.02.26. t05-transform Koordinátarendszerek: modelltér Koordinátarendszerek: világtér Koordinátarendszerek: kameratér up right z eye ahead

Részletesebben

Megoldás: feladat adataival végeredménynek 0,46 cm-t kapunk.

Megoldás: feladat adataival végeredménynek 0,46 cm-t kapunk. 37 B-5 Fénynyaláb sík üveglapra 40 -os szöget bezáró irányból érkezik. Az üveg 1,5 cm vastag és törésmutatója. Az üveglap másik oldalán megjelenő fénynyaláb párhuzamos a beeső fénynyalábbal, de oldalirányban

Részletesebben

Számítógépes Grafika mintafeladatok

Számítógépes Grafika mintafeladatok Számítógépes Grafika mintafeladatok Feladat: Forgassunk a 3D-s pontokat 45 fokkal a X tengely körül, majd nyújtsuk az eredményt minden koordinátájában kétszeresére az origóhoz képest, utána forgassunk

Részletesebben

10. Koordinátageometria

10. Koordinátageometria I. Nulladik ZH-ban láttuk: 0. Koordinátageometria. Melyek azok a P x; y pontok, amelyek koordinátái kielégítik az Ábrázolja a megoldáshalmazt a koordináta-síkon! x y x 0 egyenlőtlenséget? ELTE 00. szeptember

Részletesebben

Hajder Levente 2017/2018. II. félév

Hajder Levente 2017/2018. II. félév Hajder Levente hajder@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2017/2018. II. félév Tartalom 1 A fény elektromágneses hullám Az anyagokat olyan színűnek látjuk, amilyen színű fényt visszavernek

Részletesebben

Tartalom. Tartalom. Anyagok Fényforrás modellek. Hajder Levente Fényvisszaverési modellek. Színmodellek. 2017/2018. II.

Tartalom. Tartalom. Anyagok Fényforrás modellek. Hajder Levente Fényvisszaverési modellek. Színmodellek. 2017/2018. II. Hajder Levente hajder@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2017/2018. II. félév 1 A fény elektromágneses hullám Az anyagokat olyan színűnek látjuk, amilyen színű fényt visszavernek

Részletesebben

OPTIKA. Geometriai optika. Snellius Descartes-törvény. www.baranyi.hu 2010. szeptember 19. FIZIKA TÁVOKTATÁS

OPTIKA. Geometriai optika. Snellius Descartes-törvény. www.baranyi.hu 2010. szeptember 19. FIZIKA TÁVOKTATÁS OPTIKA Geometriai optika Snellius Descartes-törvény A fényhullám a geometriai optika szempontjából párhuzamos fénysugarakból áll. A vákuumban haladó fénysugár a geometriai egyenes fizikai megfelelője.

Részletesebben

x = cos αx sin αy y = sin αx + cos αy 2. Mi a X/Y/Z tengely körüli forgatás transzformációs mátrixa 3D-ben?

x = cos αx sin αy y = sin αx + cos αy 2. Mi a X/Y/Z tengely körüli forgatás transzformációs mátrixa 3D-ben? . Mi az (x, y) koordinátákkal megadott pont elforgatás uténi két koordinátája, ha α szöggel forgatunk az origó körül? x = cos αx sin αy y = sin αx + cos αy 2. Mi a X/Y/Z tengely körüli forgatás transzformációs

Részletesebben

Transzformációk. Szécsi László

Transzformációk. Szécsi László Transzformációk Szécsi László A feladat Adott a 3D modell háromszögek csúcspontjai [modellezési koordináták] Háromszögkitöltő algoritmus pixeleket színez be [viewport koordináták] A feladat: számítsuk

Részletesebben

A gradiens törésmutatójú közeg I.

A gradiens törésmutatójú közeg I. 10. Előadás A gradiens törésmutatójú közeg I. Az ugrásszerű törésmutató változással szemben a TracePro-ban lehetőség van folytonosan változó törésmutatójú közeg definiálására. Ilyen érdekes típusú közegek

Részletesebben

6Előadás 6. Fénytörés közeghatáron

6Előadás 6. Fénytörés közeghatáron 6Előadás 6. Fénytörés közeghatáron Fénytörés esetén a Snellius-Descartes törvény adja meg a beeső- ésa megtört sugár közti összefüggést, mely a következő: sinα n = 2 sin β n 1 Ahol α és β a beesési ill.

Részletesebben

Klár Gergely Informatikai Kar. 2010/2011. tavaszi félév

Klár Gergely Informatikai Kar. 2010/2011. tavaszi félév Számítógépes Grafika Klár Gergely tremere@elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2010/2011. tavaszi félév Tartalom I Sugárkövetés 1 Sugárkövetés 2 3 Tartalom Sugárkövetés Sugarak indítása

Részletesebben

Tárgy. Forgóasztal. Lézer. Kamera 3D REKONSTRUKCIÓ LÉZERES LETAPOGATÁSSAL

Tárgy. Forgóasztal. Lézer. Kamera 3D REKONSTRUKCIÓ LÉZERES LETAPOGATÁSSAL 3D REKONSTRUKCIÓ LÉZERES LETAPOGATÁSSAL. Bevezetés A lézeres letapogatás a ma elérhet legpontosabb 3D-s rekonstrukciót teszi lehet vé. Alapelve roppant egyszer : egy lézeres csíkkal megvilágítjuk a tárgyat.

Részletesebben

Optika gyakorlat 2. Geometriai optika: planparalel lemez, prizma, hullámvezető

Optika gyakorlat 2. Geometriai optika: planparalel lemez, prizma, hullámvezető Optika gyakorlat. Geometriai optika: planparalel lemez, prizma, hullámvezető. példa: Fényterjedés planparalel lemezen keresztül A plánparalel lemezen történő fényterjedés hatására a fénysugár újta távolsággal

Részletesebben

= Y y 0. = Z z 0. u 1. = Z z 1 z 2 z 1. = Y y 1 y 2 y 1

= Y y 0. = Z z 0. u 1. = Z z 1 z 2 z 1. = Y y 1 y 2 y 1 Egyenes és sík a térben Elméleti áttekintés Az egyenes paraméteres egyenlete: X = u 1 λ + x 0 Y = u λ + y 0, Z = u λ + z 0 ahol a λ egy valós paraméter Az u = (u 1, u, u ) az egyenes irányvektora és P

Részletesebben

OOP: Java 8.Gy: Abstract osztályok, interfészek

OOP: Java 8.Gy: Abstract osztályok, interfészek OOP: Java 8.Gy: Abstract osztályok, interfészek 26/1 B ITv: MAN 2019.04.03 Abszrakt metódus és absztrakt osztály. Gyakran előfordul a tervezés során, hogy egy osztály szintjén tudjuk, hogy valamilyen metódus

Részletesebben

Összeállította: dr. Leitold Adrien egyetemi docens

Összeállította: dr. Leitold Adrien egyetemi docens Az R 3 tér geometriája Összeállította: dr. Leitold Adrien egyetemi docens 2008.09.08. 1 Vektorok Vektor: irányított szakasz Jel.: a, a, a, AB, Jellemzői: irány, hosszúság, (abszolút érték) jel.: a Speciális

Részletesebben

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter Információ megjelenítés Számítógépes ábrázolás Dr. Iványi Péter Raszterizáció OpenGL Mely pixelek vannak a primitíven belül fragment generálása minden ilyen pixelre Attribútumok (pl., szín) hozzárendelése

Részletesebben

Láthatósági kérdések

Láthatósági kérdések Láthatósági kérdések Láthatósági algoritmusok Adott térbeli objektum és adott nézőpont esetén el kell döntenünk, hogy mi látható az adott alakzatból a nézőpontból, vagy irányából nézve. Az algoritmusok

Részletesebben

Az egyenes és a sík analitikus geometriája

Az egyenes és a sík analitikus geometriája Az egyenes és a sík analitikus geometriája Az egyenes a kétdimenziós koordinátarendszerben A kétdimenziós koordinátarendszerben az egyenest egy n(a, B) normálvektorával és egy r 0 helyvektorú P(x 0,y 0

Részletesebben

117. AA Megoldó Alfréd AA 117.

117. AA Megoldó Alfréd AA 117. Programozás alapjai 2. (inf.) pót-pótzárthelyi 2011.05.26. gyak. hiányzás: kzhpont: MEG123 IB.028/117. NZH:0 PZH:n Minden beadandó megoldását a feladatlapra, a feladat után írja! A megoldások során feltételezheti,

Részletesebben

2014/2015. tavaszi félév

2014/2015. tavaszi félév Hajder L. és Valasek G. hajder.levente@sztaki.mta.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2014/2015. tavaszi félév Tartalom Geometria modellezés 1 Geometria modellezés 2 Geometria modellezés

Részletesebben

Klár Gergely 2010/2011. tavaszi félév

Klár Gergely 2010/2011. tavaszi félév Számítógépes Grafika Klár Gergely tremere@elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2010/2011. tavaszi félév Tartalom Pont 1 Pont 2 3 4 5 Tartalom Pont Descartes-koordináták Homogén koordináták

Részletesebben

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra Programozás II. 2. gyakorlat Áttérés C-ről C++-ra Tartalom Új kommentelési lehetőség Változók deklarációjának helye Alapértelmezett függvényparaméterek Névterek I/O műveletek egyszerűsödése Logikai adattípus,

Részletesebben

OOP. Alapelvek Elek Tibor

OOP. Alapelvek Elek Tibor OOP Alapelvek Elek Tibor OOP szemlélet Az OOP szemlélete szerint: a valóságot objektumok halmazaként tekintjük. Ezen objektumok egymással kapcsolatban vannak és együttműködnek. Program készítés: Absztrakciós

Részletesebben

Gauss-Seidel iteráció

Gauss-Seidel iteráció Közelítő és szimbolikus számítások 5. gyakorlat Iterációs módszerek: Jacobi és Gauss-Seidel iteráció Készítette: Gelle Kitti Csendes Tibor Somogyi Viktor London András Deák Gábor jegyzetei alapján 1 ITERÁCIÓS

Részletesebben

Vektorok és koordinátageometria

Vektorok és koordinátageometria Vektorok és koordinátageometria Vektorral kapcsolatos alapfogalmak http://zanza.tv/matematika/geometria/vektorok-bevezetese Definíció: Ha egy szakasz két végpontját megkülönböztetjük egymástól oly módon,

Részletesebben

Helyvektorok, műveletek, vektorok a koordináta-rendszerben

Helyvektorok, műveletek, vektorok a koordináta-rendszerben Helyvektorok, műveletek, vektorok a koordináta-rendszerben. Rajzold meg az alábbi helyvektorokat a derékszögű koordináta-rendszerben, majd számítsd ki a hosszúságukat! a) (4 ) b) ( 5 ) c) ( 6 ) d) (4 )

Részletesebben

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT. Koordináta-geometria

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT. Koordináta-geometria MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT 1) Adott két pont: A 4; 1 felezőpontjának koordinátáit! AB felezőpontja legyen F. Koordináta-geometria és B 3 1; Írja fel az AB szakasz 1 3 4

Részletesebben

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor

Árnyalás, env mapping. Szécsi László 3D Grafikus Rendszerek 3. labor Árnyalás, env mapping Szécsi László 3D Grafikus Rendszerek 3. labor Egyszerű árnyaló FS legyen egy fényirány-vektor normálvektor és fényirány közötti szög koszinusza az irradiancia textúrából olvasott

Részletesebben

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Koordináta-geometria

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Koordináta-geometria MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Koordináta-geometria A szürkített hátterű feladatrészek nem tartoznak az érintett témakörhöz, azonban szolgálhatnak fontos információval az érintett

Részletesebben

BME MOGI Gépészeti informatika 6.

BME MOGI Gépészeti informatika 6. BME MOGI Gépészeti informatika 6. 1. feladat Készítsen Windows Forms alkalmazást véletlen adatokkal létrehozott körök kölcsönös helyzetének vizsgálatára! Hozza létre a következő struktúrákat, melynek elemei

Részletesebben

Tartalom. Megjegyzések. Valasek Gábor Befoglaló keretek. Felosztások. Informatikai Kar

Tartalom. Megjegyzések. Valasek Gábor Befoglaló keretek. Felosztások. Informatikai Kar Tartalom Számítógépes Grafika Valasek Gábor valasek@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2015/2016. őszi félév Rekurzív sugárkövetés Megjegyzések Sugárkövetés gyorsítása Befoglaló

Részletesebben

1. tétel. 1. Egy derékszögű háromszög egyik szöge 50, a szög melletti befogója 7 cm. Mekkora a háromszög átfogója? (4 pont)

1. tétel. 1. Egy derékszögű háromszög egyik szöge 50, a szög melletti befogója 7 cm. Mekkora a háromszög átfogója? (4 pont) 1. tétel 1. Egy derékszögű háromszög egyik szöge 50, a szög melletti befogója cm. Mekkora a háromszög átfogója? (4 pont). Adott az ábrán két vektor. Rajzolja meg a b, a b és az a b vektorokat! (6 pont)

Részletesebben

Matematika 11 Koordináta geometria. matematika és fizika szakos középiskolai tanár. > o < szeptember 27.

Matematika 11 Koordináta geometria. matematika és fizika szakos középiskolai tanár. > o < szeptember 27. Matematika 11 Koordináta geometria Juhász László matematika és fizika szakos középiskolai tanár > o < 2015. szeptember 27. copyright: c Juhász László Ennek a könyvnek a használatát szerzői jog védi. A

Részletesebben

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Bevezetés a programozásba. 8. Előadás: Függvények 2. Bevezetés a programozásba 8. Előadás: Függvények 2. ISMÉTLÉS Helló #include using namespace std; int main() cout

Részletesebben

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozás II gyakorlat. 8. Operátor túlterhelés Programozás II gyakorlat 8. Operátor túlterhelés Kezdő feladat Írjunk egy Vector osztályt, amely n db double értéket tárol. A konstruktor kapja meg az elemek számát. Írj egy set(int idx, double v) függvényt,

Részletesebben

Programozás II. 2. Dr. Iványi Péter

Programozás II. 2. Dr. Iványi Péter Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c

Részletesebben

Skaláris szorzat: a b cos, ahol α a két vektor által bezárt szög.

Skaláris szorzat: a b cos, ahol α a két vektor által bezárt szög. 1 Összeadás: Legyen a (7; 3) és b (- 2; 4), akkor az összegük a + b (7 + (-2); 3 + 4) = (5; 7) Kivonás: Legyen a (7; 3) és b (- 2; 4), akkor a különbségük a b (7 - (-2); 3-4)=(9; - 1) Valós számmal való

Részletesebben

Optika és Relativitáselmélet II. BsC fizikus hallgatóknak

Optika és Relativitáselmélet II. BsC fizikus hallgatóknak Optika és Relativitáselmélet II. BsC fizikus hallgatóknak 2. Fényhullámok tulajdonságai Cserti József, jegyzet, ELTE, 2007. Az elektromágneses spektrum Látható spektrum (erre állt be a szemünk) UV: ultraibolya

Részletesebben

BME MOGI Gépészeti informatika 7.

BME MOGI Gépészeti informatika 7. BME MOGI Gépészeti informatika 7. 1. feladat Írjon Windows Forms alkalmazást egy kör és egy pont kölcsönös helyzetének vizsgálatára! A feladat megoldásához hozza létre a következő osztályokat! Pont osztály:

Részletesebben

1. Alapok. Programozás II

1. Alapok. Programozás II 1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph

Részletesebben

Koordináta-geometria feladatgyűjtemény (A feladatok megoldásai a dokumentum végén találhatók)

Koordináta-geometria feladatgyűjtemény (A feladatok megoldásai a dokumentum végén találhatók) Koordináta-geometria feladatgyűjtemény (A feladatok megoldásai a dokumentum végén találhatók) Vektorok 1. Egy négyzet két szemközti csúcsának koordinátái: A( ; 7) és C(4 ; 1). Határozd meg a másik két

Részletesebben

Alkalmazott modul: Programozás

Alkalmazott modul: Programozás Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás Feladatgyűjtemény Összeállította: Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto Frissítve: 2015.

Részletesebben

KOVÁCS BÉLA, MATEMATIKA I.

KOVÁCS BÉLA, MATEMATIKA I. KOVÁCS BÉLA MATEmATIkA I 8 VIII VEkTOROk 1 VEkTOR Vektoron irányított szakaszt értünk Jelölése: stb Vektorok hossza A vektor abszolút értéke az irányított szakasz hossza Ha a vektor hossza egységnyi akkor

Részletesebben

Sugárkövetési algoritmusok (2. rész)

Sugárkövetési algoritmusok (2. rész) Sugárkövetési algoritmusok (2. rész) Ismét jelentkezik a sugarak szerelmeseinek szóló cikkünk, melyben tovább folytatjuk a fények birodalmában megkezdett utazásunkat. A fénysugarak rekurzív követésével

Részletesebben

Programozás II. 4. Dr. Iványi Péter

Programozás II. 4. Dr. Iványi Péter Programozás II. 4. Dr. Iványi Péter 1 inline függvények Bizonyos függvények annyira rövidek, hogy nem biztos hogy a fordító függvényhívást fordít, hanem inkább az adott sorba beilleszti a kódot. #include

Részletesebben

Koordináta-geometria feladatgyűjtemény

Koordináta-geometria feladatgyűjtemény Koordináta-geometria feladatgyűjtemény A feladatok megoldásai a dokumentum végén találhatók Vektorok 1. Egy négyzet két szemközti csúcsának koordinátái: A( ; 7) és C(4 ; 1). Határozd meg a másik két csúcs

Részletesebben

11. Előadás Gradiens törésmutatójú közeg II.

11. Előadás Gradiens törésmutatójú közeg II. 11. Előadás Gradiens törésmutatójú közeg II. A következőkben két különleges, gradiens törésmutatójú lencsével fogunk foglalkozni, az úgynevezett Luneburg-féle lencsékkel. Annak is két típusával: a Maxwell-féle

Részletesebben

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Bánsághi Anna 2014 Bánsághi Anna 1 of 33 IMPERATÍV PROGRAMOZÁS Bánsághi Anna anna.bansaghi@mamikon.net 7. ELŐADÁS - ABSZTRAKT ADATTÍPUS 2014 Bánsághi Anna 1 of 33 TEMATIKA I. ALAPFOGALMAK, TUDOMÁNYTÖRTÉNET II. IMPERATÍV PROGRAMOZÁS Imperatív

Részletesebben

Függvények ábrázolása

Függvények ábrázolása Függvények ábrázolása Matematikai függvényeket analitikusan nem tudunk a matlabban megadni (tudunk, de ilyet még nem tanulunk). Ahhoz, hogy egy függvényt ábrázoljuk, hasonlóan kell eljárni, mint a házi

Részletesebben

OPTIKA. Ma sok mindenre fény derül! /Geometriai optika alapjai/ Dr. Seres István

OPTIKA. Ma sok mindenre fény derül! /Geometriai optika alapjai/ Dr. Seres István Ma sok mindenre fény derül! / alapjai/ Dr. Seres István Legkisebb idő Fermat elve A fény a legrövidebb idejű pályán mozog. I. következmény: A fény a homogén közegben egyenes vonalban terjed t s c minimális,

Részletesebben

500. AA Megoldó Alfréd AA 500.

500. AA Megoldó Alfréd AA 500. Programozás alapjai 2. NZH 2010.05.13. gyakorlat: / Hiány:0 ZH:0 MEGOLD IB.027/51. Hftest: 0 Minden beadandó megoldását a feladatlapra, a feladat után írja! A megoldások során feltételezheti, hogy minden

Részletesebben

Számítógépes Graka - 4. Gyak

Számítógépes Graka - 4. Gyak Számítógépes Graka - 4. Gyak Jámbori András andras.jambori@gmail.com 2012.03.01 Jámbori András andras.jambori@gmail.com Számítógépes Graka - 4. Gyak 1/17 Emlékeztet A múlt órákon tárgyaltuk: WinAPI programozás

Részletesebben

Programozás II gyakorlat. 6. Polimorfizmus

Programozás II gyakorlat. 6. Polimorfizmus Programozás II gyakorlat 6. Polimorfizmus Típuskonverziók C-ben: void * ptr; int * ptr_i = (int*)ptr; Ez működik C++-ban is. Használjuk inkább ezt: int * ptr_i = static_cast(ptr); Csak egymással

Részletesebben

NULLADIK MATEMATIKA ZÁRTHELYI

NULLADIK MATEMATIKA ZÁRTHELYI NULLADIK MATEMATIKA ZÁRTHELYI 08-09-07 Terem: Munkaidő: 0 perc. A dolgozat megírásához íróeszközön kívül semmilyen segédeszköz nem használható! A feladatlap kizárólag kék vagy fekete tollal tölthető ki.

Részletesebben

Koordináta-geometria. Fogalom. Jelölés. Tulajdonságok, definíciók

Koordináta-geometria. Fogalom. Jelölés. Tulajdonságok, definíciók Koordináta-geometria Fogalom Ezen a helyen találkozik össze a számtan és a mértan. Körök, egyenesek, háromszögek és más egyéb alakzatok, de nem szerkesztenünk kell, vagy méricskélni, hanem számolni, viszont

Részletesebben

Java és web programozás

Java és web programozás Budapesti M szaki Egyetem 2013. szeptember 25. 3. El adás User public class User { private String realname_; private String nickname_; private String password_; public User(String realname, String nickname)

Részletesebben

GEOMETRIAI OPTIKA I.

GEOMETRIAI OPTIKA I. Elméleti háttér GEOMETRIAI OPTIKA I. Törésmutató meghatározása a törési törvény alapján Snellius-Descartes törvény Az új közeg határához érkező fény egy része behatol az új közegbe, és eközben általában

Részletesebben

Optika gyakorlat 1. Fermat-elv, fénytörés, reexió sík és görbült határfelületen. Fermat-elv

Optika gyakorlat 1. Fermat-elv, fénytörés, reexió sík és görbült határfelületen. Fermat-elv Optika gyakorlat 1. Fermat-elv, fénytörés, reexió sík és görbült határfelületen Kivonat Geometriai optika: közelítés, amely a fényterjedést, közeghatáron való áthaladást geometriai alakzatok görbék segítségével

Részletesebben

Analitikus térgeometria

Analitikus térgeometria Analitikus térgeometria Wettl Ferenc el adása alapján 2015.09.21. Wettl Ferenc el adása alapján Analitikus térgeometria 2015.09.21. 1 / 23 Tartalom 1 Egyenes és sík egyenlete Egyenes Sík 2 Alakzatok közös

Részletesebben

FÉNYTAN A FÉNY TULAJDONSÁGAI 1. Sorold fel milyen hatásait ismered a napfénynek! 2. Hogyan tisztelték és minek nevezték az ókori egyiptomiak a Napot?

FÉNYTAN A FÉNY TULAJDONSÁGAI 1. Sorold fel milyen hatásait ismered a napfénynek! 2. Hogyan tisztelték és minek nevezték az ókori egyiptomiak a Napot? FÉNYTAN A FÉNY TULAJDONSÁGAI 1. Sorold fel milyen hatásait ismered a napfénynek! 2. Hogyan tisztelték és minek nevezték az ókori egyiptomiak a Napot? 3. Mit nevezünk fényforrásnak? 4. Mi a legjelentősebb

Részletesebben

Koordináta geometria III.

Koordináta geometria III. Koordináta geometria III. TÉTEL: A P (x; y) pont akkor és csak akkor illeszkedik a K (u; v) középpontú r sugarú körre (körvonalra), ha (x u) 2 + (y v) 2 = r 2. Ez az összefüggés a K (u; v) középpontú r

Részletesebben

Osztályok. 4. gyakorlat

Osztályok. 4. gyakorlat Osztályok 4. gyakorlat Az osztály fogalma Az objektumok formai leírása, melyek azonos tulajdonsággal és operációkkal rendelkeznek. Osztályból objektum készítését példányosításnak nevezzük. Minden objektum

Részletesebben

Koordináta-geometria feladatok (középszint)

Koordináta-geometria feladatok (középszint) Koordináta-geometria feladatok (középszint) 1. (KSZÉV Minta (1) 2004.05/I/4) Adott az A(2; 5) és B(1; 3) pont. Adja meg az AB szakasz felezőpontjának koordinátáit! 2. (KSZÉV Minta (2) 2004.05/I/7) Egy

Részletesebben

INFORMATIKA tétel 2019

INFORMATIKA tétel 2019 INFORMATIKA tétel 2019 ELIGAZÍTÁS: 1 pont hivatalból; Az 1-4 feladatokban (a pszeudokód programrészletekben): (1) a kiír \n utasítás újsorba ugratja a képernyőn a kurzort; (2) a / operátor osztási hányadost

Részletesebben

Közegek és felületek megadása

Közegek és felületek megadása 3. Előadás Közegek és felületek megadása A gyakorlatban nem közömbös, hogy az adott közeg milyen anyagi tulajdonságokkal bír. (Törésmutató, felület típusa, érdessége ) Lehetőség van az anyagok közegének,

Részletesebben

Koordinátageometria. M veletek vektorokkal grakusan. Szent István Egyetem Gépészmérnöki Kar Matematika Tanszék 1

Koordinátageometria. M veletek vektorokkal grakusan. Szent István Egyetem Gépészmérnöki Kar Matematika Tanszék 1 Szent István Egyetem Gépészmérnöki Kar Matematika Tanszék 1 Koordinátageometria M veletek vektorokkal grakusan 1. Az ABCD négyzet oldalvektorai közül a = AB és b = BC. Adja meg az AC és BD vektorokat a

Részletesebben

A fény visszaverődése

A fény visszaverődése I. Bevezető - A fény tulajdonságai kölcsönhatásokra képes egyenes vonalban terjed terjedési sebessége függ a közeg anyagától (vákuumban 300.000 km/s; gyémántban 150.000 km/s) hullám tulajdonságai vannak

Részletesebben

Hajder Levente 2018/2019. II. félév

Hajder Levente 2018/2019. II. félév Hajder Levente hajder@inf.elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar 2018/2019. II. félév Tartalom 1 2 Törtvonal Felületi folytonosságok B-spline Spline variánsok Felosztott (subdivision) görbék

Részletesebben

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Felvételi vizsga mintatételsor Informatika írásbeli vizsga BABEȘ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR A. tételsor (30 pont) Felvételi vizsga mintatételsor Informatika írásbeli vizsga 1. (5p) Egy x biten tárolt egész adattípus (x szigorúan pozitív

Részletesebben

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak

Részletesebben

NULLADIK MATEMATIKA szeptember 13.

NULLADIK MATEMATIKA szeptember 13. A NULLADIK MATEMATIKA ZÁRTHELYI 0. szeptember. Terem: Munkaidő: 0 perc. A dolgozat megírásához íróeszközön kívül semmilyen segédeszköz nem használható nálható. Válaszait csak az üres mezőkbe írja! A javítók

Részletesebben

Programozás C++ -ban

Programozás C++ -ban 8. Dinamikus objektumok Programozás C++ -ban Ahhoz hogy általános prolémákat is meg tudjunk oldani, szükség van arra, hogy dinamikusan hozhassunk létre vagy szüntethessünk meg objektumokat. A C programozási

Részletesebben

Lakóház tervezés ADT 3.3-al. Segédlet

Lakóház tervezés ADT 3.3-al. Segédlet Lakóház tervezés ADT 3.3-al Segédlet A lakóház tervezési gyakorlathoz főleg a Tervezés és a Dokumentáció menüket fogjuk használni az AutoDesk Architectural Desktop programból. A program centiméterben dolgozik!!!

Részletesebben

Programozási alapismeretek 4.

Programozási alapismeretek 4. Programozási alapismeretek 4. Obejktum-Orientált Programozás Kis Balázs Bevezetés I. Az OO programozási szemlélet, egy merőben más szemlélet, az összes előző szemlélettel (strukturális, moduláris, stb.)

Részletesebben

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő

Részletesebben

Az Ampère-Maxwell-féle gerjesztési törvény

Az Ampère-Maxwell-féle gerjesztési törvény Az Ampère-Maxwell-féle gerjesztési törvény Maxwell elméleti meggondolások alapján feltételezte, hogy a változó elektromos tér örvényes mágneses teret kelt (hasonlóan ahhoz ahogy a változó mágneses tér

Részletesebben

C++ programozási nyelv

C++ programozási nyelv C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. november A C++ programozási nyelv Soós Sándor 1/12 Tartalomjegyzék Miért

Részletesebben

9. Fényhullámhossz és diszperzió mérése jegyzőkönyv

9. Fényhullámhossz és diszperzió mérése jegyzőkönyv 9. Fényhullámhossz és diszperzió mérése jegyzőkönyv Zsigmond Anna Fizika Bsc II. Mérés dátuma: 008. 11. 1. Leadás dátuma: 008. 11. 19. 1 1. A mérési összeállítás A méréseket speciális szögmérő eszközzel

Részletesebben

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C programozási nyelv Pointerek, tömbök, pointer aritmetika C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek

Részletesebben

Fényhullámhossz és diszperzió mérése

Fényhullámhossz és diszperzió mérése KLASSZIKUS FIZIKA LABORATÓRIUM 9. MÉRÉS Fényhullámhossz és diszperzió mérése Mérést végezte: Enyingi Vera Atala ENVSAAT.ELTE Mérés időpontja: 2011. október 19. Szerda délelőtti csoport 1. A mérés célja

Részletesebben

Készítette: niethammer@freemail.hu

Készítette: niethammer@freemail.hu VLogo VRML generáló program Készítette: Niethammer Zoltán niethammer@freemail.hu 2008 Bevezetés A VLogo az általános iskolákban használt Comenius Logo logikájára épülő programozási nyelv. A végeredmény

Részletesebben

4. Öröklődés. Programozás II

4. Öröklődés. Programozás II 4. Öröklődés Programozás II Mielőtt belevágunk Egy Tárgy típusú objektumokat tároló tömb i. elemében tároljunk el egy új tárgyat Rossz módszer: tomb[i].setnev( uj.getnev() ); tomb[i].setertek( uj.getertek()

Részletesebben

Fényhullámhossz és diszperzió mérése

Fényhullámhossz és diszperzió mérése Fényhullámhossz és diszperzió mérése Mérő neve: Márkus Bence Gábor Mérőpár neve: Székely Anna Krisztina Szerda délelőtti csoport Mérés ideje: 11/09/011 Beadás ideje: 11/16/011 1 1. A mérés rövid leírása

Részletesebben

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása Pázmány Péter Katolikus Egyetem Információs Technológiai Kar Bevezetés a programozásba II 1. gyakorlat A grafikus könyvtár használata, alakzatok rajzolása 2014.02.10. Giachetta Roberto groberto@inf.elte.hu

Részletesebben

A tér lineáris leképezései síkra

A tér lineáris leképezései síkra A tér lineáris leképezései síkra Az ábrázoló geometria célja: A háromdimenziós térben elhelyezkedő alakzatok helyzeti és metrikus viszonyainak egyértelmű és egyértelműen rekonstruálható módon történő ábrázolása

Részletesebben

Ugrásszerűen változó törésmutató, optikai szálak

Ugrásszerűen változó törésmutató, optikai szálak 9. Előadás Ugrásszerűen változó törésmutató, optikai szálak Ugrásszerűen változó törésmutatójú közeget két, vagy több objektum szoros egymáshoz illesztésével és azokhoz különböző anyag vagy törésmutató

Részletesebben

Informatika terméktervezőknek

Informatika terméktervezőknek Informatika terméktervezőknek C# alapok Névterület (namespace) using Osztály (class) és Obejtumok Metódus (function, procedure, method) main() static void string[] arg Szintaxis // /* */ \n \t Névadások

Részletesebben

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter Programozás(A szakirány) II. beadandó feladat 2014.05.05. Farkas András HP6S15 fafee@fafeecorp.com 1. csoport Veszprémi Anna / Hudoba Péter Feladat: Egy szöveges állományban bekezdésekre tördelt szöveg

Részletesebben

Geometriai és hullámoptika. Utolsó módosítás: május 10..

Geometriai és hullámoptika. Utolsó módosítás: május 10.. Geometriai és hullámoptika Utolsó módosítás: 2016. május 10.. 1 Mi a fény? Részecske vagy hullám? Isaac Newton (1642-1727) Pierre de Fermat (1601-1665) Christiaan Huygens (1629-1695) Thomas Young (1773-1829)

Részletesebben