第10章 计算机绘图原理及其应用_第1页
第10章 计算机绘图原理及其应用_第2页
第10章 计算机绘图原理及其应用_第3页
第10章 计算机绘图原理及其应用_第4页
第10章 计算机绘图原理及其应用_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章

计算机绘图原理及其应用

北京理工大学计算机系金旭亮

主要内容

■计算机绘图原理

HGDIClock程序分析

»设计打印系统

2010-9-20北京理工大学计算机系(共98页)2

10.1计算机绘图原理

图形

蒙通过数学方法生成的规则的图案

什么是GDI+

HGDI:GraphicDeviceInterface

MGDI+是由.NETFramework中的

System.Drawing命名空间提供的一组类,它

使开发人员可以利用Windows内置的图形功

能轻松地创建图形应用程序。

2010-9-20北京理工大学计算机系(共98页)6

使用GDI+绘图

2010-9-20北京理工大学计算机系(共98页)7

GDI+命名空间

HSystem.Drawing

HSystem.Drawing.Drawing2D

施System.Drawing.Imaging

施System.Drawing.Printing

0System.Drawing.Text

菱System.Drawing.Design

所有这些名字空间都在动态链接库

System.Drawing.DLL中。

2010-9-20北京理工大学计算机系(共98页)8

绘图表面--Graphics对象(1)

HGraphics对象:

表示可视元素的绘图界面,所有可视元素的

实际呈现是由Graphics对象来完成的

,绘图表面的特性:

(1)长大宽

(2)分辨率:像素/英寸(PPD点/英寸(DPI)

(3)颜色深度

2010-9-20北京理工大学计算机系(共98页)9

绘图表面--Graphics对象(2)

,屏幕上的窗口

■送到打印机上的页面

鬣内存中的位图或图像

2010-9-20北京理工大学计算机系(共98页)10

获取Graphics对象

(1)从Paint事件的参数中获取

(2)用CreateGraphics方法创建(示例工程:

DrawOnButton)

(3)对Image对象调用Graphics.Fromlmage获取

(示例工程:DrawOnImage)

2010-9-20北京理工大学计算机系(共98页)11

图形重绘原理

as示例工程:PaintEvent

2010-9-2012

绘图基本数据结构

M点:Point(X,Y)与PointF

H矩形:Rectangle

左上角(X,Y)——右下角(X,Y)

»无所不在的矩形——每个可绘图的对象都有一

个矩形

HSize与SizeF

注意:为了避免累积误差,我们一般在图像处理当中采用

浮点坐标

2010-9-20北京理工大学计算机系(共98页)13

矩形的重要方法

部某点是否在矩形内?Contains

0矩形的放大与缩小:Inflate(为正放大,为负缩小)

DimrectAsNewRectangle(100,100,50z50)

Dimrect2AsRectangle=Rectangle.Inflate(rectz50,50)

2010-9-2014

矩形的重要方法

»求两个矩形的交集:Intersect

H求并集:Union

M平移:Offset

2010-9-20北京理工大学计算机系(共98页)15

颜色(1)

»颜色的RGB模型

基本颜色口

自定义颜色(Q)

色调©

饱和度⑤)

颜色亮度上)

确定添加到自定义颜色达)

2010-9-20北京理工大学计算机系(共98页)16

颜色(2)

颜色的HSB模型

i.Hue:色调0…360

2.Saturation:饱和度0…1

3.Brightness:亮度0…1

2010-9-20北京理工大学计算机系(共98页)17

使用颜色

H创建Color对象:

DimclrAsColor

clr=Color.FromArgb(255,255,0,255)

■另一个方法:

Color.FromKnownColor(•••)

2010-9-20北京理工大学计算机系(共98页)18

颜色的Alpha通道(1)

»Alpha表示所呈现图形后面的对象的透明度。

Alpha混合处理的颜色对于各种底纹和透明度

效果很有用。如果需要指定Alpha部分,则

它应为Color.FromArgb方法中四个参数的第

一个参数,并且需要从0到255之间的一个

整数

2010-9-20北京理工大学计算机系(共98页)19

