下载工程
图形用户界面(GUI)也称为应用程序,提供对软件应用程序的点击控制,从而无需学习其他语言或键入命令来运行应用程序, 可以打包成matlab内部app或桌面应用. 传统的guide也可以做ui, 但用起来不如appdesigner好用, 已经即将要被淘汰了.
在matlab命令行输入appdesigner即可进入
首页有比较多实例, 这些可以慢慢看, 我们先新建空白app
左边有很多MATLAB之前就设置好的UI组件,可以直接拖动到画布上使用, 中间可以切换查看设计视图和代码。代码区的灰色代码是不可更改的, 右边为组件浏览器, 可以查看和编辑组件属性.
我们有一个已写好的杨氏干涉程序
clear,clc;
%波长(典型值:600)
Lambda = input('输入光的波长(单位为nm):');
Lambda = Lambda * 1e-9;
%缝间隙(典型值:1)
d = input('输入两个缝的间距(单位为mm):');
d = d * 1e-3;
%缝到屏的距离(典型值:1)
D = input('输入缝到屏的距离(单位为m):');
%设置空间坐标的边界
Xmax = 3 * Lambda * D/d;
Ymax = Xmax;
Tmax = Xmax;
%坐标取样1001份
x = linspace(-Xmax, Xmax, 1001);
y = linspace(-Ymax, Ymax, 1001);
t = linspace(-Tmax, Tmax, 1001);
%生成二维网格
[x, y] = meshgrid(x, y);
%计算复振幅
r1 = sqrt((x+d/2).^2+D^2);
r2 = sqrt((x-d/2).^2+D^2);
phi = 2*pi*(r2-r1)/Lambda;
E1 = 1;
E2 = 1 * exp(-1i * phi);
E = E1 + E2;
%合成波光强
I = abs(E) .^ 2;
I = I ./ 4;
%取y轴的中线处的光强
I0 = I(501, :);
%合成光强灰度分布图
subplot(2,1,1);
imshow(I);
xlabel('空间坐标x');
ylabel('空间坐标y');
title('杨氏双缝干涉合成光强空间分布');
% 合成光强函数分布图
subplot(2,1,2);
%设置坐标轴
axis([-Tmax,Tmax,0,1]);
plot(t, I0);
xlabel('空间坐标x'), ylabel('合成光强度');
title('杨氏双缝干涉合成光强空间分布函数');
程序的效果是输入光波波长, 双缝间隙和屏缝距离, 输出干涉结果和光强度分布.
但一次次手动输入太麻烦了, 对该变量的认识也不够直观, 我们想将所有输入量改为实时输入, 改动一个变量就能查看输出结果.
从左边的组件库中拖进来三个滑块组件, 放好位置, 在中间修改长度和名字, 在右边的组件浏览器的Value和Limit分别修改三个滑块的默认值和范围
再从组件库中拖进来三个坐标区, 两个用来显示实时图像, 一个可以显示原理图或者北京, 再在右边修改它们的标题和坐标轴
点击中间区域右上角的代码视图进入代码区, 点击菜单-属性-公共属性添加公共类, 这可以理解为一些全局变量, 因为有三个输入控件, 一个量在修改时其他量都不能改变, 这里把所有变量都定义为全局变量
properties (Access = public)
Property % Description
Lambda = 600 * 1e-9 % 输入光的波长(单位为nm)
d = 1 * 1e-3% 输入两个缝的间距(单位为mm)
D = 1 % 输入缝到屏的距离(单位为m)
Xmax,Ymax,Tmax % 空间坐标边界
x,y,t % 绘图变量
r1,r2 % 光源距离
phi % 相位差
E1,E2,E % 合成波
I,I0 % 光强
end
在其他函数中调用全局变量时, 都需要加一个前缀app.
, 包括函数名和组件的调用.
点击代码浏览器一个绿色的+号, app选择YoungS
(工程的名字),回调选StartupFcn
, 添加初始函数.
在启动函数第一行我们可以显示原理图imshow('杨氏双缝干涉.png','Parent',app.UIAxes3);
, 和matlab代码其实一样, 只是最后多了app.UIAxes3
, 就是图像要显示到哪一个窗口, 窗口对应的窗口名可在组件浏览器看到.
然后就是计算显示部分, 所有全局变量的调用都带有前缀app.
function startupFcn(app)
app.Xmax = 3 * 600*1e-9 * app.D/app.d;
app.Ymax = app.Xmax;
app.Tmax = app.Xmax;
%坐标取样1001份
app.x = linspace(-app.Xmax, app.Xmax, 1001);
app.y = linspace(-app.Ymax, app.Ymax, 1001);
app.t = linspace(-app.Tmax, app.Tmax, 1001);
%生成二维网格
[app.x, app.y] = meshgrid(app.x, app.y);
%计算复振幅
app.r1 = sqrt((app.x+app.d/2).^2+app.D^2);
app.r2 = sqrt((app.x-app.d/2).^2+app.D^2);
app.phi = 2*pi*(app.r2-app.r1)/app.Lambda;
app.E1 = 1;
app.E2 = 1 * exp(-1i * app.phi);
app.E = app.E1 + app.E2;
%合成波光强
app.I = abs(app.E) .^ 2;
Imax1 = max(max(app.I));app.I = app.I ./ Imax1;
然后再显示到两个坐标图组件上
imshow(app.I,'Parent',app.UIAxes);
app.I0 = app.I(501, :);
axis(app.UIAxes2,[-0.0018,0.0018,0,1]);
plot(app.UIAxes2,app.t, app.I0);
这时点一下菜单栏的运行, 就会以默认值绘图
这时三个滑块还是没有作用的, 我们回到设计视图, 右击光波长滑块, 添加回调函数ValueChangingFcn
, 意思是每当这个滑块被拖动, 值发生改变, 就会执行这个函数, 另一个ValueChangedFcn
则是滑块拖动结束时才执行一次函数.
在代码视图中找到刚刚添加的回调函数, event.Value
是此刻滑块的数值, 我们获取他并再次计算绘图
function T1LambdaValueChanging(app, event)
%% T1 波长(典型值:600)
app.Lambda = event.Value * 1e-9; % 获取改变的波长值
app.phi = 2*pi*(app.r2-app.r1)/app.Lambda;
app.E2 = 1 * exp(-1i * app.phi);
app.E = app.E1 + app.E2;
%合成波光强
app.I = abs(app.E) .^ 2;
Imax1 = max(max(app.I));app.I = app.I ./ Imax1;
imshow(app.I,'Parent',app.UIAxes);
app.I0 = app.I(501, :);
plot(app.UIAxes2,app.t, app.I0);
这时再运行, 每次拖动这个滑块时都会执行一次回调函数并重新绘图, 就可以查看干涉条纹随波长变化的实时变化了.
剩下两个滑块的原理也是一样的, 自行添加即可.
在上方设计工具 - 共享可以看到三个打包选项
第一个可以得到一个mlappinstall
文件, 可以在matlab主界面的app处安装, 之后在这里可以打开使用
这里生成的是一个exe文件, 可以自定义启动界面和图标, 但exe文件需要matlab的runtime运行环境, 还是需要在有matlab的设备上, 或者将运行环境整个打包, 但这样软件体积就会非常庞大.
关注公众号小电动车,回复UI下载工程文件