深入浅出CChart 每日一课——快乐高四第六十一课 飞梯十二重,CChart三维曲线图绘制

同学们好,今天继续介绍CChart本身的功能。接下来这几节课呢,笨笨老师准备对CChart的三维视图和场图功能进行详细一些的介绍。本节课首先介绍三维曲线图。

CChart软件库的开发,首先是从二维曲线图开始的,这一部分经过长时间的打磨,显示效果已经非常不错,功能也非常丰富。

对于三维曲线图,其实功能早就有了,本系列教程比较早期的课程,第十四课 三维视图,数学老师之从平面到空间,就已经展示了三维曲线的功能。但说实话,当时的三维曲线功能差强人意,只能说具备,但远远比不上CChart二维曲线那么好用。

经过这些年不断的改进,目前,三维图功能其实也已经相当不错了,这也是笨笨老师作为一个业余程序员,不断学习进步的成果。

CChart提供了3种三维视图:模拟三维视图、三维折线图、三维曲面图,CChart内部代号分别为:kTypeXY3D、kType3DLine、kType3DSurface。

本节课只介绍前面两种视图,这两种视图都是画曲线的。

虽然这两种视图都可以画三维曲线,但其内部实现是完全不同的。模拟三维视图并不是真正的三维视图,它只是二维折线图的魔改版,实际上渲染引擎是Windows GDI。而三维折线图则是真正的三维视图,内部采用OpenGL实现。

下面这两个图分别是模拟三维视图和三维折线图。

模拟三维视图。

三维折线图。

可见两者差别还是蛮大的。

下面还是用一个实例来展示一下CChart的三维曲线绘制功能。

A61.1 三维曲线图主要API

对于三维曲线图,最主要有以下两个添加数据的接口。

        // 添加三维曲线的一个数据点
		int			AddPoint3D(double x, double y, double z, int nDataIndex=0);
		// 添加一条三维曲线
		int			AddCurve3D(double *pX, double *pY, double *pZ, int nLen);	

和二维曲线的接口名和参数略有区别,很好理解。

A61.2 编程Demo

这里我们在一个对话框界面上,放置两个控件,分别用模拟三维视图和三维折线图显示相同的数据。

1. 框架程序编写

首先利用Visual Studio的向导,建立一个基于对话框的MFC应用程序,名为LessonA61。

具体过程不详述了。

2. 初始化

在LessonA61Dlg.h文件的头部,加入下列代码。

#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
#	pragma comment(lib,"CChartu.lib")
#else
#	pragma comment(lib,"CChart.lib")
#endif
using namespace NsCChart;

在资源编辑器里面,把主对话框拉大一点,然后放置两个Custom Control,ID分别是IDC_CUSTOM1和IDC_CUSTOM2,class都设置为ChartCtrl。

在LessonA61Dlg.cpp文件里面,函数OnInitDialog里面,// TODO: Add extra initialization here这一行下面,添加如下代码。

    CChart *chart;
	chart = GetChart(GetDlgItem(IDC_CUSTOM1)->m_hWnd);
	chart->SetType(kTypeXY3D);
	chart = GetChart(GetDlgItem(IDC_CUSTOM2)->m_hWnd);
	chart->SetType(kType3DLine);

得到如下图像。

图中左边准备绘制模拟三维曲线,由于这实际是二维曲线图,默认界面大家都很熟悉,右边准备绘制真三维曲线,默认界面为空。

3. 添加曲线数据

在LessonA61Dlg.cpp文件里面,把刚才的代码扩充一下,如下。

    int len = 1080;
	double pi = 4.0*atan(1.0);
	double *pX = new double[len];
	double *pY = new double[len];
	double *pZ = new double[len];

	for(int i=0; i<len; ++i)
	{
		pX[i] = 2.0*cos(i*2.0*pi/360.0);
		pY[i] = 2.0*sin(i*2.0*pi/360.0);
		pZ[i] = 2.0*i/(double)len;
	}

	CChart *chart;
	chart = GetChart(GetDlgItem(IDC_CUSTOM1)->m_hWnd);
	chart->SetType(kTypeXY3D);
	chart->AddCurve3D(pX, pY, pZ, len);
	chart->SetTitle(_T("模拟三维视图"));
	chart = GetChart(GetDlgItem(IDC_CUSTOM2)->m_hWnd);
	chart->SetType(kType3DLine);
	chart->AddCurve3D(pX, pY, pZ, len);
	chart->SetTitle(_T("三维曲线视图"));

	delete []pZ;
	delete []pY;
	delete []pX;

补充数学库头文件。

#include <math.h>

最终效果如图。

两者采用的坐标系有一点区别。模拟三维视图的Z轴垂直于屏幕向里,而三维曲线视图的Z轴开始是向上的。

应该说两者各有特色吧。模拟三维视图继承了CChart二维视图的优点,效果很不错。三维曲线视图可以得到更好的立体感。

三维曲线视图是可以用鼠标操作的。主要有三个操作,以便更好地查看图像。

1) 按住鼠标左键,在视图里面移动,视图整体绕原点旋转。

2) 按住鼠标左键,同时按住Ctrl键,在视图里面移动,视图整体平移。

3) 滚动滚轮键,可以实现视图缩放。

好了,本节课结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/407257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3+Vue3 基础知识(持续更新中~)

bean 把方法的返回结果注入到ioc中 1: 2: 3: 组合注解封装 实战篇&#xff1a; 解析token&#xff1a; 统一携带token&#xff1a; 驼峰命名与下划线命名转换&#xff1a; NotEmpty!!! mybatis&#xff1a; PageHelper设置后&#xff0c;会将pageNum,和pageSize自己拼接…

ubuntu22.04@Jetson Orin Nano之OpenCV安装

ubuntu22.04Jetson Orin Nano之OpenCV安装 1. 源由2. 分析3. 证实3.1 jtop安装3.2 jtop指令3.3 GPU支持情况 4. 安装OpenCV4.1 修改内容4.2 Python2环境【不需要】4.3 ubuntu22.04环境4.4 国内/本地环境问题4.5 cudnn版本问题 5. 总结6. 参考资料 1. 源由 昨天用Jetson跑demo程…

Spring Session:入门案例

Spring Session provides an API and implementations for managing a user’s session information. Spring Session提供了一种用于管理用户session信息管理的API。 Spring Session特点 传统的Servlet应用中&#xff0c;Session是存储在服务端的&#xff0c;即&#xff1a;Ses…

聚道云软件连接器:高科技企业财务自动化,提升效率准确性!

客户介绍&#xff1a; 某互联信息技术有限公司是一家专业从事信息技术服务的高科技企业&#xff0c;在业内享有较高的知名度和影响力。近年来&#xff0c;公司业务快速发展&#xff0c;对信息化建设提出了更高的要求。 客户痛点&#xff1a; 在传统情况下&#xff0c;该公司的…

【探索Linux】—— 强大的命令行工具 P.23(线程池 —— 简单模拟)

阅读导航 引言一、线程池简单介绍二、Linux下线程池代码⭕Makefile文件⭕ . h 头文件✅Task.hpp✅thread.hpp✅threadPool.hpp ⭕ . cpp 文件✅testMain.cpp 三、线程池的优点温馨提示 引言 在Linux下&#xff0c;线程池是一种常见的并发编程模型&#xff0c;它能够有效地管理…

大模型综述总结--第一部分

1 目录 本文是学习https://github.com/le-wei/LLMSurvey/blob/main/assets/LLM_Survey_Chinese.pdf的总结&#xff0c;仅供学习&#xff0c;侵权联系就删 目录如下图 本次只总结一部分&#xff0c;刚学习有错请指出&#xff0c;VX关注晓理紫&#xff0c;关注后续。 2、概述…

字符函数和字符串函数(C语言进阶)(一)

前言 C语言中对字符和字符串的处理是很频繁的&#xff0c;但是c语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或着字符数组中。 字符串常量适用于哪些对它不做修改的字符串函数。 1、函数介绍 1.1 strlen strlen&#xff1a;计算字符串长度 看一个代码&…

“AI教父”李一舟翻车,中国AI培训路在何方

近日&#xff0c;AIGC领域掀起了一场不小的风波&#xff0c;知名AI博主李一舟在各大平台推出的AI课程突然下架&#xff0c;其账号遭到禁止关注的情况。 这一事件不仅引发了广泛关注和热议&#xff0c;更让许多真正想学习AIGC的用户感到迷茫和困惑&#xff1a;在众多的AIGC课程中…

ONLYOFFICE 桌面编辑器现已更新至v8.0啦

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

一个div最简方法画太极图

一个div最简方法画太极图 直接上代码&#xff0c;一目了然 html <div class"太极图"/>css .太极图 {position: relative;width: 400px;height: 400px;background: linear-gradient(to right,white 50%,black 50%);border-radius: 50%;box-shadow:0 0 12px …

c#高级——插件开发

案例&#xff1a;WinForm计算器插件开发 1.建立插件库&#xff0c;设置各种自己所需的插件组件 如下图所示&#xff1a;进行了计算器的加减法插件计算组件 Calculator_DLL为总插件父类 Calculator_DLL_ADD 为插件子类的控件对象 Calculator_DLL_Sub Calculator_DLL_Factory 为…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…

【Ubuntu】使用WSL安装Ubuntu

WSL 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能&#xff0c;可用于在 Windows 计算机上运行 Linux 环境&#xff0c;而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。安装 Linux 发行版时&#xff0c…

喝多少瓶汽水

喝多少瓶汽水 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果: 题目描述&#xff1a; 水已知1瓶汽水1元&#xff0c;2个空瓶可以换⼀瓶汽水&#xff0c;输入整数n&#xff08;n>0&#xff09;&#xff0c;表示n元钱&#xff0c;计算可以多少汽水&a…

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…

通过Colab部署Google最新发布的Gemma模型

Gemma的简单介绍 Gemma 是一系列轻量级、最先进的开放式模型&#xff0c;采用与创建 Gemini 模型相同的研究和技术而构建。 Gemma 由 Google DeepMind 和 Google 的其他团队开发&#xff0c;其灵感来自 Gemini&#xff0c;其名称反映了拉丁语 gemma&#xff0c;意思是“宝石”…

RT-Thread-快速入门-3-内存管理

内存管理 定义与作用 内存池管理 基础定义 内存池是一种管理固定大小内存块的机制&#xff0c;主要用于减少碎片化&#xff0c;提高内存分配效率。在 RT-Thread 中&#xff0c;内存池允许用户预分配一定数量的具有相同大小的内存块&#xff0c;应用程序可以从中快速分配和释放内…

【Java程序设计】【C00287】基于Springboot的疫情防控期间某村外出务工人员管理系统(有论文)

基于Springboot的疫情防控期间某村外出务工人员管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的疫情防控期间某村外出务工人员信息管理系统 本系统分为系统功能模块、管理员功能模块、用户功能模块、采集…

第三百六十五回

文章目录 1. 概念介绍2. 方法与信息2.1 获取方法2.2 详细信息 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取设备信息"相关的内容&#xff0c;本章回中将介绍如何获取App自身的信息.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…