最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你用Matlab制作立體動態(tài)相冊

 更新時間:2022年03月01日 11:59:53   作者:slandarer  
沒想到吧,MATLAB竟也能制作3D相冊!本文將為大家詳細介紹Matlab制作立體動態(tài)相冊的方法步驟,感興趣的小伙伴可以跟隨小編一起動手試一試

效果

教程部分

1 圖片導入與大小重設(shè)

需要有一個名為album的文件夾和當前m文件在同一文件夾,另外ablum文件夾內(nèi)至少要有一張jpg格式圖片

path='.\album\';%文件夾名稱
files=dir(fullfile(path,'*.jpg')); 
picNum=size(files,1);

%遍歷路徑下每一幅圖像
for i=1:picNum
   fileName=strcat(path,files(i).name); 
   img=imread(fileName);
   img=imresize(img,[120,120]);
   imgSet{i}=img;
end

我們注意到,這里用了一次imresize將突破變?yōu)?20x120大小,這里重設(shè)大小有三個作用:

  • 將不是方形的圖片變?yōu)榉叫?/li>
  • 將圖像設(shè)置固定大小,方便構(gòu)造網(wǎng)格放置圖片
  • 120x120的大小大約是能讓圖片表示清晰為前提下最小的大小,圖片太大的話運行會卡,太小的話不清晰

2 fig axes設(shè)置

% fig axes設(shè)置
fig=figure('units','pixels','position',[50 50 600 600],...
                       'Numbertitle','off','resize','off',...
                       'name','album3d','menubar','none');
ax=axes('parent',fig,'position',[-0.5 -0.5 2 2],...
   'XLim', [-6 6],...
   'YLim', [-6 6],...
   'ZLim', [-6 6],...
   'Visible','on',...
   'XTick',[], ...
   'YTick',[],...
   'Color',[0 0 0],...
   'DataAspectRatioMode','manual',...
   'CameraPositionMode','manual');
hold(ax,'on')

大部分設(shè)置大家都能看懂,這里講解一下一些比較少見的設(shè)置:

2.1 為什么 axes的’position’屬性不設(shè)置[0 0 1 1]?

因為是3D坐標軸,設(shè)置為[0 0 1 1]后旋轉(zhuǎn)起來效果是這樣的,所以我們axes要設(shè)置的比figure大一圈:

2.2 為什么要設(shè)置CameraPositionMode這一奇怪的屬性?

因為我們后期要頻繁改變CameraPosition這一屬性,而CameraPositionMode設(shè)置為manual可以讓視角完全按照CameraPosition的數(shù)值來調(diào)整,至于為什么要調(diào)整視角呢?

當然是因為如果對圖像位置數(shù)據(jù)進行處理數(shù)據(jù)量會賊大,因此我們不妨直接轉(zhuǎn)動axes視角而非轉(zhuǎn)動圖片。

3 繪制圖形句柄

就是繪制小型立方體,中型立方體和大型立方體,其中鼠標移動到中型立方體中心時中型立方體變成大型立方體,這個可以靠設(shè)置圖形對象的XData,YData,ZData數(shù)值來改變

3.1 構(gòu)造網(wǎng)格

由于surf曲面圖可以將圖像貼在上面,還可以設(shè)置透明度,我們決定用surf函數(shù)來繪制,要貼圖首先要將曲面繪制出來,就要先構(gòu)造曲面網(wǎng)格:

% 用于繪制圖片的網(wǎng)格
[XMesh,YMesh]=meshgrid(linspace(-1,1,120),linspace(-1,1,120));
ZMesh=ones(120,120);

3.2 繪制小型立方體

