计算机图形学作业
计算机图形学上机作业

计算机图形学(选作以下任意1—11题)1 用中点Bresenham 算法设计直线、圆、椭圆的算法,实现任意斜率的直线、圆、椭圆的绘制;2 使用有效边表算法填充多边形。
多边形的7个顶点分别为:P 0(500,400), P 1(350,600), P 2(250,350), P 3(350,50), P 4(500,250), P 5(700,50), P 6(800,450)。
3 使用四邻接点填充算法填充上述多边形。
4 在屏幕中心显示矩形窗口,使用Cohen-Sutherland 直线段裁剪算法实现任意直线的裁剪5 在屏幕中心显示矩形窗口,使用中点分割直线裁剪算法实现任意直线的裁剪6 在屏幕中心显示矩形窗口,使用梁友栋-Barsky 直线段裁剪算法实现任意直线的裁剪7使用斜等侧投影绘制图1所示多面体的投影图及其三视图,要求使用矩阵变换方法编程实现。
图1 图28 已知17个型值点:P 1(-360,0),P 2(-315,-71),P 3(-270,-100),P 4(-225,-71),P 5(-180,0),P 6(-135,71),P 7(-90,100),P 8(-45,71),P 9(0,0),P 10(45,-71),P 11(90,-100),P 12(135,-71),P 13(180,0),P 14(225,71),P 15(270,100),P 16(315,71),P 17(360,0)。
边界条件为:自由端。
编程绘制通过给定型值点的三次参数样条曲线和正弦曲线,试比较二者之间差异。
9 根据三次Bezier 曲线的基函数,编程绘制如图2所示三次Bezier 曲线。
10. 给定9个控制点:P0(150,350),P 1(250,250),P 2(350,350),P 3(428,167),P 4(525,440),P 5(650,250),P 6(682,40),P 7(850,450),P 8(950,350)。
(完整word版)《计算机图形学》练习测试题及参考答案

《计算机图形学》测试题一、名词解释:(每个4分)1.计算机图形学2.图象处理3.模式识别4.计算几何5.凸多边形6.种子填充算法7.窗口8.视区9.光顺性10.拟合11.多项式插值12.小挠度曲线13.图形变换14.齐次坐标系15.凸包16.轮廓线17.等值线18.图形的翼边表示19.ER模型20.图形消隐21.本影22.半影23.用户坐标系24.规范化设备坐标系25.构造26.约束技术27.光线跟踪28、走样29、CRT(Cathode Ray Tube)30、隔行(interlaced)扫描31、输入模式32、取样方式(sample mode)33、区域34、边界表示法35、复合变换36、二维复合平移37.二维复合比例38.二维复合旋转39.视区(Viewport)40、投影变换41、平面几何投影42。
参数图43。
像素图44.人机界面45.地理信息系统46.虚拟现实47.几何造型技术48.扫描转换49. 插值曲线50.逼近曲线51. 用户接口52。
交互技术53. 交互式图形系统的基本交互任务54. 定位任务55。
选择任务56。
拾取任务57 。
选择技术58. 菜单技术59。
文字输入任务60. 数值输入任务61.动画62.帧63.场64。
消隐65。
物体空间的消隐算法66。
漫反射光67。
环境光68. 镜面反射光二、选择题(每题2分)1、计算机图形学与计算几何之间的关系是()。
A)学术上的同义词B)计算机图形学以计算几何为理论基础C)计算几何是计算机图形学的前身D).两门毫不相干的学科2、计算机图形学与计算机图象学的关系是( ).A)计算机图形学是基础,计算机图象学是其发展B)不同的学科,研究对象和数学基础都不同,但它们之间也有可转换部分C)同一学科在不同场合的不同称呼而已D)完全不同的学科,两者毫不相干3、触摸屏是()设备。
A)输入B)输出C)输入输出D)既不是输入也不是输出4.计算机绘图设备一般使用什么颜色模型?()A)RGB;B)CMY;C)HSV ;D)HLS5。
计算机图形学作业

