📄 drawpoly.m
字号:
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 + -