天天看點

matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像

matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像

1、基礎知識

1.1 二維圖形繪制

plot函數是Matlab繪制二維圖形的常用函數,該函數将數組中的資料點繪連起來構成一條連續的曲線。

plot(x,y,'PropertyName',PropertyValue)
  • 當x和y為同維數組時,分别以x和y為橫縱坐标繪制曲線;
  • x為一維數組,y為矩陣時,y的某一次元與x次元相等,繪制多條曲線;
  • x和y都為矩陣時,分别以對應的x和y為橫縱坐标,曲線條數與矩陣列數相等。
plot(x1,y1,x2,y2,'PropertyName',PropertyValue)

在視窗中同時繪制以x1和y1,x2和y2等分别為橫縱坐标的曲線。

%plot函數繪圖示例
%生成一維數組及參數數組
a = 0:0.1:1; t = 0:0.01:1;
%生成二維數組
y = sin(3*t').*exp(-t')*a;
%figure1:二維數組繪制曲線
subplot(1,2,1);plot(y);axis([0,100,0,1]);
xlabel('index');ylabel('y');title('figure1');
%figure2:一維數組和二維數組繪制曲線
subplot(1,2,2);plot(t,y);axis([0,1,0,1]);
xlabel('t');ylabel('y');title('figure2');           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
1.2 三維圖形繪制

plot3函數是Matlab繪制三維曲線的常用函數。

Plot3(x,y,z,LineSpec,'PropertyName',PropertyValue)

如果x,y和z是同維數組(向量、矩陣),分别以對應列作為x、y和z坐标,曲線的個數等于矩陣列維。

%plot3函數繪圖示例
t = 0:pi/50:10*pi;subplot(1,2,1);
plot3(sin(t),cos(t),t,'r*-');xlabel('sin(t)');
ylabel('cos(t)');zlabel('t');title('figure1:helix');
%繪制多條曲線
x = linspace(0,3*pi,200);z1 = sin(x); z2 = sin(2*x); z3 = sin(3*x);
y1 = zeros(size(x)); y2 = ones(size(x));y3 = 2*ones(size(x));
subplot(1,2,2);plot3(x,y1,z1,'r*',x,y2,z2,'bp',x,y3,z3,'mx');
xlabel('x');ylabel('y');zlabel('z');title('figure2:sin(x),sin(2x),sin(3x)');           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
1.3 曲面圖與等值線

三維網格圖相當于在x-y平面上的z坐标定義一個網格面,相鄰的點通過直線連接配接,網格節點就是z的資料點,在Matlab中通過mesh函數實作。

  • mesh(z):以z矩陣的列和行的下标為x和y軸的自變量繪制網格圖;
  • mesh(x,y,z):x和y為自變量矩陣,z為建立在x和y之上的函數矩陣;

與mesh函數相比,surf函數使曲面上的所有網格都填充了顔色,指令格式與mesh函數類似。但提供了平面陰影和插值陰影。

等值線圖能夠将具有相同數值的點連起來繪制相等數值的曲線或曲面,常用的MATLAB繪制等值線圖函數的指令格式為:

  • contour(z):繪制z所表達的等值線圖
  • coutour(z,n):參數n為所需要繪制的等值線圖的數目
  • contour(z,v):向量v定義了等值線的數目和數值
%surf函數繪圖示例
%顔色表示等值線繪圖示例
x = 0:pi/20:2*pi;y = 0:pi/20:2*pi;
[X,Y] = meshgrid(x,y);Z = sin(X)+cos(Y);
subplot(1,2,1);surf(X,Y,Z);
shading interp;
subplot(1,2,2);contourf(X,Y,Z,20)           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
2、特殊的三維圖形 2.1 三維切片圖

對一個三維立體資料點集進行切片觀察資料分布,可以采用matlab中的slice函數。

Slice(x,y,z,V,sx,sy,sz)

:繪制在三個坐标軸方向在于sx,sy和sz向量所對應的切片圖,其中x,y,z,V是m*n*p的三維立體資料點集。

%繪制三維切片圖
[x,y,z,v] = flow;
sx = linspace(min(min(min(x)))+1.5,max(max(max(x))),5);
sy = [1,-1]; sz = [1,-1];
slice(x,y,z,v,sx,sy,sz);
shading interp;
colormap jet;           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
2.2 三維向量圖

為了表示某一函數曲面上各點的梯度向量,比如速度圖等,我們需要在曲面圖上各點繪制向量,這可以調用matlab函數quiver3()來實作。

quiver3(x,y,z,u,v,w):

在位置(x,y,z)處繪制元素(u,v,w)的向量圖。

%三維向量圖示例
x = 0:pi/10:2*pi;y = 0:pi/10:2*pi;
[X,Y] = meshgrid(x,y);Z = sin(X)+cos(Y);
[u,v,w] = surfnorm(X,Y,Z);
colormap hsv;
surf(X,Y,Z);
hold on
quiver3(X,Y,Z,u,v,w,0.5)
axis([0,2*pi,0,2*pi])           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
2.3 三維等值線

