Matemática para zoom de imagem lenta
Eu tenho uma imagem .bmp com um layout de quadrinhos. Atualmente meu código funciona assim. Se clico com o botão direito do mouse e pressiono o botão do mouse, posso desenhar uma caixa do tipo letreiro ao redor de um dos quadros da página de quadrinhos. Quando eu solto o botão, ele aumenta o zoom nesse quadro. Mas é instantâneo. E eu gostaria que tivesse um efeito de animação.
Assim, em vez de ir e definir os valores de PicRect para o "valor final"
PicRect.Left
PicRect.right
PicRect.top
PicRect.bottom
como visto no código abaixo, eu preciso de uma maneira de chegar lá lentamente, algum tipo de loop while que define esses valores um pouco de cada vez até que chegue ao "valor final" Mas eu não estou 100% certo sobre como essa matemática está funcionando. Nem qualquer um dos meus loop while tenta fazer nada além de ampliar demais. Esse é o procedimento.
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;
Eu acredito que isso pode ser feito no código acima. mas também queria adicionar isso caso ajude.
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;
Obrigado por qualquer ajuda em conseguir que isso funcione.