AntiAliased line algorithm (uses floating point)
public void lineAA(int x0, int y0, int x1, int y1) {
int pix = color.getRGB();
int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;
double invD = ((dx==0)&&(dy==0)) ? 0.0 : 1.0/(2.0*Math.sqrt(dx*dx+dy*dy));
if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
dy <<= 1; // dy is now 2*dy
dx <<= 1; // dx is now 2*dx
if (dx > dy) {
int fraction = dy - (dx >> 1);
int v2dx = 0;
double dd, invD2dx = dx * invD;
setPixelAA(x0, y0, 0);
setPixelAA(x0, y0 + stepy, invD2dx);
setPixelAA(x0, y0 - stepy, invD2dx);
while (x0 != x1) {
v2dx = fraction;
if (fraction >= 0) {
y0 += stepy;
v2dx -= dx;
fraction -= dx;
}
x0 += stepx;
v2dx += (dx >> 1);
fraction += dy;
dd = v2dx * invD;
setPixelAA(x0, y0, dd);
setPixelAA(x0, y0 + stepy, invD2dx - dd);
setPixelAA(x0, y0 - stepy, invD2dx + dd);
}
else {
...}
}
|