计算机图形学复习之主要算法与公式.doc
文本预览下载声明
中点画线法算法步骤:
0≤k≤1时中点画线法的算法步骤为:
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、d=0.5-k、x=x0、y=y0;
3.绘制点(x,y)。判断d的符号;
若d0,则(x,y)更新为(x+1,y+1),d更新为d+1-k;
否则(x,y)更新为(x+1,y),d更新为d-k。
4.当直线没有画完时,重复步骤3。否则结束。
改进:用2d△x代替d
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、d=△x-2△y、x=x0、y=y0。
3.绘制点(x,y)。判断d的符号。
若d0,则(x,y)更新为(x+1,y+1),d更新为
d+2△x-2△y;
否则(x,y)更新为(x+1,y), d更新为d-2△y。
4.当直线没有画完时,重复步骤3。否则结束。
Bresenham算法步骤:
算法步骤:
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、d=0、x=x0、y=y0。
3.绘制点(x,y)。
4.d更新为d+k,判断d的符号。若d0.5,则(x,y)更新为(x+1,y+1),同时将d更新为d-1;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。否则结束。
改进算法步骤:
1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-△x、x=x0、y=y0。
3.绘制点(x,y)。
4.e更新为e+2△y,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。否则结束。
中点画圆法:
改进:用d-0.25代替d
算法步骤:
1.输入圆的半径R。
2.计算初始值d=1-R、x=0、y=R。
3.绘制点(x,y)及其在八分圆中的另外七个对称点。
4.判断d的符号。若d≤0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。
5.当xy时,重复步骤3和4。否则结束。
椭圆中点画法:
算法步骤:
1.输入椭圆的长半轴a和短半轴b。
2.计算初始值d=b2+a2(-b+0.25)、x=0、y=b。
3.绘制点(x,y)及其在四分象限上的另外三个对称点。
4.判断d的符号。若d≤0,则先将d更新为d+b2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b2(2x+3)+a2(-2y+2),再将(x,y)更新为(x+1,y-1)。
5.当b2(x+1)a2(y-0.5)时,重复步骤3和4。否则转到步骤6。
6.用上半部分计算的最后点(x,y)来计算下半部分中d的初值:
7.绘制点(x,y)及其在四分象限上的另外三个对称点。
8.判断d的符号。若d≤0,则先将d更新为b2(2xi+2)+a2(-2yi+3),再将(x,y)更新为(x+1,y-1);否则先将d更新为d+a2(-2yi+3),再将(x,y)更新为(x,y-1)。
9.当y0时,重复步骤7和8。否则结束。
多边形的扫描转换
x-扫描线算法
算法步骤:
(1)确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax)。
(2)从y=ymin到y=ymax,每次用一条扫描线进行填充。
(3)对一条扫描线填充的过程可分为四个步骤:
a.求交
b.排序
c.交点配对
d.区间填色
当扫描线与多边形的顶点相交时,
若共享顶点的两条边分别落在扫描线的两边,交点只算一个;
若共享顶点的两条边在扫描线的同一边,这时交点作为零个(两边顶点均在下方)或两个(均在上方)。
改进的扫描线(有效边)算法(活性边表法)
边表的构造:
(1)首先构造一个纵向链表,链表的长度为多边形所占有的最大扫描线数,链表的每个结点,称为一个桶,则对应多边形覆盖的每一条扫描线。
(2)将每条边的信息链入与该边最小y坐标(ymin )相对应的桶处。也就是说,若某边的较低端点为ymin,则该边就放在相应的扫描线桶中。
(3)每条边的数据形成一个结点,内容包括:该扫描线与该边的初始交点x(即较低端点的x值),1/k,以及该边的最大y值ymax。
x|ymin ymax 1/k NEXT
(4)同一桶中若干条边按X|ymin由小到大排序,若X|ymax 相等,则按照1/m由小到大排序。
算法步骤:
(1)初始化:构造边表,AET表置空;
(2)将第一个不空的ET表中的边与AET表合并;
(3)由AET表中取出交点对进行填充。填充之后删除y=ym
显示全部