1、第3章 直线和圆弧的生成算法,3.2 圆弧图形的生成算法,3.1 直线图形的生成算法,3.0 问题提出,(书上第5章5.15.3),Visual C/C+ 中窗口程序编写 及 窗口作图函数的调用,数学:,窗口:,3.0 问题提出,数学:,窗口:,已有: 画点函数,SetPixel( int x, int y, int color ),已知: ( X1, Y1 ), ( X2, Y2 ),算法:,要求:,逼近效果好,计算量小。,思考:,像素点: 取离散整数点的坐标,起 点: ( X1, Y1 ), 整数点坐标,终 点: ( X2, Y2 ), 整数点坐标,1. 增量法(数值微分法,DDA),2.
2、 中点法,3. Brensenham画线算法,1. 增量法,斜率:,当 | k | 1 时:,当 | k | = 1 时:,递推,浮点加, 每步计算时准确, 画时取整。,方程:,x, y 交换, y 每次递增1, x为,程序:,void DDAline ( CDC *dc, int x1, int y1, int x2, int y2, int color ) int x;float y, k;k = ( ( float ) x2 - x1 ) / ( y2 - y1 );y = y1;for( x = x1; x SetPixel( x, ( int ) ( y + 0.5 ), color
3、 );y += k; ,不完整!,2. 中点法,基本思想,p1,p2,Q,M,设 斜率,M 在Q下方, 则取,否则,取,算法:,具体实现:,端点:( X1 , Y1 ) , ( X2 , Y2 ),方程:,即:,中点值:,则: d 0, M 在下方,取P2,d = 0, M 在上方,取P1,根据 d 的符号选哪个像素,算法:,d 是 xp 和 yp 的线性函数,可采用递推(增量)计算,本步 d = 0 : 取 P1 点,则下步,计算,本步 d 0 : 取 P2 点,则下步,计算,d 的初值 :,具体: 可用 2d 代替 d , 此时 d 的符号不变。,其它斜率情况类拟。,程序:,见 3-2.c
4、pp,3. Bresenham 画线算法,应用最广泛,线段端点: ( X1 , Y1 ) , ( X2 , Y2 ),思想:,误差项 d , 初值d = 0, 每次,当前点 ( x, y ), 初值 ( X1, Y1 ) 。,计算,取下一点 ( x + 1, y +1 ), 且d = d - 1,取下一点 ( x + 1, y ),一点点确定与理想直线靠得最近的点。,误差项 d,时,取 y + 1, e = e - 1,时,取 y,e 的初值:- 0.5,每次,再变为整数 加减 运算?,整数Bresenham算法!,整数Bresenham算法:,( x, y ) 初值 ( X1,Y1),第一次
5、 d = k , 即,如果 (1), 则取 y + 1, 且下一次,因,得,(2), 则取 y, 且下一次,直到 x = X2。初值 。,程序,见 3_3.cpp,作业: 1. 对以上三种算法对 k 在其它非0-1之间的情况进行推导。2. 分别改进 3_1.cpp, 3_2.cpp, 3_3.cpp, 得到适合任何k值的完整画线程序。,3.1节完,(二次曲线),1. 对称性,圆心 ( 0 , 0 ) , 半径 R,椭圆:,圆:,3.2 圆弧图形的生成算法,2. Bresenham画圆算法,算法思想:,具体:,V( x, y - 1 ),H ( x + 1, y ),D( x + 1, y -
6、1 ),下一候选点 H、V、D, 这 3 个像素点与圆弧最近者为所求点。,H、V、D 三点离圆弧距离:,第2次课完(10.11.11),(1),( 、二种情况 ): D 在圆内,此时,候选为, 离H 近,取 H, 离D 近,取 D,对,H、D都在圆内, y 是 x 的递减函数,故取H。,此时, 即,也即,故若, 则取 H , 否则 取 D,具体地:,则, 取D, 否则 取H,(2), 则取 D、V 两者之一, 即,则取 D , 否则取V,对, V 在圆内, D在圆外, 故, 则取V , 否则取 D,对, D 、V 都在圆外, 则取V,此时, 即,也即,以上算法为1/8象限上的画点,其余作对称处
7、理即可。,下一个取 H :,取, 其误差项,下一个取 V:,取,下一个取 D:,取,程序,见 3_4.cpp,2011.09.第2次课完,3. 椭圆的扫描算法 ( 中点法 ),不妨设, 否则 x, y 交换。,对称,故选第1象限。,下半部分,上半部分,上半部分,以 x 为增量, 每步 +1,下半部分,以 y 为增量, 每步 +1,两部分分界点:,切线法向量的2个分量相等 。,椭圆上一点 ( x, y ) , 法向量,M :,法向量, 则在上半部分,反之,下一中点,第一次出现, 则转下半部分。,算法: 与直线中点法同,看中点在椭圆内或外, 选取逼近点。,(1). 上半部分,判别式:,d1 0, 取H, 且下一个, 取D, 且下一个,中点在内,中点在外,中点M: ( xp + 1, yp - 0.5 ),(2) 下半部分,与(1)类似, 以 y 为增量1, 计算 x 。,有增量式,线宽控制 像素复制方法 优点: 实现简单缺点: 线段两端要么为水平的,要么是竖直的 折线顶点处有缺口,图元的宽度不均匀产生宽度为偶数像素的图元效果不好,移动刷子,利用填充图元优点: 生成的图形质量高 缺点 计算量大 有些图形的等距线难以获得,上机作业题1 编写用VC在窗口上画点、画线、画矩形、画多边形、画园程序。,上机作业题2 用VC画点功能实现DDA算法的画直线。,