Масштабирование TRotLayer

Я работаю над графикой32. И я использую данный компонент из его примеров, TRotLayer. Основываясь на примере (examples/Layers/RotLayer_Ex), созданный RotLayer масштабируется только вместе с ImgView. Если ImgView.Bitmap не назначен, RotLayer не масштабируется. Поэтому я повозился с исходным кодом, изменив его поведение. Я изменил процедуру TRotLayer.AdjustTransformation. Вот что я сделал.

procedure TRotLayer.AdjustTransformation;
var
ScaleX, ScaleY,
ShiftX, ShiftY: Single;
begin
Transformation.Clear;
Transformation.Translate(-BitmapCenter.X, -BitmapCenter.Y);
Transformation.Rotate(0, 0, Angle);
Transformation.Translate(Position.X, Position.Y);
Transformation.Scale(Scale.X, Scale.Y);
Transformation.Translate(Shift.X, Shift.Y);
//  if Scaled and Assigned(LayerCollection) then
//    with LayerCollection do
//    begin
//      GetViewportScale(ScaleX, ScaleY);
//      GetViewportShift(ShiftX, ShiftY);
//      Transformation.Scale(ScaleX, ScaleY);
//      Transformation.Translate(ShiftX, ShiftY);
//    end;
end;

Я просто снял ограничение и просто выполнил процедуру.Scale. Я передал значения для Scale.X и Scale.Y, и все заработало, как я и ожидал. Изображение было изменено, но теперь моя проблема в позиционировании. Изображение перемещается вверх или вниз, если я масштабирую его высоту, тогда оно перемещается вправо или влево, если я масштабирую его ширину. Я просто хотел, чтобы он изменил размеры и оставался в исходном положении. Я заметил, что функция. Translate может решить мою проблему, но я не знаю, что передать в параметрах. Или я не знаю, как вычислить значения для передачи.

Любой может помочь мне с этой проблемой. Благодарю.

1 ответ

Решение

Псевдокод:

  • Рассчитаем исходные границы:

    Transformation.SrcRect := FloatRect(0, 0, Old.Width, Old.Height);

  • Переместите начало координат в центр этих границ:

    Transformation.Translate(-0.5 * Old.Width, -0.5 * Old.Height);

  • Поворот вокруг нового происхождения:

    Transformation.Rotate(0, 0, Degrees);

  • Масштаб

  • Рассчитаем новые оценки:

    New.Bounds := Transformation.GetTransformedBounds;

  • Сдвиньте начало координат до (0, 0) новых границ:

    Transformation.Translate(0.5 * New.Width, 0.5 * New.Height);

Вы также можете взглянуть на Поворот растрового изображения на реальный угол для примера Graphics32 (без масштабирования).

Другие вопросы по тегам