罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

创建可重用工具的方法

有很多方法可以用很多编程语言(包括MATLAB)创建可重用的工具和小部件。今天我
希望说明如何创建可重用的可视化工具,然后将其合并到更复杂的可视化中
工具。我们几个人(Scott, Mike和我)在MathWorks为今年早些时候举行的MATLAB世界巡回赛开发了这个示例。我还发了一些照片的事件

内容

这是一个使用该工具的GUI

这里我展示了嵌入在GUI(图形用户界面)中的工具。有一个滑块允许用户选择观看
平面穿过三维体的x轴。

[x,y,z,v] = flow();volvisGUI (x, y, z, v)

代码架构

代码被分成两个文件,实际的GUI,在volvisGUI.m而显示平面穿过体积的查看器,在volumeVisualization.m.让我们首先看一下代码的框架volumeVisualization

dbtypevolumeVisualizationPseudo
1 function s = volumeVisualizationPseudo(x,y,z,v) 2% volumeVisualizationPseudo volumeVisualization的伪代码。版权所有2007 The MathWorks, Inc. 5 6 %%初始化7 initDisplay(x,y,z,v) 8 9 %%嵌套函数10 %%添加切片平面11函数addSlicePlane(xLoc) 12 end 13% %删除切片平面14函数deleteLastSlicePlane() 15 end 16% %%初始化显示17函数initDisplay(x,y,z,v) 18 end 19 20%导出结构21 s.addSlicePlane = @addSlicePlane;22 s.deleteLastSlicePlane = @deleteLastSlicePlane;23 s.xMin = min(x(:));24 s.xMax = max(x(:));25日结束

初始化

在这段代码中,您可以看到图形已经初始化,并且返回了一个结构。这个结构包含最小值
以及一个平面沿x轴可能的最大值以及两个函数的函数句柄,其中一个用于添加切片
平面,一个删除最后一个切片平面。这两个函数句柄是我想要使用的功能
在这个可视化的基础上构建。

现在让我试试发动机。首先,我创建可视化。

关闭所有s = volumeVisualization(x,y,z,v)
addSlicePlane: @volumeVisualization/addSlicePlane deleteLastSlicePlane: @volumeVisualization/deleteLastSlicePlane xMin: 0.1000 xMax: 9.9000

接下来,让我添加和删除一些切片。

s.addSlicePlane (5)

s.addSlicePlane (3.2)

现在删除最后添加的平面。

s.deleteLastSlicePlane ()

一次又一次。

s.deleteLastSlicePlane ()

一次又一次。我可以吗?我只添加了两个切片,现在我要删除第三个!

s.deleteLastSlicePlane ()

引擎代码

唷!没有分段故障或其他崩溃。让我们看看实际的代码,看看发生了什么。我将分段讨论。

dbtypevolumeVisualization
1函数s = volumeVisualization(x,y,z,v) 2% volumeVisualization引擎用于选择y-z平面查看。3 % s = volumeVisualization(X,Y,Z,V)返回一个4%的结构,其中包含关于volume 5%的可视化数据的信息,由X,Y,Z,V描述。字段为:6% addSlicePlane——函数句柄添加一个切片7%平面在位置x 8% deleteLastSlicePLane——函数句柄删除9%最后一个切片平面添加10% xMin—一个平面的最小x位置11% xMax—一个平面的最大x位置12% 13%示例:14% [x,y,z,v] = flow;15% s = volumeVisualization(x,y,z,v);16 % s.addSlicePlane(3.7) 17 % s.addSlicePlane(7.5) 18%暂停19 % s.deleteLastSlicePlane() 20%暂停21 % s.deleteLastSlicePlane() 22 23%版权所有2007 The MathWorks, Inc. 24 25% %存储句柄到各种平面26%初始化句柄到轴27%初始化句柄到切片平面28 hAxis = [];29 hSlicePlanes = [];30 31 %%通过yz平面创建通用切片数据32 [yd,zd] = meshgrid(linspace(min(y(:))),max(y(:)),100),…33 linspace (min (z (:)), max (z (:)), 100));34 35 %%初始绘制卷36 initDisplay() 37 38 %%嵌套函数39 function addSlicePlane(xLoc) 40% addSlicePlane添加切片平面xLoc。41 xd = xLoc*ones(size(yd)); 42 newSlicePlane = slice(hAxis, x, y, z, v, xd, yd, zd); 43 hSlicePlanes = [ hSlicePlanes, newSlicePlane ]; 44 set(newSlicePlane,'FaceColor' ,'interp',... 45 'EdgeColor' ,'none' ,... 46 'DiffuseStrength',.8 ); 47 end 48 49 function deleteLastSlicePlane() 50 %deleteLastSlicePlane Delete the last slice plane added. 51 if ~isempty(hSlicePlanes) 52 delete(hSlicePlanes(end)); 53 hSlicePlanes = hSlicePlanes(1:end-1); 54 end 55 end 56 57 function initDisplay() 58 %initDisplay Initialize Display. 59 60 % Draw back and bottom walls 61 if isempty(hAxis) || ~ishandle(hAxis) 62 hAxis = gca; 63 hold on; 64 end 65 hx = slice(hAxis, x, y, z, v, ... 66 max(x(:)), [], []) ; 67 hy = slice(hAxis, x, y, z, v, ... 68 [], max(y(:)), []) ; 69 hz = slice(hAxis, x, y, z, v, ... 70 [], [],min(z(:))) ; 71 72 % Make everything look nice 73 set([hx hy hz],'FaceColor','interp',... 74 'EdgeColor','none') 75 set(hAxis,'FontSize',18,'FontWeight','Bold'); 76 xlabel('X');ylabel('Y');zlabel('Z') 77 daspect([1,1,1]) 78 axis tight 79 box on 80 view(-38.5,16) 81 colormap (jet(128)) 82 end 83 84 s.addSlicePlane = @addSlicePlane; 85 s.deleteLastSlicePlane = @deleteLastSlicePlane; 86 s.xMin = min(x(:)); 87 s.xMax = max(x(:)); 88 89 end

