第一范文网 - 专业文章范例文档资料分享平台

计算机图形学期末复习题 (2)

来源:用户分享 时间:2020-06-26 本文由霜雪落满头 分享 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

答:使用直线的参数方程,把二维裁剪问题化为两次一维裁剪

参数u的算法

初始化线段交点的参数:u1=0,u2=1; 计算出各个裁剪边界的p、q值;

调用函数clipTest(),在函数中根据p、q来判断:是舍弃线段还是改变交点的参数。

? 当p<0时,参数r用于更新u1;(u1=max{u1,…,rk}) ? 当p>0时,参数r用于更新u2;(u2=min{u2,…,rk})

如果更新了u1或u2后,使u1>u2,则舍弃该线段。

当p=0且q<0时,因为线段平行于边界并且位于边界之外,

p、q的四个值经判断后,如果该线段未被舍弃,则裁剪线段的端点坐标由参数u1和u2的值决定。

? 当Δx≥0(或Δy≥0)时,称x=xL(y=yB)为始边, x=xR(y=yT)为终边。 ? 当Δx<0(Δy<0)时,称x=xL(y=yB)为终边, x=xR(y=yT)为始边。

12边裁剪是针对什么样的图形的裁剪算法?针对什么样的窗口,基本思想是什么?

? 答:每次用窗口的一条边界对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧

的顶点,删除外侧的顶点,同时,适时地插入新的顶点:即交点和窗口顶点,从而得到一个新的多边形顶点序列。

? 然后以此新的顶点序列作为输入,相对第二条窗边界线进行裁剪,又得到一个更新的多边形顶点序列。 ? 依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边形顶点序列即为所求的裁剪好了的

多边形。 13种子填充算法的算法分析(问答题)

答:1 有些像素会多次入栈,降低了算法的效率;同时栈结构也占用一定的存储空间。

2 递归执行,算法简单,但效率不高。区域内的每一像素都引起一次递归的调用,进栈出栈费时费内存。

二.应用题

1. 用DDA算法画一条直线,直线的起点为(0,0),直线的终点为(5,2)。

K=2/5=0.4 x y y+0.5 0 0 0.5 1 0.4 0.9 2 0.8 1.3 3 1.2 1.7 4 1.6 2.1

5 2.0 2.5 画图省略

2. 用Bresenham画线算法画一条直线,直线的起点为(0,0),直线的终点为(5,2)

d=0 ,k=0.4

xi yi 第一次d 第二次d 0 0 0 0 1 0 0.4 0.4 2 1 0.8 -0.2 3 1 0.2 0.2 4 2 0.6 -0.4

5 2 0 画图过程省略

3 用中点画线算法画出(0,0)到(5,2)的一条直线 答:dx=5 ,dy=2 d的初始值是dx-2dy=1 若d<0 ,(x,y)更新为(x+1,y+1),则d的增量为2(dx-dy)=6 若d>0,(x,y)更新为(x+1,y),则d的增量为 -2dy= -4 X y d 0 0 1 1 0 -3 2 1 3 3 1 -1 4 2 5

5 2 画图过程省略

4用Bresenham画线算法画一条直线,直线的起点为(0,0),直线的终点的x坐标为你的学号对5求余,y坐标为对8求余(如果为0,x坐标加3,y坐标加5)。 答:12%5=2 12%8=4 ,因此画(0,0)到(2,4)的直线

做法同上 省略

5写出下图的新边表,并写出扫描线2的活化边表。

6 画出针对下面的多边形采用边填充算法后每一步的填充情况。

题有错误!!!

填充过程省略,详见ppt,白给分的题!!!

7 已知窗口左下角坐标(50,50),右上角坐标(400,400)。Cohen-Sutherland裁剪算法的编码图如

下。直线的端点坐标P1(40,100)和P2(500,420),请参照编码图示,求出P1和P2所在区域的分区代码C1和C2。说出P1P2的 裁剪过程。

Cohen-Sutherland算法代码:

void CS_LineClip(float x1,float y1,float x2,float y2){ code1=encode(x1,y1); code2=encode(x2,y2); while(code1!=0 ||code2!=0){ if((code1&code2)!=0) return; code = code1;

if(code1==0) code = code2; ……(求交点)

if(code ==code1){ x1=x; y1=y; code1 =encode(x,y);} else

{ x2=x; y2=y; code2 =encode(x,y); } }

setcolor(4);

line(x1,y1,x2,y2); }

