作者:朱金灿


      在二维图形编辑中,鼠标操作估计是最常用的操作。在一般的图形操作中,一般的常用操作包括鼠标点选取。这里的点选取是指移动鼠标点到指定的图形对象上,指定的图形对象进行高亮显示(下图中的红色显示),意在提示用户该图形对象出于选中的范围,类似于下图:


二维图形编辑中点选取策略研究_高亮显示



      下面谈谈怎样的是合理的点选取策略?首先涉及到鼠标点和图形对象之间距离,需要确定一个阈值,只有在鼠标点和某一图形对象的距离小于等于这一阈值时,这一图形对象才出于选中状态。其次在鼠标点离开某一图形对象的选中区域(即阈值范围内),也需要重设该对象为不选中状态。我们假设所有的图形对象都放在一个数组里。现在我们用伪代码模拟这一鼠标移动的选中事件:


int m_nSelIndex; // 上一次的选中的图形对象的序号


void MouseMoveFunction() // 鼠标移动消息处理函数

{

计算当前鼠标点到所有图形对象的距离,取得距离最小的那一个图形对象的序号。

假如上面求出的距离小于阈值

{

如果刚才的获取的图形对象序号上一次选中的图形对象序号(即等于m_nSelIndex)

   {

          退出;

   }

否则

   {

     将上一次选中的图形对象区域设为不选中状态;

     对该次选中的图形对象区域进行高亮显示;

     m_nSelIndex赋值为该次选中图形对象的序号。

    }

}

否则

    {

     将上一次选中的图形对象区域设为不选中状态;

     m_nSelIndex赋值为-1,意为当前没有选中的图形对象。

    }

}


     其次这一过程中涉及的计算量比较多的应该是计算当前鼠标点到所有图形对象的距离,取得距离最小的那一个图形对象的序号。一个优化策略是在这一计算过程中先将明显大于阈值的图形对象先剔除掉,比如在计算两点距离时两点的x方向的差或y方向的差大于阈值,就可以判断出这两点的距离一定大于阈值,从而避免再进行平方和开方的运算。