钻石图的实验原理:

双缓冲技术:

双缓冲是一种基本的动画技术,主要用于解决单缓冲擦除图像时带来的屏幕闪烁问题。
所谓双缓冲,是指一个屏幕设备上下文(屏幕缓冲区)和一个内存设备上下文(内存缓冲区)。内存缓冲区用于准备图形,屏幕缓冲区用于显示图形。图形绘制到内存缓冲区,而非直接绘制到屏幕缓冲区。每帧动画只执行图形从内存缓冲区到屏幕缓冲区的拷贝操作,屏幕缓冲区只是内存缓冲区的一个映像。双缓冲机制中根本不需要擦除屏幕缓冲区,因此有效地避免了屏幕闪烁现象,可生成平滑的逐帧动画。

实验效果图:

在绘制旋转的钻石图时,首先定义金刚石图案类,绘制出静态的钻石图,然后定义定时器消息响应函数,让旋转角每次增加,重新绘制钻石图,利用双缓冲技术即可将旋转的钻石图绘制出来。






核心代码如下

// CppDiamondView.cpp : implementation of the CCppDiamondView class
//#include "stdafx.h"
#include "CppDiamond.h"#include "CppDiamondDoc.h"
#include "CppDiamondView.h"#include "Diamond.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CCppDiamondViewIMPLEMENT_DYNCREATE(CCppDiamondView, CView)BEGIN_MESSAGE_MAP(CCppDiamondView, CView)//{{AFX_MSG_MAP(CCppDiamondView)ON_WM_TIMER()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()/
// CCppDiamondView construction/destructionCCppDiamondView::CCppDiamondView()
{// TODO: add construction code hereAlpha = 0;             //初始旋转角ptr = new CDiamond;     //动态建立金刚石图案对象}CCppDiamondView::~CCppDiamondView()
{delete ptr;                //释放动态创建的金刚石图案的内存空间ptr = NULL;             //置指针为空
}BOOL CCppDiamondView::PreCreateWindow(CREATESTRUCT& cs)
{// TODO: Modify the Window class or styles here by modifying//  the CREATESTRUCT csreturn CView::PreCreateWindow(cs);
}/
// CCppDiamondView drawingvoid CCppDiamondView::OnDraw(CDC* pDC)
{CCppDiamondDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereSetTimer(1,100,NULL);      //设置定时器DoubleBuffer(pDC);           //调用双缓冲函数绘制金刚石图案
}/
// CCppDiamondView printingBOOL CCppDiamondView::OnPreparePrinting(CPrintInfo* pInfo)
{// default preparationreturn DoPreparePrinting(pInfo);
}void CCppDiamondView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: add extra initialization before printing
}void CCppDiamondView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{// TODO: add cleanup after printing
}/
// CCppDiamondView diagnostics#ifdef _DEBUG
void CCppDiamondView::AssertValid() const
{CView::AssertValid();
}void CCppDiamondView::Dump(CDumpContext& dc) const
{CView::Dump(dc);
}CCppDiamondDoc* CCppDiamondView::GetDocument() // non-debug version is inline
{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCppDiamondDoc)));return (CCppDiamondDoc*)m_pDocument;
}
#endif //_DEBUG/
// CCppDiamondView message handlersvoid CCppDiamondView::DoubleBuffer(CDC* pDC)
{CRect rect;GetClientRect(&rect);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);CDC memDC;                      //声明内存缓冲区memDC.CreateCompatibleDC(pDC); //创建与pDC兼容的memDCCBitmap NewBitmap, *pOldBitmap; //声明位图对象和指针NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());    //创建兼容的位图pOldBitmap = memDC.SelectObject(&NewBitmap);  //将位图选入内存memDC.FillSolidRect(rect,pDC->GetBkColor());    //用背景色填充客户区rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);memDC.SetMapMode(MM_ANISOTROPIC);  //定义内存的坐标系memDC.SetWindowExt(rect.Width(),rect.Height());memDC.SetViewportExt(rect.Width(),-rect.Height());memDC.OffsetViewportOrg(rect.Width()/2,rect.Height()/2);DrawGraph(&memDC);       //向内存绘制图形pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);     //将memDC中的位图拷贝到pDCmemDC.SelectObject(pOldBitmap);NewBitmap.DeleteObject();memDC.DeleteDC();
}void CCppDiamondView::DrawGraph(CDC* pDC)
{ptr->SetAngle(Alpha);   //设置金刚石图案的旋转角ptr->Draw(pDC);         //根据旋转角绘制金刚石图案板
}void CCppDiamondView::OnTimer(UINT nIDEvent)
{// TODO: Add your message handler code here and/or call defaultAlpha += 1;               //角度增量if (Alpha == 360)       //循环播放{Alpha = 0;}Invalidate(false);       //使客户区无效,强制执行OnDraw函数进行重绘CView::OnTimer(nIDEvent);
}

