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; //跳出循环
}
}