(C++) Rotate

Rotate is a VCL math code snippet to rotate a TImage under any angle.

Rotate is demonstrated in the tool Image Rotater.

 //From http://www.richelbilderbeek.nl/CppRotate.htm void Rotate(   const TImage * const imageOriginal,   TImage * const imageResult,   const double angle) {   const int maxx = imageResult->Picture->Bitmap->Width;   const int maxy = imageResult->Picture->Bitmap->Height;   const double midx = static_cast(maxx) / 2.0;   const double midy = static_cast(maxy) / 2.0;   for (int y=0; y!=maxy; ++y)   {     for(int x=0; x!=maxx; ++x)     {       const double dx1 = static_cast(x) - midx;       const double dy1 = static_cast(y) - midy;       double dx2, dy2; //Coordinats in original       Translate(dx1,dy1,angle,dx2,dy2);       const double x2 = (static_cast(           imageOriginal->Picture->Bitmap->Width )         / 2.0) + dx2;       const double y2 = (static_cast(           imageOriginal->Picture->Bitmap->Height)         / 2.0) + dy2;       if ( x2 < 1.0         || y2 < 1.0         || x2 >= imageOriginal->Picture->Bitmap->Width - 1.0         || y2 >= imageOriginal->Picture->Bitmap->Height - 1.0         )       { //Out of range         SetPixelVcl(imageResult,x,y,0,0,0);         continue;       }       unsigned char r,g,b;       GetPixel(imageOriginal,x2,y2,r,g,b);       SetPixelVcl(imageResult,x,y,r,g,b);     }   } } //--------------------------------------------------------------------------- //From http://www.richelbilderbeek.nl/CppRotate.htm void GetPixel(   const TImage * const image,   const double x,   const double y,   unsigned char& red,   unsigned char& green,   unsigned char& blue) {   const double xRemainder = x - static_cast(x);   const double yRemainder = y - static_cast(y);   const int x_tl = ( xRemainder > 0.5 ? x : x-1);   const int y_tl = ( yRemainder > 0.5 ? y : y-1);   const double left = ( xRemainder > 0.5     ? 1.5 - xRemainder : 0.5 - xRemainder);   const double top = ( yRemainder > 0.5     ? 1.5 - yRemainder : 0.5 - yRemainder);   return GetPixel(image,x_tl,y_tl,left,top,red,green,blue); } //--------------------------------------------------------------------------- //From http://www.richelbilderbeek.nl/CppRotate.htm void GetPixel(   const TImage * const image,   const int x_tl,   const int y_tl,   const double left,   const double top,   unsigned char& red,   unsigned char& green,   unsigned char& blue) {   const double right = 1.0 - left;   const double bottom = 1.0 - top;   assert(left >= 0.0 && left <=1.0);   assert(top >= 0.0 && top <=1.0);   assert(right >= 0.0 && right <=1.0);   assert(bottom >= 0.0 && bottom <=1.0);   unsigned char r_tl, g_tl, b_tl;   unsigned char r_tr, g_tr, b_tr;   unsigned char r_bl, g_bl, b_bl;   unsigned char r_br, g_br, b_br;   GetPixel(image,x_tl+0,y_tl+0,r_tl,g_tl,b_tl);   GetPixel(image,x_tl+1,y_tl+0,r_tr,g_tr,b_tr);   GetPixel(image,x_tl+0,y_tl+1,r_bl,g_bl,b_bl);   GetPixel(image,x_tl+1,y_tl+1,r_br,g_br,b_br);   const double rTotal     = (top * left * static_cast(r_tl))     + (top * right * static_cast(r_tr))     + (bottom * left * static_cast(r_bl))     + (bottom * right * static_cast(r_br));   const double gTotal     = (top * left * static_cast(g_tl))     + (top * right * static_cast(g_tr))     + (bottom * left * static_cast(g_bl))     + (bottom * right * static_cast(g_br));   const double bTotal     = (top * left * static_cast(b_tl))     + (top * right * static_cast(b_tr))     + (bottom * left * static_cast(b_bl))     + (bottom * right * static_cast(b_br));   assert(rTotal >= 0.0 && rTotal < 256.0);   assert(gTotal >= 0.0 && gTotal < 256.0);   assert(bTotal >= 0.0 && bTotal < 256.0);   red = static_cast(rTotal);   green = static_cast(gTotal);   blue = static_cast(bTotal); } //--------------------------------------------------------------------------- //From http://www.richelbilderbeek.nl/CppRotate.htm void Translate(   const double dx1,   const double dy1,   const double dAngle,   double& dx2,   double& dy2) {   const double oldAngle = GetAngle(dx1,dy1);   const double newAngle = oldAngle - dAngle;   const double ray     = std::sqrt((dx1 * dx1) + (dy1 * dy1)); //Pythagoras   dx2 = std::sin(newAngle) * ray;   dy2 = -std::cos(newAngle) * ray; }