在解析几何中,过两点
P1、
P2直线的参数方程可以表示为
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) |