生活随笔
收集整理的這篇文章主要介紹了
Java AffineTransform入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里我們要用java 2-D來進行坐標空間中的變換。看到這里貌似要去復習線性代數了(嗚嗚)。
這里主要講的是仿射變換的入門,我們這一次主要是要嘗試用實例證明:仿射變換的順序是不可逆的。
我們將要看到的程序實現了兩種情況,一種是先平移,再旋轉;另一種是先旋轉,在平移。為了能更好的理解程序,首先得了解一些基本內容。
AffineTransform,即仿射變換。那么什么是仿射變換呢?幾何中,一個向量空間進行一次線性變換并接上一個平移,這么一個過程就稱為仿射變換或放射映射。
可以簡單地表示為:y = Ax + b?,其中有下標的字母表示向量,而粗體的字母A表示一個矩陣。
如果暫時無法理解也沒有關系(我也沒理解 ^_^#),沒關系,我們這里僅使用了它的幾個特例:平移和旋轉變換。
按照慣例,下面先把整個代碼貼出來:
[java] view plaincopy
import?java.applet.Applet;??import?java.awt.BorderLayout;??import?java.awt.Checkbox;??import?java.awt.CheckboxGroup;??import?java.awt.Color;??import?java.awt.Graphics;??import?java.awt.Graphics2D;??import?java.awt.Panel;??import?java.awt.event.ItemEvent;??import?java.awt.event.ItemListener;??import?java.awt.geom.AffineTransform;??import?java.awt.geom.Rectangle2D;??import?java.util.Random;??????public?class?AffineTest?extends?Applet?implements?ItemListener{????????private?Rectangle2D?rect;????????????private?Checkbox?rotateFirst;??????private?Checkbox?translateFirst;????????????public?void?init()??????{??????????setLayout(new?BorderLayout());??????????CheckboxGroup?cbg?=?new?CheckboxGroup();??????????Panel?p?=?new?Panel();??????????rotateFirst?=?new?Checkbox("rotate,?translate",?cbg,?true);??????????rotateFirst.addItemListener(this);??????????p.add(rotateFirst);??????????translateFirst?=?new?Checkbox("translate,?rotate",?cbg,?false);??????????translateFirst.addItemListener(this);??????????p.add(translateFirst);??????????add(p,?BorderLayout.SOUTH);??????????rect?=?new?Rectangle2D.Float(-0.5f,?-0.5f,?1.0f,?1.0f);??????}????????????public?void?paint(Graphics?g)??????{??????????Graphics2D?g2d?=?(Graphics2D)g;??????????final?AffineTransform?identify?=?new?AffineTransform();??????????boolean?rotate?=?rotateFirst.getState();??????????Random?r?=?new?Random();??????????final?double?oneRadian?=?Math.toRadians(1.0);??????????for(double?radians?=?0.0;?radians?<?2.0*Math.PI?;?radians?+=?oneRadian)??????????{??????????????g2d.setTransform(identify);??????????????if(rotate)??????????????{??????????????????g2d.translate(100,?100);??????????????????g2d.rotate(radians);??????????????}??????????????else??????????????{??????????????????g2d.rotate(radians);??????????????????g2d.translate(100,?100);??????????????}??????????????g2d.scale(100,?100);??????????????g2d.setColor(new?Color(r.nextInt()));??????????????g2d.fill(rect);??????????}??????}????????????@Override??????public?void?itemStateChanged(ItemEvent?arg0)?{????????????????????repaint();??????}????}?? 嗯,下面我們一步一步來看程序是怎樣實現的。
一開始,我們定義了一個CheckboxGroup,它可以看作是用來存儲Checkbox的一個容器。然后我們又定義了兩個Checkbox用來選擇是先旋轉呢,還是先平移呢。成員變量中還有一個Rectangle2D,用來作為變換的基準。
接下來,我們在init函數中將Checkbox定義好,然后再將CheckboxGroup填滿,最后初始化了Rectangle2D的大小。
在重寫paint函數的時候,我們利用AffineTransform作[0, 2pi]的旋轉變換以及平移變換。我們通過Checkbox的選擇來判斷這兩個操作的先后順序。
程序的結果如下所示:
? ? ? ? ??
對比可知,仿射變換的順序是不能隨便交換的。好吧,下次學習更多的java-2D的內容。
總結
以上是生活随笔為你收集整理的Java AffineTransform入门的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。