第五章交互技术交互处理是计算机绘图技术中必不可少的一大内容。交互设备是实现交互技术,完成交互任务的设备基础,交互技术是用户用交互设备把信息输入到计算机的不同方式,交互任务是用户输入到计算机的一个信息单元。对于一个给定的交互任务可以用多种不同的交互技术来实现,比如一个选择任务可以通过鼠标器在菜单中选一项,也可以用键盘输入选择项的名字,还可以用功能键进行选择。§5.1输入设备输入设备是向图形软件输入图形命令。图形输入设备是用户向计算机输入信息的硬件设备,尽管图形输入设备的种类繁多,用法各不相同,并且有各自的特点,但是按逻辑功能划分,可以划分为六种。即:定位设备、笔画设备、选择设备、字符设备、定值设备、拾取设备。定位设备(LOCATORDEVICE):指定单点位置坐标(x,y)的设备。笔画设备(STROKEDEVICE):指定一组点位置坐标的设备。选择设备(CHOICEDEVICE):选择菜单项的设备。字符设备(STRINGDEVICE):指定文字输入的设备。定值设备(VALUATORDEVICE):指定标量值的设备。拾取设备(PICKDEVICE):选择图形的组成部分的设备。在实际应用中,一个物理设备可能用于实现多个逻辑设备功能,多个逻辑设备如定位和笔画操作也可在软件系统中使用同一种逻辑设备,然后由软件判断需要一个坐标位置还是一串坐标位置来区分是定位还是笔画设备。因此有些软件系统把这两种逻辑设备认为是一种,因而认为只有五种逻辑输入设备。5.1.1定位设备定位设备是用来指定用户空间的一个位置。可以根据以下三种相互独立的特征来对定位设备分类:绝对或相对,直接或间接,离散或连续。绝对定位设备:输入给计算机的是相对于坐标原点的位置坐标。如数字化仪和触摸屏。相对定位设备:没有绝对坐标原点,输入给计算机的是相对于前一位置的变化量。如鼠标、轨迹球和操纵杆。直接定位设备:用户可以直接用手指或其它替代物指点屏幕来进行定位。如触摸屏。间接定位设备:用户通过移动屏幕上的光标来进行定位。如鼠标、数字化仪和操纵杆。连续定位设备:将手的平滑移动变成光标的平滑移动。如数字化仪、鼠标和操纵杆。离散定位设备如键盘上的光标控制键。5.1.2笔画设备笔画设备又称描画设备,用于指定一组有序点的位置。可以看成是对定位设备的连续调用。如鼠标器、轨迹球、操纵杆的连续移动都可以输入一系列坐标位置。其中,数字化仪是一种最典型的笔画设备。5.1.3选择设备选择设备用来在应用程序的多个选项中选定一项。其输入方式有:直接或间接的在屏幕上进行字符串名称、手写输入、时间扫描、声音输入等。其对应的物理设备有触摸屏、数字化仪、光笔、鼠标、操纵杆、跟踪球、编程功能键、字符串输入设备、声音识别仪。5.1.4字符设备字符设备又称为字符串设备,用来向应用程序输入字符串,比如,为某一图形设定名称,或者为某一图纸输入注解文字等。其输入方式包括:键盘输入、手写输入、声音输入、菜单输入。其对应的物理设备有键盘、数字化仪、光笔、声音识别仪等。5.1.5定值设备(Value)定值设备用来为应用程序输入一个数值(实数)。其输入方式包括:直接输入数值、通过字符串取值、上下计数控制命令、通过比例尺输入等。对应的物理设备包括旋钮、键盘、数字化仪、鼠标、方向键、编程功能键等。5.1.6拾取设备(Pick)拾取设备用来在处理的模型中选取一个对象,从而为应用程序的操作处理确定目标。一般情况下,可以先用定位设备将光标移到想要拾取的图形对象的附近(对于非封闭图形)或内部(对于封闭图形),再按拾取键,这时系统会根据一定的拾取算法在存储所有图形对象的内部数据结构中找出被拾取的图形对象,并将它着重显示出来,用户即可对该对象作进一步的操作,如复制、删除、修改等。最基本的拾取算法有点的拾取、线段的拾取和多边形拾取。其对应的物理设备包括各种定位设备、编程功能键、字符串输入设备。§5.2输入控制在交互输入过程中,常用的控制模式是请求、采样、事件三种。在设计一个交互系统时,会使用到我们前面提到的六种输入设备。应用程序必须指定用于输入数据的物理设备类型及其逻辑分类,其它参数则取决于输入数据。在应用程序和输入设备之间,输入控制的模式是多样的。比如,可以使用程序来初始化输入设备;或者程序与输入设备同时工作;或者由设备初始化输入数据。这三种方式对应的即是请求、采样、事件三种模式。对这三种输入控制模式都可定义相对应的输入命令,而且图形交互系统允许对每一种逻辑设备执行相应的输入操作。5.2.1请求模式当程序运行到请求语句就向输入设备提出输入请求;同时停止运行,等待输入设备的输入数据。直到请求满足之后,程序才继续运行。当程序运行时,输入设备处于等待状态,等待程序的请求。待到程序的请求出现,输入设备立即进入工作,直到满足程序的这一请求为止。然后又重新处于等待状态。在请求模式下,程序和输入设备轮流交换工作状态和等待状态,由程序支配输入设备的启动。此时,只有用输入方式设置命令(或语句)对相应的设备设置成需要的输入模式后,该设备才能做相应的输入处理。程序启动输入设备等待输入请求收到请求指令输入设备工作程序等待接收数据请求指令完成请求模式的工作过程5.2.2采样模式在采样模式的输入过程中,输入设备和程序分别同时运行。输入设备不断地产生数据,并把数据输入到数据缓冲区,从而不断刷新数据缓冲区的内容。程序在运行时一旦遇到采样语句,就到数据缓冲区中去取数据,所取的一定是最后刷新的输入数据。数据缓存区数据采样程序工作数据生成输入设备工作采样模式的工作过程5.2.3事件模式在事件模式的数据输入过程中,程序和输入设备分别各自运行。输入设备产生的数据被组织成事件节点,排入事件队列中等待程序处理。当程序运行到事件处理语句时,就从事件队列中取出队首节点的事件予以处理。如果事件队空,则程序等待一定的时间,以等待事件的发生。事件处理程序工作数据生成输入设备工作事件模式的工作过程事件队列§5.3交互技术5.3.1定位技术定位技术就是在屏幕指定的位置上插入一个符号,或者定义线段的端点。可以使用图形输入板(数字化仪)、鼠标等输入设备产生光标来实现,也可用键盘的左、右、上、下箭头键,实现光标沿垂直或水平方向步进来定位操作,还可以在应用程序设计中,实现八个方位(上、下、左、右、左上、左下、右上、右下)及光标块快速移动的功能。定位技术5.3.2约束技术约束就是几何约束,借助于计算机控制达到精确定位。1.方向约束用户定位两个端点,应用程序判断两点所定义的直线画水平线还是垂直线。当水平方向约束时,终点不论移动到何处,只有x坐标有意义,而y坐标与始点相同。这样产生的直线段为水平直线。水平约束垂直约束2.栅格约束在屏幕上按用户的要求,显示一网格(栅格),有时以小圆点的形式显示网格结点的位置,有时结点位置不显示,但对输入的不同点都用离它最近的一个网格点的位置坐标来代替。如定义网格线为当输入点的坐标为时,离它最近的网格点的坐标为就用这个网格点坐标来代替输入点坐标。.,,2,1,0,10,10njijyix其中),(yx)10/)5)5.0(int(*10()10/)5)5.0(int(*10(yx输入点被约束在最近的网格点5.3.3橡皮筋技术在交互式绘图过程中,需要动态的显示几何图形,可通过定位光标的移动使图形动态变化,这样用户很容易的根据设计要求现场确定其基本尺寸,这如同一根橡皮筋在人手拉动下,可随意变化一样,称为橡皮筋技术。在我们在使用微软的绘图程序时。当要画一条直线,先用鼠标确定起始位置,然后鼠标在屏幕上来回移动时,我们会发现,这条直线就像橡皮筋一样,随着鼠标在屏幕中的位置,长短和终点都随之变化。我们在编制自己的程序时,有时也需实现类似的功能。1.橡皮筋直线2.橡皮筋矩形3.橡皮筋圆利用了WINDOWS绘图模式中的“异或”的绘图特性。即在屏幕上用异或的模式画图形,然后再用异或的模式,在相同的位置重新画一次此图形,则就会在屏幕上擦出掉上一次所绘制的内容。具体在程序中,1、当按下鼠标左键时,用异或的绘图模式在屏幕上画图形。2、当鼠标移动后,先用异或的绘图模式擦掉上次绘制的图形。然后在新的位置绘制图形。3、当鼠标左键被抬起时。在最终的位置用正常的颜色重新绘制图形。结束。编程举例:下面举一个画直线的例子,其他画矩形和圆弧的实现方法完全相同,可自行编制。1、用VC6.0生成一个基于单文档的程序。2、在view类中添加如下变量:CPointOriginPos;//绘图的起始点CPointTargetPos;//绘图的目标点boolm_bDrawing;//是否在绘图状态3、用ClassWizard在view类中添加WM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSEMOVE消息响应函数。具体程序如下:voidCXv003View::OnLButtonDown(UINTnFlags,CPointpoint){m_bDrawing=true;OriginPos=point;TargetPos=point;CView::OnLButtonDown(nFlags,point);}voidCXv003View::OnLButtonUp(UINTnFlags,CPointpoint){if(!m_bDrawing)return;m_bDrawing=false;CClientDCClientDC(this);ClientDC.DPtoLP(&point);ClientDC.SelectStockObject(NULL_BRUSH);CPenpen,*oldPen;pen.CreatePen(PS_SOLID,1,RGB(255,0,0));oldPen=ClientDC.SelectObject(&pen);ClientDC.SetROP2(R2_COPYPEN);ClientDC.MoveTo(OriginPos.x,OriginPos.y);ClientDC.LineTo(TargetPos.x,TargetPos.y);ClientDC.SelectObject(oldPen);CView::OnLButtonUp(nFlags,point);}voidCXv003View::OnMouseMove(UINTnFlags,CPointpoint){if(!m_bDrawing)return;CClientDCClientDC(this);ClientDC.DPtoLP(&point);ClientDC.SelectStockObject(NULL_BRUSH);CPenpen,*oldPen;pen.CreatePen(PS_SOLID,1,RGB(255,0,0));oldPen=ClientDC.SelectObject(&pen);ClientDC.SetROP2(R2_NOT);ClientDC.MoveTo(OriginPos.x,OriginPos.y);ClientDC.LineTo(TargetPos.x,TargetPos.y);TargetPos=point;ClientDC.MoveTo(OriginPos.x,OriginPos.y);ClientDC.LineTo(TargetPos.x,TargetPos.y);ClientDC.SelectObject(oldPen);CView::OnMouseMove(nFlags,point);}编译执行。5.3.4拖动技术将光标定位的图符或物体的图形,动态的从屏幕一个位置移动到另一个位置。对于拖动技术的一个扩展是动态扩大或缩小图形,旋转图形到要求的方位。实现拖动功能,只要在应用程序中,定义包围物体的长方形窗口作为变换对象,当它再显示在指定视区内,就可完成窗口内的图形变换。