1•什么是图形?在计算机中,图形是如何表示的?计算机图形学的主要研究内容是什么?答:从广义上说,能够在人的视觉系统中形成的视觉印象的客观对象都称为图形。
在计算机图形学中,图形是对客观对象的一种抽象表示,它带有形状和颜色信息。
在计算机中,图形通过用点陈法和参数法来表示图形。
计算机图形学的主要研究内容是图形的输入,图形的处理,图形的生成和输出。
2•试举例说明计算机图形学的应用。
答:图形用户界面,计算机辅助设计,科学计算可视化,科技、教育、商业领域中的交互式绘图,计算机艺术,地理信息系统,计算机动画、广告及娱乐,多媒体系统,虚拟现实系统。
3.试列举出你所知道的图形输入与输出设备。
答:图形输入设备:鼠标,图形输入板,跟踪球,光笔,触摸屏,操纵杆,空间球,数据手套。
图形输出设备:阴极射线管显示器,液晶显示器,等离子显示器,绘图仪。
4.你用过哪些图形软件包?把它们列举出来。
答:OpenGL DirectX。
5.阴极射线管有哪几个部分组成?它们的功能分别是什么?答:阴极射线管有五部分组成:电子枪,聚焦系统,加速电极,偏转系统,荧光屏。
电子枪的功能:电流通过灯丝产生热量,对阴极加热使其发出电子束,控制电子束的强弱和数量。
聚焦系统的功能:聚焦系统通过电场或磁场控制电子束,使电子束“变细”,保证轰击荧光屏时产生的亮点足够小,提高显示系统的分辨率。
加速电极的功能:加速电极加有正的高电压,使经过聚焦的电子束高速运动。
偏转系统的功能:控制电子束的水平方向上和竖直方向上的偏转。
荧光屏的功能:显示图形。
6.什么叫刷新?刷新频率与荧光物质的持续发光时间的关系如何?答:在画线显示器中,电子束在荧光屏上产生的亮点只能持续极短的时间,为了产生静态的不闪烁的图形,电子束必须周期性地反复扫描所要绘制的图形,这种扫描过程称为刷新。
刷新频率一般要达到30Hz,图形才不闪烁。
持续发光时间是决定产生稳定画面所需刷新频率的主要因素,它的值越大,所需的刷新频率越低。
计算机图形学作业

b) 绕原点旋转-θ(θ=arctg(-a/b)),使直线与x轴重合,变换矩阵为:
c) 做关于x轴的对称变换,变换矩阵为:
计算机图形学作业
———————————————————————————————— 作者:
———————————————————————————————— 日期:
1、证明两个二维比例变换T(sx1,sy1),T(sx2,sy2)具有下式:
T(sx1,sy1) T(sx2,sy2)=T(sx1*sx2,sy1*sy2)
2、已知三角形各顶点坐标为(10,10),(10,30)和(30,2Байду номын сангаас),作下列变换,先绕原点逆时针旋转90度,再沿X正向平移10,沿Y负向平移20。写出变换的矩阵。
平移变换矩阵为: ,旋转变换矩阵为:
总的变换矩阵为:T= × =
试证明一个绕原点的旋转变换和一个均匀比例变换是可交换的变换对。
证明:
推导以直线ax+by+c=0为对称轴的二维对称变换矩阵,其中b!=0。
d) 绕原点回旋θ,变换矩阵为:
e) 沿y轴,平移直线,平移量为-c/b,变换矩阵为:
整个过程的变换矩阵为: 。
《计算机图形学》题集

《计算机图形学》题集一、选择题(每题2分,共20分)1.计算机图形学主要研究的是:A. 计算机硬件的设计B. 计算机软件的开发C. 图像的生成、处理与显示D. 计算机网络技术2.下列哪个不是计算机图形学的应用领域?A. 游戏开发B. 医学影像处理C. 文字编辑D. 三维动画制作3.在计算机图形学中,像素(Pixel)是:A. 图像的最小单位B. 显示器的大小C. 图像的分辨率D. 图像的颜色深度4.下列哪个是光栅图形显示器的特点?A. 直接使用矢量数据表示图像B. 图像由像素阵列组成C. 分辨率固定不变D. 不适用于动态图像显示5.在三维图形变换中,平移变换不会改变物体的:A. 形状B. 大小C. 方向D. 位置6.下列哪个算法常用于三维图形的消隐处理?A. 光线追踪算法B. Z-Buffer算法C. 纹理映射算法D. 反走样算法7.在计算机图形学中,下列哪个术语用于描述物体表面的明暗程度?A. 色彩B. 光照模型C. 纹理D. 透明度8.下列哪个不是计算机图形学中的基本图形生成算法?A. 中点画线算法B. Bresenham画圆算法C. 扫描线填充算法D. Cohen-Sutherland线段裁剪算法9.在计算机图形学中,下列哪个概念用于描述物体的三维形状?A. 像素B. 几何模型C. 色彩模型D. 光照模型10.下列哪个不是真实感图形生成的基本步骤?A. 几何建模B. 光照模型计算C. 纹理映射D. 数据压缩二、填空题(每题2分,共14分)1.计算机图形学中的“图形”主要分为两大类:和。
2.在三维图形变换中,旋转变换可以使用______矩阵来实现。
3.在计算机图形学中,______是指使用数学方法来模拟真实世界中光线与物体表面的相互作用。
4.在进行三维图形的消隐处理时,______算法是一种常用的方法,它通过维护一个深度缓冲区来实现。
5.在计算机图形学中,______是一种常用的图像滤波技术,可以用于图像的平滑处理。
计算机图形学作业及答案

