赞 | 1 |
VIP | 246 |
好人卡 | 87 |
积分 | 1 |
经验 | 34142 |
最后登录 | 2015-1-15 |
在线时间 | 323 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 55
- 在线时间
- 323 小时
- 注册时间
- 2010-8-21
- 帖子
- 666
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
首先说明:效率很低!非常低!
这个方法可以把图片拉成任意四边形
格式:
位图对象.(坐标, 取值方式, debug)
"坐标"是个数组,格式是: [右上x,右上y,右下x,右下y,左下x,左下y]
(为什么没有左上?因为为了方便,定为 0,0)
取值方式, 这个版本有三个 -1,0,1
分别为: 平均,四舍五入,"真实"(有问题,建议不用) 默认是0
bebug是在处理完成时,报告处理情况,默认是false
在这,我只想看一下效率到底有多低(与RGE的效率...根本没法比...).....请大家测试一下,以方便优化版出来...格式:
测试代码 :XXXXX
CPU 主频 :XXXX
内存 :XXXX
Bebug :XXXXXXXX 把bebug设为true,把弹出来的文字写上。比如:
(以学校的坏机器为例.....)
测试代码:(在标题画面修改)- array = [400,100,600,480,100,400]
- @sprite.bitmap = @sprite.bitmap.quadrilateral(array,1,true)
复制代码 CPU 2.6Ghz(单)
内存 : 480Mb
Debug:
取值方式 : -1 : 162199 p 22.36秒....
0 : 162199 p 7.875秒
1 : 162199 p 31.032秒
效率低原因分析:
浮点运算太多....(没办法,求优化方案....这个算法是根据比例用一次方程解出,下次试试高次方程....)- #==============================================================================
- # ■ Bitmap
- #------------------------------------------------------------------------------
- # 位图类 扩展
- #===============================================================================
- class Bitmap
- #--------------------------------------------------------------------------
- # ● 任意四边变形
- #--------------------------------------------------------------------------
- def quadrilateral(array, int=0, debug=false)
- time_now = Time.now
- xB, yB, xC, yC,xD,yD = array
- xB, yB, xC, yC,xD,yD = xB.to_f, yB.to_f, xC.to_f, yC.to_f,xD.to_f,yD.to_f
- # 为减少计算次数,浪费变量 ======> 我很傻....?
- @yC_B = yC - yB
- @xC_B = xC - xB
- begin
- @k_BC = @yC_B / @xC_B
- rescue
- return print "输入坐标BC线段K值无穷大"
- end
- @xM1_up = yB - @k_BC * xB
- @yC_D = yC - yD
- @xC_D = xC - xD
- @k_DC = @yC_D / @xC_D # 不可能DC直线K值无穷大
- @xM2_up = yD - @k_DC * xD
- @k_B = yB / xB
- @k_d = xD / yD # 倒数
- # 生成新位图
- @_x_ = [0.0, xB, xC, xD]
- @_y_ = [0.0, yB, yC, yD]
- qua_bitmap = Bitmap.new(@_x_.max- @_x_.min, @_y_.max - @_y_.min)
- t = Time.now
- pixel_num = 0
- # 穷举坐标
- for y in @_y_.min.to_i ... @_y_.max.to_i
- for x in @_x_.min.to_i ... @_x_.max.to_i
- if y < @k_B * x or x < @k_d * y or
- y > @k_DC * (x - xD) + yD or
- x > (1 / @k_BC) * (y - yB) + xB
- next
- end
- begin
- new_x, new_y = mapping_qua(x, y)
- case int
- when -1
- color = [get_pixel(new_x.floor, new_y.floor)]
- color << get_pixel(new_x.ceil , new_y.floor)
- color << get_pixel(new_x.floor, new_y.ceil )
- color << get_pixel(new_x.ceil , new_y.ceil )
- r = color.inject(0.0){|a,i|a+i.red}
- g = color.inject(0.0){|a,i|a+i.green}
- b = color.inject(0.0){|a,i|a+i.blue}
- a = color.inject(0.0){|a,i|a+i.alpha}
- qua_bitmap.set_pixel(x, y, Color.new(r/4, g/4, b/4, a/4))
- when 0
- color = get_pixel(new_x+0.5, new_y+0.5)
- qua_bitmap.set_pixel(x, y, color)
- when 1
- color1 = get_pixel(new_x.floor, new_y.floor)
- color2 = get_pixel(new_x.ceil , new_y.floor)
- color3 = get_pixel(new_x.floor, new_y.ceil )
- color4 = get_pixel(new_x.ceil , new_y.ceil )
- # Red
- r=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.floor)**2))*color1.red
- r+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.floor)**2))*color2.red
- r+=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.ceil)**2))*color3.red
- r+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.ceil )**2))*color4.red
- # Green
- g=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.floor)**2))*color1.green
- g+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.floor)**2))*color2.green
- g+=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.ceil)**2))*color3.green
- g+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.ceil )**2))*color4.green
- # Blue
- b=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.floor)**2))*color1.blue
- b+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.floor)**2))*color2.blue
- b+=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.ceil)**2))*color3.blue
- b+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.ceil )**2))*color4.blue
- # Alpha
- a=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.floor)**2))*color1.alpha
- a+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.floor)**2))*color2.alpha
- a+=(Math.sqrt((new_x-new_x.floor)**2+(new_y-new_y.ceil)**2))*color3.alpha
- a+=(Math.sqrt((new_x-new_x.ceil)**2+(new_y-new_y.ceil )**2))*color4.alpha
- qua_bitmap.set_pixel(x, y, Color.new(r/2, g/2, b/2, a/2))
- end
- pixel_num += 1
- rescue
- next
- end
- end
- # 9秒刷新画面...不给力啊
- if Time.now - t > 9
- Graphics.update ; t = Time.now
- end
- end
- print "共计渲染#{pixel_num}个像素\n共计耗时#{Time.now - time_now}秒"if debug
- qua_bitmap
- end
- private # 下列方法私有化
- #--------------------------------------------------------------------------
- # ● 映射坐标
- #--------------------------------------------------------------------------
- def mapping_qua(x, y)
- # 根据平面直线之间的关系,运用初中知识可以推出公式
- x, y = x.to_f, y.to_f
- if y <= @_y_[2] / @_x_[2] * x
- # 右边部分
- xM = @xM1_up / (y/x - @k_BC)
- x = x / xM * self.width
- return x, y * xM / self.width
- else
- # 左边部分
- xM = @xM2_up / (y/x - @k_DC)
- y = x / xM * self.height
- return y * xM / self.height, y
- end
- end
- end
复制代码 |
评分
-
查看全部评分
|