橡皮线的一端是固定的,另一端的位置在绘制过程中可以变化。所以绘制时看起来就像牵引一根一端固定的橡皮线。
绘制橡皮线需要记录鼠标的击键次数,鼠标按下时,击键次数为1,用当前点初始化橡皮线的起点和终点,并创建直线段。移动鼠标时,将鼠标当前点作为橡皮线的终点,以异或模式画线。鼠标再次按下时,击键次数为2,以正常模式绘制当前位置的橡皮线,并将击键次数变量归0,准备下一次绘制。下面给出一段绘制橡皮线的MATLAB程序。
code.matlab
function Interplot
global istep
global xdata
global ydata
istep=0; % istep记录击键次数
axis([0 3 0 3]);
set(gcf,'pointer','cross');
set(gcf,'WindowButtonDownFcn',@WindowButtonDown);
set(gcf,'WindowButtonMotionFcn',@WindowButtonMotion);
% 按下鼠标键时
function WindowButtonDown(hObject,eventdata,handles)
global istep
global xdata
global ydata
global h
istep=istep+1; % 击键次数加1
p=get(gca,'currentpointx27;); % 获取当前点的坐标
if(istep==1) % 如果击键次数为1
% 用当前点初始化直线段的起点和终点
xdata(1)=p(1);
ydata(1)=p(3);
xdata(2)=p(1);
ydata(2)=p(3);
% 创建直线段对象,用异或模式画线
% 返回直线段对象的句柄
h=line(xdata,ydata,'EraseMode','xor');
elseif(istep==2) % 如果击键次数为2
% 将当前点设置为直线段终点
xdata(2)=p(1);
ydata(2)=p(3);
% 改变直线段的终点属性
% 用正常模式重绘直线段
set(h,'XData',xdata,'YData',ydata,'EraseMode','normal')
istep=0; %将istep归0
end
% 移动鼠标时
function WindowButtonMotion(hObject, eventdata, handles)
global istep
global xdata
global ydata
global h
p=get(gca,'currentpoint'); % 记录鼠标的当前位置
if(istep==1) % 如果istep等于1
% 将当前点设置为直线段终点
xdata(2)=p(1);
ydata(2)=p(3);
% 改变直线段的终点属性,
% 用异或模式重绘直线段
set(h,'XData',xdata,'YData',ydata)
end
运行该程序时首先打开一个空白的图形窗口,在窗口中移动鼠标时,会显示坐标系,在坐标系中单击并拖动鼠标,可以绘制橡皮线。图8-1中绘制了3条直线段。
\[\]
图8-1 交互绘制橡皮线