% 繪制圖片立方體
surfPic(1)=surf(XMesh,YMesh,ZMesh,'CData',imgSet{mod(0,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(2)=surf(XMesh,YMesh(end:-1:1,:),-ZMesh,'CData',imgSet{mod(1,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(3)=surf(ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(2,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(4)=surf(XMesh,ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(3,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(5)=surf(-ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(4,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(6)=surf(XMesh,-ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(5,picNum)+1},'EdgeColor','none','FaceColor','interp');

3.3 繪制中型立方體

有了小型立方體,中型的繪制起來就簡單了起來,甚至可以用一個for循環(huán)解決,只需要循環(huán)提取小型立方體的XData,YData,ZData數(shù)據(jù)后乘以1.5繪制圖像,并設(shè)置透明度即可:

% 依靠小立方體數(shù)據(jù)繪制中等立方體
for i=1:6
    surfPicA(i)=surf(surfPic(i).XData.*1.5,surfPic(i).YData.*1.5,surfPic(i).ZData.*1.5,...
        'CData',surfPic(i).CData,'EdgeColor','none','FaceColor','interp','FaceAlpha',0.7);  
end

3.4 大型立方體參數(shù)設(shè)置

大型立方體參數(shù)設(shè)置時就沒那么簡單,如果直接乘以2.5,圖片與圖片之間會沒有縫隙,因此我們XData,YData,ZData數(shù)據(jù)雖然都要變大,但是要乘以不一樣的數(shù)值,而且各個方向上乘的數(shù)值不同,因此我們可以事先設(shè)立一個矩陣,用來存儲其參數(shù):

% 用來調(diào)整放大比例的矩陣
resizeMat=[2 2 2.5;2 2 2.5;2.5 2 2;
           2 2.5 2;2.5 2 2;2 2.5 2];

想直接畫大型正方形可以試試如下代碼:

% 最大圖片繪制       
% for i=1:6
%     surfPicB(i)=surf(surfPic(i).XData.*resizeMat(i,1),...
%                      surfPic(i).YData.*resizeMat(i,2),...
%                      surfPic(i).ZData.*resizeMat(i,3),...
%                      'CData',surfPic(i).CData,'EdgeColor',...
%                      'none','FaceColor','interp','FaceAlpha',0.7);  
% end    

4 立方體旋轉(zhuǎn)

我們只需要設(shè)置一個timer函數(shù)不斷調(diào)整CameraPosition即可:

fps=40;theta=0;
rotateTimer=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @rotateCube);
start(rotateTimer)

    function rotateCube(~,~)
        theta=theta+0.02;
        ax.CameraPosition=[cos(theta)*5*sqrt(2),sin(theta)*5*sqrt(2),5];
    end

5 獲取鼠標與中心點的距離

本來想直接在timer調(diào)用的函數(shù)里寫get(fig,‘CurrentPoint’);來獲得鼠標當前位置的,但發(fā)現(xiàn)這樣寫只有鼠標點擊窗口才會有反應(yīng),并不是鼠標移動就會有反應(yīng),因此我們再構(gòu)造一個WindowButtonMotionFcn回調(diào),?。?!這一部分代碼要寫在上一步代碼的前面!??!

lastDis=300;
preDis=300;
set(fig,'WindowButtonMotionFcn',@move2center)    
    function move2center(~,~)
        xy=get(fig,'CurrentPoint');
        preDis=sqrt(sum((xy-[300,300]).^2));
    end

preDis就是鼠標到圖片中心的位置,我為什么要設(shè)置一個lastDis呢,因為每次移動鼠標都更新圖像實在太卡了,因此我們要加一個判定,當且僅當以下兩種情況更新圖片大小

  • 之前鼠標距離中心>=150,現(xiàn)在<150
  • 之前鼠標距離中心<150,現(xiàn)在>=150

6 鼠標移動到fig中心時更新圖片

將之前的rotateCube函數(shù)改成這樣:

function rotateCube(~,~)
        theta=theta+0.02;
        ax.CameraPosition=[cos(theta)*5*sqrt(2),sin(theta)*5*sqrt(2),5];
        if (~all([preDis lastDis]<150))&&any([preDis lastDis]<150)
            for ii=1:6
                if preDis<150
                    surfPicA(ii).XData=surfPic(ii).XData.*resizeMat(ii,1);
                    surfPicA(ii).YData=surfPic(ii).YData.*resizeMat(ii,2);
                    surfPicA(ii).ZData=surfPic(ii).ZData.*resizeMat(ii,3);
                else
                    surfPicA(ii).XData=surfPic(ii).XData.*1.5;
                    surfPicA(ii).YData=surfPic(ii).YData.*1.5;
                    surfPicA(ii).ZData=surfPic(ii).ZData.*1.5;
                end
            end
        end
        lastDis=preDis;
    end

其中:

(~all([preDis lastDis]<150))&&any([preDis lastDis]<150)

是用來判斷上一次鼠標位置和當前鼠標位置是否只有一個距離中心<150

另:

for 循環(huán)中使用else來判斷應(yīng)該繪制大圖片還是中等圖片

完整代碼

function album3d
path='.\album\';%文件夾名稱
files=dir(fullfile(path,'*.jpg')); 
picNum=size(files,1);

%遍歷路徑下每一幅圖像
for i=1:picNum
   fileName=strcat(path,files(i).name); 
   img=imread(fileName);
   img=imresize(img,[120,120]);
   imgSet{i}=img;
end

% fig axes設(shè)置
fig=figure('units','pixels','position',[50 50 600 600],...
                       'Numbertitle','off','resize','off',...
                       'name','album3d','menubar','none');
ax=axes('parent',fig,'position',[-0.5 -0.5 2 2],...
   'XLim', [-6 6],...
   'YLim', [-6 6],...
   'ZLim', [-6 6],...
   'Visible','on',...
   'XTick',[], ...
   'YTick',[],...
   'Color',[0 0 0],...
   'DataAspectRatioMode','manual',...
   'CameraPositionMode','manual');
hold(ax,'on')
ax.CameraPosition=[5 5 5];

% 用于繪制圖片的網(wǎng)格
[XMesh,YMesh]=meshgrid(linspace(-1,1,120),linspace(-1,1,120));
ZMesh=ones(120,120);

% 繪制圖片立方體
surfPic(1)=surf(XMesh,YMesh,ZMesh,'CData',imgSet{mod(0,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(2)=surf(XMesh,YMesh(end:-1:1,:),-ZMesh,'CData',imgSet{mod(1,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(3)=surf(ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(2,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(4)=surf(XMesh,ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(3,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(5)=surf(-ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(4,picNum)+1},'EdgeColor','none','FaceColor','interp');
surfPic(6)=surf(XMesh,-ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(5,picNum)+1},'EdgeColor','none','FaceColor','interp');

% 依靠小立方體數(shù)據(jù)繪制中等立方體
for i=1:6
    surfPicA(i)=surf(surfPic(i).XData.*1.5,surfPic(i).YData.*1.5,surfPic(i).ZData.*1.5,...
        'CData',surfPic(i).CData,'EdgeColor','none','FaceColor','interp','FaceAlpha',0.7);  
end

% 用來調(diào)整放大比例的矩陣
resizeMat=[2 2 2.5;2 2 2.5;2.5 2 2;
           2 2.5 2;2.5 2 2;2 2.5 2];

% 最大圖片繪制       
% for i=1:6
%     surfPicB(i)=surf(surfPic(i).XData.*resizeMat(i,1),...
%                      surfPic(i).YData.*resizeMat(i,2),...
%                      surfPic(i).ZData.*resizeMat(i,3),...
%                      'CData',surfPic(i).CData,'EdgeColor',...
%                      'none','FaceColor','interp','FaceAlpha',0.7);  
% end     


lastDis=300;
preDis=300;
set(fig,'WindowButtonMotionFcn',@move2center)    
    function move2center(~,~)
        xy=get(fig,'CurrentPoint');
        preDis=sqrt(sum((xy-[300,300]).^2));
    end



fps=40;theta=0;
rotateTimer=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @rotateCube);
start(rotateTimer)



    function rotateCube(~,~)
        theta=theta+0.02;
        ax.CameraPosition=[cos(theta)*5*sqrt(2),sin(theta)*5*sqrt(2),5];
        if (~all([preDis lastDis]<150))&&any([preDis lastDis]<150)
            for ii=1:6
                if preDis<150
                    surfPicA(ii).XData=surfPic(ii).XData.*resizeMat(ii,1);
                    surfPicA(ii).YData=surfPic(ii).YData.*resizeMat(ii,2);
                    surfPicA(ii).ZData=surfPic(ii).ZData.*resizeMat(ii,3);
                else
                    surfPicA(ii).XData=surfPic(ii).XData.*1.5;
                    surfPicA(ii).YData=surfPic(ii).YData.*1.5;
                    surfPicA(ii).ZData=surfPic(ii).ZData.*1.5;
                end
            end
        end
        lastDis=preDis;
    end




% 棄用方案:太卡
% set(fig,'WindowButtonMotionFcn',@move2center)    
%     function move2center(~,~)
%         xy=get(fig,'CurrentPoint');
%         dis=sum((xy-[300,300]).^2);
%         for ii=1:6
%             if dis<200
%                 surfPicA(ii).XData=surfPic(ii).XData.*resizeMat(ii,1);
%                 surfPicA(ii).YData=surfPic(ii).YData.*resizeMat(ii,2);
%                 surfPicA(ii).ZData=surfPic(ii).ZData.*resizeMat(ii,3);
%             else
%                 surfPicA(ii).XData=surfPic(ii).XData;
%                 surfPicA(ii).YData=surfPic(ii).YData;
%                 surfPicA(ii).ZData=surfPic(ii).ZData;
%             end    
%         end
%         
%         
%         
%     end

end

以上就是教你用Matlab制作立體動態(tài)相冊的詳細內(nèi)容,更多關(guān)于Matlab制作立體相冊的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 介紹C語言中tolower函數(shù)的實例

    介紹C語言中tolower函數(shù)的實例

    這篇文章主要介紹了介紹C語言中tolower函數(shù)的實例,本文列出了該函數(shù)的頭文件,功能說明等,以及如何使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • CMake自動管理C/C++項目的實現(xiàn)

    CMake自動管理C/C++項目的實現(xiàn)

    CMake是一個強大的構(gòu)建系統(tǒng),用于跨平臺管理C/C++項目的編譯過程,本文主要介紹了CMake自動管理C/C++項目的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • C++三體星戰(zhàn)小游戲源代碼

    C++三體星戰(zhàn)小游戲源代碼

    這篇文章主要給大家介紹了關(guān)于C++三體星戰(zhàn)小游戲的相關(guān)資料,文中給出了詳細完整的代碼示例,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 冒泡排序的三種實現(xiàn)方法

    冒泡排序的三種實現(xiàn)方法

    本篇文章是對冒泡排序的三種實現(xiàn)方法進行了詳細的介紹,需要的朋友可以過來參考下。希望對大家有所幫助
    2013-10-10
  • c語言實現(xiàn)輸入一組數(shù)自動從大到小排列的實例代碼

    c語言實現(xiàn)輸入一組數(shù)自動從大到小排列的實例代碼

    下面小編就為大家?guī)硪黄猚語言實現(xiàn)輸入一組數(shù)自動從大到小排列的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Qt中QZXing 的編譯與使用

    Qt中QZXing 的編譯與使用

    本文主要介紹了Qt中QZXing 的編譯與使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言實現(xiàn)萬年歷源碼

    C語言實現(xiàn)萬年歷源碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)萬年歷源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C/C++ 中實現(xiàn)讓控制臺暫停的方法

    C/C++ 中實現(xiàn)讓控制臺暫停的方法

    這篇文章主要介紹了C/C++ 中實現(xiàn)讓控制臺暫停的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++實現(xiàn)簡單貪吃蛇游戲

    C++實現(xiàn)簡單貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C++ 基礎(chǔ)教程之虛函數(shù)實例代碼詳解

    C++ 基礎(chǔ)教程之虛函數(shù)實例代碼詳解

    虛函數(shù)在 c++ 的繼承體系中是一個非常重要概念,讓我們可以在子類中復寫父類的方法。這篇文章主要介紹了C++ 基礎(chǔ)教程之虛函數(shù)實例代碼的相關(guān)資料,需要的朋友可以參考下
    2020-02-02

最新評論

河北区| 曲松县| 开江县| 呼玛县| 获嘉县| 闽侯县| 淳安县| 南开区| 渝中区| 华安县| 灌阳县| 汪清县| 锦州市| 康马县| 江都市| 西畴县| 璧山县| 根河市| 永州市| 二手房| 彭泽县| 维西| 邵武市| 尼勒克县| 苍山县| 东方市| 甘孜| 西乌珠穆沁旗| 荣昌县| 大厂| 凤台县| 高清| 饶阳县| 泰顺县| 澄江县| 武清区| 化州市| 金沙县| 九寨沟县| 泽库县| 门头沟区|