计算机图形学基础教程习题课1第二版孙家广胡事民编著
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.列举计算机图形学的主要研究内容。
计算机中图形的表示方法、图形的计算、图形的处理和图形的显示。
图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。
2.常用的图形输出设备是什么?
显示器(CRT、LCD、等离子)、打印机、绘图仪等。
2.常用的图形输入设备是什么?
键盘、鼠标、跟踪球、空间球、数据手套、光笔、触摸屏、扫描仪等。
3.列出3种图形软件工具。
AutoCAD、SolidWorks、UG、ProEngineer、CorelDraw、Photoshop、PaintShop、Visio、3DMAX、MAY A、Alias、Softimage等。
错误:CAD
4.写出|k|>1的直线Bresenham画线算法。
d
d
d
d
设直线方程为:y=kx+b,即x=(y-b)/k,有x i+1=x i+(y i+1-y i)/k = x i+1/k,其中k=dy/dx。因为直线的起始点在象素中心,所以误差项d的初值d0=0。y下标每增加1,d的值相应递增1/k,即d=d+1/k。一旦d≥1,就把它减去1,这样保证d在0、1之间。
●当d≥0.5时,最接近于当前象素的右上方象素(x i+1,y i+1),x方向加1,d减
去1;
●而当d<0.5时,更接近于上方象素(x i,y i+1)。
为方便计算,令e=d-0.5,e的初值为-0.5,增量为1/k。
●当e≥0时,取当前象素(x i,y i)的右上方象素(x i+1,y i+1),e减小1;
●而当e<0时,更接近于上方象素(x i,y i+1)。
void Bresenhamline (int x0,int y0,int x1, int y1,int color)
{ int x, y, dx, dy;
float k, e;
dx = x1-x0, dy = y1-y0, k=dy/dx;
e=-0.5, x=x0, y=y0;
for (i=0; i≤dy; i++)
{ drawpixel (x, y, color);
y=y+1,e=e+1/k;
if (e≥0)
{ x++, e=e-1;}
}
}
4.写出|k|>1的直线中点画线算法。
构造判别式:d=F(M)=F(x p+0.5,y p+1)=a(x p+0.5)+b(y p+1)+c
●当d<0,M在Q点左侧,取右上方P2为下一个象素;
●当d>0,M在Q点右侧,取上方P1为下一个象素;
●当d=0,选P1或P2均可,约定取P1为下一个象素;
增量计算:
●若d≥0,取正上方象素P1 (x p, y p+1),要判下一个象素位置,应计算
d1= F(M1)=F(x p+0.5, y p+2)=a(x p+0.5)+b(y p+2)+c=d+b
增量为b。
●若d<0,取右上方象素P2 (x p+1, y p+1)。要判断再下一象素,则要计算
d2= F(M2)=F(x p+1.5, y p+2)=a(x p+1.5)+b(y p+2)+c=d+a+b
增量为a+b。
●d的初值d0=F(x0+0.5, y0+1)=F(x0, y0)+0.5a+b =0.5a+b
用2d代替d的算法:
void Midpoint Line (int x0,int y0,int x1, int y1,int color)
{ int a, b, d1, d2, d, x, y;
a=y0-y1, b=x1-x0, d=a+2*b;
d1=2*b, d2=2*(a+b);
x=x0, y=y0;
drawpixel(x, y, color);
while (y { if (d<0) {x++, y++, d+=d2; } else {y++, d+=d1;} drawpixel (x, y, color); } /* while */ } /* mid PointLine */ 5.写出下图中多边形的边表(新边表)。 5.写出下图中多边形的边表(新边表)。 6. 写出以原点为球心,半径为2的球体的旋转生成算法。 算法一:以点为基本图元 for(j=0;j<72;j++) { 绕Y 轴逆时针旋转5度,⎥⎥⎥ ⎥⎥⎥⎦⎤ ⎢⎢⎢⎢⎢⎢⎣ ⎡-=1000036cos 036sin 0010 036sin 036cos π π π πy R ; //画出半圆 画点(0,2,0); for(i=0;i<36;i++) { 将当前点绕Z 轴逆时针旋转5度,⎥⎥⎥⎥⎥⎥⎦ ⎤⎢⎢⎢⎢⎢⎢⎣ ⎡-=100001000036cos 36sin 0036 sin 36cos π π π πz R ; 画变换后的点⎥⎥⎥⎥ ⎦ ⎤⎢⎢⎢⎢⎣⎡⋅⋅=⎥⎥⎥⎥ ⎦ ⎤ ⎢⎢⎢⎢⎣⎡'''10201z y R R z y x ;}} 算法二:以圆弧为基本图元 for(j=0;j<72;j++) { 绕Y 轴逆时针旋转5度,⎥⎥⎥ ⎥⎥⎥⎦⎤ ⎢⎢⎢⎢⎢⎢⎣⎡-=1000 036cos 036sin 0010 036sin 036cos π π π πy R ; 画半圆;}