改进的 Bresenham 画线算法程序

原创 2007年10月13日 04:36:00
// By rappizit@yahoo.com.cn
// 2007-10-15 第 2 版

#define ABS(a) (a >= 0 ? a : -a)
#define SWAP(a, b) {int t = a; a = b; b = t;}

// 改进的 Bresenham 画线算法程序
// 最后一个形参是画图函数 drawpixel (int x, int y, int color) 的指针,在不同运行环境下调用不同的画图函数
void IntBresenhamline (int x0, int y0, int x1, int y1, int color, void(*drawpixel)(intintint))
{
    
int dx = x1 - x0, dy = y1 - y0;
    
if (ABS(dx) >= ABS(dy))
        {
        
if (x0 > x1)
            {
            SWAP(x0, x1);
            SWAP(y0, y1);
            dx 
= -dx;
            dy 
= -dy;
            }
        
if (dy >= 0)
            {
            
// 直线的倾斜角位于 [0, pi / 4]
            for (int x = x0, y = y0, e = -dx; x <= x1; x ++)
                {
                (
*drawpixel) (x, y, color);
                e 
+= dy * 2;
                
if (e >= 0)
                    {
                    y 
++;
                    e 
-= dx * 2;
                    }
                }
            }
        
else    {
            
// 直线的倾斜角位于 [-pi / 4, 0)
            for (int x = x0, y = y0, e = dx; x <= x1; x ++)
                {
                (
*drawpixel) (x, y, color);
                e 
+= dy * 2;
                
if (e <= 0)
                    {
                    y 
--;
                    e 
+= dx * 2;
                    }
                }
            }
        }
    
else    {
        
if (y0 > y1)
            {
            SWAP(x0, x1);
            SWAP(y0, y1);
            dx 
= -dx;
            dy 
= -dy;
            }
        
if (dx >= 0)
            {
            
// 直线的倾斜角位于 (pi / 4, pi / 2]
            for (int x = x0, y = y0, e = -dy; y <= y1; y ++)
                {
                (
*drawpixel) (x, y, color);
                e 
+= dx * 2;
                
if (e >= 0)
                    {
                    x 
++;
                    e 
-= dy * 2;
                    }
                }
            }
        
else    {
            
// 直线的倾斜角位于 [-pi / 2, -pi / 4)
            for (int x = x0, y = y0, e = dy; y <= y1; y ++)
                {
                (
*drawpixel) (x, y, color);
                e 
+= dx * 2;
                
if (e <= 0)
                    {
                    x 
--;
                    e 
+= dy * 2;
                    }
                }
            }
        }
}

// 参考调用形式

void drawpixel(int x, int y, int color)
{
    
// To Do ...
}

int main ()
{
    IntBresenhamline (
-10-0-40-2000, drawpixel);
    
return 0;
}

// 在 **View.cpp 里面添加 (** 代表工程名)

CDC
* m_pDC;    // 当前画图所用的 CDC 指针

void drawpixel(int x, int y, int color)
{
    m_pDC
->SetPixel (x, y, color);
}

void CGraphicsView::OnDraw(CDC* pDC)
{
    CGraphicsDoc
* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
if (!pDoc)
        
return;

    
// TODO: 在此处为本机数据添加绘制代码
    m_pDC = pDC;
    
    
// 自定义映射模式,令画图区域的中点为坐标原点,水平向右为 X 轴正方向,竖直向上为 Y 轴正方向
    CRect rect;
    GetClientRect (rect);
    pDC
->SetMapMode (MM_ANISOTROPIC);
    pDC
->SetWindowExt (rect.right, rect.bottom);
    pDC
->SetViewportExt (rect.right, -rect.bottom);
    pDC
->SetViewportOrg (rect.right / 2, rect.bottom /2);

    
double pi = 3.1415, r = 200.0;
    
for (double rad = 0; rad < pi * 2.0; rad += pi / 30.0)
        {
        
int x = (int)(r * cos (rad));
        
int y = (int)(r * sin (rad));
        IntBresenhamline (
00, x, y, RGB (000), drawpixel);
        }

    ReleaseDC(pDC);
    m_pDC 
= NULL;
}
 
由于 SetPixel 函数不能直接转为 IntBresenhamline 函数所能调用的函数指针,所以需要增加一个
drawpixel 的中间函数,而为了不重复申请 DC ,则需要保存当前 DC 作为全局变量。

运行结果(见下图):
http://p.blog.csdn.net/images/p_blog_csdn_net/rappy/339034/o_IntBresenhamline.jpg


PS:图片经过压缩,质量有所下降。
         工程文件可以在这里下载。

Bresenham 画线算法

Bresenham 画线算法Bresenham 画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用了整数的增量来实现的。Bresenham算法将对整形参数的符号检测,整...
  • wave_1102
  • wave_1102
  • 2007-12-14 16:27:00
  • 2377

【图形学】直线扫描算法之---bresenham改进算法(任何斜率,任何方向)

直线扫描算法之---bresenham改进算法(任何斜率,任何方向) by zxx 图形学神马的全都是数学,看来以后我不能搞这个,伤脑筋,所以先把我现在懂得先记录下来吧。不过呢,我的水平实在有限,...
  • xxxxxx91116
  • xxxxxx91116
  • 2011-04-01 21:34:00
  • 4489

Bresenham 算法——matlab实现

Bresenham 算法——matlab实现
  • u012526003
  • u012526003
  • 2016-05-26 21:18:40
  • 1780

Bresenham算法理解

Bresenham bresenham算法是计算机图形学中为了“显示器(屏幕或打印机)系由像素构成”的这个特性而设计出来的算法,使得在求直线各点的过程中全部以整数来运算,因而大幅度提升计算速度。 ...
  • cjw_soledad
  • cjw_soledad
  • 2017-12-24 17:48:49
  • 224

DDA算法和Bresenham算法

作者:朱金灿来源:http://blog.csdn.net/clever101/      DDA算法和Bresenham算法是计算机图形学中绘制直线的两种常用算法。本文具体介绍一下DDA算法和Bre...
  • clever101
  • clever101
  • 2010-12-15 09:03:00
  • 57191

Bresenham算法画直线

推导过程:http://blog.sina.com.cn/s/blog_73428e9a01016gnp.html 本程序作了进一步的简化 void Bresenham_line(CDC *pDC, ...
  • u012319493
  • u012319493
  • 2016-11-22 18:11:55
  • 1961

计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

前言本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce感谢中国农大 赵明老师的分享~现在我要...
  • Jurbo
  • Jurbo
  • 2016-09-24 21:33:24
  • 4335

正确的BresenHam算法。请各位讲解一下优化算法!

     正确的画直线算法:     不过,第二个使用整数的变形算法搞不大明白/*Bresenham算法    Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换算法。仍然假定直线斜率在...
  • shendl
  • shendl
  • 2004-12-09 22:56:00
  • 5575

Bresenham画直线,任意斜率

function DrawLineBresenham(x1,y1,x2,y2) %sort by x,sure x1x2 tmp=x1; x1=x2; x2=tmp; ...
  • u011044759
  • u011044759
  • 2014-03-24 10:38:05
  • 1450

笔记:Bresenham画线算法的推导

笔记:Bresenham画线算法的推导以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日,参考一些资料,特整理其算法推导过程如下。各位大虾如果知道其细节,赶紧闪过,不用浪费时间了。基本...
  • wave_1102
  • wave_1102
  • 2007-12-14 16:49:00
  • 1035
收藏助手
不良信息举报
您举报文章:改进的 Bresenham 画线算法程序
举报原因:
原因补充:

(最多只允许输入30个字)