您的位置:首页 > 其它

直线的中点Bresenham算法的实现

2016-03-29 19:49 477 查看
一、实验目的

1.掌握在MFC中搭建图形绘制的基本框架的方法;

2.将直线的中点Bresenham算法转化成可执行代码。

二、实验内容

1. 通过分析具体数据在中点Bresenham算法上的执行过程,绘制算法执行流程图或N-S图,在MFC中实现该算法,要求编写函数实现任意给定两点绘制线段。

三、实验步骤

任意给定的两点所绘制的线段斜率k可能有四种情况,分别是:0<k<1,k>=1,-1<k<0,

k<=-1。下面对这四种情况分别进行分析。

(一) 当0<k<1时

1.算法原理的推导

(1)构造中点误差项为:



(2)中点误差的初始值是:



(3)推导di+1





2.算法执行的N-S图



3.算法执行的主要代码

void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p1=point;

CDC *pDC=this->GetDC();

COLORREF c;

DrawLine(pDC,p0,p1,c);

CView::OnLButtonUp(nFlags, point);

}

void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p0=point;

CView::OnLButtonDown(nFlags, point);

}

void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)

{     ///*

//1.fabs(k)>0&&fabs(k)<1

double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k;

if(fabs(k)>1) return;

int x,y;

for(x=p0.x,y=p0.y;x<=p1.x;x++){

if(d>=0){

pDC->SetPixel(x,y,0xff0000);

d+=-k;

}

else{

y++;

pDC->SetPixel(x,y,0xff0000);

d+=1-k;

}

}

//*/

}


4.执行结果


(二) 当k>=1时

1.算法原理的推导

(1)构造中点误差项为:



(2)中点误差的初始值是:



(3)推导di+1





2.算法执行的N-S图



3.算法执行的主要代码

void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p1=point;

CDC *pDC=this->GetDC();

COLORREF c;

DrawLine(pDC,p0,p1,c);

CView::OnLButtonUp(nFlags, point);

}

void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p0=point;

CView::OnLButtonDown(nFlags, point);

}

void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)

{     ///*

//2.fabs(k)>=1

double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=1-0.5*k;

if(fabs(k)>0&&fabs(k)<1) return;

int x,y;

for(x=p0.x,y=p0.y;x<=p1.x;y++){

if(d>=0){

x++;

pDC->SetPixel(x,y,0x00ff00);

d+=1-k;

}

else{

pDC->SetPixel(x,y,0x00ff00);

d+=1;

}

}

}


4.执行结果



(三) 当-1<k<0时

1.算法原理的推导

(1)构造中点误差项为:



(2)中点误差的初始值是:



(3)推导di+1





2.算法执行的N-S图



3.算法执行的主要代码

void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p1=point;

CDC *pDC=this->GetDC();

COLORREF c;

DrawLine(pDC,p0,p1,c);

CView::OnLButtonUp(nFlags, point);

}

void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p0=point;

CView::OnLButtonDown(nFlags, point);

}

void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)

{     ///*

/*

//3.fabs(k)>-1&&fabs(k)<0

double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=-0.5-k;

//if(fabs(k)>1||fabs(k)<-1||(fabs(k)>0&&fabs(k)<1)) return;

int x,y;

for(x=p0.x,y=p0.y;x<=p1.x;x++){

if(d>=0){

y=y-1;

pDC->SetPixel(x,y,0x0000ff);

d+=-1-k;

}

else{

pDC->SetPixel(x,y,0x0000ff);

d+=-k;

}

}

*/}


4.执行结果


(四) 当k<=-1时

1.算法原理的推导

(1)构造中点误差项为:



(2)中点误差的初始值是:



(3)推导di+1





2.算法执行的N-S图



3.算法执行的主要代码

void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p1=point;

CDC *pDC=this->GetDC();

COLORREF c;

DrawLine(pDC,p0,p1,c);

CView::OnLButtonUp(nFlags, point);

}

void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

p0=point;

CView::OnLButtonDown(nFlags, point);

}

void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)

{     ///*

//1.fabs(k)>0&&fabs(k)<1

double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k;

if(fabs(k)>1) return;

int x,y;

for(x=p0.x,y=p0.y;x<=p1.x;x++){

if(d>=0){

pDC->SetPixel(x,y,0xff0000);

d+=-k;

}

else{

y++;

pDC->SetPixel(x,y,0xff0000);

d+=1-k;

}

}

//*/

} 


4.执行结果


四、实验结果与讨论

根据任意给定的两点所绘制的线段斜率k可能有的四种情况,实验结果如下:

(一) 当0<k<1时:


(二) 当k>=1时:


(三) 当-1<k<0时:


(四) 当k<=-1时:


五、总结

(一)本次实验按时按量完成。

(二)通过本次实验,我掌握了在MFC中搭建图形绘制的基本框架的方法;掌握了如何将直线的中点Bresenham算法转化成可执行代码。

(三)在本次实验中,我通过分析具体数据在中点Bresenham算法上的执行过程,分四种情况绘制算法执行N-S图,并且在MFC中实现了该算法。

参见源码:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/Bresenham
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: