Vista la necesidad he convertido el anterior code a BCB, disfrútenlo;
Código:
#include <math.h>
#include <math.hpp>
// ...
Graphics::TBitmap *Rotate(TCanvas *Source, int Width, int Height, int Angle, bool Reverse)
{
Double Radio = sqrt(pow(Width / 2, 2) + pow(Height / 2, 2)), AngleRad = (360 - (Angle % 360)) * M_PI / 180;
TPoint Points[3] = {Point(Width, -Height), Point(Width, Height), Point(Width, Height)};
for (int Index = 0; Index < 3; Index++)
{
Double Angle = ArcTan2(Points[Index].y, Points[Index].x) + AngleRad + ((Index % 2)? 0 : M_PI);
Points[Index] = Point(RoundTo((cos(Angle) * Radio) + Radio, 0), RoundTo(Radio - (sin(Angle) * Radio), 0));
}
Graphics::TBitmap *Result = new Graphics::TBitmap();
Result->Canvas->Brush->Color = clFuchsia;
Result->TransparentColor = clFuchsia;
int Size = RoundTo(Radio * 2, 0);
Result->Height = Size;
Result->Width = Size;
PlgBlt(Result->Canvas->Handle, Points, Source->Handle, 0, 0, Width, Height, 0, 0, 0);
if (Reverse) Result->Canvas->CopyRect(Rect(0, 0, Size, Size), Result->Canvas, Rect(Size - 1, 0, 0, Size));
return Result;
}
Modo de uso:
Código:
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
ImageHolder->Picture->Assign(Image1->Picture);
Graphics::TBitmap *Bitmap = Rotate(ImageHolder->Canvas, ImageHolder->Width, ImageHolder->Height, TrackBar1->Position, CheckBox1->Checked);
ImageHolder->Picture->Assign(Bitmap);
Bitmap->Free();
}