Математика для медленного увеличения изображения

У меня есть изображение .bmp с макетом комиксов. В настоящее время мой код работает следующим образом. Если я щелкну правой кнопкой мыши и удержу кнопку мыши, я смогу нарисовать рамку типа рамки вокруг одной из рамок на странице комиксов. Когда я отпущу кнопку, это увеличит масштаб этого кадра. Но это момент. И я бы хотел, чтобы это имело эффект анимации.

Таким образом, вместо установки и установки значений PicRect на «END VALUE» quot;

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

как видно из приведенного ниже кода, мне нужен способ, чтобы медленно туда добраться. Какой-то цикл while, который устанавливает эти значения постепенно, пока не достигнет конечного значения & quot; Но я не уверен на 100%, как работает эта математика. Ни одна из моих попыток цикла пока ничего не делает, кроме увеличения масштаба. Это процедура.

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;

Я считаю, что это можно сделать в коде выше. но также хотел добавить, что это помогает.

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;

спасибо за любую помощь в получении этого на работу.

Ответы на вопрос(4)

Ваш ответ на вопрос