⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawpoly.m

📁 computation of conformal maps to polygonally bounded regions
💻 M
📖 第 1 页 / 共 2 页
字号:
    P = minxy + grid.*(round((P-minxy)./grid));
  end
  
  % If returning from infinity, don't allow angle > -1.
  if mode==2
    if ang > -1+2*eps
      % Would be illegal.  Project to make ang=-1.
      A = pts(m,:);
      B = pts(m-2,:) + A - pts(m-1,:);
      P = A + ((B-A)*(P-A)')/((B-A)*(B-A)')*(B-A);
      ang = -1;
      qang = 0;				% override other restrictions
      grid = 0;
    elseif ang < -3
      % It's illegal.  Is it even possible?
      P = [NaN,NaN];
      ang = NaN;
    end
  end

  % Update.
  if m > 0
    if ~(mode==1)			% preview line
      set(preview, 'xdata',[pts(m,1),P(1)], 'ydata',[pts(m,2),P(2)]);
    end
  end
  set(vertices,'userdata',P);
  drawnow

case 'up'	
  preview = findobj(fig,'tag','preview');
  vertices = findobj(fig,'tag','vertices');
  P = get(vertices,'userdata');
  if ~isnan(P(1))			% valid point
    set(gcf,'windowbuttonmotionfcn','');
    set(preview,'xdata',[P(1),NaN], 'ydata',[P(2),NaN])
    set(vertices,'userdata',[NaN,NaN])
    set(findobj(fig,'tag','DRP_PT'),'user',P);
  end

case 'snap'  
  snap = findobj(fig,'tag','snap');
  qang = findobj(fig,'tag','qang');
  qlen = findobj(fig,'tag','qlen');
  if get(snap,'value')
    set(qang,'value',0)
    set(qlen,'value',0)
    space = str2num(get(findobj(fig,'tag','grid_space'),'string'));
    axlim = axis;
    x = axlim(1):space:axlim(2);
    y = axlim(3):space:axlim(4);
    set(gca,'xticklabelmode','auto','yticklabelmode','auto')
    set(gca,'xtick',x,'ytick',y)
    % For clarity, keep only about eight of the labels.
    N = length(x);
    keep = [1,3:ceil((N-1)/8):N-2,N];
    xl = get(gca,'xticklabel');
    p = min(size(xl,2),4);
    xlnew = setstr(ones(N+1,1)*blanks(p));
    xlnew(keep,:) = xl(keep,1:p);
    N = length(y);
    keep = [1,3:ceil((N-1)/8):N-2,N];
    yl = get(gca,'yticklabel');
    p = min(size(yl,2),4);
    ylnew = setstr(ones(N+1,1)*blanks(p));
    ylnew(keep,:) = yl(keep,1:p);
    % Make it so.
    set(gca,'xticklabel',xlnew,'yticklabel',ylnew)
    set(gca,'xgrid','on','ygrid','on')
  else
    set(gca,'xtickmode','auto','xticklabelmode','auto','xgrid','off')
    set(gca,'ytickmode','auto','yticklabelmode','auto','ygrid','off')
  end    
  drawnow    

case 'qang'  
  snap = findobj(fig,'tag','snap');
  qang = findobj(fig,'tag','qang');
  if get(qang,'value')
    set(snap,'value',0)
    drawpoly(fig,'snap');
  end

case 'qlen'  
  snap = findobj(fig,'tag','snap');
  qlen = findobj(fig,'tag','qlen');
  if get(qlen,'value')
    set(snap,'value',0)
    drawpoly(fig,'snap');
  end
  
case 'xlim'
  xlim = str2num(get(findobj(fig,'tag','xlimits'),'string'));
  set(gca,'xlim',xlim)
  drawpoly(fig,'snap');
  
case 'ylim'
  ylim = str2num(get(findobj(fig,'tag','ylimits'),'string'));
  set(gca,'ylim',ylim)
  drawpoly(fig,'snap');
  
