Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10641
  • 博文数量: 5
  • 博客积分: 210
  • 博客等级: 二等列兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-27 21:03
文章分类
文章存档

2010年(1)

2009年(4)

我的朋友
最近访客

分类: C/C++

2009-10-22 23:37:48

  在解析几何中,过两点P1P2直线的参数方程可以表示为P=P1+t(P2-P1),即
x=x1+t(x2-x1)
y=y1+t(y2-y1)
  因此,只要x在沿x1->x2自增,t便沿直线方向递进.所以,求出t=(x-x1)/(x2-x1),便可求出y了.
  如果观察到x、y每次都是按照一定的长度递增,那么可以求出增量dy=(y2-y1)/(x2-x1).
C++代码如下:

/*! \
 * \brief
 * \param pixels 渲染缓冲区指针
 * \param width 缓冲区宽
 * \param height 缓冲区高
 * \param x1 缓冲区坐标系某一点的x坐标
 * \param y1 缓冲区坐标系某一点的y坐标
 * \param x2 缓冲区坐标系某一点的x坐标
 * \param y2 缓冲区坐标系某一点的y坐标
 * \param color 缓冲区像素点颜色
 */

template<typename T>
void draw_line(T* pixels , unsigned int width , unsigned int height ,
    unsigned int x1 , unsigned int y1 , unsigned int x2 ,unsigned int y2 , T color)
{
    static size_t SIZE_PIXEL=sizeof(T);
    if((long)(x2-x1)>(long)(y2-y1)||y1==y2)
    {
        if(x1>x2)
        {
            swap(x1,x2);
            swap(y1,y2);
        }
        double dy=((long)(y2-y1))*1.0/(long)(x2-x1);
        for(double x=x1,y=y1;x<=x2;++x)
        {
            *(T*)((unsigned char*)pixels+((unsigned int)y*width+(unsigned int)x)*SIZE_PIXEL)=color;
            y+=dy;
        }
    }
    else
    {
        if(y1>y2)
        {
            swap(x1,x2);
            swap(y1,y2);
        }
        double dx=((long)(x2-x1))*1.0/(long)(y2-y1);
        for(double y=y1,x=x1;y<y2;++y)
        {
            *(T*)((unsigned char*)pixels+((unsigned int)y*width+(unsigned int)x)*SIZE_PIXEL)=color;
            x+=dx;
        }
    }
}

该代码用图像数据在windows xp下测试过,测试样例如下:

struct Color{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};


然后将图像数据转换成该类型的对象

Color* pc=reinterpret_cast<Color*>(img.getData());
Color color={255,255,0};
draw_line(pc,img.getWidth(),img.getHeight(),10,10,0,0,color)


如果要使用该算法代码,需要知道被绘制的数据格式,并定义一个像素的结构体。
阅读(397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~