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