case 'clear'
  preview = findobj(fig,'tag','preview');
  vertices = findobj(fig,'tag','vertices');
  set(preview,'user','first','xdata',[NaN NaN],'ydata',[NaN NaN]);
  set(vertices,'xdata',[],'ydata',[],'zdata',[])
  delete(findobj(fig,'tag','edges'))
  set(fig,'color',get(fig,'color'))
  
case 'undo'
  preview = findobj(fig,'tag','preview');
  vertices = findobj(fig,'tag','vertices');
  x = get(vertices,'xdata');
  y = get(vertices,'ydata');
  atinf = get(vertices,'zdata');
  mode = get(preview,'user');
  P = get(vertices,'user');
  m = length(x);
  n = m - floor(sum(atinf)/2);
  mask = ones(m,1);
  kill_edge = 0;
  if strcmp(mode,'normal') & (m > 0)
    mask(m) = 0;
    if m > 1
      if atinf(m-1)
	set(preview,'user','return')
      end
    else
      set(preview,'user','first')
    end
    kill_edge = 1;
  elseif strcmp(mode,'infinite')
    mask(m) = 0;
    set(preview,'user','normal')
    set(fig,'pointer','crosshair')
    kill_edge = 1;
  elseif strcmp(mode,'return')
    mask(m) = 0;
    set(preview,'user','infinite')
    set(preview,'xdata',[NaN,NaN],'ydata',[NaN,NaN])
    set(fig,'pointer','cross')
  end
  mask = logical(mask);
  set(vertices,'erasemode','norm')
  set(vertices,'xdata',x(mask),'ydata',y(mask),'zdata',atinf(mask));
  set(vertices,'erasemode','back')
  edges = findobj(fig,'tag','edges');
  if kill_edge & (n > 1)
    delete(findobj(edges,'user',n-1))
  end
  if ~any(mask)				% no vertices left
    % Erase preview line 
    set(findobj(fig,'tag','preview'),'xdata',NaN,'ydata',NaN,'user','first')
  end
  set(gcf,'color',get(gcf,'color'))
  drawpoly(fig,'move');
  
case 'done'
  preview = findobj(fig,'tag','preview');
  vertices = findobj(fig,'tag','vertices');
  set(preview,'user','done')
  set(fig,'windowbuttonmotion','')
  P = get(vertices,'userdata');
  set(preview,'xdata',[P(1),NaN], 'ydata',[P(2),NaN])
  set(findobj(fig,'tag','DRP_PT'),'user',[NaN,NaN]);
  
case 'cancel'
  preview = findobj(fig,'tag','preview');
  vertices = findobj(fig,'tag','vertices');
  set(preview,'user','done')
  set(fig,'windowbuttonmotion','')
  set(vertices,'xdata',[],'ydata',[],'zdata',[])
  set(findobj(fig,'tag','DRP_PT'),'user',[NaN,NaN]);
  
case 'resize'
  dp_resize_widgets(fig);
  
end
  

function dp_make_widgets(fig)

bgcolor = .7*[1 1 1];
set(fig,'defaultuicontrolbackground',bgcolor,'defaultuicontrolunits','point')

% We aren't going to set positions, because that is done in dp_resize_widgets

% Create uicontrol frames
frame(1) = uicontrol('style','frame','tag','dp_settings');
frame(2) = uicontrol('style','frame','tag','dp_actions');
  
widget(1) = uicontrol('style','radio',...
    'string','Snap to grid',...
    'call','drawpoly(gcf,''snap'');',...
    'horizontal','l',...
    'tag','snap');
widget(2) = uicontrol('style','radio',...
    'string','Quantize angle',...
    'call','drawpoly(gcf,''qang'');',...
    'hor','l',...
    'tag','qang');
widget(3) = uicontrol('style','radio',...
    'string','Quantize length',...
    'call','drawpoly(gcf,''qlen'');',...
    'hor','l',...
    'tag','qlen');

