第一范文网 - 专业文章范例文档资料分享平台

VC++通用GIS功能与开发[1][1][1]

来源:用户分享 时间:2025/5/21 4:52:48 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

中实现图形的选中操作。

对于一个矢量图形系统来说,不但要能够实现交互图形绘制、放缩操作等,还应有一项基本的功能,就是能够选中图形元素。选中图形元素是对图形进行修改删除直接从图形上得到信息(在GIS中),以及在GIS中实现空间统计和分析功能等操作的基础。

本设计涉及的是点选图形元素的实现方法及实现过程。

点选图形元素时,问题的关键在于如何判断一个点是否在一个图形元素上,也就是要确定每一类图形元素的选中区域。

4.1.1 各种图形元素的选中区域

⑴直线和连续直线

因为直线是没有宽度的,所以,这种选中判断实际上是要判断一个点与一条直线的距离是否在一定的距离范围之内。问题的实质就是,如何确定这个判断选中的距离范围和怎样计算一个点与一条直线的距离。

有效距离

确定有效距离的方法是:首先确定在视图屏幕上有效距离的大小(如n个象素),也就是说,不管在什么比例的情况下,选中的图形元素都以在屏幕上与要选直线的距离小于n个象素为标准。用象素为单位进行计算时不方便,于是就求出n个象素在当时显示比例下的实际距离。这个实际距离就是点选图形元素时的有效距离。

点与直线距离的计算方法

为了完成计算点到直线距离的功能,需要定义一个函数,为了在直线和连续直线类中都能够使用这个函数,把这个函数定义在图形元素基类CDraw中:

函数的参数分别是选中点与直线两个顶点的实际坐标,函数返回计算得到的距离值。在实现文件draw.cpp中,加入函数实现代码:

在上述函数中,调用了一个计算两点距离的函数CalDisp,它是在CDraw类中定义的:

⑵圆和填充圆

圆的选中区域非常简单,如果有效距离为j1,计算得到的鼠标按中点到圆心的距离为jl1;选中区域就是:

—17—

|jl1-circle.r|

圆弧的选中区域同圆类似,首先要确定按中点是否在圆弧所在的圆上。即按中点到圆心的距离jl1符合:

|jl1-circle.r|

因为圆弧不是封闭的,还要确定按中点相对于圆心的弧度是否在圆弧的弧度范围内,可以通过CArc类中的成员函数IsInArc函数来确定。

⑷多边形区域

图形元素多边形区域和标注文本(四边形)都属于这种情况。最简单的多边形区域就是没有旋转的矩形(如水平标注的文本就是这种情况),判断一个点是否在这种矩形中的算法非常简单。VC++的CRgn类提供了一个成员函数来实现这个操作功能。CRgn类封装了一些进行区域操作的函数,可以直接解决按中点是否在多边形区域中的问题。以下是操作步骤:

① 首先定义一个CRgn对象;

② 把CRgn初始化成一个具有n个顶点的多边形区域;

② 建立一个多边形区域后,调用PtInRegion函数来判断一个点是否在区域内。

函数PtInRegion 是CRgn类的成员函数,它可以判断点是否在初始化区域内。在CDraw类中建立一个函数完成这个操作:

在实现文件draw.cpp中,加入函数的实现代码

4.1.2 各种图形元素的点选判断函数

首先,在图形基类CDraw中定义一个纯虚函数:

在各个图形元素类CLine CCircle CArc CText CPline CPlineRgn CLinkNet中重载虚函数IsPoint,即在这些类中加入这个函数的重载定义:

然后实现各个图形元素类重载的IsPoint函数的实现代码,实现各

—18—

个图形元素类的点选判断功能。

4.1.3 选中图形元素的特殊显示

当用鼠标在屏幕上点选图形元素时,通过计算可以判断是否选中了图形元素。为了让用户知道是否选中了图形元素,可以用实现图形元素的特殊显示的方法来实现,实际上就是用不同的形式重新绘制这个图形元素。在矢量图形Draw中,要求选中线类图形元素时,用虚线表示;选中区域类图形元素时,就用虚边线、变色或反色显示。各个图形元素类的绘制函数Draw中,有一个参数DrawModel ,是用来确定图形元素显示方式的,可以对Draw函数进行修改,增加更多的显示方式。

4.1.4 实现点选图形元素功能

⑴增加一个菜单及消息处理函数 ⑵保留选中的图形元素 数据保留

要实现数据保留,就需要建立数据结构来存储选中的图形元素。在文档类CDrawDoc中,定义一个结构数组和一个变量:

将选中的图形元素存储在结构数组GraphSelect中,成员变量Lb存储选中图形元素的类别;成员变量Index存储图形元素的序列号,即图形元素在指针数组中的下标;成员变量id_only存储这个图形元素惟一的识别号,即图形元素中的成员变量m_id_only。

在实现文件drawdoc.cpp中,在CDrawDoc文档类的构造函数内动态分配结构数组GraphSelect:

为了将一个选中的图形元素存储到结构数组GraphSelect中,在文档类CDrawDoc中定义一个函数:

Public:

BOOL AddSelectList(int Lb ,int index ,int id_only); 函数AddSelectList实现在结构数组GraphSelect中增加一个选中的图形元素,增加成功是返回TRUE,否则函数返回FALSE. 函数的实现代码如下:

屏幕保留[9]

—19—

为了能够将选中的图形元素在屏幕上保留,需要修改图形绘制函数,使视图重画时,选中的图形元素仍然能特殊显示。

为了选择绘制某个图形元素,在文档类CDrawDoc中定义一个函数: 在文档类CDrawDoc的视图绘制函数Draw中增加代码,以实现对被选中的图形元素的特殊:

⑶实现点选图形元素功能[8]

为了能够对所有的图形元素进行检查,计算并返回选中的图形元素的参数,在文档类CDrawDoc中定义一个函数:

PointSelect函数用来计算得到点选的图形元素,如果选中了图形元素,函数返回TRUE,通过指针参数分别返回图形元素的类别、序号以及识别号,否则函数返回FALSE.参数(x,y)是按中点的实际坐标,参数jl是点选操作的有效距离,参数blc是实际坐标转成逻辑坐标的比例尺。在实现文件drawdoc.cpp中,加入函数的实现代码:

为了在应用程序Draw中实现点选图形元素的功能,需要在实现文件drawview.cpp中,在视图类的消息处理函数OnLButtonDown中加入实现代码

至此,完成了鼠标点选图形元素的操作功能。

4.1.5 放弃选中的图形元素

4.1.6 有选中图形元素的功能,就需要有相应的放弃选中图形元素的功

能。所谓“放弃”,就是取消对图形元素的选中。取消对图形元素的选中时,有只取消对某个图形元素的选中和取消对图形元素的所有选中等不同的操作。取消对图形元素的所有选中,从数据操作角度来说是非常重要的,只需使选中的图形元素是为0即可,但除数据方面所做操作外,还需要在视图中把选中 的图形元素恢复到正常显示状态下,从直觉上感觉到放弃了对图形元素的选中。对“放弃选中”菜单项的消息处理函数OnSelectClear进行修改,得到修改后的函数的实现代码

4.1.7 图形元素的显示和选中顺序

⑴区域类图形元素要显示在前,选中在后 ⑵对重要的图形元素点选时,应该首先判断

—20—

搜索更多关于: VC++通用GIS功能与开发[1][1][1] 的文档
VC++通用GIS功能与开发[1][1][1].doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c33rt33mwiz1xep036og2_5.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top