Beispiel #1
0
int Image32::RotateNearest(const float& angle,Image32& outputImage) const
{
	int height = this->height();
	int width = this->width();

	double rad = -1.0 * angle * (M_PI/180.0);

	double midHeight = (height/2.0);
	double midWidth = (width/2.0);

	double diagonal = sqrt(midHeight*midHeight + midWidth*midWidth);

	int offset = ceil(diagonal - min(midWidth, midHeight));

	Image32 interImage;
	interImage.setSize(width+(2*offset), height+(2*offset));

	outputImage.setSize(width+(2*offset), height+(2*offset));

	

	for(int y=0; y < height; ++y){
		for(int x=0; x < width; ++x){
			int xOffset = x + offset;
			int yOffset = y + offset;

			interImage.pixel(xOffset, yOffset).r = this->pixel(x,y).r;
			interImage.pixel(xOffset, yOffset).g = this->pixel(x,y).g;
			interImage.pixel(xOffset, yOffset).b = this->pixel(x,y).b;
		}
	}

	for(int y=-1*offset; y < height + offset; ++y){
		for(int x=-1*offset; x < width + offset; ++x){
			int xOffset = x + offset;
			int yOffset = y + offset;

			float u = cos(rad)*(x - midWidth) - sin(rad)*(y - midHeight) + offset + midWidth;
			float v = sin(rad)*(x - midWidth) + cos(rad)*(y - midHeight) + offset + midHeight;


			Pixel32 pix = interImage.NearestSample(u,v);


			outputImage.pixel(xOffset,yOffset).r = pix.r;
			outputImage.pixel(xOffset,yOffset).g = pix.g;
			outputImage.pixel(xOffset,yOffset).b = pix.b;
			outputImage.pixel(xOffset,yOffset).a = pix.a;

			// useful for debugging
			// outputImage.pixel(xOffset,yOffset).r = interImage.pixel(xOffset, yOffset).r;
			// outputImage.pixel(xOffset,yOffset).g = interImage.pixel(xOffset, yOffset).g;
			// outputImage.pixel(xOffset,yOffset).b = interImage.pixel(xOffset, yOffset).b;
		}
	}

	return 1;
}