基本图形生成算法
一.目的:
1.学习使用MFC的图形编程。
2.了解光栅显示的原理及基本图元线段和圆弧的生成算法。
二.内容:
1.实现DDA直线段生成算法。
2.实现Bresenham直线段生成算法。
3.实现Bresenham圆弧生成算法。
三.要求:
1.构建MFC工程:
工程名:CgLineDraw和CgCircleDraw。
选择单文档MFC框架结构:
.app为应用程序;.doc为文档,用来存放数据;.view用来绘制文档数据图形;
.MainFrame为主窗体。
2.添加图形实验程序,修改View类,显示绘制OnDraw()。
3.建立坐标系:
(1)以屏幕中心为原点(0,0),X轴为横轴,Y轴为竖轴;
(2)生成实例占据八个8分圆;
(3)分别用DDA算法和Bresenham算法绘制直线段,重复绘制100次,比较两种算法绘制直线段的效率和光滑程度,并在屏幕上显示出来。
(4)用Bresenham算法绘制完整的圆和任意角度的圆弧。
四.步骤:
(1)算法介绍:
i.数值微分法(DDA算法):直线扫描转换的最简单方法是先算出直线的斜率k=Δy/Δx,其中,Δx=x1-x0, Δy=y1-y0,(x0,y0)和(x1,y1)分别是直线的端点坐标。然后,从直线的起点开始,确定最佳逼近于直线的y坐标。假定端点坐标均为整数,让x从起点到终点变化,每步递增1,计算对应的y坐标,y=kx+B,并取象素(x,round(y))。
DDAline(int x1,int y1, int x2, int y2, CDC *pDC)
{
int i,step;
float x,y,dx,dy;
step = abs(x2-x1) > abs(y2-y1) ?
abs(x2-x1) :abs(y2-y1);
dx = (float) (x2-x1) / step;
dy = (float) (y2-y1) / step;
x = x1 + 0.5;
y = y1 +