绘图的双缓冲技术
- 格式:docx
- 大小:105.95 KB
- 文档页数:12
计算机地图制图软件中图形控制措施的探讨摘要:在社会的各个领域,地图都起着至关重要的作用,但是随着科技及经济的发展,需要的地图越来越精细复杂,手工制图已经不能满足社会的需要了,计算机可以处理庞大的复杂的数据,将计算机技术引入到地图学对其建设与发展起了非常大的作用。
本文详细介绍了计算机地图制图软件中数据结构的分类及其符号化,并对利用制图软件实现图形的无级缩放、平移以及快速移动做了详细阐述。
关键词:数据结构无级缩放平移快速恢复1 引言现今的社会是信息时代,科学与计算机技术飞速发展,特别是尤个人电脑的处理能力大大地提高,使得图形处理设备快速发展及更新,计算机地图制图、地理信息系统和电子地图像雨后春笋一样迅速发展起来。
计算机地图制图运用先进的电子计算机、扫描仪、数字化仪、胶片机、绘图机、光盘等系统硬件和图形输入、识别、制图、输出等软件,从而使资料数字化、符号化以及制图自动化得以实现。
计算机地图制图(以下简称CAC)过程主要分为数据采集、数据处理与数据输出三个阶段,其中空间数据结构不仅决定了数据采集与处理的方法,还决定数字地图输出形式,因此空间数据结构在计算机地图制图的过程中有重要作用。
2 地图空间数据结构地图空间数据结构包含矢量数据结构与栅格数据结构。
矢量数据结构为点、线、面,其能够构成现实世界中的各种复杂实体,若可以把问题描述为线或者边界的时候就特别方便了;然而栅格数据的构是通过空间点密集并将其规则排列来表示整体空间现象的。
一般矢量数据的符号化是由符号化程序并依据符号库中储存的符号信息来实现的。
在其符号化前要对将要绘制的符号来编码,并形成符号的信息块以及建立符号库。
矢量数据符号化包含符号信息块方式以及程序块式。
而栅格数据符号化一般采取信息块方式,基本没有使用程序块方式的。
①栅格符号主要缺点是不能够随意的缩放。
因为缩放的时候栅格必须要用整数来表示其象素,所以缩放各部分的形变就相对较大。
②绘制点符号。
把分类后的特征码对应栅格符号的信息块调入之后并进行一定的缩放,接着在定位的轴线旋转之后将符号平移,符号的中心点平移的位置要和预订的符号定位处一致,这样就完成了绘制点符号。
卡马克卷轴算法研究摘要与关键词中文摘要对于J2ME框架下的手机游戏程序的开发,其地图滚动的重绘有多种算法,由于手机性能的限制和开发周期等其他非技术条件,需要根据情况灵活选择所需的技术。
但在及其苛刻条件下,如系统CPU资源不足,地图块尺寸较小等,会造成屏幕闪耀,帧数过低等情况,严重影响到游戏体验。
在开发中如此类问题无法绕过以及避免(指通过修改策划方案,以及程序使用的技术框架),则需要考虑使用地图缓冲绘制技术,卡马克卷轴就是一种最经典的地图缓冲绘制技术。
可有效的改善在地图绘制中的屏幕闪耀,帧数过低等情况。
English AbstractFor J2ME Mobile Phone Games under the framework of the development process, and its rolling redraw the map has a variety of algorithms, because of restrictions on mobile phone performance and development cycle and other non-technical conditions required under the circumstances required the flexibility to choose technologies. However, in its harsh conditions, such as system CPU resources are insufficient, and a smaller block size, etc., will cause the screen shine, low frames, etc., seriously affecting the gaming experience. At the development of such a category can not bypass the problem and to avoid (referring to the adoption of amendments to planning programs, as well as the technology used in the framework of the procedure), you need to consider the use of map rendering buffer, scroll Carmack is one of the most classic map buffer rendering. Can effectively improve the mapping of the screen shine, frames are too low and so on.关键词●卡马克卷轴:一种经典的地图缓冲绘制技术。
C++MFC(13)-双缓冲技术实现绘图双缓冲即在内存中创建⼀个与屏幕绘图区域⼀致的对象,先将图形绘制到内存中的这个对象上,再⼀次性将这个对象上的图形拷贝到屏幕上,这样能⼤⼤加快绘图的速度。
MARK⼀下实现步骤,略去了项⽬的绘画代码,亲测有效。
我程序中是在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)CMainFrame::OnSize()CDC MemDC; //⾸先定义⼀个显⽰设备对象CBitmap MemBitmap;//定义⼀个位图对象 //随后建⽴与屏幕显⽰兼容的内存显⽰设备MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地⽅画 ^_^MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //建⽴⼀个与屏幕显⽰兼容的位图,⾄于位图的⼤⼩嘛,可以⽤窗⼝的⼤⼩,也可以⾃⼰定义CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //将位图选⼊到内存显⽰设备中MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //先⽤背景⾊将位图清除⼲净,这⾥我⽤的是⽩⾊作为背景 你也可以⽤⾃⼰应该⽤的颜⾊//绘图内容MemDC.MoveTo(……); MemDC.LineTo(……); pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); //将内存中的图拷贝到屏幕上进⾏显⽰MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC();。
《1》普通绘图就是直接在我们看得到的黑板上绘图《2》双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去;利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。
——————————————————————开始第一步:新建一个对话框工程第二步:添加两个按钮:一个命名为双缓冲绘图;一个命名为普通绘图;第三步:声明变量:在CMyDlg类上右击添加变量如下:CDC MyDC;CBitmap bmp;CBitmap *oldbmp;首先声明一个与窗口DC兼容的内存DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp)第四步:在OnInitDialog()函数中添加以下代码://窗口DCCDC *dc=GetDC();//创建与窗口DC兼容的内存DC(MyDC)及位图(bmp,*oldbmp )MyDC.CreateCompatibleDC(dc);bmp.CreateCompatibleBitmap(dc,200,200);//把内存位图选进内存DC中用来保存在内存DC中绘制的图形oldbmp=MyDC.SelectObject(&bmp);//在内存DC中绘制一些小的圆形,数量要多(体现双缓存的优点)for(int i=0;i<200;i+=6)for(int j=0;j<200;j+=6)MyDC.Ellipse(i-3,j-3,i+3,j+3);第五步:右击CMyDlg类添加windows消息响应函数WM_CLOSE,添加以下代码:MyDC.SelectObject(oldbmp);bmp.DeleteObject();MyDC.DeleteDC();//选进原来的位图,删除内存位图对象和内存DC第六步:双击”双缓冲“按钮添加以下代码:GetDC()->StretchBlt(0,0,200,200,&MyDC,0,0,200,200,SRCCOPY);//把内存DC中的图形粘贴到窗口中;第七步:双击“普通绘图”按钮添加以下代码:for(int i=0;i<200;i+=6)for(int j=0;j<200;j+=6)GetDC()->Ellipse(i-3,j-3,i+3,j+3);//按普通方式在窗口中绘制和在内存DC中一样数量和大小的位图;第八步:运行程序............................先单击普通绘图按钮,大家可以看到绘图的速度有点慢再单击双缓冲绘图按钮,图像马上就显示出来了,这就是双缓冲和普通绘图的区别了______________________________________________________________________完成双缓冲技术说起来也没有那么神秘,举个形象一点的例子吧,有两张纸A和B,纸A代表屏幕,纸B代表后台缓冲,我们将所有的绘图操作都显示在纸B上,然后将纸B覆盖在纸A上,这样体现在纸A上的操作就是绘制了整张图,体现在纸B上的就是纷繁复杂的绘图操作。
GDI+测井曲线绘图中效率提升的研究作者:王宇飞赵正文李瑶来源:《数字技术与应用》2013年第03期摘要:GDI+提供了快速、简单、有效的程序开发方式。
大量测井原始数据生成测井曲线时,绘制对象的增加严重制约了GDI+的绘图效率。
双缓冲技术的使用,可以有效避免图形的闪烁;使用内存中已有图形,可以减少测井曲线的绘制过程,显著提高图形绘制效率。
关键词:测井曲线双缓冲内存图形绘图效率中图分类号:P631.84 文献标识码:A 文章编号:1007-9416(2013)03-0083-021 前言GDI(Graphics Device Interface,图形设备接口)的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
通过GDI众多函数,软件开发人员不需要关心设备驱动及具体硬件设备,就可以将应用程序的输出转化为硬件设备上的输出,实现程序与硬件设备的隔离,方便开发工作。
GDI+是GDI的升级版本,在GDI的基础上进行了了大量的优化和改进工作,使得它的易用性更好。
GDI其中的一个好处就是用户不必知道任何关于数据怎样在设备上绘制图像的细节,GDI+更好地拓展了这一优点,GDI是一个中低层API,用户必须需要知道设备情况,而GDI+是一个高层的API,用户可以不必知道设备情况,GDI+的体系结构如图1。
此外,GDI+不但在功能上比GDI强大很多,而且在代码编写方面也要显得更加简单方便,这将使得其很快成为Windows图形图像程序开发的首选。
2 测井曲线绘制中存在问题测井是油田勘探与开发过程中确定和评价油、气层的重要方法之一,是解决地质问题的重要手段。
通过测井能直接为石油地质和工程技术人员提供各项资料和数据,以指导油田生产。
然而,通过测井设备测量出的大多是一系列离散或连续的数值型数据,同时这也是它们在数据库中的存储形式,即使经验丰富的测井解释人员要想在几百甚至几千米井深的海量测井数据中获得解释结论也是相当困难的,不利于测井数据发挥其功用。
绘图的双缓冲技术
简介
幸运的是当编写一个典型的Windows 窗体程序时,窗体和控件的绘制、效果等操作是不需要特别加以考虑的。
这是为什么呢?因为通过使用.Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件相关
联的代码然后在IDE中按F5,一个完完全全的窗体程序就诞生了!所有控件都
将自己绘制自己,窗体或者控件的大小和缩放都调整自如。
在这里经常会用到的,且需要引起一点注意的就是控件效果。
游戏,自定义图表控件以及屏幕保
护程序的编写会需要程序员额外撰写用于响应Paint 事件的代码。
本文针对那些Windows 窗体开发人员并有助于他们在应用程序编制过程中使用简单的绘图技术。
首先,我们会讨论一些基本的绘图概念。
到底谁在负责
进行绘制操作?Windows 窗体程序是如何知道何时该进行绘制的?那些绘制代码究竟被放置在哪里?之后,还将介绍图像绘制的双重缓冲区技术,你将会看
到它是怎样工作的,怎样通过一个方法来实现缓存和实际显示的图像间的交替。
最后,我们将会探讨”智能无效区域”,实际就是仅仅重绘或者清除应用程序
窗体上的无效部分,加快程序的显示和响应速度。
希望这些概念和技术能够引
导读者阅读完本文,并且有助于更快和更有效的开发Windows 窗体程序。
Windows 窗体使用GDI+图像引擎,在本文中的所有绘图代码都会涉及使用托管的.Net 框架来操纵和使用Windows GDI+图像引擎。
尽管本文用于基本的窗体绘图操作,但是它同样提供了快速的、有效的且
有助于提高程序性能的技术和方法。
所以,在通读本文之前建议读者对.Net框
架有个基本的了解,包括Windows 窗体事件处理、简单的GDI+对象譬如Line,Pen和Brush等。
熟悉Visual Basic .Net或者C#编程语言。
概念
Windows 应用程序是自己负责绘制的,当一个窗体”不干净”了,也就是
说窗体改变了大小,或者部分被其它程序窗体遮盖,或者从最小化状态恢复时,程序都会收到需要绘制的信息。
Windows把这种”不干净”状态称为”无效的(Invalidated)”状态,我们理解为:需要重绘,当Windows 窗体程序需要重
绘窗体时它会从Windows消息队列中获取绘制的信息。
这个信息经过.Net框架
封装然后传递到窗体的PaintBackground 和Paint 事件中去,在上述事
件中适当的书写专门用于绘制的代码即可。
简单的绘图示例如下:
using System;
using System.Drawing;
using System.Windows.Forms;
public class BasicX : Form.
{
public BasicX()
{
InitializeComponent();
}
private void BasicX_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen p = new Pen(Color.Red);
int width = ClientRectangle.Width;
int height= ClientRectangle.Height;
g.DrawLine(p, 0,0, width, height);
g.DrawLine(p, 0, height, width, 0);
p.Dispose();
}
private void InitializeComponent()
{
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.ClientSize = new System.Drawing.Size(300, 300);
this.Text = "BasicX";
this.Paint += new PaintEventHandler(this.BasicX_Paint);
}
[System.STAThreadAttribute()]
public static void Main()
{
Application.Run(new BasicX());
}
}
上述代码分成两个基本的步骤来创建示例程序。
首
先InitializeComponent 方法包含一些属性的设置和附加窗体Paint 事
件的处理过程。
注意,在方法中控件的样式也同时被设置,设置控件的样式也
是自定义Windows 窗体及控件行为的一种有效途径,譬如:控件的"ResizeRedraw"属性指示当窗体的大小变化发生以后需要对其完全进行重绘,
也就是说重绘时总是需要对整个窗体的客户区域进行重绘。
窗体的“客户区域”是指除了标题栏和边框的所有窗体区域。
可以进行一个有趣的试验,取消该控
件的属性然后再运行程序,我们可以很明显的看出为什么该属性会被经常的设置,因为窗体调整大小后的无效区域根本不会被重绘。
好了,我们需要注意一下BasicX_Paint方法,正如先前所提到的,
Paint 事件在程序需要重绘时被激活,程序窗体利用Paint事件来负责回应需要重绘的系统消息,BasicX_Paint方法的调用需要一个对象sender 和一个PaintEventArgs类型的变量,PaintEventArgs类的实例或称之为变量 e 封
装了两个重要的数据,第一个就是窗体的Graphics 对象,该对象表示窗体
可绘制的表面也称之为画布用于绘制诸如线、文本以及图像等,第二个数据就
是ClipRectangle,该Rectangle对象表示窗体上无效的的矩形范围,或者说
就是窗体需要重绘的区域。
记住,当窗体的ResizeRedDraw设置后,调整大小
后该ClipRectangle的大小实际就等于窗体整个客户区域的大小,或者是被其
它程序窗体遮盖的那部分剪切区域。
关于部分剪切区域的用处我们会在智能重
绘章节作更详细的阐述。
BasicX 示例程序的运行界面。