1 / 121

计算机图形学

计算机图形学. 一 . 教学目的 计算机图形学是一门理论性、实用性强的学科且具有非常广泛的应用领域,是计算机科学与技术专业重要课程之一。介绍计算机图形学的主要教学目的是使我们掌握计算机图形学的基本理论及其图形绘制程序设计的相关方法技术 ,培养计算机科学与技术的应用能力。为图形学的进一步的应用研究打下良好的理论基础与图形软件设计基础。. 二 . 教学路线与教学内容. 图 形 系 统. 硬件 软件. 基本 图形 程序 设计. 图形程序设计语言 简单图形程序设计 与分析. 计 算 机 图 形 学. 二维图形生成算法原理. 三 维 图 形

naiya
Download Presentation

计算机图形学

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 计算机图形学 一.教学目的 计算机图形学是一门理论性、实用性强的学科且具有非常广泛的应用领域,是计算机科学与技术专业重要课程之一。介绍计算机图形学的主要教学目的是使我们掌握计算机图形学的基本理论及其图形绘制程序设计的相关方法技术 ,培养计算机科学与技术的应用能力。为图形学的进一步的应用研究打下良好的理论基础与图形软件设计基础。

  2. 二.教学路线与教学内容 图 形 系 统 硬件 软件 基本 图形 程序 设计 图形程序设计语言 简单图形程序设计 与分析 计 算 机 图 形 学 二维图形生成算法原理 三 维 图 形 设 计 三维形体表示 几何投影变换 三维图形消隐 真实感图形生成技术 图 形 变 换 二维图形变换 三维图形变换 图形裁剪

  3. 三 教学要求 与成绩评价 • 1 要求认真完成上机实习作业并写好实习报告。 报告编写的内容: 1)作业内容 2) 图形算法与图形 程序设计分析 3)主要图形程序源码 4) 图形成果 5)上机实习总结 • 2 成绩评定由出勤率、实习作业和考试三部分组成。出勤率、实习作业成绩20~30%,考试成绩占70~80%

  4. 第一章 绪 论 1、1 计算机图形学与图像处理 1 计算机图形学 (1)计算机图形学:是真实物体或虚构物体的图形综合技术。 综合技术包括: 图形数据结构 算法与程序设计 图形处理 变换与消隐技术 图形显示输出处理技术 (2)计算机图形学的处理过程

  5. 2 计算机图像处理技术 (1)图像处理:是利用计算机对图像信息进行加工与处理,以满足人的视觉心理和实际应用的要求的一门技术。 (2)图像处理技术研究方法有: • 图像增强技术 是一种采用一系列技术 去改善图像的视觉效果或将图像转换成一种更适合于人眼观察和机器自动分析的形式。 • 图像变换 是将图像从一个空间基变换到另一个空间基,以达到图像的进一步的分析处理(如时域转换到频率域)。 • 图像恢复 是一种恢复图像在形成、传输和记录过程中多种原因影响,造成图像的质量下降(图像模糊、失真、有噪声等)的还原技术。 • 图像分析 是一种分析图像中感兴趣的物体的特征或性质的技术(如图像纹理、形状和结构分析)。

  6. 图像分类 • 是利用计算机对图像进行定量分析,把图像中的每个像元或区域划归为若干类别,以判读图像表示的客观物体的一种技术。 • 图像识别 • 是利用计算机识别图像中的物体的一种研究技术(如人脸识别、车牌照识别等人工智能的方法技术)。 (3)计算机图像处理技术 的过程

  7. 3 计算机图形学与图像处理技术的关系 1、计算机图形技术与图像处理技术过程的互逆关系 2、计算机图形学与图像处理的研究都是建立在对物体与景物的描述基础上 3、计算机图形学与图像处理的方法研究重点不同 4、计算机图形与图像具有许多相同的应用 1.2 计算机图形技术的应用与发展动向 1.2.1计算机图形技术的应用 1、在计算机辅助设计与制造(CAD/CAM)中的应用 2、日常事物管理中的应用 3、科学计算可视化的应用 4、医学图像处理的应用 5、过程控制 6、自然资源调查与监控 7、影视文艺 1.2.2计算机图形技术发展动向

  8. 1.3 计算机图形系统 1.3.1 计算机图形系统的组成 简单地说,计算机图形系统由硬件系统(计算机主机、图形输入/输出设备)和软件系统(图形处理、算法程序系统及其支持软件系统)组成。

  9. 1.3.2计算机图形系统的基本功能 作为一个基本计算机图形系统应具有五个方面的功能 : 1。计算功能 2。数据存储与管理功能 3。输入功能 4。输出功能 5。交互对话功能 1.3.3 计算机绘图系统输入与输出设备。 1.3.3.1输出设备 生成图形的最主要输出设备有显示器和绘图机。本节主要介绍图形显示器与绘图机生成图形的简单基本原理。

  10. 1、图形显示器 (1) CRT(阴极射线管 ) CRT是构成图形显示器的重要部件, CRT的主要组成是由电子枪、偏转系统、荧光屏等三大重要部分组成(如图1.4所示)。

  11. ① 电子枪 电子枪是由灯丝、阴极、控制栅与聚焦系统组成 。电流通过灯丝产生热量,对阴极加热而发射出电子束。电子束进入控制栅,通过聚焦系统,聚焦极上加有一定的正电压,使分散在各个方向上的电子束聚焦为极细的电子束。再由加速极加上正电压对电子束加速,使它具有足够的能量射向荧光屏,从而在荧光屏上形成一个细小的光点。 ② 偏转系统 偏转系统由垂直偏转系统和水平偏转系统组成 。磁偏转系统则是外部偏转系统,它有两个线圈在管颈上(如图1.5),当电子束通过线圈时,一个线圈的磁场使电子束产生水平偏转,另一个则使之产生垂直偏转。 ③ 荧光屏 荧光屏是CRT产生图形亮点的组成部分。荧光屏上涂有一层荧光粉,当荧光屏被带高压电子束轰击,荧光粉发出亮光而形成光点。

  12. CRT偏转灵敏度 CRT偏转灵敏度示反映信号所能产生的偏转角度的 大小。解决灵敏度的途径 1。增长电子枪的长度 2。增加电子束的速度 彩色CRT 彩色的产生一般是由三种基色(R、G、B)。由此构 成三个电子枪,即为三基色电子枪,三种基色作用于同一 点而产生混合的彩色,而构成彩色的CRT。 目前采用的方法有: 1。射线穿透法:是根据电子射线穿透屏幕上的荧光 层的深浅来形成彩色(广泛用于随机扫描显示器)。 2。影孔板法:十三个不同颜色的电子枪产生三个荧 光电发出三基色而构成(广泛用于光栅扫描显示器)。

  13. (2)光栅扫描显示器 ①光栅扫描显示器的基本结构 ②彩色图形的生成 光栅扫描显示器主要关键部件。它是由帧缓冲存储器与CRT组成,CRT整个屏面是一个M×N像点(Pixel)组成(通常称为Bitmap)。某个像点对应着帧缓冲存储器中若干位,对于黑色显示器来说,则对应的是一位,若该位为0表示该像点为暗,为1时,则表示该像点为亮。由此产生的图像,称为二值图像。对于彩色显示器分别控制三个原色(RGB红绿蓝)的不同灰度进行比例合成,则可构成2n×2n×2n种不同彩色。显然,若取 n=8位,光栅扫描显示器则基本可模拟自然光色生成真实感的图像。光栅扫描显示器彩色图像生成原理如图所示。

  14. (3)彩色表技术 对于彩色显示器要分别控制三个原色,并且每个原色 有256种灰度级,即每个原色就要占帧缓存单元8位,三个原 色则占24位,若屏幕分辨率800×600象素点,则需要800×600 占24位的单元。因此,要求帧缓存空间就很大,显然,其价格 就会有较大增加。为此,人们采用了彩色表技术。如图所示

  15. 彩色表地址 光栅扫描显示器最突出的优点是:它不仅可以显示物体的轮廓线、 特征线等所谓的线框图形,而且由于其每一象素点的灰度或色彩 可以控制,因而可以显示被多种灰度和色调的象素填充的真实感 图形。另外,它可以和电视兼容,价格远低于随机扫描器。自80 年以来,普遍广泛应用的一种市场主流显示器。

  16. 3、绘图机 • 绘图机是计算机输出图纸的一种重要图形输出设备。目前主要有笔式绘图机、静电绘图机和喷墨绘图机等。 • 笔式绘图机 笔式绘图机是一种矢量型 绘图设备,图形的生成是 依靠绘图笔相对图纸作图 形的轨迹运动。 其工作原 理 如图所示。

  17. 静电绘图机 笔式绘图机是一种矢量型的绘图机,而静电绘图机则是一种基于光栅式的绘图机。其基本作用原理是应用电荷同极相斥、异极相吸的原理。在绘图过程中,绘图数据首先送到电极上,电极内装有许多电 极针,由输入的 绘图数据控制其 中的某些电极针 放出高电压,其 余则不放电,从 而在经过带负电 荷的图纸上产生 图形潜像。

  18. 喷墨绘图机 • 喷墨绘图机的基本原理是,利用喷头把经雾化处理的墨水按需要喷射到图纸上。从而形成图形或字符。墨雾喷射分为连续和随机两种方式。连续喷射方式的工作原理与光栅扫描类似,喷头不间断地把墨雾喷射出去,当无图形或字符点阵信号时,墨水将被充电,充电后的微细墨滴被偏转电极改变方向不射到图纸上,而是通过墨水回收装置回收。反之,若有图形或字符点阵信号时,则墨水不被充电,此时墨滴将直接喷射到图纸的相应位置上形成图形或字符。随机方式的工作原理与随机扫描类似,喷头只在需要时才把墨水喷射出去。

  19. 1.3.3.2输入设备 • (1)鼠标 • (2)坐标数字化仪 坐标数字化仪(digitizer)是常见的定位设备,其中全电子式坐标数字化仪由于精度高,使用方便,得到普遍应用。这种设备利用电磁感应原理,在台板的x,y方向上有许多平行的印刷线,每隔200µm一条。游标中装有一个线圈,当线圈中通有交流信号时,十字丝的中心便产生一个电磁场,当游标在台板上运动时,台板下的印刷线上就会产生感应电流。印刷板周围的多路开关等线路可以检测出最大信号的位置,即十字叉线中心所在的位置,从而得到该点的坐标值,依此一张图纸便可实现数字化信息输入计算机。

  20. 1.3.4 计算机绘图软件系统 图形软件与其它软件系统一样具有良好层次结构和模块结构。其系统由若干层次,每个层次又分为若干模块集合而 成,如图所示。 1、操作系统 2、图形设备驱动软件 3、图元生成基本函数库 4、功能函数库 5、应用软件

  21. 第二章C++ Builder语言与图形设计 2.1 基本概念与操作界面 2.1.1 基本概念 1、窗体 (Windows) 2、属性 3、方法 4、事件和事件句柄 2.1.2 C++ Builder操作界面(如图2.1所示) 1.主操作界面 区 (1)菜单区: C++ Builder菜单含有10个主菜单。

  22. (2)工具栏区 (3)C++ Builder组件区 (4)Object Inspector对象浏览窗口区 (5)窗体 窗体是构成应用程序的主操作界面或应用程序风格的包容器 。窗体一旦建立,它就定义了一个标准应用程序窗口组件TForm类,TForm类,它既是一个具有强大管理功能的类,也是用户可用于图形操作区域。 (6)代码窗口 代码(Code)窗口是建立事件处理的代码编辑窗口 。 (7)工程管理窗口 工程管理(Project Manager)窗口是用于管理工程中的各类文件的增加、删除和打开。该窗口可以使用菜单“View/Project Manager”激活 。

  23. 2.2 创建C++ Builder应用程序 在可视化语言程序设计中,创建一个应用程序往往称为一项工程。工程中包含着源代码程序(.CPP)、包含文件(.h)和资源文件(.res)等,管理这些文件的文件称为工程文件。 2.3用户界面设计 用户界面设计是图形程序设计的一个重要方面,通常包括菜单设计、工具栏设计、状态栏设计、对话框及其窗体布局风格设计及鼠标操作设计等。

  24. 2.3用户界面设计 2.3.1 菜单设计 菜单是体现应用程序功能的表现及其应用交互方式之一。菜单可分为主菜单和弹出菜单。 (1)主菜单(Main Menu):是一种显式菜单,一般布局在窗体顶部。 (2)弹出菜单(Popup Menu):是一种隐式菜单,只有当按下鼠标右键,才能弹出菜单选项。 (3)增加菜单事件处理: 2.3.2 工具栏设计 2.3.3 状态栏设计与应用

  25. 2.3.4 窗体布局的设计 窗体是一个包容体,它不仅包容了上面介绍的菜单栏、工具栏及其状态栏之外,还可以对于窗体的中间区域,根据应用程序要求需要设计自己的组件布局。我们称这种组件布局设计为窗体布局设计。例如: 第一步:选择“Additional”组件页中的“Scroll Box”组件。 第二步:根据需求对对象浏览(Object Inspector)窗口中出现的Scroll Box1类的属性项进行修改。 第三步:选择“Additional”组件页中的“Image”组件。 第四步:根据需求对对象浏览(Object Inspector)窗口中出现的Image类的属性项进行修改。 本窗体布局设计仅是一个简单实例,在进行窗体布局设计中,对于组件的安放顺序,哪类组件安放于哪类组件之上是有区别的。例如:上面的“Image”组件是不能安放在“Scroll Box”之上。

  26. 2.3.5 对话框的设计 对话框在图形应用程序中,是十分有用的一种交互通信界面。对话框有模态对话框和非模态对话框。 第一步:选择菜单“Fiel/New”并单击鼠标左键,弹出“New Items”窗口。 第二步:用户选择“New Items”窗口中“Dialogs”标签按钮 。 第三步:根据用户的需要设 计对话框的组件布局 。 对话框一旦创建, 它能被作为一个对象类 可在任何处理对象(即 在用户所需要对话框的 地方)中声明与操作。 例如下面的应用如图所示:

  27. 2.4 C++ Builder基本图形与图像类 C++ Builder图形图像绘制主要与下面介绍的几个基本图形图像类有十分紧密的关系。 2.4.1 Tpen类 Tpen类是C++ Builder描述Windows的画笔所具有的画线特性。 Tpen类属性与方法 属性或方法 说 明 Color 决定用来在画布上画线的颜色 Style 决定画笔在画布上画线的线形。其线形属性值见表2.2 Width 指定画笔画线的最大像素宽度。若被设置小1,则默认为1。 Mode 决定画笔在画布上画线的模式。模式的种类有16中种。 Handle 指定Window画笔对象的句柄。 ~Tpen 删除一个Tpen类的实例。 Tpen 创建一个Tpen类的实例。 Assign 赋值另一个Tpen对象的画笔属性。

  28. 2.4.1 TBrush类 TBrush类是C++ Builder描述Windows的画刷所具有的填充特性。 TBrush类属性与方法 属性或方法 说 明 Color 指定填充的颜色 Style 指定填充式样 Bitmap 指定填充图案。 ~TBrush 释放TBrush。 TBrush 创建一个TBrush实例。 Assign 赋值另一个TBrush对象的属性。

  29. 2.4.3 TCanvas类 TCanvas类是生成图形图像的重要类,它封装了许多基本图形图像的绘制方法与属性 (如画笔、画刷 、字体、基本图形功能函数)。 (1)抬笔移到点(x,y) Tcanvs::MoveTo (x,y) 。 (2)落笔画线到点(x,y) Tcanvs:: LineTo (x,y). (3) 画圆弧或椭圆弧 Tcanvas::Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) 例如: Canvas->Arc(50,50,100,100,100,75,75,50); 画0~900圆弧 Canvas->Arc(160,50,260,150,210,50,210, 150); 画900~3600圆弧 • 画由圆弧或椭圆弧与连线两端交点构成的区域 Tcanvas::Chord(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)

  30. 其中参数(x1,y1)、(x2,y2) 确定画圆弧或椭圆弧的矩形区;(x3,y3)、(x4,y4)直线确定与画圆弧或椭圆弧的两个交点,画圆弧或椭圆弧方向按逆时钟方向。 • 例如: Canvas->Chord(50,50,100,100,100,75,75,50); Canvas->Chord(160,50,310,150,310,50,160,150);

  31. (5) 在指定的矩形区内画一个圆或椭圆: Tcanvas::Ellipse(int x1,int y1,int x2, int y2) 其中参数(x1,y1),(x2,y2)是矩形的左上角与右下角坐标。 (6) 使用当前刷子(Brush)填充矩形区域: Tcanvas::FillRect(Trect &rect) (7) 画一个矩形边框,其内部不用Brush属性填充。 TCanvas::FrameRect(Trect &rect) 其中参数rect 是一个 Trect (x1,y1,x2,y2) 类.例如: TRect rect=Trect(50,50,100,100); Canvas->Brush->Style=3; Canvas->FillRect(rect); rect.x1=150; rect.y1=50; rect.x2=250; rect.y2=100; Canvas->FramRect(rect);

  32. (8)画一个扇形 Tcanvas::Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) (x1,y1)和(x2,y2)确定园或椭圆的矩形区域。(x3,y3)和(x4,y4)确定弧的起点与终点,逆时针方向构成的扇形。例如下面程序代码段: Canvas->Brush->Style=3; Canvas-> Pie(50,50,150,150,150,100,100,50); (9) 画一个封闭的多边形,并自动用当前刷子(Brush)填充。 Tcanvas::Polygon(TPoint *point,int n) 其中,*point:是指向封闭多边形顶点坐标指针; n:是多边形的变数,如下面是绘 . (10) 画一个封闭的多边形的连线 Tcanvas::Polyline (Tpoint* Point, ,int n) 与Polygon不同的只是不作填充,其画法与参数含义完全一样。 (11)画由左上角(x1,y1)和右下角(x2,y2)确定的用当前刷子填充矩形. Tcanvas::Rectangle(int x1,int y1;int x2,int y2):

  33. TCanvas::FloodFill(int x, int y, TColor color, TFillStyle Fillstyle) • 使用Bursh属性的数值对以点(x, y)开始向外扩充,直到遇到color参数指定的颜色边界时停止的一个非矩形区域进行填充。其中参数: • X, y: 指定被填充区域内的任意种子点 • Color:指定的边界停止的边界颜色 • FillStyle:用于确定边界颜色变化类型。它两个取值: • fsSurface:填充所有由color参数指定的颜色区域。当遇到另一种颜色时停止。 • fsBorder:填充所有由color参数指定的颜色区域。当遇到Color参数指定的颜色边界时停止。 • (14)TCanvas::PolyBezier(TPoint *points, int n) • 画一簇Bezier曲线

  34. (12)画倒圆角矩形 Tcanvas::RounRect(int x1,int y1;int x2,int y2;int width;int height) Width:倒圆宽度 height:倒圆高度 (13) 在指定的位置(X,Y)按当前字体输出文本字符串 Tcanvas::Textuot(int x,int y,char*string) (14) 在一个剪切矩形区域内输出一个文本字符串 Tcanvas:: TextRect(Trect &rect, int x,int y,char*string) (15) 获取当前字体表示的字符串的像素宽度和像素高度 TSize Tcanvas::TextExtent (char*str) 例如: TRect rect; TSize size; Char *string=“这是一个C++ Builder程序”; Size= TextExtent(string); rect= Trect(50,50,size.cx+50,size.cy+50); Canvas-> TextRect(rect,50,50, string);

  35. (16) 在给定的坐标(x,y)位置处输出由graphic参数指定的图像 TCanvas::Draw(int x,int y,TGraphic* graphic) 其中参数Graphic:是一个指向图像的指针,图像可以是位图类(TBitmap)、图标(TIcon)和图元文件。例如: Graphics::TBitmap *bitmap; bitmap= new Graphics::TBitmap(); if(OpenDialog1->Execute()) { // 打开文件选择对话框并选择.BMP文件 bitmap->LoadFromFile(OpenDialog1->FileName.c_str()); // 装入位图 Canvas->Draw(0,0,bitmap); }

  36. TBitmap类 TCanvas canvas; Int Height; Int Width; Bool Empty;指定位图对象是否包含一个位图 LoadFormFile(AnsiString filename); SaveToFile(const AnsiString Filename);

  37. TFont类 TColor Color : 指定文本的颜色 String Nam: 指定字体名 Int Height:指定字体的高度(为字符高度+行距) Int Size: 指定字体的大小(只指字符高度) Int Style: 字体属性 • fsBold The font is boldfaced. (黑体显示) fsItalic The font is italicized. (斜体显示) fsUnderline The font is underlined. (带下划线显示) fsStrikeOut The font is displayed with a horizontal line through it. (字体中间有一条横线)

  38. 2.5 C++ Builder图形程序设计 第二章介绍了C++ Builder关于图形图像主要对象类及其它们的主要属性和方法。本章将应用C++ Builder图形图像对象类讨论C++ Builder图形应用程序的设计方法与步骤。下面主要从平面曲线的绘制和统计图的绘制两个方面进行分析与讨论,使我们初步掌握C++Builder图形应用程序的设计基本步骤。 2.5.1平面曲线图绘制程序设计 2.5.1.1抛物线的绘制 1.数学模型分析 抛物线标准方程为:Y=x2/4p 离散化 yi=xi/4p xi=i*dx i=0,1,……,n 2、图形绘制范围确定 X1=-(YH/2*4p)1/2 X2= (YH/2*4p)1/2

  39. 3、程序设计

  40. 4.程序设计步骤 第一步:选择“File/New”菜单创建一个工程项目文件T301。在创 建后的窗体菜单条上创建主菜单“平面曲线”和子菜单项“抛物线”。 第二步:选择“File/New”菜单的对话框的“Dialogs”标签,设计参 数输入对话框。保存文件名为“ParDialog”。 第三步:增加TMainForm类的变量XL、YH、P、N说明。其 方法是在类专家管理器中,鼠标光标移动至“TMainForm”上,按 下右键,选择“NewField”,弹出对话框。依照对话框的内容填写 “FieldName”和“Type”,并可选择成员类型,按“OK”键结束一次变量的添加。依次上述过程添加全部变量。 第四步:增加绘制抛物线的方法成员。其增加方法是:在类专家 管理器中,鼠标光标移动至“TMainForm”上,按下右键,选择 “NewMathod”,弹出对话框。依照对话框的内容填写,在 “MethodName”中填写 “DrawCurve”,在“Arguments” 中填写参变 量类型和变量名(因本例因无参数,则不填写)及其其它内容的 选择。选择后,按“OK”键。代码窗中,即刻显示该方法名 (MethodName)的成员函数的框架。

  41. 2.5.1.2 直方图的绘制 1.建立图形的数学模型 ⑴ 矩形条x坐标确定: 由图3.12假设N是直方图的组数M,每组中的对象特征个数N,设dx是绘制对象特征矩形条的宽度,组间距离Ds。由此可得出下式: Dx=XL/((M+A)*n) Ds=A*dx (3-8) Xij=I*(M*dx+ds)+j*dx+X0 Yscale=YH/Vmax Yij=Y0-vij*Yscale 其中: A:是组间距与矩形宽度的比值。 Vmax:统计的最大值,vij:统计值 XL:是绘图区域的宽度 , YH: 是绘图区域的高度

  42. 2.确定矩形坐标 • 由上面的数学模型定义不难得对象特征矩形轮廓顶点坐标是: • X1=I*(M*dx+ds)+j*dx+x0 • Y1=y0; • X2=x1+dx; • Y2=y0-vij*Yscale • 3.统计直方图程序N-S图

  43. 第三章 二维图形生成技术 4.1 直线生成技术 1.逐点比较法 对于第一象限: d<0时,画笔向+y方向移一步 则: d>0时,画笔向+x方向移一步则: A M’ M

  44. 2.数值微分(DDA)法 dt ti 1 t 1)简单DDA法

  45. DDA(int x1,int y1,int x2, int y2) { int xinc,yinc,x,y,i; float k,dx,dy; dx=abs(x2-x1); dy=abs(y2-y1); k=dx; if (dy>dx) k=dy; xinc=int(dx/k); yinc=int(dy/k); x=x1; y=y1; Image1->Canvas->Pixels[x][y]=RGB(255,0,0); for(i=1;i<=k;i++) { x=x+xinc; y=y+yinc; Image1->Canvas->Pixels[x][y]=RGB(255,0,0); } }

  46. 3. Bresenham 法 1)基本思想:在某一计长方向上每次必变化1个单位,另一个方向上的变化通过计算得到。 2) 递推关系式 如图所示,依据直线的逼近的最近的原则,现在要决定下一个点是T还是S。右图可以看出: 如s<t,则为S。如t>=s 则为T。由此, d=s-t 当d>0 则下一个点是T,否则 下一个点是S。由直线方程: y=dy/dx*x 可分别求得: 整理得: T(xi-1+1,yj-1+1) t s P(xi-1,yj-1) S(xi-1+1,yj-1)

  47. 由于dx为正,则上式改写:

  48. 输入参数:xc,yc,a,b,ts,te和椭圆的旋转角 q和dt n=(te-ts)/dt+0.5; a1=a*cos(ts*0.0174533); a2=cos(q*0.0174533); b1=b*sin(ts); b2=sin(q*0.0174533); N n==0 Y n=6.28319/dt+0.5 x=xc+a1*a2-b1*b2 y=yc+a1*b2+b1*a2; MoveTo(x,y); I=0;I<n;I++ t=I*dt; a1=a*cos(t) ; b1=b*sin(t); x=xc+a1*a2-b1*b2; y=yc+a1*b1+b1*a2; LineTo(x,y);

  49. void __fastcall TForm1::BLine(int xs, int ys, int xe, int ye, TColor color) { int i,x,y,f; float xinc,yinc; dx=abs(xe-xs); dy=abs(ye-ys); x=xs; y=ys; if((xe-xs)>=0) s1=1; else s1=-1; if((ye-ys)>=0) s2=1; else s2=-1; if(dy>dx) {swap(&dx,&dy);flag=1;}else flag=0; f =2*dy-dx; for(i=1;i<=dx;i++) {

More Related