8 直线的编码裁剪算法中,直线P1 P2的编码分别为C1 和C2。分别就下面两种情况,说明直线P1 P2与裁

剪窗口的关系。 1)C1= =0并且C2= =0. p1p2完全在窗口内,即线段完全可见

2)(C1&C2)= =0。属于其他情况

3)(C1&C2) !=0。 p1p2显然不可见

9 已知窗口左边界XL=100,线段端点P1(50,110), P2(200,200),求线段与窗口左边界的交点。

10 用中点分割算法求直线与窗口边界的交点时,假如直线的长度为64,那么最多求交多少次?

11 分析直线B采用梁-baskey算法对直线进行裁剪过程的。

12 按逐边裁剪算法对四边形ABCD进行裁剪,每次选择窗口的一条边对图形进行裁剪,选择的顺序有多种情

况,下面列了其中的六种。用你的学号对6求余然后加1,选择得到的数字对应的情况,例如如果你的学号 为11,对6求余值为5,则你选择第6种情况,即按左上右下的顺序进行裁剪。将每次裁剪的情况画出来,并写明对应的字符序列。 窗口的情况:(1)上下左右(2)左右上下(3)上左下右(4)左下右上(5)上右下左(6)左上右下

你的学号为 12 a的值为

13 分析针对任意点的比例(旋转/对称)变换的过程,写出变换矩阵。 三.编程题

1. 写出八向联通的种子填充算法的程序。

void FloodFill8(int x,int y,int fillcolor, int edgelolor){

int current;

current=getpixel(x,y);

if((current!=edgecolor)&& (current!=fillcolor)){ putpixel(x,y,fillcolor);

FloodFill8(x+1,y,fillcolor,edgecolor); FloodFill8(x-1,y,fillcolor,edgecolor); FloodFill8(x,y+1,fillcolor,edgecolor); FloodFill8(x,y-1,fillcolor,edgecolor);

后面还有4句

} }

2. 写出八分圆思想的代码。

void circlePoint(int x, int y){

putpixel ( x, y); putpixel ( y, x); putpixel ( -y, x); putpixel ( -x, y); putpixel ( -x, -y); putpixel ( -y, -x); putpixel ( y, -x); putpixel ( x, -y); }

3. 编写代码,调用C语言的图形函数,画一组同心圆,同心圆的圆心座标为(320,240),半径从50到500,

同心圆的个数为10。

#include circle(320,240,200); main( ){ circle(320,240,240); int gd=DETECT,gm; circle(320,240,300); initgraph(&gd,&gm,\ circle(320,240,350); circle(320,240,50); circle(320,240,450); circle(320,240,80); circle(320,240,500); circle(320,240,100); getchar( ); circle(320,240,150); closegraph( ); }

4. 边标志算法的代码 EdgeMarkFill(int p[][2],int n,int bcolor,int fcolor){ int i,x,y,flag,xmin,xmax,ymin,ymax; /*求出xmin,xmax,ymin,ymax;*/ for(y=ymin;y<=ymax;y++) { flag=-1;

for(x=xmin;x<=xmax;x++){ if(getpixel(x,y)==bcolor)

flag=-flag;

if(flag==1)

putpixel(x,y, fcolor); } } } 5. 编写代码,写出按上下左右的原则,对点进行Cohen-Sutherland编码。 #include return c; } #include void CS_LineClip(int x1,int y1,int x2,int y2){ #define LEFT 1 int code1,code2,code,x,y; #define RIGHT 2 code1=encode(x1,y1); #define BOTTOM 4 code2=encode(x2,y2); #define TOP 8 while(code1 !=0||code2 !=0){ #define XL 120 if((code1&code2)!=0) return; #define XR 400 if(code1!=0) code=code1; #define YB 130 else #define YT 230 code=code2; int encode(float x,float y){ if((LEFT & code)!=0){ int c=0; x=XL; if(xXR) x=XR; c|=RIGHT ; y=y1+(y2-y1)*(XR-x1)/(x2-x1); } if(yYT) x=x1+(x2-x1)*(YB-y1)/(y2-y1); } c|=TOP; else if((TOP & code)!=0){

搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新资格考试认证计算机图形学期末复习题 (2)全文阅读和word下载服务。

计算机图形学期末复习题 (2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/wenku/1102140.html(转载请注明文章来源)

相关推荐:

热门推荐
Copyright © 2018-2022 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top