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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От Julia
      Загружаю через opendialog картинку  формата bmp в image
      Есть переменные с:TColor, c1:Tcolor
      Необходимо  вначале узнать цвет определенного пикселя на загруженной картинке и записать в  c1, а затем изменить цвет определенного пикселя на загруженной картинке на цвет, хранящийся в переменной c.
      Ищу очень давно, но внятного объяснения нигде не нашла(
       
       
    • От Макс Войтенко
      Хотел сделать вот так (1 скриншот)

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

      Seattle LVdynamicLoadBitmap.zip
      Berlin LVdynamicLoadBitmap(Berlin).zip
    • От M1shQa
      Есть задача написать дату на полученной только что фотографии с камеры. С камеры фотку получаю и выгружаю в 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) на весь экран, изображение в пропорции выводится не на весь экран
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу