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; }