|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Оптимизация поворота (ускорение)
в общем написал я код, который поворачивает картинку, ускорял как мог, что получилось:
Код:
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
|
|||
|
|||
Вариант 1. Смотрим как работать через ScanLine.
Вариант 2. Смотрим как работать через API. Там можно хитро создавать вью битмапа. Получается самое быстрое. |
#3
|
||||
|
||||
Код:
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
|
||||
|
||||
последний способ как я понимаю, через матрицу поворота
|cos a; sin a| |-sin a; cos a| ? |
#5
|
||||
|
||||
а чёрт его знает как оно праильна называется - я математику 15 лет назад изучал)))
|
#6
|
||||
|
||||
кому не лень, напишите примерчик, как работать со Scanline, а то уже человек 20 сказало, что так быстрее, я прям заинтересовался))
|
#7
|
||||
|
||||
имхо не быстрее, чем ModifyWorldTransform
|