widget(4) = uicontrol('style','text',...
    'string','Grid spacing:',...
    'hor','r');
widget(5) = uicontrol('style','text',...
    'string','Angle quantum:',...
    'hor','r');
widget(6) = uicontrol('style','text',...
    'string','Length quantum:',...
    'hor','r');

gridspace = diff(get(gca,'xlim'))/16;
widget(7) = uicontrol('style','edit',...
    'string',sprintf('%.3g',gridspace),...
    'background',.8*[1 1 1],...
    'call','drawpoly(gcf,''snap'');',...
    'tag','grid_space');
widget(8) = uicontrol('style','text',...
    'string','p / ',...
    'fontname','symbol',...
    'fontsize',11,...
    'hor','r');
widget(9) = uicontrol('style','edit',...
    'string','6',...
    'background',.8*[1 1 1],...
    'tag','ang_quant');
widget(10) = uicontrol('style','edit',...
    'string',sprintf('%.3g',2*gridspace),...
    'background',.8*[1 1 1],...
    'tag','len_quant');

axlim = axis;
widget(11) = uicontrol('style','text',...
    'string','x limits:',...
    'hor','r');
widget(12) = uicontrol('style','text',...
    'string','y limits:',...
    'hor','r');
widget(13) = uicontrol('style','edit',...
    'string',sprintf('[%.3g %.3g]',axlim(1:2)),...
    'background',.8*[1 1 1],...
    'tag','xlimits',...
    'call','drawpoly(gcf,''xlim'');');
widget(14) = uicontrol('style','edit',...
    'string',sprintf('[%.3g %.3g]',axlim(3:4)),...
    'background',.8*[1 1 1],...
    'tag','ylimits',...
    'call','drawpoly(gcf,''ylim'');');

widget(15) = uicontrol('style','push',...
    'string','Clear',...
    'call','drawpoly(gcf,''clear'');');
widget(16) = uicontrol('style','push',...
    'string','Undo',...
    'call','drawpoly(gcf,''undo'');');
widget(17) = uicontrol('style','push',...
    'string','Done',...
    'call','drawpoly(gcf,''done'');');
widget(18) = uicontrol('style','push',...
    'string','Cancel',...
    'call','drawpoly(gcf,''cancel'');');

set(frame(1),'userdata',widget(1:14))
set(frame(2),'userdata',widget(15:18))


function dp_resize_widgets(fig)

figpos = get(fig,'pos');

% Frames
f(1) = findobj(fig,'tag','dp_settings');
f(2) = findobj(fig,'tag','dp_actions');

% Minimum sizes
figpos(3) = max(figpos(3),376);
figpos(4) = max(figpos(4),170);

set(fig,'pos',figpos)
set(f,{'pos'},{[0 0 figpos(3) 72];[figpos(3)-80 72 80 figpos(4)-72]})

% Axes
% Axes area needs a border of at least 24 pt on each side
usable = figpos(3:4) - [80 72];
size = min(usable - 48);
margin = (usable - size)/2 + [0 72];
set(gca,'unit','point','pos',[margin(1:2) size size])

% Settings
h = get(f(1),'userdata');
pos = {
[2 49 100 20];...
[2 26 100 20];...
[2  3 100 20];...
[120 52 80 14];...
[120 28 80 14];...
[120 4 80 14];...
[204 50 48 18];...
[204 27 20 14];...
[224 27 28 18];...
[204 4 48 18];...
[268 52 48 14];...
[268 31 48 14];...
[320 51 54 18];...
[320 30 54 18]
};
set(h,{'pos'},pos)

% Actions
offset = [figpos(3)-76 figpos(4)-94 0 0];
h = get(f(2),'userdata');
pos = {
[0 72 72 18]+offset;...
[0 52 72 18]+offset;...
[0 20 72 18]+offset;...
[0  0 72 18]+offset
};
set(h,{'pos'},pos)

drawnow

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -