Bresenham算法由误差项的符号来决定下一个像素取正右方的点,还是右上方的点。
因为每次都是比X增加1,所以设直线方程
(1)当d>=0.5 ,理想直线最接近当前像素的右上方像素
(1)当d<0.5 ,理想直线最接近当前像素的正右方像素
提供的代码,只能处理斜率不存在或者,斜率在[0,1]之间的直线,
斜率在其他范围内的直线可以自己在本代码上进行修改。
源代码:
#include<stdio.h>
#include <graphics.h>
#include <conio.h>
void InterBresenhamline(int x0,int y0,int x1,int y1,int color){
int dx,dy,x,y,e,i;
if(x1 < x0){
int t0 = x1;
int t1 = y1;
x1 = x0;
x0 = t0;
y1 = y0;
y0 = t1;
}
dx = x1 - x0;
dy = y1 - y0;
e = -dx;
x = x0;
y = y0;
for(i = 0;i <= dx;i++){
putpixel(x,y,color);
x++;
e += 2 * dy;
if(e >= 0){
y++;
e -= 2 * dx;
}
}
}
int main(){
int x0,y0,x1,y1;
int c=RED;
while(~scanf("%d%d%d%d",&x0,&y0,&x1,&y1)){
if(x0 == x1){
if(y1 < y0){
int t0 = x1;
int t1 = y1;
x1 = x0;
x0 = t0;
y1 = y0;
y0 = t1;
}
int graphdriver=DETECT, graphmode;
initgraph(&graphdriver, &graphmode, "..\\bgi");
for(int y = y0;y <= y1;y++)
putpixel(x0, y, c);
getch();
closegraph();
}
else{
int graphdriver=DETECT, graphmode;
initgraph(&graphdriver, &graphmode, "..\\bgi");
InterBresenhamline(x0, y0, x1, y1, c);
getch();
closegraph();
}
}
return 0;
}