//Program to plot antialiased line by Bresanham's Approach
#include <iostream.h>
#include <graphics.h>
#include <math.h>
#include <conio.h>
intpixel(int x, int y, float f)
{
int i=0;
/* float s=1.5/16.0;
i=fabs(f)/s;
if (i<10)
putpixel(x,y,15-i);
cout<<i<<"\t";*/
f=fabs(f);
if (f<.5)
putpixel(x,y,15);
else if (f<1)
putpixel(x,y,12);
}
void drawline(int x1, int y1, int x2, int y2)
{
long temp,p, dx, dy;
dx=abs(x2-x1);
dy=abs(y2-y1);
float m,dd;
dd=.5/sqrt(dx*dx+dy*dy);
m=float(y2-y1)/float(x2-x1)>0?2:1;
if (abs(x2-x1)>=abs(y2-y1))
{
if (x2<x1)
{
temp=x2;
x2=x1;
x1=temp;
temp=y2;
y2=y1;
y1=temp;
}
int x=x1,y=y1;
p=2*dy-dx;
while (x<x2)
{
x++;
if (p<=0)
p+=2*dy;
else
{
p+=2*(dy-dx);
y=y+pow(-1,m);
}
intpixel(x+getmaxx()/2,getmaxy()/2-y,(p+dx)*dd);
intpixel(x+getmaxx()/2,getmaxy()/2-y-1,abs(2*dx-p-dx)*dd);
intpixel(x+getmaxx()/2,getmaxy()/2-y+1,abs(2*dx+p+dx)*dd);
}
}
else
{
if (y2<y1)
{
temp=x2;
x2=x1;
x1=temp;
temp=y2;
y2=y1;
y1=temp;
}
int x=x1,y=y1;
p=2*dx-dy;
while (y<y2)
{
y++;
if (p<=0)
p+=2*dx;
else
{
p+=2*(dx-dy);
x=x+pow(-1,m);
}
intpixel(x+getmaxx()/2,getmaxy()/2-y,(p+dy)*dd);
intpixel(x+1+getmaxx()/2,getmaxy()/2-y,abs(2*dy-p-dy)*dd);
intpixel(x-1+getmaxx()/2,getmaxy()/2-y,abs(2*dy+p+dy)*dd);
}
}
}
void main()
{
int x1, x2, y1, y2;
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
struct palettetype pal;
getpalette(&pal);
for (int i=0;i<16;i++)
setrgbpalette(pal.colors[i],i*4,i*4,i*4);
setbkcolor(BLACK);
cout<<"Enter x1 ";
cin>>x1;
cout<<"Enter y1 ";
cin>>y1;
cout<<"Enter x2 ";
cin>>x2;
cout<<"Enter y2 ";
cin>>y2;
drawline(x1,y1,x2,y2);
getch();
}