bottomcoder 发表于 2011-8-15 23:07:03

这个画直线的函数, 算法用数学怎么解释?

/*************************************************************************************************************
**函 数 名: void Glib_Line(int x1,int y1,int x2,int y2,int color);
**功    能: LCD屏幕画线函数。
**输入参数: x1,y1: 起点坐标
             x2,y2: 终点坐标
             color: 颜色值5:6:5格式
**返回参数: 无
**其他描述: 无
**************************************************************************************************************/
void Glib_Line(int x1,int y1,int x2,int y2,int color)
{
        int dx,dy,e;
        dx=x2-x1;
        dy=y2-y1;
   
        if(dx>=0)
        {
                if(dy >= 0) // dy>=0
                {
                        if(dx>=dy) // 1/8 octant
                        {
                                e=dy-dx/2;
                                while(x1<=x2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){y1+=1;e-=dx;}       
                                        x1+=1;
                                        e+=dy;
                                }
                        }
                        else                // 2/8 octant
                        {
                                e=dx-dy/2;
                                while(y1<=y2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){x1+=1;e-=dy;}       
                                        y1+=1;
                                        e+=dx;
                                }
                        }
                }
                else                   // dy<0
                {
                        dy=-dy;   // dy=abs(dy)

                        if(dx>=dy) // 8/8 octant
                        {
                                e=dy-dx/2;
                                while(x1<=x2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){y1-=1;e-=dx;}       
                                        x1+=1;
                                        e+=dy;
                                }
                        }
                        else                // 7/8 octant
                        {
                                e=dx-dy/2;
                                while(y1>=y2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){x1+=1;e-=dy;}       
                                        y1-=1;
                                        e+=dx;
                                }
                        }
                }       
        }
        else //dx<0
        {
                dx=-dx;                //dx=abs(dx)
                if(dy >= 0) // dy>=0
                {
                        if(dx>=dy) // 4/8 octant
                        {
                                e=dy-dx/2;
                                while(x1>=x2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){y1+=1;e-=dx;}       
                                        x1-=1;
                                        e+=dy;
                                }
                        }
                        else                // 3/8 octant
                        {
                                e=dx-dy/2;
                                while(y1<=y2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){x1-=1;e-=dy;}       
                                        y1+=1;
                                        e+=dx;
                                }
                        }
                }
                else                   // dy<0
                {
                        dy=-dy;   // dy=abs(dy)

                        if(dx>=dy) // 5/8 octant
                        {
                                e=dy-dx/2;
                                while(x1>=x2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){y1-=1;e-=dx;}       
                                        x1-=1;
                                        e+=dy;
                                }
                        }
                        else                // 6/8 octant
                        {
                                e=dx-dy/2;
                                while(y1>=y2)
                                {
                                        PutPixel(x1,y1,color);
                                        if(e>0){x1-=1;e-=dy;}       
                                        y1-=1;
                                        e+=dx;
                                }
                        }
                }       
        }
}

bingshuihuo888 发表于 2011-8-16 09:54:32

mark!

Huaan 发表于 2011-8-16 09:59:38

找本计算机图形学的书看看,或者搜Bresenham画线算法

bottomcoder 发表于 2011-8-16 23:02:51

回复【2楼】Huaan
找本计算机图形学的书看看,或者搜bresenham画线算法
-----------------------------------------------------------------------

http://www.cnblogs.com/soroman/archive/2006/07/27/509602.html

MCU678 发表于 2011-8-16 23:43:13

mark!

s200661524 发表于 2011-8-17 09:54:56

回复【2楼】Huaan
-----------------------------------------------------------------------

这个算法看起来不是Bresenham算法,直线插补有很多种,以前学数控机床的时候看过一些常用的算法,DDA,软件DDA,中点法,最小二乘法,逐点比较法,好像都跟这个沾不上边,继续求高手给个名字

lxx_sea_sky 发表于 2011-8-17 12:39:59

5L有点理论派,单片机一般算不来最小二乘法的。

是Bresenham算法,核心只有一段:

e=dy-dx/2;               //1. 类似于斜率判断
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;}    //1.a
x1+=1;
e+=dy;                   //1.b
}

pang123hui 发表于 2011-8-17 13:19:28

学习

zhangweimcu 发表于 2011-8-17 16:47:42

这个是周立功的源码吧,挺好用的,主要是虚拟的坐标,然后画一条虚拟的直线,直线落在两点之间的,以最接近虚拟直线的那个点为准,

s200661524 发表于 2011-8-17 19:17:05

回复【6楼】lxx_sea_sky
-----------------------------------------------------------------------
1 我说的也不是单片机上的算法,而且也没指明平台吧,也没说必须用这些算法,只是说当时学数控机床直线插补的时候看到过这些算法,用C++模拟过这些算法,呵呵看清楚再回复是个好习惯,最早的数控机床用硬件DDA的比较多。

修改原因:错别字

s200661524 发表于 2011-8-17 19:20:40

回复【8楼】zhangweimcu
-----------------------------------------------------------------------
6410/2410开发板里面自带的测试程序有个glib.c专门是实现各种基本作图的,这是出自里面的,但是是谁抄谁的就不得而知了,呵呵

stm8s 发表于 2012-1-29 02:30:11

mark

scwscw 发表于 2012-2-4 12:37:40

mark

learner123 发表于 2012-2-4 22:54:13

挖个坟
就是dda算法么,也是Bresenham算法,还没有改进前的原始东西。细节不用太关心,除非做理论研究,
页: [1]
查看完整版本: 这个画直线的函数, 算法用数学怎么解释?