当前位置:文档之家› 秋双学位计算机图形学

秋双学位计算机图形学

2006年秋双学位计算机图形学作业题目教材计算机图形学(第二版)第一次P1053.17 利用中点算法并考虑对称性,推导在区间-10<=x<=10上,对下列曲线进行扫描转换的有效算法:y=(1/12)*x33.20 考虑对称性,建立中点算法对形式为y=ax2-b的任意抛物线进行扫描转换,参数a,b及x的范围从输入值获得。

第二次P1063.34 利用circle函数,编写一个程序,显示具有合适标记的饼图。

程序的输入包括:在某些区间上给定数据分布的数据组,饼图的名称和区间的名称。

每部分的标记将是显示在饼图边界外靠近对应饼图部分的地方。

第三次10.7 P1394.20 编写一个程序,使用指定的图案对给定的椭圆内部进行填充。

第四次10.14 P1685.12 确定对于任何直线y=mx+b的反射变换矩阵的形式。

第四次10.22比较若干条相对于裁剪窗口的不同方向的线段的Cohen-Sutherland和梁友栋-Barsky裁剪算法的算术运算次数。

第五次10.296.18 将梁友栋-Barsky算法改称多边形裁剪算法。

第六次11.48.13 设计一个程序,该程序允许用户使用一个笔画设备交互式地画图。

第七次11.1110.9 建立一个将给定的球、椭球或圆柱体变成多边形网格的一个算法。

第八次11.1810.20 给出d=5的均匀周期性B-样条曲线的混合函数。

第九次11.2511.13 设计关于任选平面反射的例程。

第十次12.8 编写一个将透视投影棱台变换到规则平行六面体的程序。

上机1.实现Cohen-Sutherland多边形裁剪算法,要求显示多边形被每一条窗口边裁剪后的结果。

2.编写一个程序,允许用户通过一个基本形状菜单并使用一个拾取设备,将每一个选取的形状拖曳到指定位置,并提供保存和载入的功能。

3.. 写一篇综述性的调研报告,要求不少于3000字,独立完成。

内容可以是计算机图形学理论或算法的研究。

如:曲线、曲面拟合算法;几何造型方法的研究。

如:分形树、分形山、树木、花草、云、瀑布、粒子系统等等。

或任何你感兴趣的领域。

4.2006年秋双学位计算机图形学作业参考答案P1053.17 利用中点算法并考虑对称性,推导在区间-10<=x<=10上,对下列曲线进行扫描转换的有效算法:y=(1/12)*x3解答:第一象限和第三象限中心对称考滤第一象限:对于斜率大于1的曲线段和斜率小于1的曲线段要分别考虑。

dy/dx=(1/4)*x 2 ,当0≤x ≤2时,dy/dx ≤1;当x>2时,dy/dx >1; 定义函数:f(x,y)=y-(1/12)*x 3⎪⎩⎪⎨⎧><内上外位于曲线),(0位于曲线),(0=位于曲线),(0),(y x y x y x y x f决策参数p k1)当0≤x ≤2(区域1)时, P1k = f(x k +1,y k +1/2),P1 k+1=f(x k+1+1,y k+1+1/2), x k +1= x k+1P1 k+1= P1k + (y k+1-y K )-(1/12)*(3*x k 2+9*x k +7);()()⎪⎩⎪⎨⎧<++-≥++-=++++01133121101133121增量121121k k k k k k p x x p x x2)当x >2(区域2)时,P2k = f(x k +1/2,y k +1),P2 k+1=f(x k+1+1/2,y k+1+1), y k +1= y k+1P2 k+1= P2k + 1-(1/12)*[(x k+1+1/2)3-(x k +1/2)3];内外()⎪⎩⎪⎨⎧>+-≤=+024/131211021增量21k k k p x p 算法描述:1. 初始点(0,0)2. 计算区域1中的初始决策参数值p10 = f(1,1/2)=5/123. 对区域1中,0≤x ≤2,从k=0开始,完成下列测试:假如p1k <0,则下一个点为(x k +1,y k +1)并且P1 k+1= P1k + 1 -(1/12)*( 133121++++k k x x )否则下一个点为(x k +1,y k )P1 k+1= P1k -(1/12)*( 133121++++k k x x )4. 当x>2时,进入区域2, 使用区域1的最后点(2,2/3)计算区域2的决策参数值:p20=f(2+1/2,2/3+1)完成下列测试:假如p2k >0,则下一个点为(x k +1,y k +1)并且P2 k+1= P2k + ()4/13121121+-+k x 否则下一个点为(x k ,y k +1) P2 k+1= P2k + 15. 利用中心对称确定第三象限的点。

6. 重复区域1中的步骤直到x=2,重复区域2中步骤直到x=10。

