赞 | 95 |
VIP | 77 |
好人卡 | 113 |
积分 | 69 |
经验 | 147345 |
最后登录 | 2025-2-12 |
在线时间 | 7027 小时 |
Lv4.逐梦者 (版主)
- 梦石
- 0
- 星屑
- 6891
- 在线时间
- 7027 小时
- 注册时间
- 2013-11-2
- 帖子
- 1344
 
|
本帖最后由 RaidenInfinity 于 2016-10-23 10:30 编辑
#Simple Bitmap Rotation by RaidenInfinity module Math def self.deg_to_rad(x) return x * (Math::PI / 180.0) end def self.get_rotation_matrix(angle) case angle when 0; return [1,0,0,1] when 90; return [0,1,-1,0] when 180; return [0,-1,1,0] when 270; return [-1,0,0,-1] end return [cos(deg_to_rad(angle)),-sin(deg_to_rad(angle)), sin(deg_to_rad(angle)),cos(deg_to_rad(angle))] end def self.matrix_multiply_2x2_1x2(std,vec) return [std[0] * vec[0] + std[1] * vec[1], std[2] * vec[0] + std[3] * vec[1]] end def self.transpose_matrix_2x2(mat) return [mat[0],mat[2],mat[1],mat[3]] end end class Bitmap def get_rotated_bitmap(angle) mat = Math.get_rotation_matrix(angle) arr = get_rotated_size(mat) bmp = Bitmap.new(arr[0],arr[1]) old_ox = (self.width / 2).round.to_i old_oy = (self.width / 2).round.to_i new_ox = (arr[0] / 2).round.to_i new_oy = (arr[1] / 2).round.to_i #Reverse Mapping mat = Math.transpose_matrix_2x2(mat) arr[0].times{|i| arr[1].times{|j| vec = m_mult(mat,[i - new_ox,j - new_oy]) c = self.get_pixel((vec[0] + old_ox).round,(vec[1] + old_oy).round) bmp.set_pixel(i,j, c) } } return bmp end def get_rotated_size(mat) arr = [m_mult(mat,[0,0]),m_mult(mat,[self.width,0]), m_mult(mat,[0,self.height]),m_mult(mat,[self.width,self.height])] ax = [arr[0][0], arr[1][0], arr[2][0], arr[3][0]] ay = [arr[0][1], arr[1][1], arr[2][1], arr[3][1]] return [(ax.max - ax.min).round.to_i.abs, (ay.max - ay.min).round.to_i.abs] end def m_mult(std,vec); Math.matrix_multiply_2x2_1x2(std,vec) end end
#Simple Bitmap Rotation by RaidenInfinity
module Math
def self.deg_to_rad(x)
return x * (Math::PI / 180.0)
end
def self.get_rotation_matrix(angle)
case angle
when 0; return [1,0,0,1]
when 90; return [0,1,-1,0]
when 180; return [0,-1,1,0]
when 270; return [-1,0,0,-1]
end
return [cos(deg_to_rad(angle)),-sin(deg_to_rad(angle)),
sin(deg_to_rad(angle)),cos(deg_to_rad(angle))]
end
def self.matrix_multiply_2x2_1x2(std,vec)
return [std[0] * vec[0] + std[1] * vec[1],
std[2] * vec[0] + std[3] * vec[1]]
end
def self.transpose_matrix_2x2(mat)
return [mat[0],mat[2],mat[1],mat[3]]
end
end
class Bitmap
def get_rotated_bitmap(angle)
mat = Math.get_rotation_matrix(angle)
arr = get_rotated_size(mat)
bmp = Bitmap.new(arr[0],arr[1])
old_ox = (self.width / 2).round.to_i
old_oy = (self.width / 2).round.to_i
new_ox = (arr[0] / 2).round.to_i
new_oy = (arr[1] / 2).round.to_i
#Reverse Mapping
mat = Math.transpose_matrix_2x2(mat)
arr[0].times{|i|
arr[1].times{|j|
vec = m_mult(mat,[i - new_ox,j - new_oy])
c = self.get_pixel((vec[0] + old_ox).round,(vec[1] + old_oy).round)
bmp.set_pixel(i,j, c)
}
}
return bmp
end
def get_rotated_size(mat)
arr = [m_mult(mat,[0,0]),m_mult(mat,[self.width,0]),
m_mult(mat,[0,self.height]),m_mult(mat,[self.width,self.height])]
ax = [arr[0][0], arr[1][0], arr[2][0], arr[3][0]]
ay = [arr[0][1], arr[1][1], arr[2][1], arr[3][1]]
return [(ax.max - ax.min).round.to_i.abs, (ay.max - ay.min).round.to_i.abs]
end
def m_mult(std,vec); Math.matrix_multiply_2x2_1x2(std,vec) end
end
尝试写了一个也许比较快的版本。32x32的位图从0到359度,耗时大概2.5秒上下(我的主机核是Pentium E5200 2.50GHz)
测试运行代码:
a = Bitmap.new(32,32) a.fill_rect(0,0,32,32,Color.new(255,0,0,255)) list = [] z = Time.now 360.times{|i| #p i list.push(a.get_rotated_bitmap(i)) } z -= Time.now p z
a = Bitmap.new(32,32)
a.fill_rect(0,0,32,32,Color.new(255,0,0,255))
list = []
z = Time.now
360.times{|i|
#p i
list.push(a.get_rotated_bitmap(i))
}
z -= Time.now
p z
也许你能参考来优化,或者在比较强的电脑上也许运行速度会更快。
这段脚本的主要优化原理是使用矩阵,避免每个像素都调用三角函数。
|
评分
-
查看全部评分
|