Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Вращать Bitmap вокруг точки

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// Vektor von FromP nach ToP 
// Vector from FromP to ToP 

function TForm1.Vektor(FromP, Top: TPoint): TPoint;
 begin
   Result.x := Top.x - FromP.x;
   Result.y := Top.y - FromP.y;
 end;

 // neue x Komponente des Verktors 
// new x-component of the vector 
function TForm1.xComp(Vektor: TPoint; Angle: Extended): Integer;
 begin
   Result := Round(Vektor.x * cos(Angle) - (Vektor.y) * sin(Angle));
 end;

 // neue Y-Komponente des Vektors 
// new y-component of the vector 
function TForm1.yComp(Vektor: TPoint; Angle: Extended): Integer;
 begin
   Result := Round((Vektor.x) * (sin(Angle)) + (vektor.y) * cos(Angle));
 end;


 function TForm1.RotImage(srcbit: TBitmap; Angle: Extended; FPoint: TPoint;
   Background: TColor): TBitmap;
 { 
 srcbit: TBitmap; // Bitmap dass gedreht werden soll ; Bitmap to be rotated 
 Angle: extended; // Winkel in Bogenma?, angle 
 FPoint: TPoint;  // Punkt um den gedreht wird ; Point to be rotated around 
 Background: TColor): TBitmap;  // Hintergrundfarbe des neuen Bitmaps ; 
                               // Backgroundcolor of the new bitmap 
}
 var
    highest, lowest, mostleft, mostright: TPoint;
   topoverh, leftoverh: integer;
   x, y, newx, newy: integer;
 begin
   Result := TBitmap.Create;

   // Drehwinkel runterrechnen auf eine Umdrehung, wenn notig 
  // Calculate angle down on one rotation, if necessary 
  while Angle >= (2 * pi) do
   begin
     angle := Angle - (2 * pi);
   end;

   // neue Ausma?e festlegen 
  // specify new size 
  if (angle <= (pi / 2)) then
   begin
     highest := Point(0,0);                        //OL 
    Lowest := Point(Srcbit.Width, Srcbit.Height); //UR 
    mostleft := Point(0,Srcbit.Height);            //UL 
    mostright := Point(Srcbit.Width, 0);             //OR 
  end
    else if (angle <= pi) then
   begin
     highest := Point(0,Srcbit.Height);
     Lowest := Point(Srcbit.Width, 0);
     mostleft := Point(Srcbit.Width, Srcbit.Height);
     mostright := Point(0,0);
   end
    else if (Angle <= (pi * 3 / 2)) then
   begin
     highest := Point(Srcbit.Width, Srcbit.Height);
     Lowest := Point(0,0);
     mostleft := Point(Srcbit.Width, 0);
     mostright := Point(0,Srcbit.Height);
   end
    else
   begin
     highest := Point(Srcbit.Width, 0);
     Lowest := Point(0,Srcbit.Height);
     mostleft := Point(0,0);
     mostright := Point(Srcbit.Width, Srcbit.Height);
   end;

   topoverh := yComp(Vektor(FPoint, highest), Angle);
   leftoverh := xComp(Vektor(FPoint, mostleft), Angle);
   Result.Height := Abs(yComp(Vektor(FPoint, lowest), Angle)) + Abs(topOverh);
   Result.Width  := Abs(xComp(Vektor(FPoint, mostright), Angle)) + Abs(leftoverh);

   // Verschiebung des FPoint im neuen Bild gegenuber srcbit 
  // change of FPoint in the new picture in relation on srcbit 
  Topoverh := TopOverh + FPoint.y;
   Leftoverh := LeftOverh + FPoint.x;

   // erstmal mit Hintergrundfarbe fullen 
  // at first fill with background color 
  Result.Canvas.Brush.Color := Background;
   Result.Canvas.pen.Color   := background;
   Result.Canvas.Fillrect(Rect(0,0,Result.Width, Result.Height));

   // Start des eigentlichen Rotierens 
  // Start of actual rotation 
  for y := 0 to srcbit.Height - 1 do
   begin                       // Zeilen  ; Rows 
    for x := 0 to srcbit.Width - 1 do
     begin                    // Spalten ; Columns 
      newX := xComp(Vektor(FPoint, Point(x, y)), Angle);
       newY := yComp(Vektor(FPoint, Point(x, y)), Angle);
       newX := FPoint.x + newx - leftoverh;
       // Verschieben wegen der neuen Ausma?e 
      newy := FPoint.y + newy - topoverh;
       // Move beacause of new size 
      Result.Canvas.Pixels[newx, newy] := srcbit.Canvas.Pixels[x, y];
       // auch das Pixel daneben fullen um Leerpixel bei Drehungen zu verhindern 
      // also fil lthe pixel beside to prevent empty pixels 
      if ((angle < (pi / 2)) or
         ((angle > pi) and
         (angle < (pi * 3 / 2)))) then
       begin
         Result.Canvas.Pixels[newx, newy + 1] := srcbit.Canvas.Pixels[x, y];
       end
        else
        begin
         Result.Canvas.Pixels[newx + 1,newy] := srcbit.Canvas.Pixels[x, y];
       end;
     end;
   end;
 end;


 procedure TForm1.Button1Click(Sender: TObject);
 var
   mybitmap, newbit: TBitMap;
 begin
   if OpenDialog1.Execute then
   begin
     mybitmap := TBitmap.Create;
     mybitmap.LoadFromFile(OpenDialog1.FileName);
     newbit := RotImage(mybitmap, DegToRad(45),
       Point(mybitmap.Width div 2, mybitmap.Height div 2), clBlack);
     Image1.Canvas.Draw(0,0, newBit);
   end;
 end;

 end;
Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay