直线的中点Bresenham算法的实现

---恢复内容开始---

一、实验目的

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)中点误差的初始值是:

2

(3)推导di+1

3

4

2.算法执行的N-S图

5

3.算法执行的主要代码

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2
 3 {
 4
 5        // TODO: Add your message handler code here and/or call default
 6
 7        p1=point;
 8
 9        CDC *pDC=this->GetDC();
10
11        COLORREF c;
12
13        DrawLine(pDC,p0,p1,c);
14
15        CView::OnLButtonUp(nFlags, point);
16
17 }
18
19
20
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22
23 {
24
25        // TODO: Add your message handler code here and/or call default
26
27        p0=point;
28
29        CView::OnLButtonDown(nFlags, point);
30
31 }
32
33
34
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36
37 {     ///*
38
39        //1.fabs(k)>0&&fabs(k)<1
40
41        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k;
42
43        if(fabs(k)>1) return;
44
45        int x,y;
46
47        for(x=p0.x,y=p0.y;x<=p1.x;x++){
48
49               if(d>=0){
50
51                      pDC->SetPixel(x,y,0xff0000);
52
53                      d+=-k;
54
55               }
56
57               else{
58
59                      y++;
60
61                      pDC->SetPixel(x,y,0xff0000);
62
63                      d+=1-k;
64
65               }
66
67        }
68
69 //*/
70
71 }
 

4.执行结果

 6

(二)  当k>=1时

1.算法原理的推导

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

7

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

8

(3)推导di+1

9

10

2.算法执行的N-S图

11

3.算法执行的主要代码

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2
 3 {
 4
 5        // TODO: Add your message handler code here and/or call default
 6
 7        p1=point;
 8
 9        CDC *pDC=this->GetDC();
10
11        COLORREF c;
12
13        DrawLine(pDC,p0,p1,c);
14
15        CView::OnLButtonUp(nFlags, point);
16
17 }
18
19
20
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22
23 {
24
25        // TODO: Add your message handler code here and/or call default
26
27        p0=point;
28
29        CView::OnLButtonDown(nFlags, point);
30
31 }
32
33
34
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36
37 {     ///*
38
39     //2.fabs(k)>=1
40
41        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=1-0.5*k;
42
43        if(fabs(k)>0&&fabs(k)<1) return;
44
45        int x,y;
46
47        for(x=p0.x,y=p0.y;x<=p1.x;y++){
48
49               if(d>=0){
50
51                      x++;
52
53                      pDC->SetPixel(x,y,0x00ff00);
54
55                      d+=1-k;
56
57               }
58
59               else{
60
61
62
63                      pDC->SetPixel(x,y,0x00ff00);
64
65                      d+=1;
66
67               }
68
69        }
70
71 }
 

4.执行结果

 12

(三)  当-1<k<0时

1.算法原理的推导

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

13

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

14

(3)推导di+1

15

16

2.算法执行的N-S图

17

3.算法执行的主要代码

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2
 3 {
 4
 5        // TODO: Add your message handler code here and/or call default
 6
 7        p1=point;
 8
 9        CDC *pDC=this->GetDC();
10
11        COLORREF c;
12
13        DrawLine(pDC,p0,p1,c);
14
15        CView::OnLButtonUp(nFlags, point);
16
17 }
18
19
20
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22
23 {
24
25        // TODO: Add your message handler code here and/or call default
26
27        p0=point;
28
29        CView::OnLButtonDown(nFlags, point);
30
31 }
32
33
34
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36
37 {     ///*
38
39               /*
40
41        //3.fabs(k)>-1&&fabs(k)<0
42
43        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=-0.5-k;
44
45        //if(fabs(k)>1||fabs(k)<-1||(fabs(k)>0&&fabs(k)<1)) return;
46
47        int x,y;
48
49        for(x=p0.x,y=p0.y;x<=p1.x;x++){
50
51               if(d>=0){
52
53                   y=y-1;
54
55                      pDC->SetPixel(x,y,0x0000ff);
56
57                      d+=-1-k;
58
59               }
60
61               else{
62
63                      pDC->SetPixel(x,y,0x0000ff);
64
65                      d+=-k;
66
67               }
68
69        }
70
71  */}
 

4.执行结果

 18

(四)  当k<=-1时

1.算法原理的推导

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

19

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

20

(3)推导di+1

21

22

2.算法执行的N-S图

23

3.算法执行的主要代码

 1 void CExp2View::OnLButtonUp(UINT nFlags, CPoint point)
 2
 3 {
 4
 5        // TODO: Add your message handler code here and/or call default
 6
 7        p1=point;
 8
 9        CDC *pDC=this->GetDC();
10
11        COLORREF c;
12
13        DrawLine(pDC,p0,p1,c);
14
15        CView::OnLButtonUp(nFlags, point);
16
17 }
18
19
20
21 void CExp2View::OnLButtonDown(UINT nFlags, CPoint point)
22
23 {
24
25        // TODO: Add your message handler code here and/or call default
26
27        p0=point;
28
29        CView::OnLButtonDown(nFlags, point);
30
31 }
32
33
34
35 void CExp2View::DrawLine(CDC *pDC, CPoint p0, CPoint p1,COLORREF c)
36
37 {     ///*
38
39        //1.fabs(k)>0&&fabs(k)<1
40
41        double k=1.0*(p1.y-p0.y)/(p1.x-p0.x), d=0.5-k;
42
43        if(fabs(k)>1) return;
44
45        int x,y;
46
47        for(x=p0.x,y=p0.y;x<=p1.x;x++){
48
49               if(d>=0){
50
51                      pDC->SetPixel(x,y,0xff0000);
52
53                      d+=-k;
54
55               }
56
57               else{
58
59                      y++;
60
61                      pDC->SetPixel(x,y,0xff0000);
62
63                      d+=1-k;
64
65               }
66
67        }
68
69 //*/
70
71 }
 

4.执行结果

 24

四、实验结果与讨论

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

(一)  当0<k<1时:

 6

(二)  当k>=1时:

 12

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

 18

(四)  当k<=-1时:

 24

五、总结

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

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

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

---恢复内容结束---

时间: 2024-10-26 13:14:04

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

中点Bresenham算法光栅化画直线(个人总结精简版)代码超短!速度极快!

中点Bresenham算法光栅化画直线,每次只位移一个像素,精度高!此源码借助直线 y=x 做了一些转换,简化了主位移的处理,每次移动只需要 加减操作, 不需要乘除!速度极快!! 原理在最后,下面先贴上核心代码~ void Bresenham_LineTo(CDC *pDC, int x1, int y1, int x2, int y2) //中点Bresenham算法光栅化画直线 { float k = 1.0*(y2 - y1) / (x2 - x1); //斜率 int flag = 0;

用中点Bresenham画直线算法绘制任意斜率直线

使用VC 6.0 mfc实现编程 刚学的图像学,挺难学的,show 代码吧 void CLineView::OnDraw(CDC* pDC) { CLineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here int x1 ,x2 ,y1,y2 ; x1 = 0 ; y1 = 0 ;  x2 = 1000 ; y2 = 500 ; COLORREF c = RGB(25

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

开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: 1 //中点Bresenham算法生成直线 2 #include <gl/glut.h> 3 #include <math.h> 4 5 #define WIDTH 500 //窗口宽度 6 #define HEIGHT 500 //窗口高度 7 #define DRAWLINE1 MidpointBresenham(100,200,200,100); //画直线 8

「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?

前言 博主目前在学习<计算机图形学基础>这本书,使用的是第二版. 此书第五章开始讲解基本图形生成算法. 在5.1.3 Bresenham算法中,如是写到: 虽然中点Bresenham算法是一种效率非常高的算法,但也还有改进的余地. 而后,开始介绍Bresenham算法. 思考 然而通过学习和理解,博主发现这两种算法的原理完全相同: 每次在最大位移方向上走一步,而另一个方向上走步还是不走步取决于误差项的判别. 于是博主产生了疑问: Bresenham算法真的改进了中点Bresenham算法吗?

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

移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不能看几遍就理解理论中的奥妙,只能在别人大谈XX理论XX算法的时候,自己一个人苦逼的面对错误的程序问为什么... 下面开始动手来实现一下简单的Bug2避障算法.由于算法中涉及到机器人与外界环境的交互,因此需要选择一个仿真软件.常用的移动机器人仿真软件主要有Gazebo.V-rep.Webots.MRD

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

Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现

纯中文和中英文混杂的唯一区别是,分词的时候你如何辨别一个字符是英文字符还是孩子字符, 人眼很容易区分,但是对于计算机来说就没那么容易了,只要能辨别出中文字符和英文的字符,分词本身就不是一个难题 1:文本的编码问题: utf8:windows下,以utf8格式保存的文本是一个3个字节(以16进制)的BOM的,并且你不知道一个汉字是否是用3位表示,但是英文适合ascii编码一样的 ascii:英文一位,中文两位,并且中文的第一个字节的值是大于128和,不会和英文混淆,推荐 unicode:中文基本是

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为