Introduction
All solutions for session 8.
Exercises
Exercise 1: anti-aliasing
void drawAntiAliasedLine(int x1, int y1, int x2, int y2) {
int t;
int colour;
if (abs(x2-x1)>abs(y2-y1)) {
int i, dy, y;
if (x1>x2) { t=x1; x1=x2; x2=t; t=y1; y1=y2; y2=t; } // swap
dy = (1 << 16)*(y2-y1)/(x2-x1);
y=y1 << 16;
for (i=x1; i < x2; i++) {
y+=dy;
colour = (y >> 8)%256;
stroke(colour);
point(i, y>>16);
stroke(255 - colour);
point(i, (y>>16)+1);
}
} else {
int i, dx, x;
if (y1>y2) { t=x1; x1=x2; x2=t; t=y1; y1=y2; y2=t; } // swap
dx = (1 << 16)*(x2-x1)/(y2-y1);
x=x1 << 16;
for (i=y1; i < y2; i++) {
x+=dx;
colour = (x>>8)%256;
stroke(colour);
point(x>>16, i);
stroke(255 - colour);
point((x>>16)+1, i);
}
}
}
Exercise 2: Smoothing
color calcMask(double[][] mask, int x, int y) {
double avgR=0,avgG=0,avgB=0;
color colour;
double weight;
int xstart = x - mask[0].length/2;
int ystart = y - mask.length/2;
for (int i=0; i < mask[0].length; i++)
for (int j=0; j < mask.length; j++) {
colour = bmp.get(i+xstart, j+ystart);
weight = mask[i][j];
avgR += red(colour) * weight;
avgG += green(colour) * weight;
avgB += blue(colour) * weight;
}
return color((int)avgR, (int)avgG, (int)avgB);
}
PImage smooth(PImage img, double[][] mask) {
PImage smoothbmp = new PImage(img.width, img.height);
// not strictly necessary to copy the entire original image, but this does
// correctly set the borders of the image
smoothbmp.copy(img, 0,0,img.width,img.height,0,0,img.width,img.height);
int i,j;
int xofs = mask[0].length / 2;
int yofs = mask.length / 2;
for (i=xofs; i< bmp.width-xofs; i++)
for (j=yofs; j< bmp.height-yofs; j++) {
smoothbmp.set(i,j,calcMask(mask,i,j));
}
return smoothbmp;
}