在matlab中繪制三維等值線可以調用contour3函數,調用格式類似于二維等值線的繪制。

  • contour3(Z):繪制矩陣Z的三維等值線;
  • contour3(Z,n):繪制具有n條矩陣Z的三維等值線;
  • contour3(Z,v):在參數v上繪制矩陣Z的三維等值線,等值線數量等于數組v的長度。
x = 0:pi/20:2*pi;
y = 0:pi/20:2*pi;
[X,Y] = meshgrid(x,y);
Z = sin(X)+cos(Y);
contour3(X,Y,Z,30)
xlabel('X');ylabel('Y');zlabel('Z');
title('三維等值線圖');           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
2.4 三維柱狀圖

在matlab中繪制三維柱狀圖可以調用bar3函數來實作,其調用格式為:

  • bar3(Y):繪制矩陣Y的三維柱狀圖,矩陣每一行元素代表圖形中一排柱形圖;
  • bar3(x,Y,width):在參數向量x的指定位置繪制矩陣Y的三維柱狀圖,width參數可省,控制柱形圖的寬度。
Y = 10*rand(5,5);
x = 0:2.5:10;
bar3(x,Y,0.6);           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
2.5 三維餅圖

在matlab中繪制三維餅圖需要調用pie3函數,類似于二維餅圖繪制,其函數調用格式為:

  • pie3(X):當X為向量時,三維餅狀圖表示每個元素占所有元素之和的比例,當X為矩陣時,表示每個元素占矩陣全部元素和的比例;
  • pie3(X,explode,labels):其中explode參數與X次元相同,表示是否将對應的扇形區域單獨表示,例如explode取值為[0,0,0,1]表示将第四個元素對應的扇形區域單獨表示,labels表示重新标注每個扇形區域名稱。
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像
3、小試牛刀

在今年情人節的推文中,展示了一張用matlab做的明信片,我們就以此為例,熟悉一下matlab的繪圖指令。

matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像

在這張明信片中,文字部分可以用text函數添加,重點需要做的是右側的樹。

在這棵樹中,樹幹部分采用了原始圖像中的樹幹,樹葉采用一個心形線函數進行填充,樹冠輪廓用一個心形線進行限制,確定所有樹葉都在樹冠輪廓内,所有樹葉可以組成一個心形圖。

Step1:導入樹幹圖像,同時提取樹幹輪廓資料備用;

%讀取樹幹圖像
im = imread('tree.jpg');
%提取樹幹輪廓
A = rgb2gray(I);
se1=strel('disk',2);
A2=imerode(A,se1);  
bw = im2bw(A2);                         
contour = bwperim(bw);           
matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像

Step2:根據樹幹,确定樹冠輪廓線位置和樹冠大小;

h = ezplot('x^2-1.3*abs(x)*y+y^2-1');
data=get(h, 'contourMatrix');
data = data(:,2:end);
theta = 1.04*pi;
data = data'*[cos(theta),-sin(theta);
           sin(theta),cos(theta)];
X=50*data(:,1) + 300;
Y=50*data(:,2) + 75;           

通過心形線生成的樹冠輪廓中心在原點處,我們需要對心形線上各點進行旋轉和平移,其中旋轉操作可以通過矩陣運算來實作;

matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像

上式表示,将點(X,Y)逆時針旋轉角度theta。縮放可以對坐标乘上一個合适的系數,同理對坐标加或減某一個機關長度,即可完成對坐标的平移。

matlab 向量_值得收藏 | 如何用matlab做出酷炫的圖像

Step3:繪制樹葉,在原點處繪制心形線,并通過fill函數進行随機的顔色填充;

function [] = show_heart(x,y,color)
    %繪制心形線
h = ezplot('x^2-1.4*abs(x)*y+y^2-1');
    set(h,'color','w');
hold on
%抓取輪廓資料
    heart = get(h, 'contourMatrix');
heart = heart(:,2:end);
%将樹葉輪廓點進行旋轉和平移
    theta = 2*rand()*pi;
    heart = heart'*[cos(theta),-sin(theta);
                sin(theta),cos(theta)];
    heart=3*heart;
    heart(:,1) = heart(:,1) + x;
heart(:,2) = heart(:,2) + y;
%對樹葉進行顔色填充
    h = fill(heart(:,1),heart(:,2),[color(1)/255,color(2)/255,color(3)/255]);
    set(h,{'LineStyle'},{'none'})
end           

Step4:在樹冠區域内随機選擇一些位置,作為樹葉中心點,同時確定選中的位置樹幹輪廓線内;

%在樹冠輪廓内和樹幹輪廓外随機添加樹葉
for x = min(X):6:max(X)
    for y = min(Y):6:max(Y)
        if rand() > 0.25
            if inpolygon(x,y,X,Y) && (~inpolygon(x,y,XX,YY))
                index = sum((rand() - heart_rand)>=0);
                hold on
                show_heart(x,y,heart_color(index,:));
            end
        end
    end
end           

以上,就可以完成這顆心形樹的繪制,完整代碼可以在公衆号“數學模組化andMATLAB”背景回複【

明信片

】擷取。

繼續閱讀