• 0
virus_forever

Вращение Bitmap

Вопрос

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

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

rotation.png

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

6 ответов на этот вопрос

  • 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

в учебнике про линейной алгебре

Pax Beach понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: MrSergei2017
      Я тут новичок, и не понимаю как использовать комманду CopyFromBitmap
    • Автор: ODmitrijS
      Подскажите алгоритм или готовый пример заливки замкнутой области рисунка произвольной формы определенным цветом?
      Моё решение часто приводит к переполнению стека.
    • Автор: Rusland
      Есть две картинки в формате png. Как на одну картинку наложить вторую, которая с прозрачностью (фактически там только рамка) и вывести в Image?
    • Автор: Равиль Зарипов (ZuBy)
      Привет Всем!
      Как принято в современных приложениях, догружать контент(обычно это картинки) при скролинге.
      я взял картинки пользователей этого форума

      Seattle LVdynamicLoadBitmap.zip
      Berlin LVdynamicLoadBitmap(Berlin).zip
    • Автор: MikeWuzHere
      Есть задача написать дату на полученной только что фотографии с камеры. С камеры фотку получаю и выгружаю в TImage, далее нашел пару способов, а именно:
      image.bitmap.canvas.textout
      image.bitmap.canvas.filltext
      и оба у меня не работают, первый вариант не удается запустить, пишет, что нету такого свойства textout у TCanvas, а второй тупо вешает программу. Подскажите как можно решить эту проблему пожалуйста.
    • Автор: umkes
      Добрый день, возникла проблема при работе с TImage;
      У меня компонент TImage - imgRing и есть в TImageList. 
      Я динамически формирую Bitmap из копий картинки из TImageList и асайню его в TImage. На Windows все работает прекрасно, а на андроиде картинка все время пустая... Может кто-то подскажет, где я не прав
      //============================================================================== procedure TMainForm.DrawRing; //------------------------------------------------------------------------------ var bmp1, bmp2 : TBitmap; i : integer; str : TMemoryStream; begin bmp2 := TBitmap.Create; bmp2.Assign(ImageList.Source.Items[3].MultiResBitmap.Items[0].Bitmap); bmp1 := TBitmap.Create; bmp1.Assign(bmp2); bmp1.Width := ClientWidth + bmp2.Width * 10; i := 0; bmp1.Canvas.BeginScene(); while (i * bmp2.Width) < bmp1.Width do begin bmp1.Canvas.DrawBitmap(bmp2, RectF(0, 0, bmp2.Width, bmp2.Height), RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height), 1 ); inc(i); end{ while }; bmp1.Canvas.EndScene; str := TMemoryStream.Create; bmp1.SaveToStream(str); str.Position := 0; imgRing.BeginUpdate; imgRing.Bitmap.CreateFromStream(str); imgRing.EndUpdate; end{ procedure TMainForm.DrawRings }; Делаю такое потому-что TImage.WrapMode.Tile не подходит для моей задачи.
    • Автор: HoShiMin
      Загружаю в Bitmap значок 16х16, должно получиться что-то вроде такого:

      А получается так:

       
      Помогает только изменение размеров холста в фотошопе. В ХЕ8 всё работало как надо, в 10 - вот. Хотел отредактировать стиль, убрав Stretch у картинки, но у всплывающего меню нельзя отредактировать стиль. Как поправить, не меняя размеры самих картинок значков?
    • Автор: alewka006
      Подскажите, как на форме сделать фоновое изображение. Вставляю картинку (TImage) на весь экран, изображение в пропорции выводится не на весь экран
    • Автор: VirusZ2D
      Доброго времени суток подскажите как получить картинку из TStyleObject  
      var   Item:TListBoxItem;   StyleObject: TStyleObject; begin   Item  := ListBox1.ItemByIndex(0);   StyleObject := TStyleObject(Item.FindStyleResource('styleobjectstyle'));   if (StyleObject <> nil) and (StyleObject is TControl) then   begin     Image1.Bitmap:= StyleObject.Source;   // Выводит изображение указанное в SourceLookUp целиком;     Image1.Bitmap := // Интересует как вывести изображение обрезанное с учетом SourceLink   end;
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу