深入浅出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

相关文章

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 ) 输出描述: 输出一个整数

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl