一、实验目的

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

(二)  当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=-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.执行结果

(三)  当-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)>) 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.执行结果

四、实验结果与讨论

根据任意给定的两点所绘制的线段斜率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

直线的中点Bresenham算法的实现的更多相关文章

  1. Bresenham算法的实现思路

    条件已知两个点的坐标p1(x0,y0),p2(x1,y1)要求画出这条直线 之后的e代表每次的误差积累,初始值为0,可以计算出斜率为k=dy/dx=(y0-y1)/(x0-x1) 1.x为阶跃步长(直 ...

  2. 《图形学》实验四:中点Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...

  3. Python使用DDA算法和中点Bresenham算法画直线

    title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...

  4. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

  5. 利用canvas实现的中点Bresenham算法

    Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,具体的实现过程大家可以去问度娘.我主要是利用canvas画布技术实现了这个 ...

  6. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  7. 图像数据到网格数据-2——改进的SMC算法的实现

    概要 本篇接上一篇继续介绍网格生成算法,同时不少内容继承自上篇.上篇介绍了经典的三维图像网格生成算法MarchingCubes,并且基于其思想和三角形表实现了对样例数据的网格构建.本篇继续探讨网格生成 ...

  8. 《图形学》实验七:中点Bresenham算法画椭圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画椭圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 50 ...

  9. 《图形学》实验六:中点Bresenham算法画圆

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画圆. 实验结果: 代码: #include <gl/glut.h> #define WIDTH 500 ...

随机推荐

  1. 使用navicat工具创建MySQL存储过程

    使用Navicat for MySQL工具创建存储过程步骤: 1. 新建函数(选择函数标签 -> 点击新建函数): 2.输入函数的参数个数.参数名.参数类型等: 3.编写存储过程:  代码如下: ...

  2. 浅谈Jquery中的bind()、live()、delegate()、on()绑定事件方式

    一.on(),live(),bind() on() 为指定的元素,添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数.使用 on() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建 ...

  3. Cognos开发图表乱码问题

    在此之前提到过在利用TR建模导入IQD数据源的时候遇到乱码的一种解决方案: http://www.cnblogs.com/wxjnew/p/3374029.html 今天说的是在RS中开发新报表的时候 ...

  4. 如何解决Win7将任务栏程序自动分组的困扰

    Win7默认把任务栏程序自动分组,比如多个资源管理器窗口被分到一起,其实这挺让人恼火的,关键弊病是多出一个人工检查的步骤,这在操作繁忙时容易增加人的负担,不能按预定记忆处理. 还好微软也没把蠢事做绝, ...

  5. iOS开发系列课程预告

    近期在Mac和iOS上做开发,认为应该写一点东西分享给感兴趣的童鞋们.在此之前.以前有非常多同行们都在埋怨苹果Objective-C的复杂和难以上手,为此也有非常多人对今年(2014年)刚推出的Swi ...

  6. 编程算法 - 二叉搜索树 与 双向链表 代码(C++)

    二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...

  7. 嵌套循环连接(nested loops join)原理

    嵌套循环连接(nested loops join) 访问次数:驱动表返回几条,被驱动表访问多少次. 驱动表是否有顺序:有. 是否要排序:否.    应用场景:  1.关联中有一个表比较小: 2.被关联 ...

  8. iOS 设置UILabel 的内边距

    iOS 设置UILabel 的内边距 - (void)drawTextInRect:(CGRect)rect { UIEdgeInsets insets = {, , , }; [super draw ...

  9. 使用JSP实现输出(web基础学习笔记二)

    Jsp:Java Server Page 服务器端的Java页面,动态网页技术 jsp注释 显式注释:这种注释客户端是允许看见的;<!--html注释--> 隐式注释:这种注释客户端是看不 ...

  10. [C++设计模式]template 模板方法模式

    模板法模式:定义一个操作中的算法骨架.而将一些步骤延迟到子类中. 依照<headfirst 设计模式>的样例.煮茶和煮咖啡的算法框架(流程)是一样的.仅仅是有些算法的实现是不一样的,有些是 ...