一种图形动态关系识别方法

文档序号:6586809阅读:281来源:国知局
专利名称:一种图形动态关系识别方法
技术领域
本发明属于教学自动化技术领域,特别是涉及一种图形动态关系识别方法。
背景技术
当前交互式电子白板已逐步应用于现代化的课堂教学环境,它不同于传统课堂的 黑板,具有交互式强、支持随手绘图、易编辑等特征。交互式电子白板可以与电脑进行信息 通讯,将电子白板连接到计算机,并利用投影机将计算机上的内容投影到电子白板屏幕上, 在专门的应用程序的支持下,可以构造一个大屏幕、交互式的协作会议或教学环境。利用特 定的电子白板笔代替鼠标在白板上进行操作,可以运行任何应用程序,可以对文件进行编 辑、注释、保存等在计算机上利用键盘及鼠标可以实现的任何操作。目前,电子白板正逐渐步入课堂教学。其中,在初等几何教学中,超级画板等工具 已经逐渐得到应用。但是,此类工具依旧采用鼠标+键盘的输入方式,对于基于电子白板笔 的绘制方式支持不足。因此,有必要研制一种新的支持手绘图形输入及关系识别的方法,针 对初等几何教学中图形输入的以下特征(1)点、线、圆、多边形是最基本和常用的图形,其 中,多边形可以认为是多条线的集合。(2)课堂教学通常需要连续做图,然后由多种图形组 合完成某种教学实例的讲解,在连续做图中,需要进行动态关系识别以保障图形在电子课 件中保持特定的关系。但是,当绘制某些特定特征的图形,如垂线、中线、切线等,采用手绘 的方式难以准确定位图形间的相互关系。比如手绘圆的切线,存在误差不能正好相切。为了达到精确绘制几何图形的目的,现有的绘图工具软件通常采用预先设定绘制 的类别,然后采用菜单或工具栏的外部干预的方式解决。但是,如果在手绘方式中采用这种 思想实现,将会使绘制过程离散化,也无法体现电子白板笔绘制的方便、快捷的优势。目前有出现一类手绘图形识别软件,例如Finite State machines,能够识别手绘 输入内容代表的基本图形类别,即在人工输入后自动判断是否为点、线、圆,有些软件还自 动识别出多条线构成的多边形,然后把不规整的图形自动规整化。这种图形识别一般包括 三个步骤轨迹获取,即获取鼠标移动时经过的轨迹;图形识别,根据获取到的轨迹判断所 画图形形状;图形输出,即在显示屏幕上输出识别出的图形,达到规整化输出手绘所需表达 图形的效果。但是,图形间的相互关系识别仍缺乏技术手段实现。

发明内容
本发明目的在于针对以上不足,提出一种图形动态关系识别方法。本发明的技术方案用于对通过鼠标绘制输入计算机的图形进行关系识别,所述图 形的种类为点、线或圆,(1)当通过鼠标单击输入计算机的当前图形为点时,判断该当前图形下是否有在 前图形,没有则将该当前图形判断为自由点,有则提取该当前图形下所有在前图形的个数, 根据个数分别进行以下处理,若该当前图形下有两个在前图形,则判断该当前图形是否为在前图形的交点,
若该当前图形下有一个在前图形,则根据在前图形的种类进行判断,包括若在前 图形的种类为点则判断该当前图形是否为在前图形的重叠点,若在前图形的种类为线则判 断该当前图形是否为在前图形的线上点,若在前图形的种类为圆则判断该当前图形是否为 在前图形的圆上点;(2)当通过鼠标移动输入计算机的当前图形为线时,判断该当前图形下是否有在 前图形,没有则将该当前图形判断为自由线,有则根据绘制该当前图形时鼠标移动的终止 点位置进行判断,包括若在前图形的种类为线则判断该当前图形是否为在前图形的中线或 垂线,若在前图形的种类为圆则判断该当前图形是否为在前图形的切线。而且,在2)中,判断当前图形是否为在前图形的中线的实现方式为,求取绘制该当前图形时鼠标 移动的起始点到在前图形的中点的理论位置,判断绘制该当前图形时鼠标移动的终止点与 中点的理论位置是否在预设区域范围内,是则判断当前图形为在前图形的中线,然后由绘 制当前图形时鼠标移动的起始点到在前图形的中点的理论位置自动绘制出中线,否则判断 当前图形为一般线;判断当前图形是否为在前图形的垂线的实现方式为,求取绘制该当前图形时鼠标 移动的起始点到在前图形的垂足点的理论位置,判断绘制该当前图形时鼠标移动的终止点 与垂足点的理论位置是否在预设区域范围内,是则判断当前图形为在前图形的垂线,然后 由绘制当前图形时鼠标移动的起始点到在前图形的垂足点的理论位置自动绘制出垂线,否 则判断当前图形为一般线;判断当前图形是否为在前图形的切线的实现方式为,求取绘制该当前图形时鼠标 移动的起始点到在前图形的切点的理论位置,判断绘制该当前图形时鼠标移动的终止点与 切点的理论位置是否在预设区域范围内,是则判断当前图形为在前图形的切线,然后由绘 制当前图形时鼠标移动的起始点到在前图形的切点的理论位置自动绘制出切线,否则判断 当前图形为一般线。而且,先判断当前图形是否为在前图形的垂线,再判断当前图形是否为在前图形 的中线。而且,记录判断所得关系结果,并在移动多个在前图形时保持关系。本发明提供的技术方案能够在连续做图中实现准确定位图形间的关系,将教师手 绘图像转化为准确的几何图形方式,提高交互式电子白板的自动化程度,令教师操作方便 快捷。实际应用本发明将具有多项优点能够在现有z+z超级画板等图形输入软件上直接 扩展定位图形间关系功能;便于支持无线电子白板;操作符合教师输入习惯,无需训练。


