首页 技术 正文
技术 2022年11月19日
0 收藏 994 点赞 4,499 浏览 3465 个字

一、实验目的

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)构造中点误差项为:

直线的中点Bresenham算法的实现

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

直线的中点Bresenham算法的实现

(3)推导di+1

直线的中点Bresenham算法的实现

直线的中点Bresenham算法的实现

2.算法执行的N-S图

直线的中点Bresenham算法的实现

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)>) return;        int x,y;        for(x=p0.x,y=p0.y;x<=p1.x;x++){               if(d>=){                      pDC->SetPixel(x,y,0xff0000);                      d+=-k;               }               else{                      y++;                      pDC->SetPixel(x,y,0xff0000);                      d+=-k;               }        } //*/ }

4.执行结果

直线的中点Bresenham算法的实现

(二)  当k>=1时

1.算法原理的推导

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

直线的中点Bresenham算法的实现

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

直线的中点Bresenham算法的实现

(3)推导di+1

直线的中点Bresenham算法的实现

直线的中点Bresenham算法的实现

2.算法执行的N-S图

直线的中点Bresenham算法的实现

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=-0.5*k;        if(fabs(k)>&&fabs(k)<) return;        int x,y;        for(x=p0.x,y=p0.y;x<=p1.x;y++){               if(d>=){                      x++;                      pDC->SetPixel(x,y,0x00ff00);                      d+=-k;               }               else{                      pDC->SetPixel(x,y,0x00ff00);                      d+=;               }        } } 

4.执行结果

直线的中点Bresenham算法的实现

(三)  当-1<k<0时

1.算法原理的推导

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

直线的中点Bresenham算法的实现

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

直线的中点Bresenham算法的实现

(3)推导di+1

直线的中点Bresenham算法的实现

直线的中点Bresenham算法的实现

2.算法执行的N-S图

直线的中点Bresenham算法的实现

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.执行结果

直线的中点Bresenham算法的实现

(四)  当k<=-1时

1.算法原理的推导

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

直线的中点Bresenham算法的实现

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

直线的中点Bresenham算法的实现

(3)推导di+1

直线的中点Bresenham算法的实现

直线的中点Bresenham算法的实现

2.算法执行的N-S图

直线的中点Bresenham算法的实现

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)>) return;        int x,y;        for(x=p0.x,y=p0.y;x<=p1.x;x++){               if(d>=){                      pDC->SetPixel(x,y,0xff0000);                      d+=-k;               }               else{                      y++;                      pDC->SetPixel(x,y,0xff0000);                      d+=-k;               }        } //*/ } 

4.执行结果

直线的中点Bresenham算法的实现

四、实验结果与讨论

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

(一)  当0<k<1时:

直线的中点Bresenham算法的实现

(二)  当k>=1时:

直线的中点Bresenham算法的实现

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

直线的中点Bresenham算法的实现

(四)  当k<=-1时:

直线的中点Bresenham算法的实现

五、总结

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

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

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

参见源码:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Computer-Graphics/Bresenham

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,580
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918