Перейти к содержанию
Fire Monkey от А до Я
  • 0

Вращение Bitmap


virus_forever

Вопрос

Доброго времени суток!

Подскажите, пожалуйста, как можно отрисовать Bitmap (схематично на рисунке представлен черным прямоугольником) с поворотом последнего на определенный угол (скажем 45, 90, или любой другой) относительно какой либо точки - например центра TBitMap`a. И потом определить координаты углов - A, B, C и D для дальнейшего использования.

rotation.png

Я вычитал, что для этого используется TMatrix с ее методами и SetMatrix у Canvas. Но в матрицах можно сказать ничего не понимаю, и нету хорошего описания - что это и с чем это употребляют.

Подскажите, пожалуйста! Заранее спасибо!

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

 

  AB  := 10;
  AD  := 5;
  X   := 7; {X [0..AB]}
  Y   := 2; {Y [0..AD]}
  AngleRot  := 45;

  Image1.RotationCenter.X := (X/AB);
  Image1.RotationCenter.Y := (Y/AD);
  Image1.RotationAngle    := AngleRot;

это поворот Image на произвольный угол AngleRot. Предварительно поместить Bitmap в Image

Расчёт координат углов к FireMonkey не относится. Посмотрите учебник геометрии - Теорема Пифагора 

Изменено пользователем Alexander
Ссылка на комментарий
  • 0
8 часов назад, Alexander сказал:

 


  AB  := 10;
  AD  := 5;
  X   := 7; {X [0..AB]}
  Y   := 2; {Y [0..AD]}
  AngleRot  := 45;

  Image1.RotationCenter.X := (X/AB);
  Image1.RotationCenter.Y := (Y/AD);
  Image1.RotationAngle    := AngleRot;

это поворот Image на произвольный угол AngleRot. Предварительно поместить Bitmap в Image

Расчёт координат углов к FireMonkey не относится. Посмотрите учебник геометрии - Теорема Пифагора 

Мне нужно вращать не TImage целиком на форме, в виде отдельного компонента.

Мне нужно освоить матрицу преобразований холста Bitmap, чтобы научиться отрисовывать нужные мне примитивы и графические объекты под нужным углом и в нужном месте. Документации вменяемой по этому поводу нигде вменяемой нет. Вот и обратился за помощью сюда.

Есть материалы по HTML5 Canvas, там тоже есть подобные методы - но как я не пытался воспроизвести их - на Delphi не получается. Даже схематично нарисовал на листочке весь процесс. О том КАК перемещается НАЧАЛО КООРДИНАТ у канвы при вызове translate и rotate. Вычитал, что нужно выполнить: .rotate(angle) + .translate(x + width\2, y+height\2) + .draw(-width\2, height\2, width, height) - все равно не получается.

Если мы хотим вращать какой-то объект, например, картинку, необходимо правильно взаимодействовать методами rotate и translate, иначе мы никогда не попадём картинкой в нужное место. Самый простой способ осью вращения выбрать центр картинки и отрисовывать её в координаты (-width/2, -height/2). К примеру, мы хотим развернуть картинку размерами 50х50, находящуюся на координатах 100:100. Указываем translate в координату 125:125 и отрисовываем картинку в координату -25:-25. Альтернатива — использовать LibCanvas и метод rotatedImage(или drawImage в ближайшем будущем) и не напрягаться.
procedure xDrawBitmapWithAngle(x,y: Integer; a: Single; Bmp: TBitmap);
  var
    AR: Single;

    HalfW,
    HalfH: Single;

    NM,
    OM: TMatrix;

    SrcRect,
    DstRect: TRectF;
  begin
    AR:= a * (Pi / 180);

    HalfW:= Bmp.Width / 2;
    HalfH:= Bmp.Height / 2;

    NM := TMatrix.CreateTranslation( x + HalfW, y + HalfH ) * TMatrix.CreateRotation( AR );

    OM:= B.Canvas.Matrix;

    B.Canvas.SetMatrix( NM );

    SrcRect:= RectF( 0, 0, Bmp.Width, Bmp.Height );
    DstRect:= RectF( -HalfW, -HalfH, Bmp.Width, Bmp.Height );

    B.Canvas.DrawBitmap(Bmp, SrcRect, DstRect, 1, False);

    B.Canvas.SetMatrix( OM );
  end;

Нарисованного изображения не видать. Скорее всего оно рисуется где то там, за пределами.

Что я делаю и понимаю не так? 

Ссылка на комментарий
  • 0
50 минут назад, Pax Beach сказал:

Вот пример вращения матрицы на канве.

Спасибо! Буду разбираться!

Одно не понятно сразу: Где узнать что означают каждая из 9 переменных TMatrix? 

Matrix := CreateRotationMatrix(RadAngle);
Matrix.m31 := P.X;
Matrix.m32 := P.Y;

Тут, например, идет прямое обращение к m31 и m32.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...