Bresenham画线法详细注释解析

Bresenham画线法
void swap_value (int* a, int* b)//交换值函数
{
int temp=*a;
*a=*b;
*b=temp;
}

void Bres_Line(int x1, int y1, int x2, int y2, int color)//输入起点 与下一个点
{
setpixel(x1,y1, color); //第一个点直接画

int dx=abs(x2-x1);          //三角线x
int dy=abs(y2-y1);         //三角线y

if (dx==0&&dy==0)   //判断是否为0,要是0啥也别说了 直接不运行了
    return; 

int flag=0;  //flag做判断值,判断是否经过斜率转换,若经过斜率转换,在最后输出时要xy倒过来放参数,因为斜率转换时xy交换了

if (dx<dy)         	//下面将斜率变换至0≤|k|≤1区间
{
    flag=1;
    swap_value(&x1, &y1);
    swap_value(&x2, &y2);
    swap_value(&dx, &dy);
}

int tx=(x2-x1)>0 ? 1:-1;         //tx ty做加1量
int ty=(y2-y1)>0 ? 1: -1;

int curx=x1;     //curx cury做起点
int cury=y1;

int dS=2*dy;        //dsdt这么设置是因为在公式推导中di+1 = 【di +2(▲y-▲x) di≥0】【di+2▲y    di<0】
int dT=2*(dy-dx);

int d=dS-dx;     //int d = 2*dy -dx  也就是说   d代表的是起点的状态起点大小

while (curx!=x2)
{
    if (d<0) 
        d+=dS; // d(i+1)=d(i) +ds  次是y(i+1)= y(i)所以y不要动 就是默认得到直线下面的那个yi
    else
    {cury+=ty;  d+=dT; }    //覆盖d值得同时 将y的值加一 代表选择的是直线上面的那个点

    if (flag)     //1 0代表是否交换了xy的值 是否需要倒着输出   有则倒着输出 无则加冕
        setpixel(cury, curx, color);  
    else 
        setpixel(curx, cury, color);


    curx+=tx;        //跳出循环
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值