3.20 考虑对称性,建立中点算法对形式为y=ax 2-b 的任意抛物线进行扫描转换,参数a,b 及x 的范围从输入值获得。

解答:考虑y=ax 2-b 的任意曲线都可以由y=|a| x 2通过翻转和平移得到,所以先计算y=|a| x 2曲线。

令|a|=A;dy/dx=2Ax ,当0≤x ≤1/(2A)时,dy/dx ≤1;当x>1/(2A)时,dy/dx >1; 定义函数:f(x,y)=y-Ax 2⎪⎩⎪⎨⎧><内上外位于曲线),(0位于曲线),(0=位于曲线),(0),(y x y x y x y x f决策参数p k1)当0≤x ≤1/(2A)(区域1)时, P1k = f(x k +1,y k +1/2),P1 k+1=f(x k+1+1,y k+1+1/2), x k +1= x k+1P1 k+1= P1k + (y k+1-y K )-A*(2*x k +3);⎩⎨⎧<+≥+=++011)x *(2*A -1011)x *(2*A 增量1k 1k k k p p2)当x >1/(2A)(区域2)时,P2k = f(x k +1/2,y k +1),P2 k+1=f(x k+1+1/2,y k+1+1),y k +1= y k+1P2 k+1= P2k + 1 - A*[(x k+1+1/2)2-(x k +1/2)2];⎩⎨⎧>-≤=+022Ax 1021增量1k k k p p 算法描述:1. 输入a,b 和x 范围[x min , x max ],令A=|a|。

2. 令MAX=max{ |x min |, |x max |}, 在范围[-MAX,MAX]中作曲线3. 初始点为(0,0),计算区域1中的初始决策参数值p10 = f(1,1/2)4. 对区域1中,0≤x ≤1/(2A),从k=0开始,完成下列测试:假如p1k <0,则下一个点为(x k +1,y k +1)并且P1 k+1= P1k + 1)x *(2*A -11k ++ 否则下一个点为(x k +1,y k ) P1 k+1= P1k - 1)x *(2*A 1k ++5. 当x>1/(2A)时,进入区域2, 使用区域1的最后点(x0,y0)为初值计算区域2的决策参数值初值:p20=f(x0+1/2, y0+1) 完成下列测试:假如p1k >0,则下一个点为(x k +1,y k +1)并且P2 k+1= P2k + 1k 2Ax 1+-否则下一个点为(x k ,y k +1) P2 k+1= P2k + 16. 利用中心对称确定第二象限的点。

7. 如果MAX ≤1/(2A),那么重复区域1中步骤,计算到x=MAX ,无须计算区域2;否则重复计算区域1中步骤,直到x=1/(2A),进出区域2,重复计算区域2中步骤,直到x=MAX 。

8. 截取[x min , x max ]中的部分,如果a<0,那么就将计算所得点(x,y)变换到(x,-y)。

9. 将上面所得曲线点(x,y)移到(x,y-b) P1063.34 利用circle 函数,编写一个程序,显示具有合适标记的饼图。

程序的输入包括:在某些区间上给定数据分布的数据组,饼图的名称和区间的名称。

每部分的标记将是显示在饼图边界外靠近对应饼图部分的地方。

解答:#define TWO_PI 6.28 Typedef struct{Int number; //数据组中元素的个数 Char[20] ChartName;Data_t* pdata; //指向数据组的指针 }pieChart_array; Typedef struct{ Float dataChar[20] SecName; }Data_t;Void pieChart(pieChart_array dataArray){wcPt2 pts[2],center;float radius = WINDOW_HEIGHT/4.0float newSlice, total=0.0, lastSlice=0.0;int counter;center.x=WINDOW_WIDTH/2;center_y=WINDOW_WIDTH/2;//画圆pCircle(center,radius);//求总数for(counter=0;counter<dataArray.number;counter++){total += (dataArray.pdata[counter])->data;}pts[0].x=center.x;pts[0].y=center.y;//求每个区间的数据和的大小并画线,标明区间名for(counter=0;counter<dataArray.number;counter++){newSlice=TWO_PI*(dataArray.pdata[counter])->data/total+lastSlice;pts[1].x=center.x+radius*cosf(newSlice);pts[1].y=center.y+radius*sinf(newSlice);pPolyline(2,pts);//设置文字的对齐方式if (newSlice<TW0_PI/4 || newSlice>TWO_PI*3/4){setTextAlignment(right,normal);}else{setTextAlignment(left,normal);}text(pts[1], (dataArray.pdata[counter])-> SecName);lastSlice=newSlice;}//画饼图名称pts[0].x=center.x;pts[0].y=center.y+ radius+4;text(pts[0], dataArray.ChartName);}4.20 编写一个程序,使用指定的图案对给定的椭圆内部进行填充。

相关主题