颜色的Alpha通道(2)

»示例工程Alpha

2010-9-20-山小任一1-八千“歼4儿不、K?o〃一20

»笔用于描绘线条(示例:LineCap)

0

吗线条谓点和线型

2010-9-20北乐埋_L大字计舁机系(不比贝)21

画刷(1)

・画刷用于填充图形

H纹理画刷实例(MyArtist)

选取图像文件

2010-9-20北京理工大学计算机系(共98页)22

画刷(2)

H渐变画刷(示例工程:UseGradient)

2010-9-20北京理工大学计算机系(共98页)23

字体(1)

菱对联(实例:DuiLian)

2010-9-20北京理工大学计算机系(共98页)24

字体(2)

艺术字体(实例:BeautifulText)

吗艺术字体

厂竖行输出设置字体设置字体背景

Draw?

[水滴石穿,

水筒石穿/

2010-9-20北京理工大学计算机系(共98页)25

路径

菱GraphicsPath:此类封装了一系列相连接的直

线、曲线、圆弧等围成的图形

M示例工程UsePath

2010-9-20北京理工大学计算机系(共98页)26

区域

£示例工程:UseRegion

2010-9-20北京理工大学计算机系(共98页)27

区域的有限与无限

»展示Windows的“画笔”程序

“未命名-画图□0S

要获得帮助,话在“帮助”菜单中,单击“帮助主题”.264,49

2010-9-20北京理工大学计算机系(共98页)28

应用区域(1)

■给绘图表面指定一个文字形状的区域示例:

ArtistText

2010-9-20北京理工大学计算机系(共98页)29

应用区域(2)

H异形窗体(示例OtherShapeForm)

2010-9-20北京理工大学计算机系(共98页)30

坐标系(1)

»直角坐标系与屏幕坐标系

2010-9-20北京理工大学计算机系(共98页)31

坐标系(2)

as极坐标系

x-rcos0

y=/sin8

2010-9-20北京理工大学计算机系(共98页)32

坐标变换(1)

x平移:

g.TranslateTransform(100,75)

■£平移示例________________________百回留

原港发*

水平平移100像素,垂直平移75像素。

2010-9-20北京理工大学计算机系(共98页)33

坐标变换(2)

»平移的应用

■aForal-JteJSl

中国/、

2010-9-20北京理工大学计算机系(共98页)34

坐标平移代码

PrivateSubForml_Paint()Handles

MyBase.Paint

DimgAsGraphics

g=e.Graphics

g.TranslateTransform(-3,-3)

g.DrawString(〃中国人〃,NewFont(〃宋体〃,

80,FontStyle.Bold),Brushes.Red,100,100)

g.ResetTransform()

g.DrawString(〃中国人〃,NewFont(〃宋体〃,

80,FontStyle.Bold),Brushes.Black,100,100)

EndSub

2010-9-20北京理工大学计算机系(共98页)35

坐标变换(3)

H旋转

g.RotateTransform(45)

咽旋转示例曰回国

2010-9-20北京理工大学计算机系(共98页)36

坐标变换(4)

缩放:坐标系的缩放是指坐标原点不变,但

单位长度所占的像素数目有变化

’水平放大两倍,垂直放大三倍

g.ScaleTransform(2.OF,3.OF)

2010-9-20北京理工37

坐标变换(5)

复坐标变换综合实例(RotateText):

吗旋转的字体____________一回留

实现方法:

平移坐标系,将原

点移至屏幕中心,

Hello,World然后,再将坐标移

旋转45度,循环8次

2010-9-20北京理工大学计算机系(共98页)38

开发绘图程序必须注意

♦岂一个绘图对象使用完毕时,最好马上调用其Dispose方法。

0示例:

PrivateSubFormlPaint(ByVaisenderAsObject,ByVaie

AsSystem.Windows.Forms.PaintEventArgs)Handles

MyBase.Paint

DimgAsGraphics

g-e.Graphics

DimpAsNewPen(Color.Blue,7)

g.DrawLine(p,10,10,50,50)

p.Dispose()

EndSub

2010-9-20北京理工大学计算机系(共98页)39

绘制数学图案

简单的循环,创建奇特的效果

H实例CircleArea

2010-9-20北京理工大学计算机系(共98页)41

绘制函数图形

H示例工程DrawMathFunc

36x

/(x)=1+

(x+3)2

2010-9-20北京理工大学计算机系(共98页)42

绘制函数图形

0运行结果:

巧用递归

£实例DrawCircles

呜使用递归生成美丽的图案

开始绘制递归深度

2010-9-20北京理工大学计算机系(共98页)44

计算机图形学

0GDI+的坐标变换功能使我们可以很方便地平移、缩放

和旋转图形。

复通过附加一人变换矩阵,应用线性代数的方法,我们

可以把图形坐标映射到某种新坐标值上,从而创造出

变形的效果。

这个矩阵在GDI+中是一个Matrix类的实例,可以被传

送给Transform系列方法。

复更多的理论请去学习计算机图形学,然后,我们就可

以使用方便强大的GDI+创建让人目瞪口呆的计算机图

形。

复推荐钻研:分形算法

2010-9-20北京理工大学计算机系(共98页)45

补充材料:

分形技术简介

口分形之父:Mandelbrot(左上图:Voss为他做的分形头像)

□1975年出版分形几何专著《分形、机遇和维数》,标志着分形理论的诞生。

口分形是大自然的几何。

口右上图:著名的Mandelbrot集。这个点集均出自公式:Z^l=Z2n+C。他是曼德

勃罗教授在二十世纪七十年代发现的。只要你计算的点足够多,不管你把图案放

大多少倍,都能显示出更加复杂的局部.这些局部既与整体不同,又有某种相似的地

方,具有无穷无尽的细节和自相似性。

2010-9-20北京理工大学计算机系(共98页)47

分形概念

»通俗地讲,分形的本质就是局部同整体相似。

复分形是一种具有自相似特性的现象、图像或者

物理过程。也就是说,在分形中,每一组成部

分都在特征上和整体相似,只仅仅是变小了一

些而已。

麓局部都可以看成整体的副本。

2010-9-20北京理工大学计算机系(共98页)48

2010-9-20北京理工大学计算机系(共98页)49

2010-9-20北京理工大学计算机系(共98页)50

2010-9-20北京理工大学计算机系(共98页)51

2010-9-20北京理工大学计算机系(共98页)52

处理图像

怎样显示一幅图片

dimpicfilenameAsString

DimimgAsImage

'选择文件

img=NewBitmap(picfilename)

g.Drawlmage(img,0,0)

2010-9-20北京理工大学计算机系(共98页)55

缩放图像

■方法:

Drawlmage(图像对象,图像大小)

・代码:

g.Drawlmage(img,NewRectangle(0,0,

Me.Panell.Width,Me.Height))

2010-9-20北京理工大学计算机系(共98页)56

在图像上输出字

复获取图像对象所在容器的Graphics对象g,然

后,调用

2010-9-20北京理工大学计算机系(共98页)57

创建图像特效

蒙图像特效是依靠对图像的像素点直接进行操作

实现的。并可对像素进行数学变换

■其方法是:

调用GetPixel得到点的颜色,然后,进行相应

处理后,再用SetPixel写回到图像中

・实例:

加亮图片

2010-9-20北京理工大学计算机系(共98页)58

图像特效实例

M加亮图片:GetBrightPic

■L加亮图片・回国I

2010-9-20北京理工大学计算机系(共98页)59

使用GDI+播放动画

HGIFPlayer

QGIF播放器

2010-9-20北京理工大学计算机系(共98页)60

GIFPlayer程序分析

H使用ImageAnimator类来播放GIF动画

・使用动态事件绑定来进行画面切换

H在Form的Resize过程中创建Graphics对象

2010-9-20北京理工大学计算机系(共98页)61

10.2GDIClock程序分析

GDI+综合实例分析:小闹钟

2010-9-20北京理工大学计算机系(共98页)63

基本原理

»使用GDI+绘制图形

»使用时钟激发事件

2010-9-20北京理工大学计算机系(共98页)64

如何实现程序的自动运行一背景

»什么叫注册表?展示注册表的结构与作用

注册表是一个存储设备,包含有关应用程序、用

户和默认系统设置的信息。例如,应用程序可以

使用注册表来存储在应用程序关闭后需要保留的

信息,并在应用程序重新加载时访问那些同样的

信息。

■注册表的生死轮回回到DOS时代

2010-9-20北京理工大学计算机系(共98页)65

如何实现程序的自动运行(方案)

»实现程序自动运行的基本方法:

(1)修改注册表

(2)将程序放入“启动”菜单

(3)将程序开发为Windows服务

(4)做成病毒

2010-9-20北京理工大学计算机系(共98页)66

如何实现程序的自动运行(实现)

建要点:

利用注册表实现程序的开机自动运行

■使用System.Win32.Registry类访问注册表

■实际代码:在类RegSettings中。

2010-9-20北京理工大学计算机系(共98页)67

如何实现程序退出时保存设置

»每次程序运行时都自动保存上次的设置参数,

这是如何做到的?

■方案:

可以利用配置文件

2010-9-20北京理工大学计算机系(共98页)68

配置文件的内容

<configuration>

<appSettings>

<addkey="Top"value="326"/>

<addkey="Left"value=“518〃/>

<addkey二〃Width"value=〃192”/>

<addkey="Height“value="166"/>

<addkey="FillColor“value二〃LightYellow”/>

<addkey二〃TextColor"value=〃T6777216”/>

</appSettings>

</configuration>

2010-9-20北京理工大学计算机系(共98页)69

程序退出时保存设置(实现)

»存取配置文件:AppSettings类中的代码,这

里使用了XML技术,创建XMLDocumet,然后使

用XPath来存取信息。

»窗体的LoadSettings()用于实现装入配置信

息,在窗体的Load事件中运行。

施SaveSettings(),在窗体的Closing事件中

、一/一

三仃。

2010-9-20北京理工大学计算机系(共98页)70

程序退出时保存设置(改进)

»此程序现在不能保存渐变填充设置,请加上此

功能

2010-9-20北京理工大学计算机系(共98页)71

创建自画菜单

・基本原理:

(1)OwnerDraw属性

(2)Measureltem事件决定菜单项的大小

(3)Drawltem事件绘出菜单

2010-9-20北京理工大学计算机系(共98页)72

绘制时钟

»整个时钟的代码被封装成一个类

2010-9-20北京理工大学计算机系(共98页)73

何时绘制时钟?

H主窗体的frmClock_Paint事件过程

Me.SetStyle(Controlstyles.ResizeRedraw,

True),在改变窗体大小时重绘

罐Draw。有两个重载的方法,一个用于绘制数字

时钟,一个用于绘制模拟时钟

2010-9-20北京理工大学计算机系(共98页)74

怎样实现平滑的时钟显示?

夏关键处理好Paint事件

,导致窗体闪烁的罪魁祸首是谁?

解决之道:

(1)只重绘部分区域

(2)使用抠俊冲/

2010-9-20北京理工大学计算机系(共98页)75

在Clock类中

H在Draw。中设定InvalidRegion属性

,在任何需要重绘的地方,调用:

ParentForm.Invalidate(InvalidRegion)

2010-9-20北京理工大学计算机系(共98页)76

使用双缓冲

■示例中问题的解决方案

蒙在FormLoad过程中使用双缓冲

Me.SetStyle(Controlstyles.AHPaintinglnWmPaintOr

Controlstyles.UserPaintOrControlstyles.DoubleBuffer,

True)

2010-9-20北京理工大学计算机系(共98页)77

怎样显示或不显示窗体边框?

・再次利用窗体的Region属性,代码在:

PublicSubClipForm(ByVaiClipAsBoolean)

由ToggleFrame()所调用。

2010-9-20北京理工大学计算机系(共98页)78

绘制时钟

»数学中的知识:坐标变换

»请自行研究相关代码

2010-9-20北京理工大学计算机系(共98页)79

让时钟“走”

PublicSubNew(ByVaiParentAsForm)

ParentForm=Parent

ClockTimer二NewTimer()

ClockTimer.Interval=100,注意:为何不是一^秒?

AddHandlerClockTimer.Tick,AddressOfClockTimerTick

ClockTimer.Enabled=True

EndSub

2010-9-20北京理工大学计算机系(共98页)80

实现闹钟

HClockTimer_Tick()中处理时间到,通过设

置ClockFiliBrush属性并刷新实现闪烁

2010-9-20北京理工大学计算机系(共98页)81

释放资源

HPrivateSubDispose()Implements

IDisposable.Dispose

2010-9-20北京理工大学计算机系(共98页)82

可能的改进

,如何将此程序放入托盘中?

■给程序加上音乐闹钟功能

蒙封装此Clock为DLL,并提供可以激发的事件接

口,定时提醒。

2010-9-20北京理工大学计算机系(共98页)83

10.3设计打印系统

编程实现打印的基本原理

H获取打印机Graphics对象

H在打印机Graphics对象上绘图

2010-9-20北京理工大学计算机系(共98页)85

文件打印

器思索:

为何打印的类全部放在

ImportsSystem.Drawing.Printing下?

,这是因为绘图与打印本质是一样的。

38求同存异的思维方式

2010-9-20北京理工大学计算机系(共98页)86

打印文本与图形

H示例工程:PrintExamplel

2010-9-20北京理工大学计算机系(共98页)87

打印作业与打印事件

照在・net框架的打印模块中,打印的内容是由应

用程序逻辑直接提供的。打印作业是由

PrintDocument.Print方法初始化的,这就开始

了打印作业,然后,引发一个戢多个PrintPage

事件。通过在此事件中提供处理代码,就能指

定要打印的内容。

蠹打印作业中的每个页面都会引发一个PrintPage

事件,所以,方法必须能够实现某些功能以跟

踪打印作业,并且确保被打印的多页面文档的

页面连续。否则,文档的第一页将会被打印多

次。

2010-9-20北京理工大学计算机系(共98页)88

使用PrintDocument组件

使用PrintDocumentl_PrintPage()事件向打印

机传送数据,注意其参数e的类型

2010-9-20北京理工大学计算机系(共98页)89

PringPageEventArgs对象

»与打印相关的信息被封装到

PringPageEventArgs对象中。使用其Graphic

对象可以绘图。

H通过计算基于MarginBounds方框的打印坐标,

可以指定打印发生在页边距之内。发生在页边

距之外的打印,如页眉和页脚,可以通过计算

基于PageBounds方框的打印坐标来指定。

2010-9-20北京理工大学计算机系(共98页)90

使用PrintDocument组件

»HasMorePage属性用于控制是否继续激发

PrintPage事件。

2010-9-20北京理工大学计算机系(共98页)91

控制打印

H示例工程PrinterExample3

2010-9-20北京理工大学计算机系(共98页)92

打印预览

H实例:PrintExample5

噌打印预览阳

/Q,圆国画图画一―亲记一页目

;?n:

1••G・,ff•»*t—।

:i::ru;;nrzn^4l^:x»r3:=■:

««m«.AWBa«*<«at;«••一«■«,i.•*'!•0.■*■«

••-■—,«.v•••MLtr«*MiRU«*««^

••••»••«・••«••**•••»..■••••••

•**««•»•-•・•,«>V9・.y•・・・》・・,・a”・・,ww・・・・o6

**••M«o0・4・(*♦

■・♦・,••>•■•-.4WW••«

♦♦♦♦W•••'«T

•**-9TUK»vr*.•«>*'•,>9•■«*,w・w

•・X・«•»•W»«.V»«W.•«*.«♦.

•V■*«*••»J•:0'E(■・--•*««•«■«*T

♦■■・,i»vatx»««•->*••-•«^*rv«A

・1・,A4•<*v:»<—wwi*r-»wr4ut1:«rrt«>tM»>

•*«■-V*BeBJL»»fMWM)»•*|

••••••••••••Uwwt-*a-««7•«r-«・••

・・・,・»、,»♦・・«/«•*■•'•#<4・,«-,4F,・・・•♦•*••4M«

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论