国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在J2ME/MIDP中實現圖像旋轉(二)

2019-11-18 16:18:01
字體:
來源:轉載
供稿:網友

  3、旋轉失真問題

  因為旋轉公式含有三角函數,所以求出的旋轉坐標取整后有可能插入到先前已插入的位置中,而沒有插入到它本應該插入的位置。例如:計算出旋轉坐標(3.1,4)取整后插入到(3,4)中;如果計算下個旋轉坐標為(3.4,4),取整后又被插入到(3,4)中,因此覆蓋了原來的像素點,而且(3.4,4)對應的像素點沒有辦法插入到它應該插入的位置,造成失真。

  要解決這個問題,在不考慮犧牲額外資源的情況下,一般的方法是先將圖像放大若干倍,然后再進行旋轉,再等比例縮小。對于邊界可考慮馬賽克的處理方式或者用兩行重描補償誤差的辦法。

  算法的應用與局限性

  1、模擬浮點運算

  上述算法是基于cldc1.1規范的,該規范提供了對浮點運算和三角函數運算的直接支持。為提高程序的通用性,我們希望算法能運行在cldc1.0設備上。

  cldc1.0不支持任何非整形的數值,要實現三角函數的計算,我們可以考慮用已有的整型數來模擬浮點數:把一個整數分成兩個域,分別存放浮點的整數和小數部分,這并不難,但要模擬通用的數學函數,如正弦、余弦、二次方根、指數運算等就不那么容易了,需要花費不少時間。由于一些現有的庫已經能夠很好地完成這些工作,一般情況下,我們可以直接拿來用。

  這里我們選用Onne Hommes編寫的MathFP庫,該庫提供了基于整形int和長整形long的不同精度的實現,有簡單、健壯、速度快的特點。看下面使用該庫的示例代碼:

  int xFP = MathFP.toFP(“0.10”);

  int yFP = MathFP.toFP(“0.2”);

  int zFP = MathFP.mul(xFP , yFP);

  System.out.PRintln( MathFP.toString( zFP ) ); //0.02

  前兩行構造了兩個定點數0.10和0.2,第三行計算他們的乘積,并根據這個值構造定點數zFP,最后一行把zFP的值輸出。

  這些定點值xFP,yFP,zFP不是真正意義上的整型值,雖然它們用整型值來存儲數據。使用這些定點值時必須調用相應的MathFP方法。

  別的可以選用的浮點運算庫有JMFP、FPLib、shiftFP等。

  2、使用預置的三角函數表

  三角函數的計算一般比較慢,為提高運行速度,我們可以對數值進行預計算,比如提前計算出360?以內角度的正弦和余弦值,把結果存儲在一個靜態數組中,如下面代碼。

  static int[] lookupCosFP = new int[360];

  static int[] lookupSinFP = new int[360];

  long radianFP ; //用于存放角度的弧度值

  for(int i = 0; i<360; i++ ) {

  //將角度轉化為弧度,使用MathFP庫

  radianFP=MathFP.div(MathFP.mul(MathFP.toFP(i),MathFP.PI),MathFP.toFP(180)) ;

  lookupCosFP = MathFP.cos(radianFP); //存入數組

  lookupSinFP = MathFP.sin(radianFP);

  }

  這樣使用時,從數組中直接值就行了。事實上,根據三角函數的特點,我們只需預計算存儲0-90度的正弦函數值,便可以導出任意角度的正弦、余弦值。讀者可以編寫一個單獨的方法實現之。 由于移動設備的屏幕通常比較小,做高精度的三角函數運算的意義不大,所以一般采取近似模擬的辦法。(1)對有浮點支持/第三方庫支持的情況,不去存放每個角度的三角函數值,每隔5?存一個值。(2) 對于沒有浮點支持和第三方浮點庫支持的情況,在表中存放角度的三角函數值乘以某個較大數(如4096)取整后的值,在實際計算之后,再等比例縮小(除以4096)。這兩種方法在實際中都有不少應用。

  3、Sprite中的圖像旋轉

  Sprite,即精靈,是在游戲中代表角色的類,它管理所有的圖像幀來實現各種動畫效果,在游戲開發中有著廣泛的應用。如果需要表現動畫效果,那用Sprite是再合適不過的了。MIDP2.0中,提供了專門的這樣一個類,在構造時只需把圖像對象作為參數傳遞。Sprite類自身提供了圖像反射和成90度整數倍旋轉的功能。如果要實現任意角度旋轉,本質上跟上面的Image的旋轉沒有分別,只是在Sprite中內置了精靈的位置等信息,管理起來會更加方便高效。

  讀者可以參考上面Image的實現,方便寫出基于Sprite的旋轉實現。需注意的是,Sprite一次只能取一幀圖像,因此需要首先把該幀從圖像集中提取出來。圖五展示了“淘金者”游戲中,精靈類“鉤子”的逆時針方向0到60?的旋轉效果圖。

  
