- 积分
- 1
- 注册时间
- 2012-11-4
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 RenLiujie 于 2013-5-2 05:17 编辑
最近在学习 MATLAB 的纯 m 语言的 GUI 设计,于是做了这么一个东西练练手。
东西很简单,实现的功能就是绘制逐渐放大的 Mandelbrot 分形图。
想法来自于《用Python做科学计算》,下面连接中对 Mandelbrot 分形图的意义和算法进行了详细介绍
http://hyry.dip.jp:8000/pydoc/fractal_chaos.html#mandelbrot
程序主要实现,鼠标点击图上某一点,则重绘一个以该点为中心的 局部放大图。我就是用来学习 Figure, axes 两个句柄的一些参数,鼠标事件和进度条这三样东西,所以 一个按钮什么的都没有(惭愧)。
界面大概就这样,要不是菜单栏可以保存图像比较简单,连菜单栏我都想省略。
这玩意儿,闲来无事东点点西点点,看看分形之美数学之奇倒是很不错哈哈。
当然这个程序可以有很多很多很多改进的地方,不同的逃逸半径,不同的迭代次数,还有算法上的细节对图像的影响;不同的 Colormap,显示复数区域坐标,... 都可以用各种控件来实现。还可以改用鼠标框选来放大图像,反正可以修改的太多了,看来要随着我慢慢学习慢慢改了... ^_^
代码如下,虽然用 MATLAB 很长一段时间,对一般的代码很熟悉;但是对于 GUI 编程我还只是刚刚接触,肯定代码有很多不合适的地方。尤其是变量之间的传递应该用什么方法,是设置 global 变量还是用函数参数的形式传递,或者还有什么其它方法我比较困惑。希望哪位大神能给个指导吧~
系统:WIN7 旗舰版 32bit
MATLAB 版本:Version 7.1.0.246(R14) Service Pack 3- function Mandelbrot()
- close all;clear all;clc;
- % root 层面的 ---------------------------------------
- scsze = get(0,'screensize'); % 可用 screensize 属性获得屏幕的大小, 只读
- global FigureSize;
- FigureSize = 600;
- % ---------------------------------------
- % 在屏幕正中创建一个窗口
- position = [fix((scsze(3)-FigureSize)/2) fix((scsze(4)-FigureSize)/10) FigureSize FigureSize];
- global h_fig0;
- global h_fig0_axes1;
- global IMG;
- h_fig0 = figure('Position',position,... % 窗口位置
- 'Resize','off',... % 不可变换大小
- 'color',[1 1 1],... % 背景颜色
- 'MenuBar','figure',... % 菜单栏, 'none' or 'figure'
- 'toolBar','none',... % 工具栏,'none' or 'auto', MenuBar 为 'figure' 下有效
- 'visible','on',... % 设置可见
- 'NumberTitle','off',...% 标题上的 Figure X 的显示
- 'Name','Plot of Mandelbrot Set'...% 标题的 Name
- );
- position2 = [0 0 FigureSize FigureSize];
- h_fig0_axes1_pos = [position2(1)/position(3),position2(2)/position(4),position2(3)/position(3),position2(4)/position(4) ];
- h_fig0_axes1 = axes('Parent',h_fig0,...
- 'Position',h_fig0_axes1_pos,...
- 'FontName','times',...
- 'FontAngle','italic',...
- 'FontSize',14,...
- 'XGrid','on',...
- 'YGrid','on',...
- 'XLimMode','manual',...
- 'YLimMode','manual',...
- 'XLim',[0,position2(3)],...
- 'YLim',[0,position2(4)],...
- 'visible','off');
- % 一些关于 Mandelbrot 集合的参数以及初始化
- global N; global M; global MAP; global R; global maxIter;
- global cx; global cy; global dx; global dy;
- initialize();
- plotMandelbrot(M,N,maxIter,R,cx,cy,dx,dy);
- set(h_fig0_axes1,'visible','on');
- end
- function IMG_click(src,event)
- global N; global M; global MAP; global R; global maxIter;
- global cx; global cy; global dx; global dy; global IMG;
- global h_fig0;
- global h_fig0_axes1;
- h_fig0_pos = get(h_fig0,'Position');
- h_fig0_axes1_pos = get(h_fig0_axes1,'Position');
- point = get(h_fig0_axes1,'currentPoint');
- current_x = point(1,1);
- current_y = N - point(1,2);
- cx = current_x/M*dx+cx-dx/2;
- cy = current_y/N*dy+cy-dy/2;
- dx = dx/5;
- dy = dy/5;
- plotMandelbrot(M,N,maxIter,R,cx,cy,dx,dy);
- set(IMG,'ButtonDownFcn', @IMG_click);
- end
- % 初始化变量
- function initialize()
- global N; global M; global MAP; global R; global maxIter;
- global cx; global cy; global dx; global dy;
- global FigureSize;
- N = FigureSize; M = FigureSize;
- MAP = zeros(N,M,3,'single');
- R = 2;
- maxIter = 255;
- cx = -0.5;
- cy = 0;
- dx = 2.5;
- dy = dx;
- end
- % 绘制 Mandelbrot 分形图形
- function plotMandelbrot(M,N,maxIter,R,cx,cy,dx,dy)
- global IMG;
- global MAP;
- global h_fig0_axes1;
- waitbar1 = waitbar(0);
- for ix = 1:M
- for iy = 1:N
- c = cx-dx/2+dx/M*ix + i*(cy+dy/2-dy/N*iy);
- z = 0;
- for iter = 1: maxIter
- z = z*z + c;
- x = real(z); y = imag(z);
- if x^2+y^2 > R^2
- break;
- end
- % 一种平滑算法,用于当 Itermax 较小时候
- % z = z*z + c;z = z*z + c; iter = iter - log2(log2(abs(z)));
- end
- iter = floor(iter)+1;
- MAP(iy,ix,:) = iter/maxIter;
- end
- if M/ix-floor(M/ix)==0 && M/ix < 10;
- waitbar(2*ix/M-0.1,waitbar1)
- end
- end
- delete(waitbar1);
- IMG = imshow(MAP(:,:,1));colormap('HSV');
- % 鼠标图形响应事件
- set(IMG,'ButtonDownFcn', @IMG_click);
- end
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
2
查看全部评分
-
|