K.Gy.
MATLAB grafika gyakorlatok 2.01-es verzió Bevezető Az összefoglaló kettős céllalt készült. Egyrészt a MATLAB grafikus lehetőségeibe kiván nem teljes igényű bepillantást nyújtani, másrészt a különböző függvénytípusok használatának a bemutatása. A Numerikus módszerek tárgy gyakorlatainak segédlete. A cél a vizualizáció, az elméleti anyag szemléltetése és ezen keresztül annak könnyebb feldolgozhatósága. Az ismertetőben a funkcióhoz tartozó eljárás ismertetése után példa segíti a megértést és az alkalmazást. Matematikai magyarázatok nem képezik ezen anyag részét, ez az előadás, illetve más tárgyak feladata. Tartalomjegyzék Kétdimenziós ábrázolások................................................................................................................ 2 Függvények, adatsorok megadása.............................................................................................. 2 Grafikon formázási lehetőségek ................................................................................................ 2 Kiegészítő grafikus utasítások ................................................................................................... 3 y=f(x) alakú egyváltozós függvények (skalár-skalár függvény) ................................................... 3 x=f(t), y=g(t) koordináta-függvényű paraméteres görbe (vektor-skalár függvény) ...................... 4 (x,y)=0 alakú implicit függvény ábrázolása ................................................................................ 6 r=f(), =[t1,t2] polárkoordinátás ábrázolás ................................................................................. 7 Háromdimenziós ábrázolások .......................................................................................................... 8 x=f(t), y=g(t), z(t) koordináta-függvényű paraméteres görbe (vektor-skalár függvény) ............... 8 Függvények, adatsorok megadása.............................................................................................. 9 Megjelenítési lehetőségek ........................................................................................................ 10 z=f(x,y) alakú kétváltozós függvények vetített megjelenítése (skalár-vektor függvény)............ 10 Kétváltozós függvény szintvonalas megjelenítése (skalár-vektor függvény) ............................. 10 x=f(u,v), y=g(u,v), z=h(u,v) koordináta-függvényű felület (kétparaméteres vektor-skalár függvény) .................................................................................................................................... 11 Összetett felületek konstruálása .................................................................................................. 12 Áthatási görbe számítása és megjelenítése ................................................................................. 13 Terep megjelenítése .................................................................................................................... 14 Általános térbeli paraméteres megjelenítés ................................................................................. 16 Poligonok megjelenítése ............................................................................................................. 17
1 / 19
K.Gy.
Kétdimenziós ábrázolások A megjelenítésekhez szükséges az értelmezési tartomány és az értékkészlet megfelelő megadása. Ez az alábbi módokon történhet. Függvények, adatsorok megadása Adatok vektorban tárolása - általánosabb és nagyobb szabadságfokú használatot eredményez: plot(X,Y,…) függvény-csoport. Pl.: Az összetartozó x,y értékeket vektorba helyezzük. x=-2:.1:2 y=1./(1.+x.*x)
A formula elhelyezése karakterláncban - könnyebben kezelhető és átláthatóbb: ezplot(fvstring,[x1,x2]) függvény-csoport. Pl.: Képlet defíniálása. fvstring='1/(1+x*x)'
A formula elhelyezése szimbolikus kifejezésben - könnyebben kezelhető és átláthatóbb: ezplot(fvkeplet,[x1,x2]) függvény-csoport. Pl.: Képlet defíniálása. Syms x fvkeplet=1/(1+x*x)
Felhasználói függvény (anonymous function) definiálása - könnyebben kezelhető és általánosabb a fentieknél: ezplot(fv,[x1,x2]) függvény-csoport. fv=@(x)1/(1+x*x)
Külön file-ba helyezett függvény (function) készítése - nehézkesebben kezelhető, de a legnagyobb általánosságot adja: ezplot(@fv,[x1,x2]) függvény-csoport. Function y=fv(x) y=1/(1+x*x) end
A továbbiakban mindegyikre látunk példát, de az ezplot használati módot részesítettük előnyben. Grafikon formázási lehetőségek Helyes rajzolási utasítás után megjelenik a Figure ablak. Formázására két lehetőség van. Formázó eljárások és paraméterek használatával a parancssorból. Interaktív úton a Figure ablakból A grafikon objektum fontosabb állítható tulajdonságai: Ablak – háttérszín, cím. Koordinátaháló – x,y tengely és háló, style (feliratok színek), aspect (torzítás). Vonal – vonalstílus, vastagság, szín, markerek. Parancssorból használható fontosabb vezérlőparaméterek (használatát lásd későbbi példákban): szín: angol szavak kezdőbetűi – pl. r: piros, b: kék marker: +,*,x, .,o használatukkor nincs vonalhúzás Interaktív módban aktivizálni kell az Edit plot ikont, majd a megfelelő helyen dupla klikk az egérrel. A témacsoporthoz tartozó tulajdonságok dialógus lapon módosíthatók. 2 / 19
K.Gy.
Kiegészítő grafikus utasítások A rajzi output helye a Figure ablak, mely sorszámmal vezérelhető a parancssorból. Egy rajzi utasítás alapértelmezetten törli az ablak tartalmát és utána jelenít meg. Hasznos utasítások a parancssorból:
figure(n) : az n. ablak legyen aktív, vagy nyíljon meg. hold on : további rajzutasítások engedélyezése az aktív ablakra. Kikapcsolás: off paraméter. subplot(n,m,k) : egy figure-n belül több ablak megadása (mozaikszerűen): n – sor, m – oszlop kialakítása, k. ablak legyen aktív (sorfolytonosan számolva). axis([x1,x2,y1,y2]) : koordinátaablak megadása. grid on : beállított vagy alapértelmezett koordinátaháló rajzolása. Kikapcsolás: off paraméter.
A fentiek interaktív módban is megadhatók a megfelelő dialóguslapon.
y=f(x) alakú egyváltozós függvények (skalár-skalár függvény) Ebben az esetben az x tengelyhez intervallumot adunk meg, azaz ez lesz a függvény független változója. Az értékkészletet vektorba helyezzük, vagy formálisan definiáljuk. Az alábbi öt utasításcsoport eredménye egyenértékű (fenti példák alkalmazása): 1.
2.
3. 4.
x=-2:.1:2 y=1./(1.+x.*x) plot(x,y) ezplot('1/(1+x^2)',[-2,2]) fvstring='1/(1+x^2)' ezplot(fvstring,[-2,2]) fv=@(x)1/(1+x^2) ezplot(fv,[-2,2])
az ÉT: [-2,2] zárt intervallum.
A formázás automatikusan – alapértelmezett – módon történt: 1/(1+x 2)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
-2
-1.5
-1
-0.5
0 x
3 / 19
0.5
1
1.5
2
K.Gy.
x=f(t), y=g(t) koordináta-függvényű paraméteres görbe (vektor-skalár függvény) Skalár intervallumot képezünk le a sík pontjaiba (helyvektorba). Mindkét tengely vektor, kifejezés vagy függvény, egy változó értékkészletével. Pl.: egységsugarú kör és koordinátafüggvényeinek megjelenítése a paraméterintervallum normálásával. t=0:0.01:1; korx=cos(2*pi*t); kory=sin(2*pi*t);
A koordinátafüggvények egy ábrán (páronként vesszővel elválasztva): plot(t,korx,t,kory)
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
A grafikon további beállításokkal (interaktív módon):
4 / 19
háló mindkét tengelyen vonalvastagság: 2 vonalszínek: kék, piros tengely, kommentár és címfeliratok
K.Gy.
A kör megjelenítése: plot(korx,kory)
Lineáris spirál (körből származtatva): Négyszer tekeredik. t=0:0.01:4;
A vezérsugár arányos az elfordulással. A koordináta-függvények és megjelenítésük: spx=t.*cos(2*pi*t); spy=t.*sin(2*pi*t); plot(t,spx,t,spy)
4
3
2
1
0
-1
-2
-3
-4
0
0.5
1
1.5
2
2.5
3
3.5
4
plot(spx,spy,’b.’)
A spirál nyomvonala csak markerekkel és kék színnel lett jelölve, a vektorokban tárolt pontok szemléltetéséhez.
5 / 19
K.Gy.
(x,y)=0 alakú implicit függvény ábrázolása Ellipszis megjelenítése: Kanonikus egyenletével adjuk meg, a [-2,2] négyzet tartományon, interaktívan formázva: ezplot('x^2/4+y^2/2-1',[-2,2])
Metsző körök megjelenítése: Kanonikus egyenletükkel szimbolikusan adjuk meg, parancssorból formázva: syms u v kor1=u^2+v^2-4 kor2=(u-1)^2+(v-1)^2-2 6 / 19
K.Gy. mo=solve(kor1,kor2) % az algebrai egyenlet megoldása; az eredmény rekord formátumban, vektorba kerül – szimbolikus típusban h=ezplot(kor1,[-2,2]) % az alpértelmezett szín a kék set(h,'Linewidth',2) % az ezplot vonalvastagság állítási lehetősége hold on h=ezplot(kor2,[-1,3]) set(h,'color','c') % az ezplot szinezési lehetősége axis([-2,3,-2,3]) plot(double(mo.u),double(mo.v),'ro') % valós típusra konvertálva
(u-1)2+(v-1)2-2 = 0 3 2.5 2 1.5
v
1 0.5 0 -0.5 -1 -1.5 -2 -2
-1.5
-1
-0.5
0
0.5 u
1
1.5
2
2.5
3
r=f(), =[t1,t2] polárkoordinátás ábrázolás A szögtengelyen (körív) megadjuk egy intervallummal a független változót, a sugár egy kifejezés vagy függvény. Lineáris spirál (háromszor fordul, elfordulással arányos méretű sugárral): ezpolar('t/2/pi',[0,3*2*pi])
7 / 19
K.Gy.
Háromdimenziós ábrázolások x=f(t), y=g(t), z(t) koordináta-függvényű paraméteres görbe (vektor-skalár függvény) A térgörbe három koordináta-függvényét kell megadni a plot3(X,Y,Z,...), az ezplot3('x(t)','y(t)','z(t)',[t1,t2],…), vagy az ezplot3(fv_x,fv_y,fv_z,[t1,t2],…) formában. Pl.: henger-, illetve kúp-csavarvonal, egy figure-ben és két ablakban: t=0:0.01:4; csx=cos(2*pi*t); csy=sin(2*pi*t); csz=t; kcsx=t.*cos(2*pi*t); kcsy=t.*sin(2*pi*t); kcsz=t; subplot(1,2,1) plot3(csx,csy,csz) subplot(1,2,2) plot3(kcsx,kcsy,kcsz)
Formázási elve megegyezik a 2D-sal.
8 / 19
K.Gy.
Függvények, adatsorok megadása Adatok mátrixban tárolása - általánosabb és nagyobb szabadságfokú használatot eredményez (mesh(X,Y,Z), surf((X,Y,Z), fill3(X,Y,Z,szin) függvény-csoport). Az összetartozó X,Y,Z értékeket mátrixba helyezzük. A formula elhelyezése karakterláncban - könnyebben kezelhető és átláthatóbb. ezsurf('x(u,v)','y(u,v)','z(u,v)',[u1,u2,v1,v2],…) függvény-csoport Képlettel defíniálunk és intervallumot adunk meg. A formula elhelyezése szimbolikus kifejezésben - könnyebben kezelhető és átláthatóbb: ezsurf(fvkeplet,[x1,x2,y2,y2]) függvény-csoport. Pl.: Képlet defíniálása. Syms x y fvkeplet=1/(1+x*x)/(1+y*y)
Felhasználói függvény (anonymous function) definiálása - könnyebben kezelhető és általánosabb a fentieknél: ezsurft(fv,[x1,x2,y1,y2]) függvény-csoport. fv=@(x,y)1/(1+x*x)/(1+y*y)
Külön file-ba helyezett függvény (function) készítése - nehézkesebben kezelhető, de a legnagyobb általánosságot adja: ezsurf(@fv,[x1,x2,y1y2]) függvény-csoport. A megjelenítendő függvényre program írható. Function z=fv(x,y) z=1/(1+x*x)/(1+y*y) end
9 / 19
K.Gy.
Megjelenítési lehetőségek Helyes rajzolási utasítás után megjelenik a Figure ablak. Formázására két lehetőség van. Formázó eljárások használatával a parancssorból. Interaktív úton a Figure ablakból A grafikon objektum fontosabb állítható tulajdonságai: Ablak – háttérszín, cím. Világítás – Insert->Light menüvel helyezhetünk el fényt. Koordinátaháló – x,y,z tengely és háló, style (feliratok színek), aspect (torzítás), világítás beállításai. Felület – megjelenítési mód (pontmodell, drótváz, élek, kitöltés), szín, világítás alkalmazásával árnyalási módok, anyagválasztás (matt-tükrözés aránya). Interaktív módban aktivizálni kell az Edit plot ikont, majd a megfelelő helyen dupla klikk az egérrel. A témacsoporthoz tartozó tulajdonságok dialógus lapon módosíthatók.
z=f(x,y) alakú kétváltozós függvények vetített megjelenítése (skalár-vektor függvény) Az x,y síkbeli téglalap tartományon értelmezett függvényt adunk meg. ezsurf('1/(1+x^2)/(1+y^2)',[-2,2,-2,2])
Kétváltozós függvény szintvonalas megjelenítése (skalár-vektor függvény) A fenti függvény szintvonalasan megjelenítve. ezcontourf('1/(1+x^2)/(1+y^2)',[-2,2])
10 / 19
K.Gy.
x=f(u,v), y=g(u,v), z=h(u,v) koordináta-függvényű felület (kétparaméteres vektor-skalár függvény) Két összerendelt skalár intervallumot (téglalap tartományt) képezünk le a tér pontjaiba (helyvektorba). Másképpen: olyan vektor-vektor függvény mely a sík pontjait képezi le a tér pontjaiba. Készítsük el három "alapfelület" koordináta-függvényét. Mindhárom a körvonalból származtatható. Az értelmezési tartomány egy négyzet pontjai ahol u,v є [0,1] intervallumnak. Hengerpalást: Hx='cos(2*pi*u)'; Hy='sin(2*pi*u)'; Hz='v' ezsurf(Hx,Hy,Hz,[0,1,0,1])
11 / 19
K.Gy.
Körlap: Kx='v*cos(2*pi*u)'; Ky='v*sin(2*pi*u)'; Kz='0' ezsurf(Kx,Ky,Kz,[0,1,0,1])
Kúppalást: Kupx='v*cos(2*pi*u)'; Kupy='v*sin(2*pi*u)'; Kupz='v' ezsurf(Kupx,Kupy,Kupz,[0,1,0,1])
Összetett felületek konstruálása Ismert a felületet alkotó elemi felületek egyenlete. kúp=kúppalást+alaplap Kupz='1-v' ezsurf(Kupx,Kupy,Kupz,[0,1,0,1]) hold on ezsurf(Kx,Ky,Kz,[0,1,0,1])
Az alaplap bemutatásához drótváz megjelenítést választottunk.
12 / 19
K.Gy.
Áthatási görbe számítása és megjelenítése Adva két paraboloid. Jelenítsük meg ezeket és húzzuk ki áthatási görbéjüket. Válasszuk a legkényelmesebb utat, szimbolikus változók használatát. syms x y z1=-x^2-2*y^2 z2=-4*(x-1)^2-4*(y+1)^2 mo=solve(z1-z2,y) % y-ra oldjuk meg az egyenletet, ami y(x) függvényt eredményez. z3=-x^2-2*mo(1)^2 % az első megoldást választjuk és visszahelyettesítünk. hold off ezplot3(x,mo(1),z3,[0,2]) % a görbe – a három koordinátafüggvény x paramétertől függ hold on colormap([1 0.5 0.5]) % szinezzük a felületeket a példa kedvéért RGB -módon ezsurf(z1,[-2,2,-2,2]) ezsurf(z2,[-2,2,-2,2]) axis([-2,2,-2,2,-6,0])
13 / 19
K.Gy.
-4 (x-1)2-4 (y+1)2
0 -1
z
-2 -3 -4 2
-5 -6 2
0 1.5
1
0.5
0
-0.5
-1
-1.5
-2
-2
x
y
Terep megjelenítése A terep magassági mintavételi pontjai egy szabályos rács pontjaiban vannak megadva. A rács x koordinátáira: 1000<=x<=1500 , y koordinátáira: 500<=x<=1000. A formázást parancssorból végezzük. A magassági értékek mátrixa: Z= 162.3000 165.4000 168.5000 164.5000 160.8000 158.4000
168.1000 170.7000 170.8000 167.8000 162.4000 159.9000
171.4000 174.3000 172.1000 164.3000 163.1000 158.2000
170.6000 173.0000 171.5000 167.7000 163.5000 157.1000
166.8000 170.3000 168.9000 164.9000 162.9000 159.6000
164.9000 165.5000 169.7000 163.1000 159.3000 160.8000
subplot(2,2,1) mesh(Z,'Marker','.','Edgecolor','b') % mitapontok és rácsháló axis([1,6,1,6]) subplot(2,2,2) surf(Z,'Edgecolor','c','Facecolor','b') % festett megjelenítés a hálóval axis([1,6,1,6]) subplot(2,2,3) [X Y]=meshgrid(1000:100:1500,500:100:1000); % valódi x,y koordináták generálása X= 1000 1100 1200 1300 1400 1500 1000 1100 1200 1300 1400 1500 1000 1100 1200 1300 1400 1500 1000 1100 1200 1300 1400 1500
14 / 19
K.Gy.
1000 1000
1100 1100
1200 1200
1300 1300
1400 1400
1500 1500
500 600 700 800 900 1000
500 600 700 800 900 1000
500 600 700 800 900 1000
500 600 700 800 900 1000
500 600 700 800 900 1000
500 600 700 800 900 1000
Y=
surf(X,Y,Z,'Edgecolor','none','Facecolor','b','Facelighting','Flat') % laponkénti árnyalás light('Position',[0 0 1],'Style','infinite'); % világítás adott irányból axis([1000,1500,500,1000]) [x y]=meshgrid(1000:10:1500,500:10:1000) z=interp2(X,Y,Z,x,y,'spline') % sűrített háló készítése spline interpolációval subplot(2,2,4) surf(x,y,z,'Edgecolor','none','Facecolor','b','Facelighting','Phong') % interpolált árnyalás light('Position',[0 0 1],'Style','infinite'); axis([1000,1500,500,1000])
15 / 19
K.Gy.
Általános térbeli paraméteres megjelenítés Az adatmegadás elve: a felület egy (x, y, z) pontja három téglalaprács azonos indexpárú értéke. A paramétertartomány: iє[1…n], jє[1…m]. Ezzel […xi,j…], […yi,j…] és […zi,j…] mátrixok adják a felület pontjait. A felület paramétervonalait az azonos i és azonos j indexű koordinátahármasai alkotják. Jelenítsünk meg egy r=1 sugarú göböt. Származtassunk le ebből egy olyan felületet, melyet véletlenszerűen deformálunk paramétervonalai metszéspontjában. A formázást parancssorból végezzük. n=24; [X Y Z]=sphere(n); % a gömb pontjainak koordinátáit 25x25-ös mátrixokban kapjuk (könyvtári függvény). subplot(1,2,1) surf(X,Y,Z,'FaceColor','c','Edgecolor','none','Facelighting','Phong') light('Position',[0 0 1],'Style','infinite'); axis equal dr=.15; % max. dr amplitúdójú deformációk készítése for i=1:n for j=1:n s=1+dr*(rand-.5); % torzító tényező sorsolása X(i,j)=s*X(i,j); Y(i,j)=s*Y(i,j); Z(i,j)=s*Z(i,j); end X(i,n+1)=X(i,1); % folytonos záródás Y(i,n+1)=Y(i,1); Z(i,n+1)=Z(i,1); end for j=1:n+1 X(n+1,j)=X(1,j); % folytonos záródás Y(n+1,j)=Y(1,j); Z(n+1,j)=Z(1,j); end subplot(1,2,2) surf(X,Y,Z,'FaceColor','c','Edgecolor','none','Facelighting','Gouraud') light('Position',[0 0 1],'Style','infinite'); axis equal
16 / 19
K.Gy.
Poligonok megjelenítése Amennyiben alakzatainkat síkok – poligonok – határolják, használhatjuk a fill3(X,Y,Z,ColorSpec) grafikus függvényt. Az eljárás X,Y,Z vektorban tárolt (csúcskoordináták) poligont fest ki a megadott színnel. A pontokat körüljárási sorrendben kell megadni. A példa egy alapelemből - ház, transzformációkkal egy tanyát készít, majd megjeleníti. A formázást parancssorból végezzük. A ház csúcsmátrixa homogén koordinátával kibővítve: csucs = 0 0 3 3 0 0 3 3 1 1 2 2
0 3 3 0 0 3 3 0 1 2 2 1
0 0 0 0 3 3 3 3 5 5 5 5
1 1 1 1 1 1 1 1 1 1 1 1
A ház lapmátrixa (hivatkozási sorszámokkal a csúcsokra): lap = 1 3 2 5 8
2 7 6 6 5
3 8 7 2 1
17 / 19
4 4 3 1 4
K.Gy.
9 10 11 12 5 6 10 9 6 7 11 10 7 8 12 11 8 5 9 12
subplot(1,2,1) hold on for i=1:length(lap) fill3(csucs(lap(i,1:4),1),csucs(lap(i,1:4),2),csucs(lap(i,1:4),3),[.8 .8 .8],'Edgecolor',[.0 .0 .0]) end set(gca,'DataAspectRatioMode','manual') axis([-1,4,-1,4,0,5]) subplot(1,2,2) hold on Nagy1=[10 0 0 0; 0 10 0 0; 0 0 20 0; 0 0 0 1] Nagy2=[20 0 0 0; 0 10 0 0; 0 0 10 0; 0 0 0 1] Nagy3=[10 0 0 0; 0 20 0 0; 0 0 10 0; 0 0 0 1] Tol2=[1 0 0 0; 0 1 0 0; 0 0 1 0; 50 0 0 1] Tol3=[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 50 0 1] haz1=csucs*Nagy1 haz2=csucs*Nagy2*Tol2 haz3=csucs*Nagy3*Tol3 for i=1:length(lap) fill3(haz1(lap(i,1:4),1),haz1(lap(i,1:4),2),haz1(lap(i,1:4),3),[.7 .7 .7],'Edgecolor','none') end for i=1:length(lap) fill3(haz2(lap(i,1:4),1),haz2(lap(i,1:4),2),haz2(lap(i,1:4),3),[.7 .7 .7],'Edgecolor','none') end for i=1:length(lap) fill3(haz3(lap(i,1:4),1),haz3(lap(i,1:4),2),haz3(lap(i,1:4),3),[.7 .7 .7],'Edgecolor','none') end set(gca,'DataAspectRatioMode','manual') axis([-10,120,-10,120,0,100]) light('Position',[-2 -1 1.5],'Style','infinite');
18 / 19
K.Gy.
Csupa háromszögből vagy négyszögből összerakott alakzathoz használhatjuk a trimesh(lapok,X,Y,Z,…) grafikus függvényt. Az eljárás X,Y,Z vektorban tárolt (csúcskoordináták) háromszögeket vagy négyszögeket jelenít meg. A példa az előző alapelem megjelenítése. A lapmátrix soronként a megfelelő sorszámú csúcsokra hivatkozik. Fontos, hogy a csúcsok körüljárási sorrendje a jobbkéz-szabály szerinti kifelé mutató normálist defíniálja! csucs =[ 0 0 0 0 3 0 3 3 0 3 0 0 0 0 3 0 3 3 3 3 3 3 0 3 1 1 5 1 2 5 2 2 5 2 1 5] lap =[ 1 2 3 3 7 8 2 6 7 5 6 2 8 5 1 9 12 11 5 9 10 6 10 11 7 11 12 8 12 9
4 4 3 1 4 10 6 7 8 5]
subplot(1,2,1) trimesh(lap,csucs(:,1),csucs(:,2),csucs(:,3),'edgecolor','none','facecolor',[.7 .7 .7],'facelighting','flat') light('Position',[-2 -1 1.5],'Style','infinite'); axis equal axis([-1,4,-1,4,0,5])
Megjegyzés: a gúla megjelenítése egy másik lapmátrix-szal történt, megegyező módon. 19 / 19