@rayiooo
2018-07-04T02:52:41.000000Z
字数 4934
阅读 2042
计算机考试复习
实时更新.
发布地址已变更.
差不多已完结.
| Author | 爱吃大板 |
|---|---|
| rayiooo@foxmail.com | |
| Time | 2018.7 |
void DDA_Line(int x0, int y0, int x1, int y1, int color){int dx = x1 - x0;int dy = y1 - y0;float k = dy / dx;float y = y0;for(x=x0; x<=x1; x++){drawPixel(x, int(y + 0.5), color);y += k;}}
// 因为d0 = a + 0.5b,所以用2d代替d来摆脱浮点运算。void Midpoint_Line(int x0, int y0, int x1, int y1, int color){int a = y0 - y1;int b = x1 - x0;//int c = x0 * y1 - x1 * y0; //这行用不到int d = (a + 0.5 * b) * 2;int d1 = a * 2;int d2 = (a + b) * 2;int x = x0, y = y0;dralPixel(x, y, color);while(x < x1){if(d < 0){x++; y++; d+=d2;}else{x++; d+=d1;}drawPixel(x, y, color);}}
Question: 依次写出用中点画线法进行直线扫描转换,从点(5,5)到(15,11)经过的像素点。
Answer:
a = y0 - y1 = -6
b = x1 - x0 = 10
c = x0y1 - x1y0 = -20
F(x, y) = -6x + 10y - 20
d0 = F(M) = F(x0+1, y0+0.5) = F(x0, y0) + a + 0.5b
因为增量
a = -6,a + b = 4,故有下表
d d的计算 d的值 x y d0 a + 0.5b -1 5 5 d1 d0 + (a+b) 3 6 6 d2 d1 + a -3 7 6 d3 d2 + (a+b) 1 8 7 d4 d3 + a -5 9 7 d5 d4 + (a+b) -1 10 8 d6 d5 + (a+b) 3 11 9 d7 d6 + a -3 12 9 d8 d7 + (a+b) 1 13 10 d9 d8 + a -5 14 10 d10 d9 + (a+b) -1 15 11 所以答案是(5,5)、(6,6)、(7,6)、(8,7)、(9,7)、(10,8)、(11,9)、(12,9)、(13,10)、(14,10)、(15,11)。
void Bresenham_Line(int x0, int y0, int x1, int y1, int color){float k = (y1 - y0) / (x1 - x0);float e = -0.5;int y = y0;for(x=x0; x<=x1; x++){drawPixel(x, y, color);e += k;if(e >= 0){y++;e--;}}}
//内点表示的四连通区域的递归填充算法void FloodFill4(int x, int y, int oldColor, int newColor){if(getPixel(x, y) == oldColor){drawPixel(x, y, newColor);FloodFill4(x, y+1, oldColor, newColor);FloodFill4(x, y-1, oldColor, newColor);FloodFill4(x+1, y, oldColor, newColor);FloodFill4(x-1, y, oldColor, newColor);}}
//边界表示的四连通区域的递归填充算法void BoundaryFill4(int x, int y, int boundaryColor, int newColor){int color = getPixel(x, y);if(color != boundaryColor && color != newColor){drawPixel(x, y, newColor);BoundaryFill4(x, y+1, boundaryColor, newColor);BoundaryFill4(x, y-1, boundaryColor, newColor);BoundaryFill4(x+1, y, boundaryColor, newColor);BoundaryFill4(x-1, y, boundaryColor, newColor);}}
是一种二分法求边界交点的方法。
数学二分法是无限的,但图形像素二分法是有限的。

如下图所示,裁减窗口为正方形,采用逐边裁件算法,依次按左、下、右、 上的顺序,用四条窗口边界裁减多边形ABCDE。试写出每条框口边界裁减后 输出的新的多边形的顶点序列。

答:左边界裁减后:ABCD12,下边界裁减后:4B56D123,右边界裁减后:4B7D123,上边界裁减后:4B789123。
Q:什么叫做走样?什么叫做反走样?反走样技术包括那些?
A:走样指的是用离散量表示连续量引起的失真。
为了提高图形的显示质量。需要减少或消除因走样带来的阶梯形或闪烁效果,用于减少或消除这种效果的方法称为反走样。
加权区域取样的方法是:
①前滤波,以较高的分辨率显示对象;
②后滤波,即加权区域取样,在高于显示分辨率的较高分辨率下用点取样方法计算,然后对几个像素的属性进行平均得到较低分辨率下的像素属性。


//伪代码RayTracing(start, direction, weight, color){if(weight < MinWeight)color = black;else{计算光线与所有物体交点中离start最近的点;if(没有交点)color = black;else{Ilocal = 在交点处用局部光照模型计算出的光强;计算反射方向R;RayTracing(交点, R, weight * w, Ir);计算折射方向T;RayTracing(交点, T, weight * w, It);color = Ilocal + KsIr + KtIt;}}}
Q:假设在观察坐标系下窗口区的左下角坐标为(wxl=10,wyb=10),右上角坐标为(wxr=50,wyt=50)。设备坐标系中视区的左下角坐标为(vxl=10,vyb=30),右上角坐标为(vxr=50,vyt=90)。已知在窗口内有一点p(20,30),要将点p映射到视区内的点p,请问p点在设备坐标系中的坐标是多少?
A:书上的解法太麻烦了。设从窗口区到视图区的转换矩阵
则左下角坐标转换
右上角坐标变换
解得
所以将点P映射就是
∴p点在设备坐标系中的坐标是(20, 60)。
1. 设有一条二次Bezier曲线的控制点为P0,P1,P2,另一条二次曲线Bezier曲线的控制顶点为Q0,Q1,Q2,P2=Q0。请写出两条曲线可以精确合并(表示)为一条二次Bezier曲线的条件。
解:P2=Q0,且P1,P2(Q0),Q1三点共线,切平面重合,曲率相等
2. 已知Bezier曲线上的4个点分别为Q0(50,0),Q1(100,0),Q2(0,50)和Q3(0,100),它们对应的参数分别为0,1/3,2/3,1,反求Bezier曲线的控制点。
Q(0)=P0B0,3(0)+P1B1,3(0)+P2B2,3(0)+P3B2,3(0)(50,0)=P0×1+P1×0+P2×0+P3×0=P1
Q(1)=P3=(0,100)
Q(1/3)=P0×1×8/27+P1×3×4/27+P2×3×2/27+P3×1×1/27=(100,0)
Q(2/3)=P0×1×1/27+P1×3×2/27+P2+3×4/27+P4×8/27=(0,50)
方程连立求出:P0,P1,P2,P3
3. 设一条三次Bezier曲线的控制点为P0,P1,P2,P3。对曲线上一点P(0.5)及一个给定的目标点T,给出一种调整Bezier曲线形状的方法,使得P(0,5)精确通过点T。
对曲线进行二维平易拉伸变换,设T(X,Y) 将P1调整到P1+X, T=P(0.5)+XB1,3(0.5) 将P1调整到P1+(T-P(0.5))/B1,3(0.5)
4. 计算以(30,0),(60,10),(80,30),(90,60),(90,90)为控制顶点的4次Bezier曲线在t=1/2处的值。
C(1/2)=(30,0)×1×1/16+(60,10)×4×1/16+(80,30)×6×1/16+(90,60)×4×1/16+(90,90)×1×1/16
5. 给定三次Bezier曲线的控制点(0,0),(0,100),(100,0),(100,100),计算升阶一次后的控制顶点。
Pj(1)=(j/(n+1))pj-1+(1-j/(n+1))pj
P0(1)=(0/4)P0-1+(1-0)P0=P0=(0,0)
P1(1)=(1/4)P0+(1-1/4)P1=(0,75)
P2(1)=(2/4)P1+(1-2/4)P2=(50,50)
P3(1)=(3/4)P2+(1-3/4)P3=(100,25)
P4(1)=(4/4)P3+(1-1)P4=(100,100)