У меня есть изображение .bmp с макетом комиксов. В настоящее время мой код работает так. Если я нажимаю правой кнопкой мыши и удерживаю нажатой кнопку мыши, я могу нарисовать поле типа шатер вокруг одного из фреймов на странице комикса. Когда я отпущу кнопку, она будет увеличиваться в этом фрейме. Но его мгновение. И я бы хотел, чтобы у него был эффект анимации.Математика для медленного увеличения изображения
Таким образом, вместо того, чтобы идти и установка значения PicRect к «END VALUE»
PicRect.Left
PicRect.right
PicRect.top
PicRect.bottom
, как показано в коде ниже, мне нужен способ, чтобы медленно попасть, своего рода в то время как цикл, который устанавливает те значения немного за раз, пока он не достигнет «конечного значения». Но я не уверен на 100% о том, как эта математика работает. Ни один из моих попыток while не делает ничего, кроме масштабирования слишком далеко. Это процедура.
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;
Я считаю, что это может быть сделано в коде выше. но также хотел добавить этот incase, который он помогает.
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;
благодарит за любую помощь в получении этой работы.
Проблема была бы растянута, с этим добавленным циклом он теперь останавливает растяжку. X - start == y - starty работает так же, если закомментирован. Я попробую это, пока цикл не увидит, как это работает, спасибо за это. Я не уверен, что КОЭФ предположил бы даже сделать :(Я решил, что цикл while заменит раздел кода, который вы назвали немного запутанным. .. В то время как цикл был выше, нужно было удалить растягивание. –
будет принимать, как это помогло мне получить все от работы! –
Что было бы _awesome_, если вы добавите ответ с кодом _fixed_, кто-то другой, пытающийся сделать анимацию масштабирования изображения, вероятно, очень хотел бы знать, что конкретно необходимо изменить. – sarnold