自定义图谱控件

       先上一张效果图吧

      这个是我曾经上传过的一个资源——自定义图谱控件使用范例。记得那个时候应该是毕业设计如火如荼日渐焦灼的时期,论坛里很多朋友询问有没有什么好的绘制图谱的控件。当然多数网友推荐mschart等成熟控件,不过我一直建议对于简单的图谱可以自行绘制。因为我现在的工作就是做上位机开发,在我的项目中也需要显示采集上来的数据,刚到公司时就一直在做这个图谱控件,后来经过一段时间的使用自问还是比较稳定的,而且可以很好的实现基本功能。项目中在这个控件基础上还做了相当于matlab中image功能一个可以表达三维信息的图谱绘制控件,实际应用使用效果也不错。

      这个控件上传后再在论坛遇到类似的问题我都会推荐这个例子给大家试用,得到的反馈也还算可以。这些天想写些技术博客,一方面系统的数理一下知识,另一方面也是可以和朋友们交流以便共同提高。不过想要动笔的时候发现自己掌握的那些小伎俩都拿不太上台面,于是想起这个例子,以它为基础写点东西应该还看得过去吧,呵呵。

       这是一个自定义控件,在自定义控件实现信号灯一文中我提过现在做东西我喜欢通过自定义控件实现,尤其是这种和MFC标准控件向去深远的控件。所以很自然的,这个控件也是从CWnd派生的一个自定义控件。关于自定义控件的一些基础的东西可以参见自定义控件实现信号灯中的相关介绍。这里主要介绍一下这个图谱控件的核心功能及其实现方法。我将这个控件的类命名为CGraphView,其声明的代码如下

  

      阅读代码不难发现其实这个控件绘制图谱的基本思路就是描点绘图,通过MoveTo、LineTo函数把数据样本点串联起来。在控件中我通过CArray数组m_dataGraph存储绘制数据,而通过LoadGraphyData实现对数据的更新。

      需要说明的是仿真绘图需要将数据映射到绘制坐标系中,否则绘制的图谱不具有分析意义。因此如何构建坐标系,如何计算映射关系就显得比较关键。这里我以x轴为例说一下我这个控件中这部分的实现,y轴原理与其相同。成员变量m_dbStartX, m_dbEndX标记了图谱x轴的起始坐标和终止坐标,m_nDivisionX变量则记录了显示图谱时的坐标轴分段。效果图所示的就是m_dbStartX=0、m_dbEndX=100、m_nDivisionX=10时x轴的效果,相信对比图示大家应该可以明白这几个参数的含义。m_dbResolutionX记录的是每一个单位刻度的分辨率,参考效果图,坐标轴长度是100,如果我们的绘图精度是1那么每个刻度内就应该绘制1个点,m_dbResolutionX就为1;如果我们的绘图精度是0.1,那么每个刻度内就应该绘制10个点,m_dbResolutionX就为10。也就是说,一屏幕内绘制点的个数最多为(m_dbEndX-m_dbStartX)*m_dbResolutionX个,图中是分辨率为1的效果。明确这些参数的含义就可以确定坐标系了,SetGraphyView和SetResolution两个函数的主要功能就是设置相关参数。

      说到坐标映射,继续以x轴为例DrawGraphy函数中nRangX = abs(int((m_dbEndX-m_dbStartX)*m_dbResolutionX))一句计算出了x轴包含的数据点的总数,而参数rectCoord是坐标系即图中白色区域所占的rect,也就是说nCoordWith  = rectCoord.Width()一句得到的是x轴长度的像素值。这样nCoordWith/nRangX就是每一个数据点之间间隔的像素值,而一旦确定坐标系坐标原点的绘制位置我们就可以通过数据点的x坐标计算出其在控件的客户区坐标系中的横向位置的像素值了。nOriginX = rectCoord.left-int(m_dbStartX*nCoordWith/nRangX)一句就是计算原点在控件客户区内的横向位置,而

nOffsetX = int(nCoordWith*(i+1)/nRangX);则是根据上诉原理计算数据点在横向上与坐标原点的偏移。有一点需要注意的是,屏幕坐标系和客户区坐标系纵向是向下为正,而我们绘制的坐标系y轴是向上的,因此在做计算时要注意相关符号。结合代码应该能够更好的理解坐标映射的关系,以下给出绘制坐标系的代码供大家参考

      应该说这个控件的实现并不复杂,其基本原理也比较简单。当然在这个基础之上我们还可以丰富其功能,在实际项目应用中我也确实做了很多包括网格显示、极值寻找、自动幅值等功能。欢迎大家使用这个控件,如果发现什么问题或增添了什么功能也希望大家能分享出来,让我们共同提高。

  • 10
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 163
    评论
知识图谱是一种用于表示和组织知识的方法。它将知识以图的形式呈现,其中包含了实体、属性和关系之间的连接。Markdown是一种轻量级的标记语言,用于编写和格式化文本。知识图谱Markdown是将知识图谱表示为Markdown格式的一种方式。 使用Markdown格式可以使知识图谱更加易读、易维护和易扩展。通过Markdown,可以将实体、属性和关系清晰地呈现出来,并使用简单的语法对其进行标记和格式化。例如,使用Markdown的标题和列表功能,可以将知识图谱中的实体和属性分组和层次化。 另外,知识图谱Markdown还可以嵌入图片和超链接,用于展示实体之间的关系和引用外部资源。通过Markdown语法的引用和链接功能,可以在文本中直接引用和链接相关实体或属性的详细信息。 使用知识图谱Markdown标记和格式化知识图谱的好处是多方面的。首先,Markdown是一种简单易学的语法,使用者可以快速上手并编写知识图谱。其次,Markdown具有易读性和可移植性,可以用于多种文本编辑工具和平台。最后,使用Markdown可以提高知识图谱的可维护性和可扩展性,便于团队共同协作和知识的更新迭代。 总而言之,知识图谱Markdown是一种将知识图谱表示为Markdown格式的方法,通过简单的语法和格式化功能,使知识图谱更易读、易维护和易扩展。这是一种强大而便捷的知识管理工具,有助于组织和共享知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 163
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值