Mathe für langsamen Bildzoom

Ich habe ein BMP-Bild mit einem Comic-Layout. Momentan funktioniert mein Code so. Wenn ich mit der rechten Maustaste klicke und die Maustaste gedrückt halte, kann ich einen Auswahlrahmen um einen der Rahmen auf der Comic-Seite zeichnen. Wenn ich die Taste loslasse, wird in diesen Rahmen hineingezoomt. Aber es ist sofort. Und ich möchte, dass es einen Animationseffekt hat.

Anstatt also die Werte von PicRect auf "END VALUE" zu setzen

PicRect.Left
PicRect.right
PicRect.top
PicRect.bottom

Wie im Code unten zu sehen ist, brauche ich eine Möglichkeit, um langsam dahin zu gelangen. Eine Art while-Schleife, die diese Werte ein wenig nach dem anderen setzt, bis sie den "Endwert" erreichen funktioniert. Auch versucht keine meiner while-Schleifen etwas anderes als zu weit hineinzuzoomen. Dies ist das Verfahren.

procedure TZImage.MouseUp(Button: TMouseButton; Shift: TShiftState;
                      X, Y: Integer);
    var coef:Double;
    t:integer;
begin
   if FMouse=mNone then Exit;
   if x>ShowRect.Right then x:=ShowRect.Right;
   if y>ShowRect.Bottom then y:=ShowRect.Bottom;
   if FMouse=mZoom then begin  //calculate new PicRect
     t:=startx;
     startx:=Min(startx,x);
     x:=Max(t,x);
     t:=starty;
     starty:=Min(starty,y);
     y:=Max(t,y);
     FMouse:=mNone;
     MouseCapture:=False;
//enable the following if you want to zoom-out by dragging in the opposite direction}
    {     if Startx>x then begin
            DblClick;
            Exit;
         end;}
         if Abs(x-startx)<5 then Exit;
         if (x - startx < y - starty) then
         begin
           while (x - startx < y - starty) do
           begin
              x := x + 100;
              startx := startx - 100;
           end;
         end
         else if (x - startx > y - starty) then
         begin
            while (x - startx > y - starty) do
            begin
                y := y + 100;
                starty := starty - 100;
            end;
         end;


    //This is were it sets the zoom info. This is were
    //I have to change to slowly get the PICRECT.Left/right/top/bottom
         if (PicRect.Right=PicRect.Left)
         then
            coef := 100000
         else
            coef:=ShowRect.Right/(PicRect.Right-PicRect.Left);
         PicRect.Left:=Round(PicRect.Left+startx/coef);
         PicRect.Right:=PicRect.Left+Round((x-startx)/coef);
         if (PicRect.Bottom=PicRect.Top)
         then
            coef := 100000
         else
            coef:=ShowRect.Bottom/(PicRect.Bottom-PicRect.Top);
         PicRect.Top:=Round(PicRect.Top+starty/coef);
         PicRect.Bottom:=PicRect.Top+Round((y-starty)/coef);
       end;
       if FMouse=mDrag then begin
         FMouse:=mNone;
         Canvas.Pen.Mode:=pmCopy;
         Screen.Cursor:=crDefault;
       end;
       Invalidate;
    end;

Ich glaube, dass dies im obigen Code getan werden kann. wollte aber auch diesen incase hinzufügen das hilft.

type
    TZImage = class(TGraphicControl)
  private
    FBitmap        : TBitmap;
    PicRect        : TRect;
    ShowRect       : TRect;
    FShowBorder    : boolean;
    FBorderWidth   : integer;
    FForceRepaint  : boolean;
    FMouse         : (mNone, mDrag, mZoom);
    FProportional  : boolean;
    FDblClkEnable  : boolean;
    startx, starty,
    oldx, oldy     : integer;

Vielen Dank für jede Hilfe dabei, dies zum Laufen zu bringen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage