Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2010, 21:46
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию Оптимизация поворота (ускорение)

в общем написал я код, который поворачивает картинку, ускорял как мог, что получилось:

Код:
const da = 1;
var x_,y_,a: Real;
    x,y: Integer;
    cl,trcl: TColor;
    sina,cosa: Real;

begin
trcl:=Image1.Canvas.Pixels[0,0];
a:=pi/180*da;
while true do begin
sina:=sin(a);
cosa:=cos(a);
for x:=0 to Image1.Width-1 do
    for y:=0 to Image1.Height-1 do begin
      cl:=Image1.Canvas.Pixels[x,y];
      If cl<>trcl then begin
        x_:=(x-Image1.Width/2)*cosa-(y-Image1.Height/2)*sina+Image1.Width/2;
        y_:=(x-Image1.Width/2)*sina+(y-Image1.Height/2)*cosa+Image1.Height/2;
        Image2.Canvas.Pixels[Round(x_),Round(y_)]:=cl;
      end;
    end;
a:=a+pi/180*da;
Application.ProcessMessages;
end;
end.

ускорял как мог (синус и косинус только 1 раз считаю, не беру прозрачные пикселы) но все равно он вращает медленно, может у кого есть идеи как это ускорить?
Ответить с цитированием
  #2  
Старый 07.09.2010, 21:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,050
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вариант 1. Смотрим как работать через ScanLine.
Вариант 2. Смотрим как работать через API. Там можно хитро создавать вью битмапа. Получается самое быстрое.
Ответить с цитированием
  #3  
Старый 08.09.2010, 08:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  dc: HDC;
  savetagx: tagXFORM;
  tagx: tagXFORM;
  angle: Real;
begin
  angle:=30*Pi/180;
  dc:=Image1.Canvas.Handle;
  SetGraphicsMode(dc, GM_ADVANCED);
  GetWorldTransform(dc, savetagx);
  ZeroMemory(@tagx, SizeOf(tagx));
  tagx.eM11:=Cos(angle);
  tagx.eM12:=Sin(angle);
  tagx.eM21:=-Sin(angle);
  tagx.eM22:=Cos(angle);
  tagx.eDx:=Image1.Picture.Bitmap.Width / 2;
  tagx.eDy:=Image1.Picture.Bitmap.Height / 2;
  ModifyWorldTransform(dc, tagx, MWT_LEFTMULTIPLY);
  Image1.Canvas.Draw(0, 0, Image2.Picture.Graphic);
  SetWorldTransform(dc, savetagx);
end;

Последний раз редактировалось NumLock, 04.05.2012 в 10:45.
Ответить с цитированием
  #4  
Старый 08.09.2010, 13:47
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

последний способ как я понимаю, через матрицу поворота
|cos a; sin a|
|-sin a; cos a| ?
Ответить с цитированием
  #5  
Старый 08.09.2010, 14:06
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а чёрт его знает как оно праильна называется - я математику 15 лет назад изучал)))
Ответить с цитированием
  #6  
Старый 08.09.2010, 15:58
Аватар для Моклев
Моклев Моклев вне форума
Новичок
 
Регистрация: 27.02.2009
Адрес: Лен. обл., г. Коммунар
Сообщения: 53
Версия Delphi: 7 и 2010
Репутация: 16
По умолчанию

кому не лень, напишите примерчик, как работать со Scanline, а то уже человек 20 сказало, что так быстрее, я прям заинтересовался))
Ответить с цитированием
  #7  
Старый 08.09.2010, 16:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

имхо не быстрее, чем ModifyWorldTransform
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter