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

本文主要是介绍深入浅出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) 滚动滚轮键,可以实现视图缩放。

好了,本节课结束。

这篇关于深入浅出CChart 每日一课——快乐高四第六十一课 飞梯十二重,CChart三维曲线图绘制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744013

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数