帮助

我们从函数声明开始,然后是第2-21行帮助,包括一个示例。

变量初始化

接下来,我们初始化变量以将句柄保存到绘制数据的轴上,并为句柄设置另一个数组
到切片平面。它们一开始是空的。我们还为通用切片的y和z数据创建了一个值数组。和
然后通过调用嵌套函数来初始化绘图initDisplay.你可以看到,我们沿着不同的方向绘制了几个切片,并改变了图的各个方面,如色彩图、方面
坐标轴,等等。

最后,我们设置了一个结构来返回沿着x轴和函数句柄的切片的最小值和最大值
到两个函数,用于添加和删除切片。这些函数句柄引用文件中的嵌套函数volumeVisualization.m我将在下一节讨论这些函数。

主要工作

这个应用程序的主要工作在初始化之后完成,体现在两个嵌套函数中addSlicePlane而且deleteLastSlicePlane

当我打电话时addSlicePlane,我在特定的x位置插入一个平面。该函数为切片平面创建数据,实例化切片,使
它通过改变一些颜色和阴影属性来美化,并将最新切片的句柄添加到切片句柄列表中。
就这么简单。

调用deleteLastSlicePlane同样,通过从绘图中删除列表上的最后一个元素并将其从列表中删除来管理片平面列表
切片平面。如果该列表为空,则该函数基本上不执行任何操作,这就是为什么它可以不执行的原因
我之前出错了。

GUI

现在我准备使用这个m文件创建我展示的初始GUI。该GUI有一个滑块,可以映射到平面的位置
沿着x轴。当用户选择一个值时,滑块回调只是删除最后一个切片平面并添加一个新的
在选定的地点。这是代码。

dbtypevolvisGUI
1函数volvisGUI(x,y,z,v) 2% volvisGUI交互体可视化。示例:5% [x,y,z,v] = flow;6% volvisGUI(x,y,z,v) 7 8%版权所有2007 The MathWorks, Inc. 9 10% %初始化可视化11图形;12 s = volumeVisualization(x,y,z,v);13 s.addSlicePlane (s.xMin);添加uicontrol 16 hSlider = uicontrol(…“Units”,“normalized”,…18“位置”,[。75.05 .2 .05], ... 19 'Style','slider', ... 20 'Min',s.xMin, ... 21 'Max',s.xMax, ... 22 'Value',s.xMin, ... 23 'Callback',@updateSliderPosition); 24 25 %% 26 function updateSliderPosition(varargin) 27 s.deleteLastSlicePlane(); 28 x = get(hSlider,'Value'); 29 s.addSlicePlane(x); 30 end 31 32 end 33

模块化编程体系结构

我在这里演示了一个使用嵌套函数的编程体系结构,您可以在其中创建单独的工具并将其合并
将它们转化为更大的应用程序。

我有可视化引擎,我展示了如何单独使用它,以及如何将它合并到
一个GUI。它现在可以作为一个工具,随时可以整合到其他应用程序中。例如,我可以选择它来供电
一个动画。或者我可以通过提供一种选择其他颜色地图的方法在GUI中添加其他自由度。

的文件

您可以在MATLAB Central的文件交换中找到此示例的运行文件。

您将如何使用这些想法来创建可以轻松重用和共享的工具?发表你的想法在这里

使用MATLAB®7.4发布


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。