欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

《计算机图形学》第1-5章课后习题参考答案.doc

  • 资源ID:12812236       资源大小:583KB        全文页数:54页
  • 资源格式: DOC        下载积分:5积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要5积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

《计算机图形学》第1-5章课后习题参考答案.doc

第一章1、 试述计算机图形学研究的基本内容?答:见课本P5-6页的1.1.4节。2、 计算机图形学、图形处理与模式识别本质区别是什么?请各举一例说明。答:计算机图形学是研究根据给定的描述,用计算机生成相应的图形、图像,且所生成的图形、图像可以显示屏幕上、硬拷贝输出或作为数据集存在计算机中的学科。计算机图形学研究的是从数据描述到图形生成的过程。例如计算机动画制作。图形处理是利用计算机对原来存在物体的映像进行分析处理,然后再现图像。例如工业中的射线探伤。模式识别是指计算机对图形信息进行识别和分析描述,是从图形(图像)到描述的表达过程。例如邮件分捡设备扫描信件上手写的邮政编码,并将编码用图像复原成数字。3、 计算机图形学与CAD、CAM技术关系如何?答:见课本P4-5页的1.1.3节。4、 举3个例子说明计算机图形学的应用。答:事务管理中的交互绘图应用图形学最多的领域之一是绘制事务管理中的各种图形。通过从简明的形式呈现出数据的模型和趋势以增加对复杂现象的理解,并促使决策的制定。地理信息系统地理信息系统是建立在地理图形基础上的信息管理系统。利用计算机图形生成技术可以绘制地理的、地质的以及其它自然现象的高精度勘探、测量图形。计算机动画用图形学的方法产生动画片,其形象逼真、生动,轻而易举地解决了人工绘图时难以解决的问题,大大提高了工作效率。5、 计算机绘图有哪些特点?答:见课本P8页的1.3.1节。6、 计算机生成图形的方法有哪些?答:计算机生成图形的方法有两种:矢量法和描点法。矢量法:在显示屏上先给定一系列坐标点,然后控制电子束在屏幕上按一定的顺序扫描,逐个“点亮”临近两点间的短矢量,从而得到一条近似的曲线。尽管显示器产生的只是一些短直线的线段,但当直线段很短时,连成的曲线看起来还是光滑的。描点法:把显示屏幕分成有限个可发亮的离散点,每个离散点叫做一个像素,屏幕上由像素点组成的阵列称为光栅,曲线的绘制过程就是将该曲线在光栅上经过的那些像素点串接起来,使它们发亮,所显示的每一曲线都是由一定大小的像素点组成的。当像素点具有多种颜色或多种灰度等级时,就可以显示彩色图形或具有不同灰度的图形。7、当前计算机图形学研究的课题有哪些?答:见课本P10-11页的1.4节。8、简述三维图形生成和输出的流水线?答:见课本P13页1.5.6.节。9、向量图形和点阵图形之间的区别有哪些? 答:通过矢量法产生的图形称为矢量图形或者向量图形,用描点法产生的图形称为点阵图形。向量图形区别点阵图形的特点在于描述图形几何形状的数学模型及依据此模型生成几何图形的计算机命令。向量图形由各个基本图形构成,这就要求各个基本图形有各自独立的信息。如果用点阵图形来表示一个向量图形,构成向量图形的某个基本图形(如直线段、圆弧等)的所有点应有一个信息。因此,在描述一个基本图形时,同时要描述其相应的信息。向量图形最基本的优点是它本身是由精确的数据给出,所以可以充分利用各种输出图形设备的分辨率尽可能精确地输出图形。也正因为如此,向量图形的尺寸可以任意变化而不损失图形显示的质量。但是向量图形仅适合于描绘简单图形,而点阵图形可以描绘绚烂多彩的复杂图形。10、什么是虚拟现实技术和可视化技术?答:虚拟现实技术:利用计算机生成一种模拟环境,通过多种传感器和设备使用户“投入”到该环境中,实现用户和该环境直接进行交互的技术。例如模拟飞机驾驶舱。可视化技术:通过对空间数据场构造中间几何因素,或用图形绘制技术在屏幕上产生二维图像。例如分子模型构造。第二章1、计算机图形系统有什么特点?有哪些主要功能?答:课本2.1.1的图2.1展示了计算机图形系统的组成。计算机图形系统是为了支持应用程序,便于实现图形的输入输出的硬件和软件组合体。没有图形系统支持,就难以实现应用软件的开发。主要功能见课本2.1.2节。2、计算机图形系统有哪几种?各有什么特点?答:一种分类方法:交互式图形系统允许操作者以某种方式(对话方式或命令方式)来控制和操作图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。而被动式绘图系统,图形在生成过程中,操作者无法对图形进行实时操作和控制,不具备交互功能,只提供各种图形命令或图形程序库,通过编程获得所需图形。另一种分类方法:见课本2.1.3节,分为脱机绘图系统、联机绘图系统和交互式绘图系统。3、阴极射线管由哪些部分组 成?它们的功能分别是什么?答:CRT由四部分组成:电子枪、聚焦系统、偏转系统和荧光屏,这四部分都在真空管内。电子枪由灯丝、阴极和控制栅极组成。灯丝加热阴极,阴极表面向外发射自由电子,控制栅控制自由电子是否向荧光屏发出,若允许电子通过,形成的电子流在到达屏幕的途中,被聚焦系统(电子透镜)聚焦成很窄的电子束,由偏转系统产生电子束的偏转电场(或磁场),使电子束左右、上下偏转,从而控制荧光屏上光点上下、左右运动,使得在指定时刻在屏幕指定位置上产生亮点。4、光栅扫描显示器由哪些部分组成?它们的功能分别是什么? 答:见课本P21页图2.9所展示的组成框图,其后有各部分的介绍及功能。5、对于分辨率为1024*1024的光栅系统,若每一像素用8位和12位二进制来表示存储信息,各需多大光栅存储容量以及显存?每一屏幕最多能显示多少颜色?若R,G,B灰度都占8位,其显示颜色的总数是多少?解:1)每一像素用8位二进制来表示存储信息,所需容量为1024*1024*1=(Byte)=1MB彩色素:=256(项)2)若每一像素用12位二进制表示存储信息,所需容量为:1024*1024*1.5=1.5*(Byte) =1.5MB (由于显示卡的显存是按2的指数次倍增长的,因此所需显存为2M)彩色素:=4096( 项)3)颜色总数:*=16777216(种)6、对于19英寸显示器,若X和Y两方向的分辨率相等,即1024*1024,那么每个像素点的直径是多少?解: =0.33(mm)或=0.013(英寸)7、对于分辨率为1024768的光栅系统,若调色板设置为真彩色32位,此时需要显示一个三维图形,各需要多大光栅存储容量以及显存?答:调色板为真彩色32位,即意味着像素值的位长为32所需容量为1024*768*32/8*3=9MB 因此所需要的显存为16M8、GKS有哪三种坐标系?它们有什么不同?试写出它们之间对应关系?答:GKS有3种不同的坐标系。第一种是供应用程序使用的实际世界坐标系统(World Coordinate System,简称 WC);第二种是GKS内部使用的规范设备坐标系(Normalized Device Coordinate,简称NDC),它的取值范围为0,1,这是一种既与设备无关也与应用无关的坐标系;第三种是各工作站物理设备使用的设备坐标系(Device Coordinate System,简称DC)。GKS只支持二维对象的图形处理,因此上述3个坐标系都是二维坐标系。详见课本图3.28的描述。9、GKS中输入设备有哪6种逻辑功能?请各举出对应的物理设备。答:见课本2.4.5.节。10、当前主流的图形软件有哪些?答:见课本2.6.3节。第三章1、编写画一正方形程序,并在其中用不同的颜色画15个正方形,每一个都比前一个小。#include“graphics.h”#include“conio.h”void main()int i,color=0,ls=0;int j=700;int gdriver=VGA; int gmode=VGAHI;initgraph(&gdriver,&gmode,”);3-1批改说明; l 必须至少包含"graphics.h"l initgraph(&gdriver,&gmode,"");l 必须包含15个正方形,一般用for循环,也可能用到while等。l 注意查看是否是正方形(i, i, j, j)即:x2-x1=y2-y1l 注意查看颜色是否有15种:也就是说gdriver=CGA肯定是错的,可以为DETECT、VGA、EGA。setbkcolor(15);for(i=0;i<225;i=i+15, j=j-30)setcolor(color);bar(i,i,j,j);color+;ls+;getch();closegraph();2、用不同的线形绘制题1中的图形#include“graphics.h”#include“conio.h”void main()int i,color=1,ls=0; 3-2批改说明; l 注意查看3_1部分内容l setlinestyle(i%4),0,k);l k对线宽的设置。int j=700;int gdriver=VGA;gmode=VGAHI;initgraph(&gdriver,&gmode,”);setbkcolor(15);for(i=0;i<=225;i=i+15, j=j-30)setcolor(color);/setlinestyle(ls%4,0,1); 或者setlinestyle(4,ls,3);rectangle(i,i,j,j);setfillstyle(SOLID_FILL,color);/floodfill(getmaxx()/2,getmaxy()/2,color); 此句会出现最后只用一种颜色填充的情况color+;ls+;getch();closegraph();3、画一五颜六色的图(此例为画一个五颜六色的圆)#include“graphics.h”#include“conio.h”void main()int driver=DETECT,mode=0;int i,start,end;3-3批改说明; l 必须至少包含"graphics.h"l initgraph(&gdriver,&gmode,"");l 如果是这个版本的图,注意end比start要大。l restorecrtmode()可能有人写成retorecrtmode()initgraph(&driver,&mode,”);start=0;end=20;for(i=0;i<18;i+) setfillstyle(SOLID_FILL,i);pieslice(300,200,start,end,100);start+=20;end+=20;getch();restorecrtmode();4、编写一辆自行车在一公路上由右至左快速行驶的程序。#include"stdlib.h"#include"graphics.h"#include"conio.h"#include"stdio.h"void main()void *w;int driver=DETECT,mode=0,i,start,end,j;initgraph(&driver,&mode," ");cleardevice();setbkcolor(15);setcolor(CGA-LIGHTGREEN);start=0;end=180;circle(387,290,37);circle(525,290,37);line(404,217,398,230);line(436,217,429,230);line(398,230,429,230);line(413,230,387,290);line(387,290,525,290);line(408,243,484,243);line(387,290,484,243);line(484,243,525,290);line(444,290,484,243);line(444,290,446,279);line(444,290,443,300);line(438,277,444,278);line(435,300,451,301);line(484,243,487,233);line(472,233,502,233); /自行车基本轮廓的绘制w=malloc(imagesize(350,200,562,327);getimage(350,200,562,327,w);for(i=350,j=0;i>0;i-,j-)setfillstyle(EMPTY_FILL,0);pieslice(387+j,290,start,end,37);pieslice(525+j,290,start,end,37);start+=40;end+=40;delay(5); /处于运动状态的自行车车轮的轴线的绘制 putimage(i-1,200,w,COPY_PUT);line(2,327,562,327);delay(10); /自行车行驶动画的实现 for(i=0;i<10;i+)pieslice(37,290,start,end,37);pieslice(175,290,start,end,37);start+=40;end+=40; /处于静止状态的自行车车轮的轴线的绘制getch();restorecrtmode();closegraph();5、试自行设计一个美术图案,并且用程序实现。 (略)第四章1. 为什么说直线生成算法是二维图形生成技术的基础?答:无论什么复杂图形,它们都是由直线段和曲线段组成(三维图形经投影后最终变成了二维图形),而图形设备显示曲线段时,最终还是将曲线段转化成一系列直线段逼近表示的。因此,所有图形都可以看成是由直线段组成的。可参考课本图4.1。2. 根据DDA画直线算法,遍一程序求(0,0)到(4,12)和(0,0,)到(12,4)的直线#include “graphics.h” #include “math.h”void DDA_Line(int x1,int y1,int x2,int y2)float increx,increy,x,y,length;int i;if(abs(x2-x1)>abs(y2-y1)length=abs(x2-x1);elselength=abs(y2-y1);increx=(x2-x1)/length; increy=(y2-y1)/length; x=x1;y=y1;for(i=1;i<=length;i+)putpixel(x,y,1); x=x+increx;y=y+increy; void main()int driver=DETECT,mode=0;initgraph(&driver,&mode,”);int x1=0,y1=0,x2=4,y2=12;int x3=12,y3=4;DDA_Line(x1,y1,x2,y2);DDA_Line(x1,y1,x3,y3);getch();3. 根据逐点比较法编一程序画一段圆弧,其圆心为(0,0),圆弧两点为A(5,0)、B(0,5)方法1:顺4象限#include "graphics.h"#include "stdio.h"#include "conio.h"void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2);void main()int gdriver=CGA,mode=CGAC0;initgraph(&gdriver,&mode," "); ZDBJ_ARC(0,0,25,0,0,25); getch(); closegraph();void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2) float f=0.0,F; float dx=1,dy=1; while(abs(x1-x2)>1) if(f>=0) x1=x1-dx;y1=y1;putpixel(x1,y1,1);f=f-2*dx*(x1-x0)+dx*dx; else x1=x1;y1=y1+dy;putpixel(x1,y1,1);f=f+2*dy*(y1-y0)+dy*dy; 方法2:逆4象限#include "graphics.h"#include "stdlib.h"#include "conio.h"void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2);void main()int gdriver=CGA,mode=CGAC0;initgraph(&gdriver,&mode," "); ZDBJ_ARC(0,0,0,25,25,0); getch(); closegraph();void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2) float f=0.0,F; float dx=1,dy=1; while(abs(y1-y2)>1) if(f>0) x1=x1;y1=y1-dy;putpixel(x1,y1,1);f=f-2*dy*abs(y1-y0)+dy*dy; else x1=x1+dx;y1=y1;putpixel(x1,y1,1);f=f+2*dx*abs(x1-x0)+dx*dx; 方法3:顺1象限#include“graphics.h” /省略了图形初始化的步骤AB#include“conio.h”#include “math.h”void main()int x1=5,y1=0,x2=0,y2=5;int x0=0,y0=0;int R=sqrt(x2-x0)* (x2-x0)+(y2-y0)* (y2-y0);int dx=abs(x2-x1);int dy=abs(y2-y1);int n=dx+dy;putpixel(x2,y2,1);int f;int x=x2,y=y2;for(int i=0;i<n;i+)f=(x-x0)* (x-x0)+(y-y0)* (y-y0)-R*R;if(f>=0)putpixel(x,y-,1);elseputpixel(x+,y,1);getch();closegraph(); /另一种做法是采用课本P97页表4.2的公式4. 编一程序用角度DDA法画一圆 /以圆点为圆心,半径为20的圆#include “graphics.h” /省略了图形初始化的步骤#include “conio.h”#include “math.h”void main()int x0=0,y0=0,R=20;int x1,y1,xi,yi;int N=R*8;float a=2*3.14/N;x1=20,y1=0;for(int i=1;i<=N;i+)xi=x0+R*cos(i*a)yi=y0+R*sin(i*a);line(x1,y1,xi,yi);x1=xi;y1=yi;getch();closegraph();5. 如果线段端点坐标值不是整数,采用DDA算法产生的直线和将端点坐标值先取整后再用Bressenham算法产生的直线是否完全相同?为什么?能否扩充整数Bressenham算法使之能够处理当线段端点坐标值不是整数的情况。答:不相同。因为DDA算法总是选择x或者y中的较大者作为步进的方向,不失一般性,假设选择x方向,则x方向每前进一个像素点,y方向前进的像素点个数应该在0, 1区间,但是由于采用了(向上或者向下或者四舍五入)取整运算,必然会导致某些像素点偏在了真实直线的一侧。而Bressenham算法每一步都会根据实际直线与网格的距离来决定下一个像素点的选择,因此所选像素点更加贴近于真实的直线。可以扩充整数Bressenham算法使之能够处理当线段端点坐标值不是整数的情况。6. 若采用Bresenham算法实现画圆,写出算法实现的具体流程(包括判别公式推导等等)。答:给定圆心在原点,半径为R的圆,其方程为x2+y2=R2,构造函数F(x, y)= x2+y2-R2,对于圆上的点,有F(x, y)=0;对于圆外的点,F(x, y)>0;而对于圆内的点,F(x, y)<0。YXPPdPuM1/8圆弧PuPdM此处仅考虑如图所示的第一象限内x的1/8圆弧,此时中点Bresenham画圆算法要从(0, R)到()顺时针地确定最佳逼近于该圆弧的像素序列。由于最大位移方向为x,因此其基本原理:每次x方向上走一步,而y方向上或减1或减0。假定当前与圆弧最近者已确定,为P(xi, yi),那么下一候选像素只能是正右方的Pu(xi +1, yi)和右下方的Pd(xi +1, yi-1)。到底选取哪一个候选点依旧用中点进行判别。假设M是Pu和Pd的中点,即有M(xi +1, yi-0.5),则当F(xM, yM)<0,M在圆内,这说明Pu离圆弧更近,应取其为下一个像素点;当F(xM, yM)>0,M在圆外,说明Pd离圆弧更近;当F(xM, yM)=0,则约定取Pd。构造判别式di=F(xM, yM)= F(xi +1, yi-0.5)=(xi +1)2+(yi-0.5)2- R2(1) 当di<0,取Pu(xi +1, yi),计算下一步的的判别式 di+1=F(xu, yu)= F(xi +2, yi-0.5)= (xi +2)2+(yi-0.5)2- R2= di+2xi+3 所以沿正右方向,di的增量为2xi+3。(2) 当di0,取Pd(xi +1, yi+1),计算下一步的的判别式 di+1=F(xd, yd)= F(xi +2, yi-1.5)= (xi +2)2+(yi-1.5)2- R2= di+2(xi-yi)+5所以沿右下方向,di的增量为2(xi-yi)+5。显然,所绘制圆弧段的第一个像素为P0(0, R),因此判别式d0的初始值为1.25-R,可以令d=d-0.25来摆脱小数运算,则判别式di<0对应于di<-0.25,由于d始终是整数,di<-0.25等价于di<0。7. 已知4个型值点(1.0,2.0),(2.5,3.5),(4.0,4.5),(5.0,4.0),求各段三次样条曲线。Si(X)(i=1,2,3),设边界条件为抛物线端(1.0, 2.0)(2.5, 3.5)(5.0, 4.0)(4.0, 4.5)解:m1=x2-x1=1.5, m2=x3-x2=1.5, m3=x4-x3=1;2=m2/(m2+m1)=0.5;u2=m1/(m1+m2)=0.5;3=m3/(m2+m3)=0.4;u3=m2/(m2+m3)=0.6;R2=3*u2*(y3-y2)/m2+2*(y2-y1)/m1=2.5;R3=3*u3*(y4-y3)/m3+3*(y3-y2)/m2=-0.1;于是有0.5b1+2b2+0.5b3=2.5 (1)0.4b2+2b3+0.6b4=-0.1 (2)又边界抛物线端b1+b2=2 (3)b3+b4=-1 (4)由(1),(2),(3),(4)得b1=39/38, b2=37/38, b3=3/38, b4=-41/38从而c1=-1/57;d1=0;c2=-1/57;d2=-64/513;c3=-11/19;d3=0;故可得s1(x)=2+39/38(x-1)-1/57(x-1)2 x1.0, 2.5s2(x)=3.5+37/38(x-2.5)-1/57(x-2.5)2-64/513(x-2.5)3 x2.5, 4.0s3(x)=4.5+3/38(x-4)-11/19(x-4)2 x4.0, 5.08. 已知4个型值点坐标值P0(5,5)、P1(10,15)、P2(15,10)、P3(10,5),绘一个三次贝塞尔曲线。解:用矩阵表示为p(t)=t3 t2 t 1Pp0 p1 p2 p3TP= -1 3 -3 1 3 -6 3 0 -3 3 0 0 1 0 0 0p(0)=5, 5p(0.15)=7.215, 8.536p(0.35)=9.83, 10.64p(0.5)=11.25, 10.625p(0.65)=12.015, 9.615p(0.85)=11.606, 7.198p(1)=10, 5将上面各点相连可以画出三次贝塞尔曲线。9. 编写一个绘制Bezier曲线的程序。该程序根据以下数据点x, y:50, 100 80, 230 100, 270 140, 160 180, 50 240, 65 270, 120 330, 230 380, 230 430, 150计算出结果,并实现三段首尾相接的三次贝塞尔曲线在屏幕上显示的功能,采用了C+语言实现;#include "graphics.h"#include "conio.h"#include "stdio.h"typedef structdouble x,y;DPOINT; /定义结构体class Bezier /定义Bezier类private:DPOINT* bP;int m_maxIndex;void drawFrame();void drawCurve();void drawCurve(int p0,int p1,int p2,int p3);public:Bezier(DPOINT* p,int len); /定义构造函数void draw();Bezier:Bezier(DPOINT* p,int len) /构造函数的实现this ->bP=p;m_maxIndex=len-1;void Bezier:draw() /通过公有函数调用私有函数drawFrame();drawCurve();void Bezier:drawFrame() /其功能是绘制出多边形和各个端点setcolor(12);for(int i=0;i<m_maxIndex;i+)line( bPi.x, bPi.y, bPi+1.x, bPi+1.y ); /绘制多边形circle(bPi.x, bPi.y,5); /绘制各个端点circle(bPm_maxIndex.x,bPm_maxIndex.y,5);void Bezier:drawCurve() /实现多段Bezier曲线绘制的功能for(int i=0;i<=m_maxIndex-3;i+=3)drawCurve(i,i+1,i+2,i+3);void Bezier:drawCurve(int p0,int p1,int p2,int p3) /实现绘制某一段Bezier曲线的功能double tmpx=0.0;double tmpy=0.0;double t=0.0;for(;t<=1.0;t+=0.001)tmpx=(-bPp0.x+3*bPp1.x-3*bPp2.x+bPp3.x)*t*t*t+(3*bPp0.x-6*bPp1.x+3*bPp2.x)*t*t+(-3*bPp0.x+3*bPp1.x)*t+bPp0.x;tmpy=(-bPp0.y+3*bPp1.y-3*bPp2.y+bPp3.y)*t*t*t+(3*bPp0.y-6*bPp1.y+3*bPp2.y)*t*t+(-3*bPp0.y+3*bPp1.y)*t+bPp0.y;putpixel(tmpx,tmpy,3);void main() /主函数的实现int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,"E:tc3bgi");setbkcolor(15);DPOINT* p;p=new DPOINT10; p0.x=50.0;p0.y=100.0;p1.x=80.0;p1.y=230.0;p2.x=100.0;p2.y=270.0;p3.x=140.0;p3.y=160.0;p4.x=180.0;p4.y=50.0;p5.x=240.0;p5.y=65.0;p6.x=270.0;p6.y=120.0;p7.x=330.0;p7.y=230.0;p8.x=380.0;p8.y=230.0;p9.x=430.0;p9.y=150.0;Bezier bzr(p,10);bzr.draw();delete p;getch();closegraph();10. 编写一个绘制B样条曲线的程序。该程序根据以下数据点x, y:P050, 130 P1120, 40 P2100, 270和P3140, 160计算出结果,并实现两段首尾相接的两次B样条曲线在屏幕上显示的功能,采用了C+语言实现;将已知点代入式(4-19)可得两段两次B样条曲线方程:P1(t)= t2 t 1 =-45 160t2 70 -90t 85 85P2(t)= t2 t 1 = 30 -170t2 -20 230t 110 155#include "graphics.h"#include "conio.h"#include "stdio.h"typedef structdouble x,y;DPOINT; /定义结构体class B_Spline /定义B样条曲线类private:DPOINT* bP;int m_maxIndex; /有多少个型值点void drawFrame();void drawCurve();void drawCurve(int p0,int p1,int p2);public:B_Spline(DPOINT* p,int len); /定义构造函数void draw();B_Spline:B_Spline(DPOINT* p,int len) /构造函数的实现this ->bP=p;m_maxIndex=len;void B_Spline:draw() /通过公有函数调用私有函数drawFrame();drawCurve();void B_Spline:drawFrame() /其功能是绘制出多边形和各个端点setcolor(12);for(int i=0;i<m_maxIndex-1;i+)line( bPi.x, bPi.y, bPi+1.x, bPi+1.y ); /绘制多边形circle(bPi.x, bPi.y,5); /绘制多边形各个端点circle(bPm_maxIndex-1.x,bPm_maxIndex-1.y,5);void B_Spline:drawCurve() /实现多段B样条曲线绘制的功能for(int i=0;i<m_maxIndex-2;i+)drawCurve(i,i+1,i+2);void B_Spline:drawCurve(int p0,int p1,int p2) /实现绘制某一段Bezier曲线的功能double tmpx=0.0;double tmpy=0.0;double t=0.0;for(;t<=1.0;t+=0.001)tmpx=(0.5*bPp0.x-bPp1.x+0.5*bPp2.x)*t*t+(-bPp0.x+bPp1.x)*t+0.5*bPp0.x+0.5*bPp1.x;tmpy=(0.5*bPp0.y-bPp1.y+0.5*bPp2.y)*t*t+(-bPp0.y+bPp1.y)*t+0.5*bPp0.y+0.5*bPp1.y;putpixel(tmpx,tmpy,3);void main() /主函数的实现int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,""); /图形初始化setbkcolor(15);DPOINT* p;p=new DPOINT4; p0.x=50.0;p0.y=130.0;p1.x=120.0;p1.y=40.0;p2.x=190.0;p2.y=130.0;p3.x=260.0;p3.y=40.0;B_Spline b_sp(p,4);b_sp.draw();delete p;getch();closegraph();11. 简述NURBS曲线产生的背景和特点?答:NURBS曲线具有局部可调性、凸包性、几何和透视投影变换不变性等等,它采用有理参数多项式可以精确表示圆锥曲线、二次曲面等,对于几何造型算法提供了思路。12. 将下列数据 X 2 6 10 12 14 16 Y 3 8 11 13 15 17按最小二乘法曲线拟合,分别求一次和二次多项式曲线,拟合以上数据并画图表示。解:如下表所示:i1236412816268483628821612963101111010011001000100004121315614418721728207365141521019629402744384166161727225643524096655366067802736105649792136000一次多项式的情形: 6+60=67 =1.4608 60+736=802 =0.9706所求多项式为y=f(x)=1.4608+0.9706x二次多项式的情形: 6+60+736=67 =1.0793 60+736+9792=802 =1.0921 736+9792+136000=10564 =-0.006796所求多项式为y=f(x)=1.0793+1.0921x-0.006796x213. 设五边形的五个顶点坐标为(10, 10),(15, 5),(12, 5),(8, 2)和(4, 5),利用多边形区域填充算法,编一程序生成一个实心图。解:假设以上五个顶点依次对应编号A-B-C-D-E,首先计算得到ET表:AEDCB1046/5EA1015-1BA 6-10 5 458-4/3DE584/3DC 3 2 1 0 用于存放AET活动边表该多边形的AET指针的内容为:1 AET为空58-4/3DE584/3DCAET2DCDEAET5-4/328/3-4/320/353DE-4/316/35-4/332/35DCAET46/5410-4/345DCEAAET5DE4/3125-11510BA1410BAEA6/526/510AET-16BAEA6/532/510AET-113107EA6/538/510AET-11210BA810AET-11110BAEA44/56/591010BAEA6/51010AET-110具体编程实现如下:第1步:(1) 根据输入的五个顶点坐标找到y值最小的点(例如点D,此时y=2),并找到与D有边关系的两个顶点(此时为E和C),在y=2处建立ET边表记录(ymax、xi和m值均可通过顶点坐标间的计算得到,例如DE边的建立,特别注意:当D点和E点y坐标值相同时,也即是DE与x轴平行,该边不能计入ET边表),之后标记D点被访问过;(2) 排除访问过的点以及和该点相关联的边,重复(1)直至将ET表建立完善。注边关系的建立可通过邻接矩阵的数据结构实现,权值可以为该矩阵行编号对应点的y坐标值,ET边表采用邻接表的数据结构第2步:根据ET表构建AET表,并逐行完成多边形填充,具体的C+代码如下:(1) 建立头文件base_class.h,主要是边表结点结构体和ET边表类的实现enum ResultCodeSuccess, Failure;template <class T>struct EnodeEnode() next=NULL;Enode(T pymax, float pxi, float pm, Enode *pnext)ymax=pymax; xi=pxi;m=pm; next=pnext;T ymax, xi; /ymax表示最大的y值,xi表示最底端点的x坐标值float m; /m表示斜率的倒数Enode *next; /定义了ET表和AET表中结点的结构体template <class T>class ETpublic:ET(int mSize); ET();ResultCode Insert(int u, T ymax, float xi, float m);int n; /覆盖该多边形的扫描线的总数,从0开始计数Enode<T> *a; /定义了边表类template <class T>ET<T>:ET(int mSize)n=mSize;a=new Enode<T> *n; for(int i=0;i<n;i+) ai=0; /ET边表的初始化template <class T>ET<T>:ET()Enode<T> *p, *q;delete a0; for(int i=1;i<n;i+)p=ai; q=p;while(p)p=p->next;delete q;q=p;delete a; /析构函数负责回收内存空间template <class T>ResultCode ET<T>:Insert(int u, T ymax, float xi, float m)if(u<0|u>n-1) return Failure;Enode<T> *p=new Enode<T>(ymax, xi, m, au);au=p;return Success; /依次插入结点构建出边表,其中a1到a10用于构建ET边表 /a0用于构建活动AET边表(2) 填充函数po_fill的实现和主函数的实现#include "base_class.h"#include "graphics.h"#include <iostream.h>void po_fill(ET<int> &etp, int ep, int color) /多边形填充函数的实现 int i=1; /i作为控制变量标识扫描线while(i<ep-1) if(etp.ai!=NULL)Enode<int> *p,*r;p=etp.ai;r=etp.a0;while(p) Enode<int> *q=new Enode<int>(p->ymax,p->xi,p->m,NULL); if(!etp.a0) etp.a0=q; r=q; else if(r->xi=q->xi) q->next=r->next; r->next=q; r=q; if(r->xi>q->xi) etp.a0=q; q->next=r; else while(q->xi>r->xi && r->next) r=r->next; if(r->next) q->next=r->next; r->next=q; else r->next=q; q->next=NULL; p=p->next; /按照xi值的大小将当前ET表中的记录放置到AET表中 Enode<int> *f,*g;if(etp.a0)f=etp.a0;while(f->next)g=f;f=f->next;for(int j=g->xi;j<=g->next->xi;j+)putpixel(j,i,color); /把一对相邻结点的xi区间范围进行填充if(etp.a0!=NULL)Enode<int> *w;int s=1;while(s)Enode<int> *z=NULL;w=etp.a0;s=0;while(w && w->ymax!=i)z=w; w=w->next; if(!w) break;if(z) z->next=w->next;else etp.a0=w->next;delete w;s=1; /删去AET表中i值已经等于ymax的结点记录 if(etp.a0)Enode<int> *u,*v;u=etp.a0;while(u)v=u;u=u->next;v->xi=v->xi+v->m; /用xi+m来替代原有的xii+; /进入下一条扫描线 void mai

注意事项

本文(《计算机图形学》第1-5章课后习题参考答案.doc)为本站会员(s****u)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!