How can I link a scroll-bar GUI with the mathematical code I have written?

5 views (last 30 days)
I am trying to write a program using GUIDE that has several scroll-bars. The program is going to plot a interference pattern of two point-sources of light varying certain variables using the scroll-bars. I have the math part of the code working and have some sort of the GUI as well. However, I cannot seem to get the two working together. The scroll-bars wont seem to vary the math part of the code.
If anybody could give me any advice I would greatly appreciate it.
  1 Comment
Nicholas
Nicholas on 19 Nov 2012
I'm not exactly sure what your question here is, however I can tell you that by default the sliders update only when the mouse button is released. A few weeks ago, though, I found some code on here that added "real time sliders". I can't find the exact link right now, but I have the code that I used.
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
obj = get(YOURMAINFIGUREWINDOW, 'CurrentObject');
if ~isempty(obj)
if obj == YOURSLIDERHANDLE
set(YOURSLIDERHANDLE, 'Value', round(num2str(get(YOURSLIDERHANDLE, 'Value')) / 5)* 5 ) ); %%I was rounding the value here
set(SOMEDISPLAYHANDLE, 'String', num2str(get(YOURSLIDERHANDLE, 'Value'))); %%This line sets the handle value to an output
end
end
What this does is find which object your mouse is hovering over, and if it's a slider, it replaces a display value with that number. Instead of replacing a display value, you could perform a math function.
This should work, if not, I apologize as I'm not really a qualified expert.

Sign in to comment.

Accepted Answer

Matt Fig
Matt Fig on 19 Nov 2012
Edited: Matt Fig on 19 Nov 2012
Here is an example GUI that does something similar. You should be able to adapt it fairly easily...
function [S] = gui_scrollplot()
% Scroll through various Taylor approximations to exp(x)
S.fh = figure('units','pixels',...
'position',[500 500 320 460],...
'menubar','none',...
'name','gui_scrollplot',...
'numbertitle','off',...
'resize','off');
S.sl = uicontrol('style','slide',...
'unit','pix',...
'position',[290 10 20 440],...
'min',0,'max',8,...
'sliderstep',[1/8 1/8],...
'value',0);
S.V = 1; % The value of the slider.
S.x = -2:.01:2; % Make plot of exponential function.
S.ax = axes('units','pix',...
'pos',[30 30 250 400],...
'fontsize',8);
plot(S.x,exp(S.x))
hold on
S.L = plot(S.x,1,'r');
axis([-2 2 -1 9])
S.T = title('e^{x} and 1 term Taylor');
S.FUN = @(x,y) x.^y./factorial(y); % Taylor approx
set(S.sl,'callback',{@sl_call})
guidata(S.fh,S) % Save the handles structure.
if ~nargout
clear S
end
function [] = sl_call(varargin)
% Callback for slider.
S = guidata(gcbf);
V = get(S.sl,'value');
if ~V
D = ones(size(S.x));
else
D = sum(bsxfun(S.FUN,S.x,(0:V).'));
end
set(S.L,'xdata',S.x,'ydata',D);
set(S.T,'string',sprintf('e^{x} and %i term Taylor',V+1))
  1 Comment
Caleb Pocock
Caleb Pocock on 19 Nov 2012
Here is the code that I have written so far. i was able to get one of the scroll-bars to change the data I want changed. However, I cant seem to get any more to work with the other data.
function ex_uicontrol
% Example code for uicontrol reference page
% Create a figure and an axes to contain a 3-D surface plot.
figure(10)
hax = axes('Units','pixels');
imagesc;
% Add a slider uicontrol to control the vertical scaling of the
% surface object. Position it under the Clear button.
uicontrol('Style', 'slider',...
'Min',1E-9,'Max',1000E-9,'Value',500E-9,...
'Position', [400 20 120 20],...
'Callback', {@surfzlim,hax});
% Slider function handle callback
% Implemented as a local function
end
function surfzlim(hObj,event,ax) %#ok<INUSL>
% Variables
% Angles in radians
d = 50^-3; % separation
ss = .1; % screen size
a = 0; % alpha angle
b = 0; % beta angle
g = 0; % gamma angle
ra = [cos(a) sin(a) 0; -sin(a) cos(a) 0; 0 0 1]; % alpha rotation matrix
rb = [1 0 0; 0 cos(b) sin(b); 0 -sin(b) cos(b)]; % beta rotation matrix
rg = [cos(g) sin(g) 0; -sin(g) cos(g) 0; 0 0 1]; % gamma rotation matrix
rotation = ra*rb*rg; % total rotation matrix
source1 = [0 d/2 0]*rotation; % source1 vector
source2 = [0 (-d/2) 0]*rotation; % source2 vector
sdim = linspace(-ss/2, ss/2, 1000); % screen array
%%%%%%%%%%%%%START%%%%%%%%%%%%%%%%%Added 111512 TDM
[sdimX sdimY] = meshgrid(sdim, sdim);
%%%%%%%%%%%%%%END%%%%%%%%%%%%%%%%
S = .1; % distance to screen
wavelength = get(hObj,'Value'); % wavelength of light
opd = zeros(1000, 1000); % optical path difference
l = 1;
k = 1;
screen = zeros(length(sdim), 1, length(sdim));
%%%%%%%%%%%%%START%%%%%%%%%%%%%%%%%Added 111512 TDM
%try this
OPL1 = ((source1(1)-sdimX).^2 + (source1(2)-sdimY).^2 + (source1(3)-S).^2).^(0.5);
OPL2 = ((source2(1)-sdimX).^2 + (source2(2)-sdimY).^2 + (source2(3)-S).^2).^(0.5);
opd = OPL1 - OPL2;
%%%%%%%%%%%%%%END%%%%%%%%%%%%%%%%
% while l <= length(sdim)
% while k <= length(sdim)
% opd(l, k) = abs(sqrt((sdim(l) - source1(1))^2 + (S - source1(2))^2 + (sdim(k) - source1(3))^2) - sqrt((sdim(l) - source2(1))^2 + (S - source2(2))^2 + (sdim(k) - source2(3))^2));
% k = k + 1;
% end
% k = 1;
% l = l + 1;
% end
n = opd/wavelength - floor(opd/wavelength);
I = cos(2*pi*n) + 1;
%meshc(I);
%%%%%%%%%%%%%START%%%%%%%%%%%%%%%%%Added 111512 TDM
figure(10);imagesc(sdim,sdim,I);colormap(gray);axis image
%%%%%%%%%%%%%%END%%%%%%%%%%%%%%%%
end
So looking at this I was able to vary wavelength with the scroll-bar. I would like to add several more to be able to vary d, ss, a, b, g, and S.

Sign in to comment.

More Answers (0)

Categories

Find more on Interactive Control and Callbacks in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!