计算机图形学作业及答案1、计算机图形系统的组成包括哪些?答:计算机图形系统由硬件和软件两部分组成,硬件包括:主计算机、图形显示器以及I/O 交互工具和存储设备;软件包括操作系统、高级语言、图形软件和应用软件。
现代计算机图形系统与一般计算机系统最主要的差别是具有图形的输入、输出设备以及必要的交互工具,在速度和存储容量上具有较高的要求。
另外,人也是这个系统的组成部分。
2、简述光栅扫描式显示器的性能指标?答:⑴分辨率:指显示器在屏幕水平(垂直)方向可显示多少像素,分辨率以象素点为基本单位。
表示方法为320×200、640×480等。
显示分辨率与显卡上的缓冲存储器的容量有关,容量越大,显示分辨率越高。
分辨率越高,显示的字符或图像越清晰。
⑵ 亮度等级数目和色彩:指单种颜色亮度可变化的数目,亮度等级范围的提升可使图像看 上去更柔和自然色彩包括可选择显示颜色的数目以及一帧画面可同时显示的颜色数。
⑶ 显示速度:指显示字符、图形,特别是动态图像的速度,可用最大带宽表示:水平像素 数*垂直像素数*最大刷新率。
3、具有相同分辨率的彩色光栅显示器与黑白光栅在结构上有何区别? 答:彩色:对于红、绿、蓝的三个原色有三个位面的帧缓存和三个电子枪,每个位面的帧缓冲对应一个电子枪即对应一种颜色;对每个颜色的电子枪可以通过增加帧缓存位面来提高颜色种类和灰度级,通过三种原色的组合可以产生不同种类的颜色。
彩色光栅显示器主要是有红、绿、蓝的三个原色所组成,每种原色电子枪有8个位面的帧缓存和8位的数模转换器,每种原色有256种亮度,三种原色组合可为16771216种颜色,也可以通过颜色查找表查找,故帧缓存位数至少24位。
黑白:黑白光栅显示器的帧缓存是一块连续的计算机存储器,每个像素需1位存储器,每个存储器只有0或1两个状态。
因此一个位面的帧缓存只能产生黑白图形。
可以增加象素点的位面数,通过多个位面显示出多种灰度级。
《计算机图形学》习题
一、名词解释计算机图形学、图形消隐、裁剪、走样、反走样、参数方程、曲线拟合、曲线插值、曲线的参数化、区域填充、扫描转换二、判断正误(正确写T,错误写F)1.存储颜色和亮度信息的相应存储器称为帧缓冲存储器,所存储的信息被称为位图。
2.光栅扫描显示器的屏幕分为m行扫描线,每行n个小点,整个屏幕分为m╳n个中点,其中每个小点称为一个像素。
3.点阵字符用一个位图来表示,位图中的0对应点亮的像素,用前景色绘制;位图中的1对应未点亮的像素,用背景色绘制。
4.矢量字符表示法用(曲)线段记录字形的边缘轮廓线。
5.将矢量字符旋转或放大时,显示的结果通常会变得粗糙难看,同样的变换不会改变点阵字符的显示效果。
6.在光栅图形中,区域是由相连的像素组成的集合,这些像素具有相同的属性值或者它们位于某边界线的内部。
7.多边形的扫描变换算法不需要预先定义区域内部或边界的像素值。
8.用DDA算法生成圆周或椭圆不需要用到三角运算,所以运算效率高。
9.找出并消除物体中的不可见部分,称为消隐。
10.经过消隐得到的图形称为消隐图。
11.深度缓存算法并不需要开辟一个与图像大小相等的深度缓存数组,深度缓存算法能并行实现,深度缓存算法中没有对多边形进行排序。
12.在种子填充算法中所提到的八向连通区域算法同时可填充四向连通区。
13.Bezier曲线不一定通过其特征多边形的各个顶点,Bezier曲线两端点处的切线方向必须与起特征折线集(多边形)的相应两端线段走向一致,Bezier曲线可用其特征多边形来定义。
14.由三个顶点可以决定一段二次B样条曲线,若三顶点共线时则所得到的曲线褪化为一条直线段。
15.插值得到的函数严格经过所给定的数据点。
16.参数曲线的表示有形式和几何形式两种。
17.L-B参数直线裁剪算法中的裁剪条件为uP k<=Q k,当直线平行于裁剪边界的条件Q k=0。
18.L-B参数直线裁剪算法中的裁剪条件为uP k<=Q k,当P k<0时表示线段从裁剪边界外部指向内部。
计算机图形学作业答案
计算机图形学作业答案一、选择题1.第一个图形软件标准是___B_____;A. OpenGLB. GKSC. DirectXD. PHIG2.CRT显示器需要不断刷新的原因是__D___________;A.电子束强度不够B. 显示的图像在不断变化C. 荧光物质的亮度不够D. 荧光物质的亮度会逐渐衰减3.如果用一个单位立方体来表示RGB颜色空间,那么坐标(1,0,1)表示的颜色是______C____色;A.青 B.黄 C.品红 D.洋红4.位面数为16,分辨率为1024*1024的光栅扫描图形显示器,帧缓存容量为_______C____; A.512KB B. 1MB C. 2MB D 3MB5.下列关于光栅扫描显示器的性能指标的说法,错误的是___B______;1) 分辨率越高,相邻像素点之间的距离越小,显示的字符或图像就越清晰2) 刷新频率越高,图像闪烁和抖动的就越厉害3) 点距越小,显示出来的图像越细腻,其成本越高4) 行频是指电子枪每秒在屏幕上扫描过的行数,行频越大越好,至少要达到50KHz5) 亮度等级范围的提升可以使图像看上去更加柔和自然6) 显示速度指显示字符、图形,特别是动态图像的速度,与显示图形的复杂程度有关A.1),3),6) B.2),4),6) C.3),4),5) D.1),2),5)6.中点算法生成圆,第i个点的坐标位置为(xi,yi),当决策变量di>0时,第i+1个点的坐标位置和决策变量分别为_____B________;A.(xi+1,yi+1)=(xi+1,yi),di+1=di+2(xi-yi)+5;B.(xi+1,yi+1)=(xi+1,yi-1),di+1=di+2(xi-yi)+5;C.(xi+1,yi+1)=(xi+1,yi),di+1=di+2xi+3;D.(xi+1,yi+1)=(xi+1,yi-1),di+1=di+2xi+3;7. 下列对于ET表的描述,正确的是____C_________;1) ET表是根据AET表生成的;2) 在做奇异点处理时,当该边最大y值对应的顶点为局部极值点时,边记录的第一项:ymax=ymax-1;3) ET表的第二项为某边的最小的y对应的x值;4) ET表对水平边不需要进行登记;A.1),2) B. 2),4) C.3),4) D. 1),3)8. 能比较容易地找到通过一个点或和一个圆相切的直线的位置的交互技术是____C______;A.约束技术 B. 网格技术 C. 橡皮筋技术 D. 操作柄技术9. 在____C___模式下,输入过程和应用程序并发运作。
计算机图形学作业答案
一、判断题1、自由曲线可以用一条标准代数方程来描述。
( X )2、插值样条曲线通过所有的型值点。
( X )3、几何形体一包含两种重要信息:几何信息和拓扑信息。
( √ )4、标准的解析形状(圆锥曲线、二次曲面等)可也以用非均匀有理B 样条函数(NURBS )来表示。
( √ )5、曲线在某点处的曲率越大,曲线在该点看上去越弯曲。
( √ )二、填空题1、计算机图形系统的输入设备除了常用的键盘和鼠标外,一般还要配备 空间球 和 数据手套 。
2、写出你所知道的计算机图形系统软件(3个) AutoCAD 、 UG 、Pro/E 。
34、直线的生成算法主要有 DDA 画线法 、 中点画线法 和Bresenham 画线算法。
5、在生成圆时,考虑到圆的对称性,只要能生成 8分圆 ,那么圆的其它部分可 通过简单反射变换得到。
6、在种子填充算法中,从当前点检测相邻像素的方法有两种, 四向连通和八向连通 。
7、由多种基本变换组合而成的变换称为组合变换 。
8、扫描表示法是指通过 平移、 旋转 及其它对称变换来构造三维物体的方法。
9、二维基本变换包括比例变换、对称变换、 旋转变换 、 错切变换 和平移变换。
10、使用二维图形变换矩阵:T =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-100001010 如果图形的一个顶点坐标为A (6,8),则变换后的坐标 。
三、 名词解释1、计算机图形学:是关于利用计算机及其相关图形设备输入、表示、生成、存储、处理、显示和输出图形的理论、算法、技术及系统的一门综合性学科。
2、齐次坐标法:齐次坐标就是将一个原本是n 维的向量用一个n+1维向量来表示,是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。
四、综合题1、请写出中点画线算法的C 语言描述代码。
(仅考虑0<k<1的情况)2、已知三角形各顶点坐标为(10,10),(10,30)和(30,20),作下列变换,写出变换的矩阵,画出变换后的图形。
计算机图形学作业
计算机图形学作业(总3页) --本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--计算机图形学第一次作业计算机X班 XXX 1XXX010XXX1.你是否想用图形学的有关知识去解决一两个实际问题你想解决的问题是什么考虑如何解决答:我希望可以解决的有设计汽车外壳和制作动画。
解决方法:(1)汽车外壳使用3D MAX/AutoCAD软件进行设计。
(2)制作动画利用动画制作软件(3D MAX)在计算机上制作动画2.某彩色图形显示系统,CRT显示器的分辨率为1024×1024,它可以从2^17次方种颜色中选择出2^15次方来显示,其帧缓冲器的容量应该如何计算查色表的长度和宽度应为多少解:16b==2B因为分辨率为1024x1024所以1024*1024*2B=2MB3.采用Bresenham画线算法,绘出起点(1,3),终点为(9,18)的直线段。
解:void DrawBresenhamline(int x0, int y0, int x1, int y1){int dx = x1 - x0;中点画圆法生成圆心在(3,-2),半径为12的上半个半圆。
解:cen = [3 0];r = 3;t = linspace(0, 2*pi);x = cen(1) + r*cos(t);y = cen(2) + r*sin(t);y(y<0) = NaN;figure; box on; hold on;plot(x, y, 'r-');axis equal;plot([min(x), max(x)], [0 0], 'k-');。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录摘要 (2)1,文件栏实现 (3)2,绘图功能的实现 (3)3,图形几何变换功能的实现 (5)4,撤销、恢复、删除功能的实现 (6)5,图形错位及其解决方法 (7)参考文献 (8)摘要交互式图形系统是指能够进行人机交互的图形设计系统。
我们平时所接触的CAD,PROE,UG等均属于这一类系统。
这次作业是要设计一个简单的交互式图形系统。
我以前学过一段时间的Visual C++,所以选择以Visual C++做为平台,利用MFC形成框架,用Visual C++所带的GDI绘图函数来实现这个系统。
此系统实现的功能主要分为四个方面:一,文件栏,实现文件打开和储存;二,绘图,能绘制直线、圆、矩形;三,基本的几何变换,平移、旋转、镜像等;四,编辑栏,实现删除和返回功能。
这个系统在以下几个方面还有待改进,首先,没有实现图形的拾取功能,这就导致图形处理时只能是整体式处理;其次,绘图时没有实现图形的橡皮筋功能,这样绘图时不能给使用者一种感观上的感觉。
关键词:交互式图形系统不 Visual C++ MFC1,文件栏实现1.1,文件保存功能中的主要工作一,生成CfileDialog对象,通过调用对象的成员函数DoModal()生成标准保存对话框。
二,通过fdlg.m_ofn.lpstrFilter="图形文件(*.wnf)\0*.wnf\0所有文件(*.*)\0*.*\0\0";来设定文件过滤器。
三,通过fdlg.m_ofn.lpstrDefExt="wnf";来设定文件保存的文件的默认扩展名。
在这里我将其设定为.wmf。
四,通过CopyMetaFile(hmetafile,fdlg.GetFileName());生成保存文件。
1.2,文件打开功能中的主要工作一,生成CfileDialog对象,通过调用对象的成员函数DoModal()生成标准打开对话框。
二,通过fdlg.m_ofn.lpstrFilter="图形文件(*.wnf)\0*.wnf\0所有文件(*.*)\0*.*\0\0";来设定文件过滤器。
三,通过HMETAFILE hmetafile=GetMetaFile(fdlg.GetFileName() );m_dcMetaFile.PlayMetaFile(hmetafile);两条语句,实现把保存文件中的绘图命令拷贝到DC中,以实现文件打开。
1.3,关键技术首先,因为此部分涉及到数据的保存和打开。
因此需要考虑图形数据的结构,以便于对其进行保存和打开。
我通过构造CDC类的子类CMetaFileDC的对象来保存绘图操作的相关命令。
其次,通过CopyMetaFile()实现文件的存储,通过GetMetaFile()实现文件的打开。
2,绘图功能的实现2.1,实现绘图功能中的主要工作一,在菜单栏中添加绘图菜单,直线、圆、矩形三个菜单项。
并为其创建一个工具条,形成快捷键。
最后为每一个菜单添加一个消息响应函数。
在消息响应函数中实现对int变量m_nDrawType的不同值,以标记所绘图形的类型。
二,因为我采用的是通过鼠标来两次单击来确定绘图的两点坐标,所以需要添加鼠标的消息响应函数OnLButtonDown(),并在函数中实现对两个点的捕捉。
三,在OnLButtonDown()首先生成画笔类CPen对象和CBrush类对象,来设置画线的线宽,线条颜色,生成透明画刷。
最后把画笔和画刷能过SelectObject()选入CMetaFileDC中。
四,OnLButtonDown()中使用switch(m_nDrawType)语句,首先判断m_nDrawType的值来确定执行哪一个case语句。
并在相应的case后面执行画图命令。
来确定执行哪一个case语句。
五,为了使图形能在窗口发生重绘时,始终都在View类窗口中出现,那么必须在OnPaint()函数中把刚才所绘制的图形重新绘制一遍。
由于我采用的是m_dcMetaFile来存储绘图命令.首先能过m_dcMetaFile.Close()来获得此DC 的一个句柄,再用pDC->PlayMetaFile(hmetafile)把dcMetaFile中的绘图命令在CDC中绘出来,显示到屏幕上。
这一过程每当窗口重绘,便执行一次。
六,为了能使程序的使用者能够改变线型,线宽。
在绘图菜单中我还添加了一项设置菜单项。
其次是创建一个对话框资源并为其生成一个相关的类CSetting。
在菜单项的消息响应函数中创建一个CSetting类对象dlg。
调用其成员函数DoModal()来显示对话框。
2.2,关键技术在这一部分重点涉及到Menu、Dialog、ToolBar等多种资源的协调和运用。
我总结了一下一般的创建顺序为:一,创建Dialog资源,并创建一个与其相关的类;二,创建一个了菜单资源,创建一个ToolBar资源,把菜单项的ID赋给相应的ToolBar项的ID。
三,在CMainFrame的成员函数OnCreate()中调用CToolBar的成员函数来加载资源,并显示工具条。
四,为菜单项添加消息响应函数。
在响应函数中可以创建Dialog类的对象,典型的是利用if(IDOK==dlg.DoModal())语句显示对话框,在其后添加一些数据交换的命令,从而实现程序使用者和程序之间的人机对话(实际上我最开始是采用这种方法,但后来我发现这样做代码的重用度太低了),所以换成了下面的方法。
在绘图这一部分最重要的一点是我采用了m_nDrawType来标识绘图的类型(CCDA2View的public成员)。
从而在每一个绘图的子菜单项的消息响应函数中只需对其进行赋值,然后到OnLButtonDown()中再统一通过switch(m_nDrawType)来判断绘图类型。
并执行相应的绘图语句。
这样做的话,代码的重用度得到了很大的提高,也使程序更紧凑。
3,图形几何变换功能的实现这一部分功能的实现没有完全做出来。
本来是想利用TransformAndDraw()来调用SetWorldTransform()函数,通过坐标空间的转换来实现图形几何变换,但我按照MSDN中所说的调试了很长时间没有实现。
最后我选择直截编写代码来实现。
我在实现图形的几何变换时选择采用整体式的几何变换。
主要是实现的移动和镜相两个功能。
3.1,移动功能中的主要工作一,为图形移动添加菜单项,创建图形移动的工具图标。
把菜单项的ID赋值给图标ID。
二,为菜单项添加消息响应函数OnMove(),并在函数体内通过赋值来改变移动命令标志Drag=true;三,为了实现图形移动,需要用鼠标确定移动的参考点和终点。
那么就要捕捉两点的坐标。
这当然是在OnLButtonDown()来实现。
四,在这一部分中一个难点就是要把原来的图形坐标均改变再重绘。
为了实现这一功能,我首先自定义了一个Celement类。
把有关绘图命令相关的一些参数包含进去。
如,绘图中的第一点的坐标:m_ptOrigin,第二点的坐标:point,绘图命令的类型:m_nDrawType,线型:m_nLineStyle,线宽:m_nLineWidth。
然后,在CCDA2View中定义一个CPtrArray类型的成员变量m_ptrArray。
再在OnLButtonDown()第一次绘图命令执行完成以后执行Celement *p=new Celement; m_ptrArray.Add(p);把相关的绘图信息保存一份。
最后,在执行移动命令时,就可以在OnDraw()中取出m_ptrArray中保存点坐标,结合获得的移动参考点和终点的坐标最后可以计算出图形发生后的两点坐标。
并且把m_dcMetaFile中以前所有的绘图命令清空。
再按照新的坐标重新把命令执行一遍,功能便实现了。
3.2,镜相功能中的主要工作一,为图形镜相功能添加菜单项,创建图形镜相的工具图标。
把菜单项的ID赋值给图标ID。
在此功能中我还添加了一个对话框资源。
以便程序使用者可以对镜相完成以后原来图形是否保留,镜相图是沿着鼠标确定点的x轴还是y 轴镜相等问题根据实际情况做选择。
二,为菜单项添加消息响应函数OnMirror(),并在函数体内通过赋值来改变移动命令标志mirror=true;三,由于需要用鼠标来确定镜相轴的位置,所以在OnLButtonDown()中要对坐标点进行捕捉。
四,根据鼠标确定的镜相轴的位置,和m_ptrArray中保存的有关绘图命令的两点坐标,可计算出镜相后图形的坐标点位置。
并根据对话框中用户自己的选择来决定是否把m_dcMetaFile中以前所有的绘图命令清空。
再按照新的坐标重新把命令新DC中执行一遍,功能便实现了。
3.4,关键技术在实现这一部分功能时最关键的技术在于,用了m_ptrArray在每次执行绘图命令以后,来保存绘图命令的相关参数。
所以在OnDraw()中通过其保存的参数方便地实现几何变换后的重绘。
4,撤销、恢复、删除功能的实现4.1,主要工作一,首先为此三命令添加菜单项,创建ToolBar图标,把菜单项的ID赋值给图标的ID。
二,撤销命令实现,首先生成另一个CPtrArray类型变量m_ptrArraycopy,再把m_ptrArray 中的最后一个节点通过Add()添加到m_ptrArraycopy中,用RemoveAt()删除m_ptrArraycopy最后一个节点。
三,恢复命令与撤销命令正好相反,把m_ptrArraycopy中的最后一个节点通过Add()添加到m_ptrArray的末尾,再把用RemoveAt()把最后一个节点删除。
四,我这里定义的删除功能,就是把所有的图元删除。
存放到m_ptrArraycopy中,以防恢复的需要。
4.1,关键技术引入另一个另一个CPtrArray类型变量m_ptrArraycopy来保存被删除的m_ptrArray中的节点,当需要的时候可以方便地恢复。
5,图形错位及其解决方法5.1,图形错位因为我在这个程序中CCDA2View的基类是CscrollView,所以产生的窗口是带滚动条的,当我们把滚动条拖动时画图,图形会自动向上偏移一个距离,这个距离实际上与你托运滚动条的距离是相等,这个现象就是图形的错位。
产生这一现象的原因是因为图形重绘会调用OnPaint(),而这个函数以调用了一个OnPrepareDC(),它会调整视口的设备坐标的坐标原点(根据你移动滚动条的距离)。
那么当窗口的逻辑坐标映射到视口的设备坐标时,图形就会发生我们前面所说的向上发生偏移。
5.2,解决方法我找的参考书的解决方法是在画图命令以后,图形命令信息保存之前,首先调用OnPrepareDC(&dc),再调用DptoLP()把点从设备坐标转成逻辑坐标。