appdesigner

下载工程

图形用户界面(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('杨氏双缝干涉合成光强空间分布函数');

程序的效果是输入光波波长, 双缝间隙和屏缝距离, 输出干涉结果和光强度分布.

在这里插入图片描述

但一次次手动输入太麻烦了, 对该变量的认识也不够直观, 我们想将所有输入量改为实时输入, 改动一个变量就能查看输出结果.

组件摆放

从左边的组件库中拖进来三个滑块组件, 放好位置, 在中间修改长度和名字, 在右边的组件浏览器的ValueLimit分别修改三个滑块的默认值和范围

在这里插入图片描述

再从组件库中拖进来三个坐标区, 两个用来显示实时图像, 一个可以显示原理图或者北京, 再在右边修改它们的标题和坐标轴

在这里插入图片描述

代码

点击中间区域右上角的代码视图进入代码区, 点击菜单-属性-公共属性添加公共类, 这可以理解为一些全局变量, 因为有三个输入控件, 一个量在修改时其他量都不能改变, 这里把所有变量都定义为全局变量

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);

这时再运行, 每次拖动这个滑块时都会执行一次回调函数并重新绘图, 就可以查看干涉条纹随波长变化的实时变化了.

请添加图片描述

剩下两个滑块的原理也是一样的, 自行添加即可.

打包

在上方设计工具 - 共享可以看到三个打包选项

MATLAB App

在这里插入图片描述

第一个可以得到一个mlappinstall文件, 可以在matlab主界面的app处安装, 之后在这里可以打开使用

在这里插入图片描述

独立桌面 APP

这里生成的是一个exe文件, 可以自定义启动界面和图标, 但exe文件需要matlab的runtime运行环境, 还是需要在有matlab的设备上, 或者将运行环境整个打包, 但这样软件体积就会非常庞大.

下载

关注公众号小电动车,回复UI下载工程文件

请添加图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