![]() |
|
![]() ![]() ![]() |
|
Loki_ |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 13.10.2003 Репутация: нет Всего: нет |
Подскажите, как реализовать более быстрый способ поворота картинки?
Этот слишком долго работает(если картинка большая) var x, y: integer; r: single; xo, yo: integer; s, c: extended; BitmapOriginal,BitmapRotate:TBitmap; begin BitmapOriginal:=TBitmap.Create; BitmapOriginal.LoadFromFile('C:\Test.bmp'); BitmapRotate:=TBitmap.Create; BitmapRotate.Width:=BITMAPORIGINAL.Width; BitmapRotate.Height:=BITMAPORIGINAL.Height; xo:=BITMAPORIGINAL.Width div 2; yo:=BITMAPORIGINAL.Height div 2; a := a+0.05; for y:=0 to BITMAPORIGINAL.Height - 1 do begin for x:=0 to BITMAPORIGINAL.Width - 1 do begin r:=sqrt(sqr(x - xo) + sqr(y - yo)); SinCos(a + arctan2((y - yo), (x - xo)), s, c); Form1.BitmapRotate.Canvas.Pixels[x,y]:=Form1.BITMAPORIGINAL.Canvas.Pixels[ round(xo + r * c), round(yo + r * s)]; end; end; Form2.Image1.Canvas.Draw(0,0,Form1.BitmapRotate); end; |
|||
|
||||
Unregistered |
|
|||
Unregistered |
Тормозит, потому что ты внутри двойного цикла считаешь
несколько левых функций типа sqrt() или arctan2() или SinCos(), что делать совсем не обязательно, так как на их исполнение тратится слишком много времени Чтобы повернуть изображение, достаточно знать всего лишь синус и косинус угла поворота Причем угол поворота не зависит от каждой конкретной точки изображения, поэтому этот синус и косинус можно сосчитать вне цикла, тогда работать будет намного быстрее |
|||
|
||||
val |
|
|||
![]() Program developer ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 992 Регистрация: 14.1.2003 Где: г. Киев Репутация: 1 Всего: 7 |
Где-то уже была тема поворота...
Повторюсь: Ynew=Y*sin(alpa); Xnew=X*cos(alpa); alpha - угол, на который поворачиваем... При этом, желательно, иметь подготовленными таблицы sin и cos. Тогда всё должно ускориться... -------------------- Терпимость - величайшее благо человечества... Ярчайший признак интеллекта – постоянно хорошее настроение… |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
а поворачивают вообще-то не так
так изображение получается размазанное насколько я знаю алгоритм поворота строится на основе операции "скашивания" (не знаю, как правильно это называется): (x,y)->(round(x+a*y),y) (по горизонтали) (x,y)->(x,round(y+b*y)) (по вертикали) сам алгоритм строится как композиция нескольких скашиваний: 1. по горизонтали с коэффициентом a 2. по вертикали с коэффициентом b 3. по горизонтали то ли с a, то ли с (-a) коэффициенты a и b вычисляются из значения угла поворота -------------------- qqq |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
не совсем так: xnew=x*cos(alpha)+y*sin(alpha); ynew=-x*sin(alpha)+y*cos(alpha); -------------------- qqq |
|||
|
||||
Unregistered |
|
|||
Unregistered |
Если ещё ускорять, то забудь про pixels[] и работай со scanline... всё ускорится в несколько раз...
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |