Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2014, 05:28   #1
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию FMX DrawBitmap вращение

В FMX есть процедура:
Цитата:
TBitmap.Rotate(const Angle: Single);
Она, вращает непосредственно саму текстуру, создавая и перерисовывая TBitmap.

Если необходимо вращать объект, а не текстуру, то этот метод не подойдет, т.к. это затратно по ресурсам и главное медленно.

Процедуру вращения при отрисовке TBitmap я не нашел, поэтому написал вот такой, немного кривовастенький вариант.
(происходит "вращение" матрицы, без каких либо перерисовок TBitmap).

Код:
procedure DrawBitmapRotate(c:TCanvas; const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single; const HighSpeed: Boolean;a:Single);
var M,OldM:TMatrix;
pw,ph:single;
begin
  pw   := (DstRect.Right -DstRect.Left)/2;
  ph   := (DstRect.Bottom-DstRect.Top )/2;
  OldM := c.Matrix;
  m    := c.Matrix;
  m.m11:= cos(a-pi);
  m.m12:= sin(a-pi);
  m.m21:=-sin(a-pi);
  m.m22:= cos(a-pi);
  m.m31:= DstRect.Left+pw;
  m.m32:= DstRect.Top +ph;
  c.setmatrix(M);
  c.DrawBitmap(ABitmap,SrcRect,RectF(0-pw,0-ph,0+pw,0+ph),AOpacity,HighSpeed);
  c.setmatrix(OldM);
end;
Использование:
Код:
Angle:=70;//Угол вращения
DrawBitmapRotate(Layout.Canvas,Bitmap,RectF(0,0,500,500),RectF(500,500,1000,1000),1,True,Angle);
Может кому понадобится, хз.

П.с.
Для реализации задуманного меня этот метод полностью устраивает, но если вдруг кто-нибудь знает более правильное решение - поделитесь
ZBEP вне форума Ответить с цитированием
Старый 15.11.2014, 13:24   #2
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Синус и косинус одновременно вычисляются (одной инструкцией сопроцессору):
Код:
 Math.SinCos(a-pi, s, c);
 m.m11:= c;
 m.m12:= s;
 m.m21:=-s;
 m.m22:= c;
Так-то спички, но может есть другие места - может дать серьезное ускорение.
StriderX вне форума Ответить с цитированием
Старый 16.11.2014, 03:53   #3
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

StriderX, спасибо, не знал.
ZBEP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FMX. Поведение контролов ZuBy Общие вопросы Delphi 23 10.06.2014 17:16
Проблема при создании своего контрола в FMX-приложении cooper72 Общие вопросы Delphi 2 11.03.2014 19:07
FMX StyleBook MIKE11IPME Общие вопросы Delphi 0 16.09.2013 15:37
Разноцветный текст силами FMX (XE3) KPu3uC B Poccuu Общие вопросы Delphi 0 04.02.2013 09:12
Delphi XE2 вопросы по FMX ZBEP Общие вопросы Delphi 3 25.03.2012 03:50