MapStatus BitMap::rotateMap(Angle angle) /* rotate 'angle' degrees around the center of the image */ /* there are a few easy optimizations. do 'em later */ { int nx,ny,newheight,newwidth,oldheight,oldwidth,i,j,halfnewheight,halfnewwidth; int halfoldheight,halfoldwidth; double radians; double cosval,sinval; uchar** newMapData; fprintf(stderr,"Rotating Image %lf Degrees\n",angle); radians = -(angle) / ((180 / 3.142)); cosval = cos(radians); sinval = sin(radians); oldheight = fImageLength; oldwidth = fImageWidth; newwidth = (int)abs((int)(oldwidth*cosval)) + (int)abs((int)(oldheight*sinval)); newheight = (int)abs((int)(-oldwidth*sinval)) + (int)abs((int)(oldheight*cosval)); halfnewheight = newheight / 2; halfnewwidth = newwidth / 2; halfoldwidth = oldwidth /2; halfoldheight = oldheight /2 ; newMapData = new (uchar*) [newheight]; int num_chars = (newwidth / 8) + 1; for (int row = 0; row < newheight; ++row) { newMapData[row] = new uchar[num_chars]; newMapData[row][num_chars - 1] = 0; } last_status = 0.0; for(i=0;i < newheight;i++) { set_rotation_status((int)i, (int)newheight); for(j=0;j < newwidth;j++) { nx =(int)( (j - halfnewwidth)*cosval + (i-halfnewheight)*sinval); ny =(int)( -((j - halfnewwidth)*sinval) + (i - halfnewheight)*cosval); nx = nx + halfoldwidth; ny = ny + halfoldheight; if ((nx < oldwidth) && (ny < oldheight) && (nx > 0) && (ny > 0)) { if(get_pixel_value(fMapData, ny, nx)) set_pixel_value(newMapData, i, j, 1); else set_pixel_value(newMapData, i, j, 0); } else { set_pixel_value(newMapData, i, j, 0); } } } set_status("Rotating Image: Done"); last_status = 0.0; /* free up the old storage */ for(i = 0; i < fImageLength; i++) { free(fMapData[i]); } free(fMapData); /* assign pointer, etc to the new stuff */ fMapData = newMapData; fImageLength = newheight; fImageWidth = newwidth; }