作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 最快的bitmap旋转演算法?
时间Sun Jun 4 21:31:04 2006
※ 引述《bobhsiao (㊣小臃肿㊣)》之铭言:
: 有一个 "将图A旋转N度, 再贴到图B的函数", 原始码如下(用allegro写的):
: http://rafb.net/paste/results/ZmAFzl75.html
: 速度的瓶颈在22~35行.
: 试过下列最佳化:
: 1. 浮点改整数. (例:int sinT=sin(Thita)*1024, 後面要用时再除1024)
: 2. 先求srcX, 若满足条件才算srcY. (可节省一些运算)
: 3. 一些固定值用变数存起来. (New_Height/2, New_Width/2...等)
: 结果还是无法像DirectX的API那样快速.
: 我想DirectX应该是有用硬体加速吧.
: 用软体做bitmap旋转是否还有更快的方式呢?
以下完全是用想的,虽然我用类似的方法实作过三角形填色,
不过并没有拿来实作过图形的旋转。
基本上旋转只是座标乘上旋转矩阵:
[ u ] [ cosθ sinθ ] [ x ]
[ ] = [ ] [ ]
[ v ] [ -sinθ cosθ ] [ y ]
如果你把 (x+1, y) 代进这个矩阵就会发现:
u' = (cosθ)(x+1) + (sinθ)y
= (cosθ)x + (sinθ)y + cosθ
= u + cosθ
v' = (-sinθ)(x+1) + (cosθ)y
= (-sinθ)x + (cosθ)y - sinθ
= v - sinθ
也就是说,当你的 x 座标前进一格时,你完全不用重做矩阵
乘法,只须要把上次算出来的座标各加上一个位移即可。这麽
一来就完全不须要乘法运算。
如果配合 Bresenham 画线的方式,甚至可以把浮点数加法改
成整数加法。
当然再加上 SSE 可能会更快,但因为你还要 clipping,所以
应该没办法快多少,当然也不可能比显示卡硬体加速还快。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.62.3.35
1F:推 yoco315:酷 @@ 06/05 01:12