解决方案 »

  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);
    }
    }
      

  2.   

    http://blog.csdn.net/juyingmin/article/details/5630547