
第五章 交互技术.ppt
30页第五 章 交互技术,交互处理是计算机绘图技术中必不可少的一大内容交互设备是实现交互技术,完成交互任务的设备基础,交互技术是用户用交互设备把信息输入到计算机的不同方式,交互任务是用户输入到计算机的一个信息单元对于一个给定的交互任务可以用多种不同的交互技术来实现,比如一个选择任务可以通过鼠标器在菜单中选一项,也可以用键盘输入选择项的名字,还可以用功能键进行选择§5.1输入设备,输入设备是向图形软件输入图形命令 图形输入设备是用户向计算机输入信息的硬件设备,尽管图形输入设备的种类繁多,用法各不相同,并且有各自的特点,但是按逻辑功能划分,可以划分为六种即:定位设备、笔画设备、选择设备、字符设备、定值设备、拾取设备定位设备(LOCATOR DEVICE):指定单点位置坐标(x,y)的设备笔画设备(STROKE DEVICE):指定一组点位置 坐标的设备选择设备(CHOICE DEVICE):选择菜单项的设备字符设备(STRING DEVICE):指定文字输入的设备定值设备(VALUATOR DEVICE):指定标量值的设备 拾取设备(PICK DEVICE):选择图形的组成部分的设 备。
在实际应用中,一个物理设备可能用于实现多个逻辑设备功能,多个逻辑设备如定位和笔画操作也可在软件系统中使用同一种逻辑设备,然后由软件判断需要一个坐标位置还是一串坐标位置来区分是定位还是笔画设备因此有些软件系统把这两种逻辑设备认为是一种,因而认为只有五种逻辑输入设备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.栅格约束在屏幕上按用户的要求,显示一网格(栅格),有时以小圆点的形式显示网格结点的位置,有时结点位置不显示,但对输入的不同点都用离它最近的一个网格点的位置坐标来代替如定义网格线为 当输入点的坐标为 时,离它最近的网格点的坐标为 就用这个网格点坐标来代替输入点坐标输入点被约束在最近的网格点,5.3.3橡皮筋技术在交互式绘图过程中,需要动态的显示几何图形,可通过定位光标的移动使图形动态变化,这样用户很容易的根据设计要求现场确定其基本尺寸,这如同一根橡皮筋在人手拉动下,可随意变化一样,称为橡皮筋技术。
在我们在使用微软的绘图程序时当要画一条直线,先用鼠标确定起始位置,然后鼠标在屏幕上来回移动时,我们会发现,这条直线就像橡皮筋一样,随着鼠标在屏幕中的位置,长短和终点都随之变化我们在编制自己的程序时,有时也需实现类似的功能1.橡皮筋直线2.橡皮筋矩形3.橡皮筋圆,利用了WINDOWS绘图模式中的“异或”的绘图特性即在屏幕上用异或的模式画图形,然后再用异或的模式,在相同的位置重新画一次此图形,则就会在屏幕上擦出掉上一次所绘制的内容具体在程序中, 1、当按下鼠标左键时,用异或的绘图模式在屏幕上画图形 2、当鼠标移动后,先用异或的绘图模式擦掉上次绘制的图形然后在新的位置绘制图形 3、当鼠标左键被抬起时在最终的位置用正常的颜色重新绘制图形编程举例:下面举一个画直线的例子,其他画矩形和圆弧的实现方法完全相同,可自行编制 1、用VC6.0生成一个基于单文档的程序 2、在view类中添加如下变量: CPoint OriginPos; // 绘图的起始点 CPoint TargetPos; // 绘图的目标点 bool m_bDrawing; // 是否在绘图状态 3、用ClassWizard在view类中添加 WM_LBUTTONDOWN WM_LBUTTONUP WM_MOUSEMOVE 消息响应函数。
具体程序如下:void CXv003View::OnLButtonDown(UINT nFlags, CPoint point) { m_bDrawing = true; OriginPos = point; TargetPos = point; CView::OnLButtonDown(nFlags, point);},void CXv003View::OnLButtonUp(UINT nFlags, CPoint point) { if (!m_bDrawing ) return; m_bDrawing = false; CClientDC ClientDC(this); ClientDC.DPtoLP(&point); ClientDC.SelectStockObject(NULL_BRUSH); CPen pen, *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);},void CXv003View::OnMouseMove(UINT nFlags, CPoint point) { if ( !m_bDrawing ) return; CClientDC ClientDC(this); ClientDC.DPtoLP(&point); ClientDC.SelectStockObject(NULL_BRUSH); CPen pen, *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);}编译执行。