完整代码可添加QQ获取

1173953942 备注钻石图即可

计算机图形学(三)——opengl实现动态钻石图的绘制相关推荐

  1. 计算机图形学及OpenGL简介摘记

    计算机图形学(Computer Graphics)是研究怎样用计算机表示.生成.处理和显示图形的一门学科.图形的具体应用范围很广,但是按基本的处理技术划分只有两类.一类是线条,如工程图.地图.曲线图表 ...

  2. 平移计算机图形学代码注释,求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢...

    求代码注释:计算机图形学的OpenGL画四面体.高手来吧.争取每句都注释下.谢谢 答案:3  信息版本:手机版 解决时间 2018-12-20 05:00 已解决 2018-12-20 01:58 求 ...

  3. 计算机图形学三(补充):重心坐标(barycentric coordinates)详解及其作用

    重心坐标(Barycentric Coordinates) 1 重心坐标的定义及求解 1.1 基础定义 1.2 几何面积角度求解 1.3 坐标系角度求解 2 重心坐标的运用 Reference (本篇 ...

  4. 计算机图形学与opengl C++版 学习笔记 第5章 纹理贴图

    目录 5.1 加载纹理图像文件 5.2 纹理坐标 5.3 创建纹理对象 5.4 构建纹理坐标 5.5 将纹理坐标载入缓冲区 5.6 在着色器中使用纹理:采样器变量和纹理单元 5.7 纹理贴图:示例程序 ...

  5. 【计算机图形学】OpenGL递归实现光线追踪

    计算机图形学课程设计:基于面向对象的光线跟踪算法设计与实现 目录 一.前言 二.项目实现与说明 1. 数据结构设计 1.1 光线 Ray 1.2 材质 Material 1.3 光照 Light 1. ...

  6. 计算机图形学入门OpenGL

    计算机图形学openGL 计算机图形学:(Computer Graphics, 简称CG) 简单得说:计算机图形学是一种使用数学算法将二维或者三维图形转化为计算机显示器所能显示的二维栅格形式的科学. ...

  7. 【学习日志】2022.08.19 计算机图形学、OpenGL、疼迅云游戏引擎面试、GLAD、GLFW、virtual

    计算机图形学知识图谱 .学习路线 OpenGL 概述 简介 - LearnOpenGL CN (learnopengl-cn.github.io) 当前比较流行的搭配是 freeglut + glew ...

  8. 计算机图形学E1——OpenGL 方中有圆,圆中有方,无穷尽焉

    其他计算机图形学实验见 链接 使用OpenGL绘制如图所示图形 有穷的: #include <GL/glut.h> #include <math.h> #include< ...

  9. 计算机图形学中OpenGL和DirectX

    引言 接触计算机图形学,一定听说过两大编程接口:OpenGL和DirectX,两者之间不断竞争,也不断促进着各自的发展.API大战真的很有意思,一起来看看这两大BOSS究竟是什么,实力如何? Open ...

最新文章

  1. rest-framework 视图
  2. 【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )
  3. php制作软件工具,开源10款热门教学相关的开源软件(教学平台和制作工具)
  4. android byte[]与图片的转换
  5. 如何给SAP Cloud ConnectorRegion列表中添加新的Region
  6. 项目管理(3):备战pmp
  7. android性能测试工具之dumpsys
  8. python 网络运维框架scape_“python scape 教程“求PhotoScape X Pro for Mac软件
  9. python类与对象 封装继承与多态 0308
  10. 简单说说我对几位认识的号主的印象
  11. LibMeshEquationSystem 类接口
  12. PAT1030 Travel Plan (30)---DFS
  13. php正则去掉空格,PHP怎么实现正则去掉空格
  14. 在thinkphp中引入自定义的敏感词库
  15. 焓湿图软件 android,焓湿图查询计算软件
  16. 逆向基础 OS-specific (四)
  17. Android MTK log分析
  18. 有关世界上第一台计算机的知识,计算机基础知识 1、世界上第一台电子计算机诞生于 A) 1943年 B) 1946年.doc...
  19. wlan mac地址 network interface IPv6 IPv4
  20. php判断无理数,重新整理证明:无理数在数轴上不存在的逻辑证明

热门文章

  1. 【区块链论文阅读】A Weak Consensus Algorithm and Its Applic
  2. 工业相机与镜头分辨率的匹配选型
  3. 【论文阅读】An LSTM-Based Deep Learning Approach for Classifying Malicious Traffic at the Packet Level
  4. Yii2 中添加全局函数
  5. 2016太原网络营销师揭秘面试题百度竞价(SEM)中百度网盟推广的理解?
  6. Spring Boot配置定时任务
  7. 【Leetcode】1641. Count Sorted Vowel Strings
  8. @staticmethod静态方法
  9. 客户不去你网店买东西的15个理由
  10. Nginx代理——正向、反向代理,动静分离和负载均衡