} /* 当pi≥0时: yi+1=yi+1, xi+1=xi+1, pi+1=pi+2(△y-△x) 否则: yi+1=yi, xi+1=xi+1, pi+1=pi+2△y */ if(p >= 0) { if(change == 0) y = y + stepy; else x = x + stepx; p = p - (dp.x << 1); } if(change == 0) x = x + stepx; else y = y + stepy; p = p + (dp.y << 1); } }
Function Name:
rtLine
Function Action:
直线Bresenham算法实现
Input Parameter:
image--图像数据
pt1--直线段的端点之一
pt2--直线段的端点之二
thickness--线段的粗细程度
color--线段的颜色
Output Parameter:
image--加了直线的图像数据
Return Value:
NULL
Author :
WangFei 2010/5/28 12:58
Re: *************************************************************************/
void rtLine(RtImage* image, RtPoint pt1, RtPoint pt2, int thickness, unsigned char* color)
{
int x = 0, y = 0, stepx = 0, stepy = 0, p = 0, i = 0, j = 0, k = 0, change = 0/*表示斜率大于45度,交换了dx, dy*/;
RtPoint dp; dp.x = pt2.x - pt1.x;
dp.y = pt2.y - pt1.y; if (dp.x > 0) stepx = 1;
if (dp.y > 0) stepy = 1; dp.x = abs(dp.x);
dp.y = abs(dp.y); if (dp.y > dp.x)//斜率大于45度
{
swap(&dp.x, &dp.y);//交换x,y
change = 1;
} //初始 p1=2△y-△x
p = (dp.y << 1) - dp.x; x = pt1.x;
y = pt1.y; for(i = 1;i <= dp.x; i++)//从开始点到结束点
{
for (j = 0; j < image->nChannels; j++)//图像通道,保证每个通道都可以包含数据
{
for (k = 0; k < thickness; k++)//直线的绘制宽度
{
*(image->pData + (y * image->width + x) * image->nChannels + j) = color[j];
if (change == 0)
{
*(image->pData + (max(y - k, 0) * image->width + x) * image->nChannels + j) = color[j];
*(image->pData + (min(y + k, image->height - 1) * image->width + x) * image->nChannels + j) = color[j];
}
else
{
*(image->pData + (y * image->width + max(x - k, 0)) * image->nChannels + j) = color[j];
*(image->pData + (y * image->width + min(x + k, image->width - 1)) * image->nChannels + j) = color[j];
}
}
} /*
当pi≥0时: yi+1=yi+1,
xi+1=xi+1,
pi+1=pi+2(△y-△x)
否则: yi+1=yi,
xi+1=xi+1,
pi+1=pi+2△y
*/
if(p >= 0)
{
if(change == 0)
y = y + stepy;
else
x = x + stepx; p = p - (dp.x << 1);
} if(change == 0)
x = x + stepx;
else
y = y + stepy; p = p + (dp.y << 1);
}
}