900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > matlab阅读怎么放大镜 matlab局部放大

matlab阅读怎么放大镜 matlab局部放大

时间:2024-07-09 07:07:05

相关推荐

matlab阅读怎么放大镜 matlab局部放大

function [Hza,Hzr]=mmzoom(arg)

% 用法:

% [Hza,Hzr] = MMZOOM 返回创建的放大坐标系和方法框的句柄

% MMZOOM DRAG 使能放大框的拖放功能

% MMZOOM RESET 取消放大框的拖放功能

% MMZOOM OFF 删除放大框

% 常用用法:画好图片后输入mmzoom,圈图片放大,可以拖动放大框到理想位置,点击figure的非主坐标

% 系区域确定;还想拖动,输入mmzoom drag;删除放大框,输入mmzoom off删除

if nargin==0%无输入参数,则为无参数

arg = [];

end

if isempty(arg) %无参数表示放大

Hzoom = findobj(0,'Tag','MMZOOM'); % 找之前的放大窗口,有的话删掉

if ~isempty(Hzoom)

delete(Hzoom)

end

[xlim,ylim,prect] = getbox;% 获得一个矩形框

if ~isempty(prect) % 区域不能为空

Haxes = gca;

Hzr = rectangle('Position',prect,...%画矩形框

'Linestyle',':',...

'Tag','MMZOOM');

Hfig = gcf;

Hzoom = copyobj(Haxes,Hfig); %复制一个坐标系到当前窗口

OldUnits = get(Haxes,'Units');%得到坐标系的单位

set(Haxes,'Units','normalized') %设置坐标系的单位

Pvect = get(Haxes,'Position');

set(Haxes,'Units',OldUnits)

alpha = 1/3; %放大窗口缩放比例

beta = 98/100; %放大窗口偏移

Zwidth = alpha*Pvect(3);

Zheight = alpha*Pvect(4);

Zleft = Pvect(1)+beta*Pvect(3)-Zwidth;

Zbottom = Pvect(2)+beta*Pvect(4)-Zheight;

set(Hzoom,'units','Normalized',... % make units normalized

'Position',[Zleft Zbottom Zwidth Zheight],...% axes position

'Xlim',xlim,'Ylim',ylim,...% axis data limits

'Box','on',... % axis box on

'Xgrid','off','Ygrid','off',... % grid lines off

'FontUnits','points',...

'FontSize',8,... % shrink font size

'ButtonDownFcn','selectmoveresize',... % 设置放大坐标系可拖动和缩放

'Tag','MMZOOM',... % tag zoomed axes

'UserData',Haxes) % store original axes

[Htx,Hty,Htt] = getn(Hzoom,'Xlabel','Ylabel','Title');%得到多个属性的句柄

set([Htx,Hty,Htt],'String','')%设置相应的句柄string属性为空

set(Haxes,'DeleteFcn',... % 设置原坐标系的删除函数

'delete(findobj(0,''Type'',''axes'',''Tag'',''MMZOOM''))')

Hchild = findobj(Hfig,'type','axes');

Hchild(Hchild==Hzoom) = [];

set(Hfig,'Children',[Hzoom;Hchild],...%将放大的坐标系放在栈顶

'CurrentAxes',Haxes,... %使原坐标系为当前坐标系,如果再画图将在当前坐标系绘图

'ButtonDownFcn','mmzoom reset') %点击figure空白区域响应此函数

if nargout>=1

Hza = Hzoom;

end

end

elseif strncmpi(arg,'d',1) %使能拖动放大框

Hzoom = findobj(0,'Type','axes','Tag','MMZOOM');

if ~isempty(Hzoom)

set(Hzoom,'ButtonDownFcn','selectmoveresize')%设置放大框可拖动

end

elseif strncmpi(arg,'r',1) %使放大框不能再被拖动

Hzoom = findobj(0,'Type','axes','Tag','MMZOOM');

if ~isempty(Hzoom)

[Hfig,Haxes] = getn(Hzoom,'Parent','UserData');

set(Hzoom,'ButtonDownFcn','','Selected','off')

set(Hfig,'CurrentAxes',Haxes)

end

elseif strncmpi(arg,'o',1)%删除放大框

Hzoom = findobj(0,'Tag','MMZOOM');

if ~isempty(Hzoom)

delete(Hzoom)

end

else

error('Unknown Input Argument.')

end

%%%%%%%%%%%%%%%%

function [xbox,ybox,prect]=getbox

if waitforbuttonpress %等待鼠标按下,按下鼠标返回False,按下按键返回True

return

end

Hf = gcf; % 得到鼠标点击的窗口

Ha = gca(Hf);% 得到鼠标点击的坐标系

AxesPt = get(Ha,'CurrentPoint'); % 得到第一个鼠标点击数据点在坐标系中的位置

FigPt = get(Hf,'CurrentPoint');% 坐标轴的CurrentPoint值为一个2*3的矩阵,第一行为离观察者最

%近的点的三维坐标,第2行为离观察者最远的点的三维坐标。默认的视角View = 90度的情况下,这两行的

%x和y坐标是相同的。一般情况下,只需要取pos第1行的前两个元素,第3个元素为z轴坐标,一般不用。

rbbox([FigPt 0 0],FigPt) % 用鼠标圈出矩形框,鼠标松开时返回

AxesPt = [AxesPt;get(Ha,'CurrentPoint')];%组合起始点和终止点

[Xlim,Ylim] = getn(Ha,'Xlim','Ylim');%得到一个对象的多个属性的句柄

xbox = [min(AxesPt(:,1)) max(AxesPt(:,1))]; %得到所画矩形框两角点的横坐标

xbox = [max(xbox(1),Xlim(1)) min(xbox(2),Xlim(2))]; %点不能在边界外

ybox = [min(AxesPt(:,2)) max(AxesPt(:,2))];

ybox = [max(ybox(1),Ylim(1)) min(ybox(2),Ylim(2))];

prect = [xbox(1) ybox(1) diff(xbox) diff(ybox)];

%%%%%%%%%%%%%%%%

function varargout=getn(H,varargin)%一般varargin和varargout是隐藏的,但可像这里作为传入参数用,

%注意为元胞类型

% 得到一个对象的多个属性

if max(size(H))~=1 || ~ishandle(H)

error('Scalar Object Handle Required.')

end

varargout=get(H,varargin);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

学到的知识:

findobj

rectangle

copyobj

'ButtonDownFcn','selectmoveresize'

'CurrentAxes'

'Children'

waitforbuttonpress

%%%%%%%%%%%%%%%%matlab示例:

w = waitforbuttonpress;

if w == 0

disp('Button click')

else

disp('Key press')

end

%%%%%%%%%%%%%%%%

'CurrentPoint'

rbbox

%%%%%%%%%%%%%%%%matlab示例:

k = waitforbuttonpress;

point1 = get(gca,'CurrentPoint'); % button down detected

finalRect = rbbox; % return figure units

point2 = get(gca,'CurrentPoint'); % button up detected

point1 = point1(1,1:2); % extract x and y

point2 = point2(1,1:2);

p1 = min(point1,point2);% calculate locations

offset = abs(point1-point2); % and dimensions

x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];

y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];

hold on

axis manual

plot(x,y)% redraw in dataspace units

%%%%%%%%%%%%%%%%

varargin、varargout

6163bdeb486111e0b58ae&690.jpg

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。