在J2ME/MIDP中實現圖像旋轉(二)(圖一)


  圖五 鉤子的旋轉效果

  4、局限性

  (1)該算法的使用過程中生成了較大的圖像,比較適合于圖像繞固定點連續旋轉情況。如果實際中圖像只需做一次旋轉,或旋轉點經常變換,這種方法會產生較大的無效區域,增加處理的負擔,此時,旋轉后圖像的大小最好根據旋轉點和角度做最優化計算。

  (2)算法需要獲得圖像的象素信息,這在midp2.0才給予支持,如果要在midp1.0的機器上實現圖像旋轉,須借助于設備廠商專用開發包,如Nokia開發包就提供了DirectUtils類實現類似上面createRGBImage()的功能。當然這只能在相應設備上才能用。

  (3)算法要求設備支持Alpha通道,否則不能正常的表現效果。

  (4)基于該方法的Sprite對象在做碰撞檢測時,須采用象素檢測的方法。

  其余方案

  1、預置圖像

  預置圖像就是把所需要的各個角度的圖像預先存儲起來,然后按需直接調用的方法。這種方法不需要我們在程序中做像素級的操作,所以使用起來較簡單。缺點是當要存儲的圖像類別和角度很大時,會增加不少存儲開銷。

  當所需要的各角度的圖像為偶數個且在0-360?范圍內均勻分布時,借助于MIDP2.0的Sprite類提供的順時針旋轉90?、180?、270?度的功能,我們可以在一定程度上降低這種開銷。比如在坦克大戰游戲中,假如一輛坦克需要一周范圍內均勻分布的12個不同的方向,則需預置12副圖像。借助于該方法,只需要提供三張圖片就夠了(見圖六),當它們分別旋轉90?、180?和270?后就得到了完整的12個方向,節省了3/4的存儲開銷。

  
在J2ME/MIDP中實現圖像旋轉(二)(圖二)


  圖六 預置圖像

  2、使用TinyLine 2D

  這是一個用于高性能圖形繪制的j2me開發包。它面向程序員,定義了一組緊湊的2d圖形對象集,擴展了j2me在移動設備上的圖形表現能力。它提供了基于CLDC 1.0 純java語言的實現,很小巧,整個庫不足35k,能夠很方便地集成到應用程序當中去。需要說明的是,該庫不但支持圖形,對一般意義上的光柵圖像也支持,通過它也能實現旋轉等的操作。

  結論

  J2ME作為移動信息設備上的開發應用程序的開放平臺,獲得了眾多廠商的支持,和越來越廣泛的使用。本文從數學的基礎出發,提出了實現圖像按任意角度旋轉的一種方案并給出了基于J2ME/MIDP平臺的實現,給出了局限性分析,最后引出了實現圖像旋轉的另外兩種參考性方法。其實方法并沒有好劣之分,只有適合不適合之說,在實際應用中,我們應根據具體的需求,選擇最合適的方案。希望本文能給讀者在J2ME開發中需要用到圖像旋轉的功能時提供有益的參考

(出處:http://m.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜黄县| 绥中县| 冀州市| 伊川县| 健康| 彩票| 嘉荫县| 游戏| 和林格尔县| 南召县| 许昌县| 崇阳县| 潮州市| 鹰潭市| 浮梁县| 军事| 祁东县| 盘山县| 临高县| 乌兰浩特市| 泸水县| 盘山县| 舞钢市| 常熟市| 临武县| 黄平县| 安龙县| 盐源县| 甘洛县| 泽州县| 伊金霍洛旗| 崇明县| 沁源县| 方城县| 陕西省| 阳江市| 旺苍县| 泸西县| 富平县| 恩平市| 宁陵县|