生活随笔
收集整理的這篇文章主要介紹了
Java AffineTransform入门
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這里我們要用java 2-D來進(jìn)行坐標(biāo)空間中的變換。看到這里貌似要去復(fù)習(xí)線性代數(shù)了(嗚嗚)。
這里主要講的是仿射變換的入門,我們這一次主要是要嘗試用實(shí)例證明:仿射變換的順序是不可逆的。
我們將要看到的程序?qū)崿F(xiàn)了兩種情況,一種是先平移,再旋轉(zhuǎn);另一種是先旋轉(zhuǎn),在平移。為了能更好的理解程序,首先得了解一些基本內(nèi)容。
AffineTransform,即仿射變換。那么什么是仿射變換呢?幾何中,一個(gè)向量空間進(jìn)行一次線性變換并接上一個(gè)平移,這么一個(gè)過程就稱為仿射變換或放射映射。
可以簡單地表示為:y = Ax + b?,其中有下標(biāo)的字母表示向量,而粗體的字母A表示一個(gè)矩陣。
如果暫時(shí)無法理解也沒有關(guān)系(我也沒理解 ^_^#),沒關(guān)系,我們這里僅使用了它的幾個(gè)特例:平移和旋轉(zhuǎn)變換。
按照慣例,下面先把整個(gè)代碼貼出來:
[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();??????}????}?? 嗯,下面我們一步一步來看程序是怎樣實(shí)現(xiàn)的。
一開始,我們定義了一個(gè)CheckboxGroup,它可以看作是用來存儲(chǔ)Checkbox的一個(gè)容器。然后我們又定義了兩個(gè)Checkbox用來選擇是先旋轉(zhuǎn)呢,還是先平移呢。成員變量中還有一個(gè)Rectangle2D,用來作為變換的基準(zhǔn)。
接下來,我們?cè)趇nit函數(shù)中將Checkbox定義好,然后再將CheckboxGroup填滿,最后初始化了Rectangle2D的大小。
在重寫paint函數(shù)的時(shí)候,我們利用AffineTransform作[0, 2pi]的旋轉(zhuǎn)變換以及平移變換。我們通過Checkbox的選擇來判斷這兩個(gè)操作的先后順序。
程序的結(jié)果如下所示:
? ? ? ? ??
對(duì)比可知,仿射變換的順序是不能隨便交換的。好吧,下次學(xué)習(xí)更多的java-2D的內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的Java AffineTransform入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。