图1为本发明实施例的图形识别过程示意图;图2为本发明的线上点判断示意图;图3为本发明的垂线绘制示意图;图4为本发明的切点理论坐标求取示意图;图5为本发明的垂足点理论坐标求取示意图;图6为本发明的绘制过程示意图。
具体实施例方式一图形关系分析由于多边形为多线段的集合,因此,图形间关系识别只需考察三种基本的图形 点,线和圆。针对不同的图形首先分析关系识别的基本要素。(1)点图形识别软件通常设定点是通过鼠标单击输入计算机,一般是由用户单击鼠标左 键,图形输入软件内置的图形识别函数就会判断为点。点可分为自由点,线上点,圆上点,图 形交点,重叠点五大类,在支持动态几何的应用中,点属性(不包含坐标位置)将保持不变。自由点鼠标左键在图形输入软件提供的客户区上任意空白区域按下时生成的 点。对于这类点,只需支持选择后自由拖动。线上点鼠标在客户区中已有的线上(图形输入软件一般提供响应鼠标的自动变 色显示,例如线会变红)时,点击,则会生成线上点。圆上点鼠标在客户区中已有的圆上(图形输入软件一般提供响应鼠标的自动变 色显示,例如圆会变红)时,点击,则会生成圆上点。交点鼠标在客户区中已有的两个在前图形相交的位置点击,则可绘制出交点,选 择拖动相交图形,交点会随之改变,但保持交点性质,如果图形不再相交,交点消失。重叠点这是种特殊情况,有可能鼠标在客户区中已有的点图形上点击,造成重 复,所以绘制结果实际上合并了两点。(2)线图形识别软件通常设定线是通过鼠标移动输入计算机,由鼠标移动的起始点和终 止点这两个点决定线段。用户的操作则是按下鼠标左键确定起始点位置,保持左键按下拖 动,松开时确定终止点位置。一般情况下,鼠标左键按下拖动后抬起,如果轨迹被图形输入软件内置的图形识 别函数判断为线,则会在起始点位置(按下点)和终止点位置(松开点)之间作出一条线 段。线段支持选择后改变位置及长短。为已有线段作出中线或垂线,是教学常见需求,因此 本发明提出,将线分为自由线、中线、垂线、切线和一般线,提供具体关系识别。通过多个线 段首尾相连,可以做出三角形,四边形等多边形。如果两线段端点重合,图形输入软件内置 的图形识别函数会自动将两个点判别成一个点,这样,三条线段构成三角形,就会只有三个 端点。多边形依次类推。处理时考虑构成多边形的线段即可。自由线鼠标在图形输入软件提供的客户区上任意空白区域移动时生成的线。对 于这类线,只需支持选择后自由拖动。中线是线段外一点到线段中点的连线。鼠标左键按下在客户区中拖动后,如果在 客户区中已有的线段中点抬起,可以设定自动跳出“中点”字样,当图形拖动时该中点随在 前线段变化而变化,但总是保持中点特性不变,这样就可以在移动多个在前图形时(包括 已有的线段和作出的中线时)保持中线关系。垂线是线段外一点到线段上的垂直线。鼠标左键按下在客户区中拖动后,如果在 客户区中已有的线段上垂足点处抬起,可以设定自动跳出“垂足点”字样,当图形拖动时该 垂足点随垂线的起始点一起移动,但总是保持垂足点特性不变,这样就可以在移动多个在前图形时(包括已有的线段和作出的垂线时)保持垂线关系。
切线是圆外一点到圆上的切线。鼠标左键按下在客户区中拖动后,如果在客户区中已有的圆上切点处抬起,可以设定自动跳出“切点”字样,当图形拖动时该切点随切线的起始点一起移动,但总是保持切点特性不变,这样就可以在移动多个在前图形时(包括已有的圆和作出的切线时)保持切线关系。
一般线除中线、垂线和切线以外,于在前图形上做的线无需特别关注。在客户区中已有的在前图形上抬起时,和自由线一样生成线即可。
(3)圆
图形识别软件通常设定圆是通过鼠标移动输入计算机,由鼠标移动的起始点位置决定圆心,由终止点位置作为圆上一点决定圆的半径。用户的操作则是按下鼠标左键确定起始位置,保持左键按下拖动然后松开,根据其轨迹由相应算法判断出计算出圆心和半径,然后进行做图。
鼠标左键按下拖动后抬起,如果轨迹被图形输入软件内置的图形识别函数判断为圆,则会根据取圆参数取得的圆心和半径做一个圆。圆支持选择后改变位置及大小。教学中不需要分析圆和在前图形的关系,因此本发明不予特别处理。
图形识别属于现有技术,本发明提供一种具体实施方式
以供参考,识别出点、线、圆的图形识别函数工dentifyShape见以下伪码说明
如果 图形数组中的点坐标数目为1个
{绘制图形为点;}
或者
{
diStanCel一起始点到结束点的直线距离;
diStanCe2一图形数组中的顺序点间距离的叠加;
如果(diStanCel和diStanCe2的比小于等于门限Tho,Tho取经验值o.08)
{绘制图形为线;}
或者
{绘制图形为圆;}
}
图形数组用于存放绘制当前图形时,鼠标所经过的点坐标,当鼠标单击绘制点时,图形数组只会存放1个点坐标。图形数组存放1个以上点坐标时,绘制的当前图形就是线或者圆,图形数组从起始点到结束点顺序存放鼠标移动所经过点的点坐标,鼠标移动所经过点构成点序列,按顺序求取相邻点间距离后叠加即可得到diStanCe2。实施例中,图形识别函数工dentifyShape识别得到绘制图形为线时,令变量Shape—o,识别得到绘制图形为圆时,令变量Shape—l。
点、线的基本参数由相应点的坐标得到,为便于实施参考,提供一种现有技术的取圆参数提取方法如下
确定圆心和半径的方法是先把鼠标移动所经过的点序列均分成三份,从每一份中任取一点,这样就有三个点。确定这三个点构成的圆的圆心和半径;同理,遍历点序列,保证每个点都参与过计算,就可以得到一组圆心和半径的值,再从这组值中确定出最佳圆心和半径。然后,由最佳圆心和半径计算出圆外接矩形的左上点坐标和右下点坐标。关键步骤 详细说明如下(1)由三点确定圆心和半径的方法三点确定三条直线,三条直线对应三条中垂线,三条中垂线的交点就是三点所成 圆的圆心。圆心到三点中任一点的距离就是半径。(2)由一组圆心和半径值确定最佳圆心和半径的方法从这组数据中找出出现概率最大的圆心(cx,cy)和半径cr。在[cx_2,cx+2]和 [cy-2, cy+2]范围内计算圆心与笔划上每一点的距离,再与[cr_2,cr+2]范围内对应半径 求差值,并计算累积和。差值大表示当前圆心和半径与真实值接近程度低,反之则高。差值 和最小时对应的cx,cy和cr值就是最佳圆心和半径值。二动态关系识别根据以上关系识别分析结果,本发明提供了关系识别实现的技术方案,(1)当通过 鼠标单击输入计算机的当前图形为点时,判断该当前图形下是否有在前图形,没有则将该 当前图形判断为自由点,有则提取该当前图形下所有在前图形的个数,根据个数分别进行 以下处理,若该当前图形下有两个在前图形,则判断该当前图形是否为在前图形的交点,若该当前图形下有一个在前图形,则根据在前图形的种类进行判断,包括若在前 图形的种类为点则判断该当前图形是否为在前图形的重叠点,若在前图形的种类为线则判 断该当前图形是否为在前图形的线上点,若在前图形的种类为圆则判断该当前图形是否为 在前图形的圆上点;(2)当通过鼠标移动输入计算机的当前图形为线时,判断该当前图形下是否有在 前图形,没有则将该当前图形判断为自由线,有则根据绘制该当前图形时鼠标移动的终止 点位置和在前图形进行判断,包括若在前图形的种类为线则判断该当前图形是否为在前图 形的中线或垂线,若在前图形的种类为圆则判断该当前图形是否为在前图形的切线。以上技术方案可以采用计算机软件技术实现自动关系识别,还可以进一步在识别 结果上自动进行相应绘制处理,软件流程可参见图1 流程开始后,判断为了将当前图形输 入计算机,用户进行的操作是鼠标单击还是鼠标移动。当用户进行的操作是鼠标单击时 (即图形数组中的点坐标数目为1个),判断当前图形下是否有在前图形,即鼠标单击位置 下是否已有图形。若没有则判断当前图形为自由点进行绘制,若有且只有一个在前图形时, 判断为线上点或圆上点或重叠点,若有且有两个在前图形时,判断为在前图形的交点。当用 户进行的操作是鼠标移动时(即图形数组存放1个以上点坐标),识别当前图形为线或圆, 当为圆时,直接画圆即可。当为线时,首先判断当前图形下是否有在前图形,即鼠标移动的 终止点下是否已有图形,没有则判断为自由线,有则根据在前图形种类判断,在前图形为线 时判断当前图形为中线、垂线或一般线,在前图形为圆时判断当前图形为切线。本发明实施例基于现有Microsoft Visual C++技术实现,以下简称VC。实施例按 照应用分类,分别进行动态关系识别的方法如下1.点绘制的动态关系识别鼠标单击所绘制点,主要分两类图形上的点和图形外的点。图形外的点即自由 点。其中,图形上的点除重叠点、线上点和圆上点以外,还包含了特例——图形的交点。考虑到用户使用鼠标时,未必能够准确地点击到所需要的位置,具体实施时,需要判断鼠标下 点击位置下是否有在前图形时,可以容许一定范围内的差异。也就是说,绘制点的关键是动 态判断发生鼠标绘制的当前图形(点)在目标上的事件和目标的范围。本实施例标记为 PtInObject 函数,a重叠点的PWnObject函数求鼠标当前点和目标点的距离,如果距离小于6像素,认为鼠标在目标点上,此时 两点合并。b线上点的PWnObject函数求鼠标当前点和线段两个端点的距离(有两个),如果这两个距离之和减去线段 长度的差不小于0.2,则认为点在线段上。参见图2,如果AB+AC < = BC+0. 2,则认为点A在线段BC上。c圆上点的PWnObject函数求鼠标当前点到圆心的距离,如果该长度处于半径士3范围内,则认为点在圆上。现有技术中,客户区中已有的所有在前图形都采用VC里的对象链表模板类存储。 当用户输入当前图形时,计算机自动调用一一调取对象链表中所有在前图形对象的信息, 并根据在前图形的种类采用相应PthObject函数,判断该在前图形是否在当前图形下。由 此得到当前图形下有几个在前图形,以及这些在前图形的种类,然后即可判定具体关系若该当前图形下有一个在前图形,则根据在前图形的种类进行判断,包括若在前 图形的种类为点则判断该当前图形是否为在前图形的重叠点,若在前图形的种类为线则判 断该当前图形是否为在前图形的线上点,若在前图形的种类为圆则判断该当前图形是否为 在前图形的圆上点。若该当前图形下有两个在前图形,则判断该当前图形是否为在前图形的交点。然 后可以判断两个以上图形的形状,做出相应的交点,具体实施时做交点可采用现有技术,即 采用绘制交点函数的形式,判断当前图形为在前图形的交点时调用绘制交点函数进行绘 制。用户输入的当前图形是自由点时,在客户区直接于用户所点击位置显示自由点。 而重叠点、线上点、圆上点和交点,因为容许了一定范围误差,并不一定是在用户所点击位 置显示点,而是自行在理论位置显示。2.线绘制的动态关系识别除了点,手绘图形间的动态关系识别主要解决中线、垂线、切线的绘制识别,中线 的目标点为线段上的中点,垂线的目标点为线段上垂足所在垂足点,切线的目标点为圆上 的切点。为判定是否达到目标点,需要考察绘制当前图形时鼠标移动的终止点位置。可以 将中点和垂足点视为特殊的线上点,将切点视为特殊的圆上点,具体实施时可以预先判定 终止点是否为线上点或圆上点。考虑到用户使用鼠标时,未必能够准确地点击到所需要的 位置,具体实施时可以容许一定范围内的差异,在鼠标抬起时(即鼠标移动终止时),通过 线上点的PWnObject函数、圆上点的PWnObject函数进行判断。实施例的基本识别步骤为2. 1鼠标在移动时,则进行动态关系识别预处理,即是否发生鼠标绘制的点在目标 上的事件(即采用上述相应的PthObject函数预先判定终止点是否为线上点或圆上点),如果“是”,则会调用vc自带重绘函数重绘显示设备上展现的客户区,而重绘的图形默认颜 色为红色以区别于客户原来手绘的图形)。这一操作是为得到关键点(中点等)提供函数 入口参数。2. 2鼠标在抬起时,若图形识别判断出绘制的图形为线(OnLButtonUp伪代码3)的 结果,则按照步骤2. 3进行三类特殊点的判断;2. 3当在前图形为线时,按照判断优先级垂线- > 中线进行关系判断。即先检查 鼠标移动的终止点位置是否在垂足点的理论位置附近,然后检查是否在中点的理论位置附 近。当在前图形为圆时,检查是否在切点的理论位置附近。经多次试验,建议将是否位于某目标点的“附近”的判断门限值设置为60*60像素 的区域,即如果鼠标移动的终止点位置的横纵坐标和目标点的理论位置横纵坐标相差不超 过30个像素,就认为他们是同一点。将当前点记为dqd,目标点记为mbd,则I dgd. x-mbd. χ < =30&& I dqd. y-mbd. y < = 30,其中.χ标识横坐标、.y标识纵坐标。具体实施时,可以 通过VC自带的函数获取客户区内目标点的理论位置的具体坐标。比如VC自带的函数可以 算出从线段外某点到线段上的中点,当用户单击鼠标确定鼠标移动的起始点时,该函数就 可以得到从起始点位置到在前图形的中点的理论位置。具体实施时,三类线的动态关系判断和绘制过程如下举例所示(1)中线(一般是为三角形的某边作中线)即过客户区中已有的线段外一点,做该线段的中线。首先,用户将鼠标左键按下得 到线段(设为be)外的一点(设为a)作为起点。然后,当鼠标移动到线段be上时,该线段 be变红,则抬起鼠标结束绘制并进行判断,若判断鼠标绘制的当前线段的终点到达a到be 的中点d的理论位置附近,则认为用户是在做中线。此时,跳出“中线”字样,然后连接起点 a和中点d自动做出中线。(2)垂线即过客户区中已有的线段外一点,做该线段的垂线。参见图3,首先,用户将鼠标左 键按下得到线段(设为be)外的一点(设为a)作为起点。然后,当鼠标移动到线段be上 时,该线段be变红,则抬起鼠标结束绘制并进行判断,若判断鼠标绘制的当前线段的终点 到达a到be的垂足点d的理论位置附近,则认为用户是在绘制垂线段。此时,跳出“垂线” 字样,然后连接起点a和垂足点d自动做出垂线段。(3)切线即过客户区中已有的圆外一点,做该圆的切线。首先,用户将鼠标左键按下得到圆 外的一点作为起点。然后,当鼠标移动到圆上时,该圆变红;则抬起鼠标结束绘制并进行判 断,若判断鼠标绘制的线段的终点处于起点到圆的切点附近,则认为用户是在做切线。此 时,跳出“切线”字样。然后,自动连接起点和切点得到切线。3.图形移动的动态关系识别在图形移动时保持绘制时识别出的关系,可以在移动中保持图形间几何关系不 变,使演示更随意流畅。本发明建议通过保存父子对象关系保持识别出的关系结果,父对象 决定子对象的存在,可以设定以下父子对象关系线段的父对象为线段的两个端点,圆的父对象为圆心和圆周上一点,线上点的父 对象为线段,圆上点的父对象为圆,中点、垂足点的父对象为线外一点和线段,切点的父对象为圆外一点和圆。按照线段的父对象为线段的两个端点的规则,中线的父对象为线外一 点和中点,垂线的父对象为线外一点和垂足点,切线的父对象为圆外一点和切点。具体实施时在程序中,每生成一个对象,就要将其加入其父对象的关联链表中。图 形间的关联由关联链表来实现。链表是VC中一种数据结构。每绘制完成一个图形,都要将 其和别的对象(父对象)关联,实施例标记为函数AddAssociateObj,这个函数的作用是将 对象加入其父对象的关联链表中。在图6的具体绘制例子中,切线、垂线、切点、垂足点等都 是和D点相关的,D点是G点(切点)的父对象,D、G点又是切线DG的父对象,切线DG又 是垂足点M的父对象。当移动组合图形某关键点D时,调用D点的Moveto函数(每个图形 都有一个Moveto函数,由Visual C++自动生成相应框架,该函数作用是移动点的位置到某 个特定值),这个函数又调用相应函数更新所有和D点有关联的对象,即调用与D点有关联 的所有点的Moveto函数。大体流程是遍历D的关联链表,然后改变每个图形的相应位置。 这样,移动了 D,就重新自动计算与之相关联的所有图形的位置,则每个图形也就相应的保 持动态关系不变了。三程序实现流程由于具体实施时可采用Microsoft Visual C++实现,采用函数形式提供程序代码 可以灵活响应客户操作。为方便本领域人员实施参考起见,本发明提供了具体程序代码设 计方案程序代码主要反映在鼠标左键按下(标记为OnLButtonDown)、鼠标移动(标记为 OnMouseMove)和鼠标左键弹起(标记为OnLButtonUp)三个函数中。其他定义包括绘制中 线,切线和垂线的类主要功能及流程(分别标记为⑶rawPointMid,OTrawPointTangent和 CDrawPointFoot)、判别两个点的距离是否在一定得范围内(标记为IdenfifSamePoint)、 跳出所画图形的有闪烁文字提示函数(标记为SiowTip)。各函数基本流程说明如下1 OnLButtonDown主要功能记录鼠标移动的起始点,做自由点,交点、重叠点、线上点和圆上点,并 为OnLButtonUp中做中线、垂足线和切线提供依据。主要步骤流程描述如下(1)设置并保存当前点为鼠标移动的起始点,并清空上个在前图形的轨迹数组 (所谓轨迹数组就是将鼠标移动的轨迹,也就是鼠标经过的点保存下来,放到一个数组里 面,由OnMouseMove函数提供),设置该点状态为新点(2)设置一变量标记为num,变量值为当前图形下在前图形的个数(3)如果 num 为 O那么为自由点,绘制该自由点,并将其(由于对象存储在对象链表中,该图形对象 用对象链表的指针表示)存在变量m中(用于绘制圆时)和对象firstObj (用于关系判 别)中(4)如果 num 为 1那么取得当前图形下该在前图形的指针,并将其保存在对象firstObj中如果该在前图形是线判断当前图形为线上点(标记为midpoint = 1),跳出(此次跳出而不绘制,而是 在判断中点的时候再绘制,是中点的话就绘制中点,否则绘制线上点)。
如果该在前图形是圆判断当前图形为圆上点,绘制。将当前图形与圆相关联如果不是线段或圆判断当前图形为重叠点,将在前图形的指针赋给当前图形(用在绘制多边形上)(5)如果num为2,则当前图形为两在前图形的交点贝 Ij取得两在前图形的指针如果在前图形之一为线且在前图形之二为线判断当前图形为线线交点并绘制如果在前图形之一为线且在前图形之二为圆判断当前图形为线圆交点并绘制如果在前图形之一为圆且在前图形之二为线判断当前图形为圆线交点并绘制如果在前图形之一为圆且在前图形之二为圆判断当前图形为圆圆交点并绘制将当前图形和在前图形相关联(以便保持交点性质)2 OnMouseMove主要功能该函数的主要功能是存储鼠标移动的轨迹,将其放置在一个轨迹数组中,为图形 识别提供数据依据。主要步骤(1)定义一个轨迹数组用来存储绘图轨迹(2)如果鼠标按下将鼠标经过点的坐标加入数组中并设置状态为鼠标移动3 OnLButtonUp主要功能画线,圆;对中线,垂线,切线进行动态识别。这部分是整个程序的核 心。主要步骤(1)设置当前点为鼠标移动的终止点并保存(2)如果鼠标移动而且轨迹数组里的点的个数大于五(3)那么调用图形识别函数(Identifyaiape)来判断图形形状,得到辨别图形为直线 (shape= 0)或圆(shape = 1)(4)设置一变量,值为当前图形下有在前图形的个数(此时当前鼠标下在前图形 变红)如果当前图形下在前图形的个数为1且该在前图形为线那么取进行图形识别的两个图形的指针(第一个图形针对鼠标移动的起始点,记 为firstObj,是在OnLButtonDown中获得的点指针;第二个图形针对当前图形下在前图形,为线或圆,此时鼠标在其上,在前图形保存变红的状态)如果第二个图形为线那么求得过点firstObj到该线的垂足点的理论位置如果求得的垂足点的理论位置和当前点距离在预设区域范围内那么认为用户是在画垂线弹出提示,做垂足点并连接点firstObj和该垂足点的理论位置得到垂线如果第二个图形为线那么求得过点firstObj到该线的中点的理论位置如果求得的中点的理论位置和当前点距离在预设区域范围内那么认为用户是在画中线弹出提示,做出中点并连接点firstObj和该中点的理论位置得到中线如果第二个图形为圆求过点firstObj到该圆的两个切点的理论位置(分别标记为qdl和qd2)如果qdl和当前点距离在预设区域范围内那么弹出提示,做出切点qdl并连接点firstObj和该切点的理论位置得到切线如果qd2和当前点距离在预设区域范围内那么弹出提示,做出切点qd2并连接点firstObj和该切点的理论位置得到切线(5)如果 shape 为 0那么取OnLButtonDown所得鼠标移动的起始点为线段的起点调用OnLButtonDown函数,取当前点为线段的终点调用画线函数(画线函数是一个简单的画直线的类,是VC提供的现有技术),从起 点到终点画线将该线加入对象链表中将起点和终点与线相关联如果shape 为 1那么取得圆的圆心和圆周上的点并将其显示出来删除m点(OnLButtonDown取得,m点是画圆时鼠标一开始落下的一个点,对于画 圆没有用,因此为简洁起见可以删除)调用画圆函数(画圆函数是一个简单的画圆的类,是VC提供的现有技术),根据圆 心、以圆心到圆周上的点之间距离为半径,画圆将该圆加入对象链表中将圆心和圆周上的点与圆相关联(6)设置状态为鼠标不移动(7)如果 midpoint 为 1 (OnLButtonDown 中获得)取得线段的起点和终点,求得中点的理论位置如果当前点与中点的理论位置距离在预设区域范围内那么做出中点并弹出提示(此次只作出一个线段的中点,而不是做中线,注意区 别)如果不在一定范围内
那么弹出提示并做出线上点因为教学中有指出线段中点的需要,而不一定需要做中线,中线往往只针对三角 形而做。因此,作为特殊的线上点,本发明实施例采用OnLButtonDown函数和OnLButtonUp 函数配合实现。在OnLButtonUp函数(7)部份中,如果当前点与中点的理论位置距离在预 设区域范围内就做出中点,否则直接作出普通的线上点。4 类=CDrawPointLL, CDrawPointLC 和 CDrawPointCC主要功能这三个类的功能分别是绘制线线交点(记为OTrawPointLL)、线圆交点 (记为OTrawPointLC)和圆圆交点(记为⑶rawPointCC),以及在移动时保持交点随图形移 动而改变。类的构成以⑶rawPointLL为例。在⑶rawPointL L类中包括构造函数以及成员 函数ktDatas、ResetPosition和Movel^o。其中ktDatas函数的作用是根据两个相交线 段的数学表达式求出交点(解方程组即可),MoveTo和ResetPosition的作用是在相交直 线的位置改变后重新计算交点坐标,从而保证交点随着相交直线的移动而改变。5 类CDrawPointLine 禾口 CDrawPointCircle主要功能绘制线上点和圆上点,以及在移动图形时保持线上点(圆上点)随线 (圆)改变而改变。类的构成以⑶rawPointLine为例,该类包括成员变量m_dLambda,构造函数以及 成员函数ktLambda,MoveTo和ResetPosition。其中m_dLambda是记录线上点和线段的 比例关系,ktLambda求出该比例关系。MoveTo和ResetPosition的作用是在移动过程中 通过m_dLambda求出新的线上点,从而保证线上点在移动过程中保持比例关系不变。6绘制中点,切点和垂足点(分别标记为CDrawPointMid,CDrawPointTangent和 ⑶rawPointR)ot)的类主要功能及步骤主要功能以⑶rawPointi^oot为例,其构造函数的入口有两个,分别是图形外一 点的指针(标记Sm_pBegin)和图形的指针(线,标记为m_pEnd),如图3,即输入参数为点 a的指针和线be的指针,输出的是垂足点d。在程序中主要是通过调用它们的构造函数完成 关键点的识别,这三个构造函数类似。以垂足点为例,显示文本指针标记为n^strContent, 实参输入标记为点pPoint,线pLine (l)m_strContent ="垂足点 〃 ;m_pBegin = pPoint ;m_pEnd = pLine ;(2)调用相关计算函数用数学方法求得过点pPoint线pLine的垂足点的理论位置。⑶rawPointMid类的相关计算函数核心数学思想设中点的理论位置横纵坐标为m_dx和m_dy,线段起始点和终点指针标记为m_ pBegin (横坐标为 m_pBegin_ > m_dx,纵坐标为 m_pBegin_ > m_dy)禾口 m_pEnd(横坐标为 m_pEnd- > m_dx,纵坐标为 m_pEnd_ > m_dy),则有m_dx = (m_pBegin_ > m_dx+m_pEnd_ > m_dx) /2 ;m_dy = (m_pB_egin_ > m_dy+m_pEnd- > m_dy) /2 ;⑶rawPointTangent类的相关计算函数核心数学思想参见图4,设圆外点坐标为(px,py),圆心(以,(^),半径为1~,点到圆心距离为2。1进行坐标系变换,将坐标系原点移到圆心处(如图4所示)
这时 px = px-cx ;py = cy-py ;2T1为圆外点和圆心连线与χ轴夹角Tl = atan(py/px),T2为圆外点、切点、圆心 的夹角 T2 = acos(r/z)。求 T2 和 Tl 的差,即 T3 = T2-T1。3则切点(处于图中第四象限)在此坐标系中坐标为χ = r*cos (T3),y =-r*sin(T3)。4转换为以前的坐标为切点的理论位置横纵坐标χ = r*cos (T3) +cx, y = cy_r氺sin(T3)。CDrawPointR)ot的相关计算函数核心数学思想参见图5,设点为(X,y),线段起点标记为pBegin- > m_dx, pBegin- > m_dy),终 点标记为 m_pEnd- > m_dx, m_pEnd_ > m_dy)。如果线段垂直于X轴,则垂足点的理论位置横坐标为pBegin- > m_dx,纵坐标为如果线段垂直于Y轴,则垂足点的理论位置横坐标为X,纵坐标为pBegin- > m_dy除以上线段垂直于X或Y轴的特殊情况外,一般情况下,则按以下步骤得到垂足点 坐标1首先,如图5所示,将坐标原点移到点(x, y),起点变为(xl, yl),终点为(x2, y2),设 kl = (y2-yl) / (x2_xl),k2 = - (x2_xl) / (y2-yl),bl = yl_xl*kl2运用相似三角形原理推导出垂足点的理论位置在该坐标系下坐标值为(bl/ (k2-kl),-k2*bl/(k2-kl))3再将bl/(k2_kl),-k2^3l/(k2_kl))变换到原坐标下,得到垂足点的理论位置在 原坐标系下坐标值。7 IdentifySamePoint主要功能判别两个点的距离是否在预设区域范围内,是的话返回TRUE,否则返 回 FALSE.输入当前点(标记为oldPoint);判断点,即中点、垂足点或切点(标记为 newPoint)主要流程设置一个布尔型变量dis如果(abs (oldPoint. χ-newPoint. χ) <= 30)而且 abs (oldPoint. y-newPoint. y) <=30)Dis = TRUE否则Dis = FALSE返回 dis其中.χ标识横坐标,.y标识纵坐标,abs()为C++自带的取绝对值函数。8 ShowTip主要功能跳出所画当前图形的闪烁文字提示,向用户提供关系识别结果,例如“线上点”、 “交点”、“中线”等。
输入当前鼠标点位置;显示文字字符串指针输出无伪代码在当前鼠标点的X,y坐标各加10个像素的位置显示字符串str等待500毫秒在当前鼠标点的X,y坐标各加10个像素的位置显示空字符串等待500毫秒在当前鼠标点的X,y坐标各加10个像素的位置显示字符串str等待500毫秒四连续手绘初等几何图形实例为方便了解图形关系识别在绘制过程的应用,本发明提供一个实例,绘制目标是 通过圆外一点D做圆BC的两条切线,并连接两个切点G、K,以D、G、K三点为顶点的三角形 做三条垂线,证明它们交于一点。参见图6 (1)当鼠标进行由B点到C点的移动时,通过Identifyampe函数自动识别输入计 算机的当前图形为规则的圆,记为圆BC;(2)当鼠标点击D点时,通过OnLButtonDown函数自动绘制点D ;(3)当由D点拖动鼠标至圆BC上,通过OnLButtonMove函数自动将圆BC在客户区 的显示颜色变红;当通过OnLButtonUp函数调用IdentifySamePoint函数识别出拖动鼠标至圆BC 上的终结点为切点时,自动在切点的理论位置绘制切点G,并将切点G与圆相关联,即两者 满足动态几何关系,同时通过⑶rawPointTangent函数自动绘制切线DG ;采用同样方法绘制切线DK ;(4)从K点出发,鼠标移动至G点,通过OnLButtonMove函数自动将G点在客户区 的显示颜色变红;鼠标松开,自动绘制线GK(画线函数);(5)从D点出发,鼠标拖动至线GK,线GK变红;鼠标松开,当通过OnLButtonUp函数调用IdentifySamePoint函数识别出松开时 的终结点为垂足点时,通过⑶rawPointi^oot函数自动绘制垂线DL ;采用同样方法绘制垂线KM、GN,发现垂线DL、GN、KM交于一点,点击交点标记为0 点,通过绘制交点函数绘制0点。(6)拖动D点,观察垂线DL、GN、KM的交点,可验证其始终交于0点。这种动态关 系的保持为关联链表应用的具体实例。
权利要求
1.一种图形动态关系识别方法,用于对通过鼠标绘制输入计算机的图形进行关系识 别,所述图形的种类为点、线或圆,其特征在于(1)当通过鼠标单击输入计算机的当前图形为点时,判断该当前图形下是否有在前图 形,没有则将该当前图形判断为自由点,有则提取该当前图形下所有在前图形的个数,根据 个数分别进行以下处理,若该当前图形下有两个在前图形,则判断该当前图形是否为在前图形的交点,若该当前图形下有一个在前图形,则根据在前图形的种类进行判断,包括若在前图形 的种类为点则判断该当前图形是否为在前图形的重叠点,若在前图形的种类为线则判断该 当前图形是否为在前图形的线上点,若在前图形的种类为圆则判断该当前图形是否为在前 图形的圆上点;(2)当通过鼠标移动输入计算机的当前图形为线时,判断该当前图形下是否有在前图 形,没有则将该当前图形判断为自由线,有则根据绘制该当前图形时鼠标移动的终止点位 置进行判断,包括若在前图形的种类为线则判断该当前图形是否为在前图形的中线或垂 线,若在前图形的种类为圆则判断该当前图形是否为在前图形的切线。
2.如权利要求1所述的图形动态关系识别方法,其特征在于在O)中,判断当前图形 是否为在前图形的中线的实现方式为,求取绘制该当前图形时鼠标移动的起始点到在前图 形的中点的理论位置,判断绘制该当前图形时鼠标移动的终止点与中点的理论位置是否在 预设区域范围内,是则判断当前图形为在前图形的中线,然后由绘制当前图形时鼠标移动 的起始点到在前图形的中点的理论位置自动绘制出中线,否则判断当前图形为一般线;判断当前图形是否为在前图形的垂线的实现方式为,求取绘制该当前图形时鼠标移动 的起始点到在前图形的垂足点的理论位置,判断绘制该当前图形时鼠标移动的终止点与垂 足点的理论位置是否在预设区域范围内,是则判断当前图形为在前图形的垂线,然后由绘 制当前图形时鼠标移动的起始点到在前图形的垂足点的理论位置自动绘制出垂线,否则判 断当前图形为一般线;判断当前图形是否为在前图形的切线的实现方式为,求取绘制该当前图形时鼠标移动 的起始点到在前图形的切点的理论位置,判断绘制该当前图形时鼠标移动的终止点与切点 的理论位置是否在预设区域范围内,是则判断当前图形为在前图形的切线,然后由绘制当 前图形时鼠标移动的起始点到在前图形的切点的理论位置自动绘制出切线,否则判断当前 图形为一般线。
3.如权利要求2所述的图形动态关系识别方法,其特征在于先判断当前图形是否为 在前图形的垂线,再判断当前图形是否为在前图形的中线。
4.如权利要求2或3所述的图形动态关系识别方法,其特征在于所述预设区域范围 采用60X60像素。
5.如权利要求1或2或3所述的图形动态关系识别方法,其特征在于记录判断所得 关系结果,并在移动多个在前图形时保持关系。
全文摘要
一种图形动态关系识别方法,用于对通过鼠标绘制输入计算机的图形进行关系识别,所述图形的种类为点、线或圆,当通过鼠标单击输入计算机的当前图形为点时,判断该当前图形下是否有在前图形,没有则将该当前图形判断为自由点,有则提取该当前图形下所有在前图形的个数,根据个数分别进行处理,识别出重叠点、线上点、圆上点;当通过鼠标移动输入计算机的当前图形为线时,判断该当前图形下是否有在前图形,没有则将该当前图形判断为自由线,有则根据绘制该当前图形时鼠标移动的终止点位置进行判断,包括若在前图形的种类为线则判断该当前图形是否为在前图形的中线或垂线,若在前图形的种类为圆则判断该当前图形是否为在前图形的切线。
文档编号G06F3/048GK102096831SQ20091027326
公开日2011年6月15日 申请日期2009年12月15日 优先权日2009年12月15日
发明者刘清堂, 宋晓娟, 张国庆, 朱晓亮 申请人:华中师范大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1