1
Grafika w programie
MATLAB
dr inż. Henryk Olszewski
2
Funkcja quiver
Funkcja quiver wyświetla wektory prędkości w postaci strzałek, których długości i zwroty określają macierze składowych wektorów U i V zaś współrzędne punktów zaczepienia
macierze X i Y:
quiver(X,Y,U,V)
Macierze X, Y, U i V muszą mieć ten sam wymiar i zawierać odpowiadające sobie współrzędne położenia wektorów i składowe wektorów.
Program MATLAB generuje macierze współrzędnych X i Y na podstawie wektorów:
[X,Y] = meshgrid(X,Y)
quiver(X,Y,U,V)
W tym przypadku muszą być spełnione następujące zależności:
length(X) = n i length(Y) = m, gdzie [m,n] = size(U) = size(V)
Wektor X odpowiada kolumnom macierzy U i V, zaś wektor Y wierszom macierzy U i V.
3
Funkcja quiver
Funkcja:
quiver(U,V)
wyświetla wektory U i V w równoodległych punktach na płaszczyźnie x-y.
Funkcja:
quiver(...,scale)
automatycznie przeskalowywuje strzałki wektorów dopasowywując je węzłów siatki, a następnie przemnaża długość wektorów przez zadany współczynnik skali. Jeżeli parametr scale = 2
długość wektorów zwiększa się dwukrotnie, jeżeli parametr scale = 0.5 długość wektorów zmniejsza się dwukrotnie. Jeżeli parametr scale = 0 wektory prędkości nie są automatycznie
przeskalowywane.
We funkcji:
quiver(...,LineSpec)
rodzaj linii, symbol markera oraz kolor linii są określone przez parametr LineSpec. Markery są rysowane w punktach początkowych wektorów.
4
Funkcja quiver
Funkcja:
quiver(...,LineSpec,'filled')
wypełnia markery określone za pomocą parametru LineSpec.
Polecenie:
h = quiver(...)
wyświetla wektor cech rysowanych linii.
Przykład 1:
Wyświetlić pole gradientów funkcji:
2
2
y
x
e
x
z
5
Funkcja quiver
[X,Y] = meshgrid(-2:.2:2);
Z = X.*exp(-X.^2 - Y.^2);
[DX,DY] = gradient(Z,.2,.2);
contour(X,Y,Z)
hold on
quiver(X,Y,DX,DY)
colormap hsv
grid off
hold off
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
6
Funkcja quiver
Przykład 2:
Wyświetlić 10 linii konturowych funkcji peaks:
n = -2.0:.2:2.0;
[X,Y,Z] = peaks(n);
contour(X,Y,Z,10)
7
Funkcja quiver
Przykład 2:
Przy pomocy funkcji gradient obliczyć składowe wektora przyrostów funkcji Z będące parametrami funkcji quiver:
[U,V] = gradient(Z,.2);
Na wyświetlony w oknie rysunkowym wykres nałożyć nowy wykres pola wektorowego:
hold on
quiver(X,Y,U,V)
hold off
8
Funkcja quiver3
Funkcja quiver3 wyświetla trójwymiarowe wykresy wektorów o składowych (U, V, W) w
punktach o współrzędnych (X, Y, Z):
quiver(X,Y,Z,U,V,W)
Przykład 1:
Wyświetlić wektory normalnych do płaszczyzny określonej równaniem:
2
2
y
x
e
x
z
9
Funkcja quiver3
[X,Y] = meshgrid(-2:0.25:2,-1:0.2:1);
Z = X.* exp(-X.^2 - Y.^2);
[U,V,W] = surfnorm(X,Y,Z);
quiver3(X,Y,Z,U,V,W,0.5);
hold on
surf(X,Y,Z);
colormap hsv
view(-35,45)
axis ([-2 2 -1 1 -.6 .6])
hold off
-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
-1
-0.5
0
0.5
1
-0.4
-0.2
0
0.2
0.4
0.6
10
Funkcja quiver3
Przykład 2:
Wyświetlić prędkość punktu, którego trajektoria jest opisana równaniem:
Określenie wartości stałych vz oraz a:
vz = 10;
% Velocity
a = -32;
% Acceleration
Obliczenia funkcji z, jeżeli czas zmienia się od 0 do 1 z krokiem 0.1:
t = 0:.1:1;
z = vz*t + 1/2*a*t.^2;
Obliczenia składowych położenia x i y:
vx = 2;
x = vx*t;
vy = 3;
y = vy*t;
2
2
t
a
t
v
t
z
z
11
Funkcja quiver3
Przykład 2:
Obliczenia składowych wektorów prędkości i wyświetlenie wektorów w przestrzeni trójwymiarowej:
u = gradient(x);
v = gradient(y);
w = gradient(z);
scale = 0;
quiver3(x,y,z,u,v,w,scale)
view([70 18])
12
Funkcja coneplot
Funkcja coneplot wyświetla wektory prędkości postaci w stożków w przestrzeni 3D.
Funkcja:
coneplot(X,Y,Z,U,V,W,Cx,Cy,Cz)
wyświetla wektory prędkości w postaci stożków, których osie symetrii są zgodne z kierunkami wektorów prędkości zaś wysokość jest
proporcjonalna do długości wektora.
Macierze X, Y i Z zawierają składowe współrzędnych pola wektorów.
Macierze U, V i W zawierają składowe wektorów. Powyższe macierze muszą mieć te same wymiary, muszą być monotoniczne i
3-D (o takiej samej postaci, co macierze wygenerowane przez funkcję meshgrid).
Macierze Cx, Cy i Cz zawierają położenia stożków w polu prędkości.
13
Funkcja coneplot
W przypadku funkcji:
coneplot(U,V,W,Cx,Cy,Cz)
(macierze X, Y i Z są pominięte) przyjmuje się, że:
[X,Y,Z] = meshgrid(1:n,1:m,1:p) gdzie: [m,n,p]= size(U).
W przypadku wywołania funkcji:
coneplot(...,s)
funkcja MATLAB automatycznie przeskalowywuje stożki wykresu do rozmiarów okna graficznego a następnie zmienia ich wysokości przemnażając je współczynnik skali
s. Jeśli współczynnik skali s nie jest określony program MATLAB przyjmuje wartość domyślną s = 1. Jeżeli s = 0 stożki są wyświetlane bez automatycznego
przeskalowania.
14
Funkcja coneplot
Funkcja:
coneplot(...,color)
interpoluje macierzą kolorów pole wektorów i następnie wyświetla stożki w kolorach odpowiadających interpolowanym wartościom. Wymiary macierzy
color muszą być te same, co wymiary macierzy U, V i W. Powyższa opcja działa tylko w przypadku stożków (nie współpracuje z opcją quiver).
Funkcja:
coneplot(...,'quiver')
wyświetla strzałki zamiast stożków (działa podobnie jak funkcja quiver3).
15
Funkcja coneplot
W przypadku funkcji:
coneplot(...,'method')
istnieje możliwość wyboru metody interpolacji:
‘linear’
- kawałkami liniowa – funkcją łamaną (domyślna),
‘cubic’
- kawałkami sześcienna – wielomianami trzeciego
stopnia,
‘nearest’
- najmniejszych odległości
Funkcja:
coneplot(X,Y,Z,U,V,W,'nointerp')
nie interpoluje położenia stożków w zadanej objętości. Stożki są rysowane w położeniach zdefiniowanych przez macierze X, Y i Z, zaś ich orientację określają macierze U, V i W. Macierze X, Y, Z, U,
V, W muszą mieć te same wymiary.
16
Funkcja coneplot
Polecenie:
h = coneplot(...)
wyświetla cechy obiektów użytych do narysowania stożków
Funkcja coneplot automatycznie przeskalowywuje wymiary stożków, tak by maksymalnie wypełniały one obszar
wykresu przy równoczesnym zachowaniu proporcji względem wektorów prędkości.W większości przypadków należy
określić współczynniki skali osi wykresu przed użyciem funkcji coneplot za pomocą funkcji daspect:
daspect([1,1,1])
17
Funkcja coneplot
Przykład 1:
Narysować stożkowe wektory prędkości przedstawiające ruch powietrza w prostopadłościennej
przestrzeni. Wykres ma obejmować:
stożki określające amplitudę oraz kierunek prędkości wiatru,
powłokę brzeg wykresu,
kierunkowe oświetlenie ułatwiające określenie orientacji stożków.
18
Funkcja coneplot
Wczytanie danych
Plik danych dotyczących wiatru wind zawiera sześć 3-D macierzy: u, v i w określających składowe prędkości w każdym punkcie przestrzeni o współrzędnych x, y i z. Po
wczytaniu danych pomocne jest ustalenie zakresów wczytanych danych, które zostaną wykorzystane przy rysowaniu powłoki oraz stożków prędkości:
load wind
xmin = min(x(:));
xmax = max(x(:));
ymin = min(y(:));
ymax = max(y(:));
zmin = min(z(:));
zmax = max(z(:));
19
Funkcja coneplot
Utworzenie wykresu stożkowego
Określić zakresu wykresu stożkowego – przyjąć pełen zakres x i y z ośmioma krokami w przedziale od 3 do 15 oraz z czterema krokami z zakresie z (funkcje linspace i meshgrid).
Użyć funkcję daspect w celu określenia współczynników skali osi przed wydaniem polecenia coneplot – program MATLAB przyjmie właściwe wymiary stożków.
Wygenerować stożki przyjmując współczynnik skali równy 5 – stożki będą pięciokrotnie większe.
Określić sposób kolorowania każdego stożka (funkcje FaceColor, EdgeColor).
daspect([2,2,1])
xrange = linspace(xmin,xmax,8);
yrange = linspace(ymin,ymax,8);
zrange = 3:4:15;
[cx cy cz] = meshgrid(xrange,yrange,zrange);
hcones = coneplot(x,y,z,u,v,w,cx,cy,cz,5);
set(hcones,'FaceColor','red','EdgeColor','none')
20
Funkcja coneplot
Utworzenie powłoki tworzącej brzeg rysunku
Obliczyć długości wektorów pola prędkości (które reprezentują prędkości wiatru) będące danymi funkcji slice.
Wygenerować powłokę brzegową, dla której współrzędna x zmienia się od xmin do xmax, y zmienia się od ymin do ymax, z zmienia się od zmin do zmax.
Określić zinterpolowane kolory siatki elementów trójkątnych powłoki ograniczającej przestrzenny wykres prędkości wiatru. Kolory siatki zależeć mają od prędkości
wiatru. Krawędzie elementów nie mają być rysowane (funkcje hold, slice, FaceColor, EdgeColor).
hold on
wind_speed = sqrt(u.^2 + v.^2 + w.^2);
hsurfaces=slice(x,y,z,wind_speed,[xmin,xmax],ymax,zmin);
set(hsurfaces,'FaceColor','interp','EdgeColor','none')
hold off
21
Funkcja coneplot
Zdefiniować widok
Za pomocą funkcji axis określić granice osi wykresu równe zakresom danych.
Przyjąć widok o azymucie równym 30 i elewacji równej 40 (ustalenie najlepszego widoku jest możliwe przy pomocy funkcji rotate3d).
Przyjąć widok perspektywiczny pozwalający uzyskać bardziej realistyczny widok wykresu (funkcja camproj).
Powiększyć scenę wykresu tak, by wykres był możliwie jak największy (funkcja camzoom).
axis tight;
view(30,40); axis off
camproj perspective;
camzoom(1.5)
22
Funkcja coneplot
Dodać oświetlenie do sceny
Dodane do sceny źródła światła oświetlają zarówno powłokę (brzeg wykresu), jak i stożki (linie prądu wiatru). Dla każdego z powyższych obiektów wykresu można
określić różne charakterystyki odbicie i pochłaniania światła.
Dodać źródło światła na prawo od kamery, użyć oświetlenie Phong, w którym stożki i powłoki brzegu łagodnie wyłaniają się z trójwymiarowego wykresu
(funkcje camlight, lighting).
Zwiększyć wartość cechy AmbientStrength ( światło otoczenia) dla każdej powłoki w celu zwiększenia nasycenia ciemno-niebieskiego koloru (istnieje również
możliwość określenia różnych map kolorów – funkcja colormap dla poszczególnych powłok brzegu strumienia wiatru).
Zwiększyć wartość cechy DiffuseStrength (rozproszenie światła) dla stożków w celu rozjaśnienia stożków nie odbijających bezpośrednio strumień światła.
camlight right; lighting phong
set(hsurfaces,'AmbientStrength',.6)
set(hcones,'DiffuseStrength',.8)
23
Funkcja coneplot
24
Funkcja curl
Funkcja curl wyświetla rotacje wektorów oraz prędkości kątowe pola wektorów w przestrzeni trójwymiarowej.
Przykład 1:
Przy pomocy kolorowych powłok (slice planes) wykonać wykres prędkości kątowych zawirowania powietrza w określonych położeniach pola wektorów strumienia wiatru:
load wind
cav = curl(x,y,z,u,v,w);
slice(x,y,z,cav,[90 134],[59],[0]);
shading interp
daspect([1 1 1]); axis tight
colormap hot(16)
camlight
25
Funkcja curl
26
Funkcja curl
Przykład 2:
Wykonać wykres prędkości kątowych zawirowania powietrza na zadanej płaszczyźnie analizowanej objętości strumienia powietrza, na otrzymany wykres nanieść wektory prędkości (funkcja quiver)
w tej samej płaszczyźnie:
load wind
k = 4;
x=x(:,:,k); y=y(:,:,k); u=u(:,:,k); v=v(:,:,k);
cav = curl(x,y,u,v);
pcolor(x,y,cav); shading interp
hold on;
quiver(x,y,u,v,'y')
hold off
colormap copper
27
Funkcja curl
28
Funkcja streamribbon
Funkcja streamribbon wyświetla wstęgi linii prądu w przestrzeni 3D.
Funkcja:
streamribbon(X,Y,Z,U,V,W,startx,starty,startz)
wyświetla wstęgi prądu na podstawie zadanych macierzy danych U, V i W (macierze 3D). Macierze X, Y i Z zawierają współrzędne dla danych U, V i
W. Powyższe macierze muszą być monotoniczne i 3-D (macierze o postaci generowanej przez funkcję meshgrid). Parametry startx, starty i startz
określają położenia początkowe środków wstęg linii prądu.
Skręcenie wstęg linii prądu jest proporcjonalne do rotacji pola wektorowego. Grubość wstęg jest obliczana automatycznie. Zalecane jest określenie
współczynnika skali wyświetlanych danych DataAspectRatio (funkcja daspect) przed użyciem funkcji streamribbon.
29
Funkcja streamribbon
W przypadku pominięcia macierzy współrzędnych X, Y i Z we funkcji:
streamribbon(U,V,W,startx,starty,startz)
macierze X, Y i Z są przyjmowane zgodnie z poleceniem:
[X,Y,Z] = meshgrid(1:n,1:m,1:p) gdzie [m,n,p] = size(U).
Funkcja:
streamribbon(vertices,X,Y,Z,cav,speed)
przyjmuje wcześniej przeliczone wierzchołki linii prądu, prędkość kątową rotacji i prędkość przepływu. Macierz vertices jest macierzą obiektową (cell array)
wektorów linii prądu (tak, jak w przypadku funkcji stream3). Macierze X, Y, Z, cav i speed są macierzami 3-D.
30
Funkcja streamribbon
W przypadku funkcji:
streamribbon(vertices,cav,speed)
macierze współrzędnych X, Y i Z są przyjmowane zgodnie z poleceniem:
[X,Y,Z] = meshgrid(1:n,1:m,1:p) gdzie [m,n,p] = size(cav)
Funkcja:
streamribbon(vertices,twistangle)
wykorzystuje macierz obiektową (cell array) wektorów kąta skręcenia określającą skręcenie wstęg linii prądu (w radianach). Wymiary odpowiadających sobie elementów macierzy wierzchołków oraz kątów skręcenia
muszą być sobie równe.
W przypadku funkcji:
streamribbon(...,width)
istnieje możliwość określenia grubości wstęg linii prądu.
31
Funkcja streamribbon
Przykład 1:
Przy pomocy wykresu wstęgowego linii prądu przedstawić strumień wiatru. Dane obejmują współrzędne prędkości strumienia wiatru, składowe wektorów prędkości i położenie początkowe wstęg linii
prądu.
load wind
[sx sy sz] = meshgrid(80,20:10:50,0:5:15);
daspect([1 1 1])
streamribbon(x,y,z,u,v,w,sx,sy,sz);
%-----Deficja widoku i oświetlenia
axis tight
shading interp;
view(3);
camlight; lighting gouraud
32
Funkcja streamribbon
33
Funkcja streamribbon
Przykład 2:
Wykorzystać wcześniej wyznaczone wierzchołki linii prądu (funkcja stream3), prędkość kątową rotacji (curl) oraz prędkość:
Powyższe wielkości pozwalają zmodyfikować początkowo wczytane dane zwarte w pliku wind.mat. Prędkość wiatru zostaje zredukowana o 10 w porównaniu z prędkością wiatru z poprzedniego przypadku.
load wind
[sx sy sz] = meshgrid(80,20:10:50,0:5:15);
daspect([1 1 1])
verts = stream3(x,y,z,u,v,w,sx,sy,sz);
cav = curl(x,y,z,u,v,w);
spd = sqrt(u.^2 + v.^2 + w.^2).*.1;
streamribbon(verts,x,y,z,cav,spd);
2
2
2
w
v
u
34
Funkcja streamribbon
%-----Definicja widoku i oświetlenia
axis tight
shading interp
view(3)
camlight; lighting gouraud
35
Funkcja streamribbon
36
Funkcja streamribbon
Przykład 3:
W przykładzie tym określony jest kąt skręcenia wstęgi przepływu:
t = 0:.15:15;
verts = {[cos(t)' sin(t)' (t/3)']};
twistangle = {cos(t)'};
daspect([1 1 1])
streamribbon(verts,twistangle);
%-----Definicja widoku i oświetlenia
axis tight
shading interp;
view(3);
camlight; lighting gouraud
37
Funkcja streamribbon
38
Funkcja streamribbon
Przykład 4:
Połączenie wykresu stożkowego (funkcja coneplot) i wstęg strumienia w jednym oknie rysunkowym:
%-----Definicja macierzy 3-D: x, y, z, u, v, w
xmin = -7; xmax = 7;
ymin = -7; ymax = 7;
zmin = -7; zmax = 7;
x = linspace(xmin,xmax,30);
y = linspace(ymin,ymax,20);
z = linspace(zmin,zmax,20);
[x y z] = meshgrid(x,y,z);
u = y; v = -x; w = 0*x+1;
daspect([1 1 1]);
[cx cy cz] = meshgrid(linspace(xmin,xmax,30),...
linspace(ymin,ymax,30),[-3 4]);
39
Funkcja streamribbon
h = coneplot(x,y,z,u,v,w,cx,cy,cz,'quiver');
set(h,'color','k');
%-----Wykres dwóch zbiorów wstęg
[sx sy sz] = meshgrid([-1 0 1],[-1 0 1],-6);
streamribbon(x,y,z,u,v,w,sx,sy,sz);
[sx sy sz] = meshgrid([1:6],[0],-6);
streamribbon(x,y,z,u,v,w,sx,sy,sz);
%-----Definicja widoku i oświetlenia
shading interp
view(-30,10) ; axis off tight
camproj perspective; camva(66); camlookat;
camdolly(0,0,.5,'fixtarget')
camlight
40
Funkcja streamribbon