ActionScript從入門到高手教程全集(七)幾何相關(guān)的類
ActionScript從入門到高手教程全集(七)幾何相關(guān)的類
flash.geom 包中包含用于定義幾何對象 (如,點(diǎn)、矩形和轉(zhuǎn)換矩陣)的類。您可使用這些
類來定義在其它類中使用的對象的屬性。
學(xué)習(xí)目錄
幾何學(xué)基礎(chǔ)知識
使用 Point 對象
使用 Rectangle對象
使用 Matrix對象
例如:將矩陣轉(zhuǎn)換用于顯示對象
很多人都可能會在學(xué)校努力學(xué)習(xí)幾何學(xué)這門學(xué)科,過后又幾乎忘干凈了。
但就算只了解一點(diǎn)這方面的知識,也可能會在ActionScript中派上大用場。
flash.geom 包中包含用于定義幾何對象 (如,點(diǎn)、矩形和轉(zhuǎn)換矩陣)的類。
所有幾何類都基于以下概念:將屏幕上的位置表示為二維平面。
可以將屏幕看作是具有水平(x) 軸和垂直 (y) 軸的平面圖形。
屏幕上的任何位置 (或 “點(diǎn)”)可以表示為 x 和 y 值對,即該位置的 “坐標(biāo)” 。
每個顯示對象(包括舞臺)具有其自己的“坐標(biāo)空間”;實(shí)質(zhì)上,這是其用于標(biāo)繪子顯示對
象、圖畫等位置的圖形。通常,“原點(diǎn)” (x 和 y 軸相交的位置,其坐標(biāo)為 0, 0)位于顯示
對象的左上角。
使用 Point 對象 Point 對象定義一對笛卡爾坐標(biāo)。它表示二維坐標(biāo)系中的某個位置。其中 表示水平軸, 表示垂直軸。
要定義 Point 對象,請?jiān)O(shè)置它的 x 和 y 屬性,如下所示:
import flash.geom.*;
var pt1:Point = new Point(10, 20); // x == 10; y == 20
var pt2:Point = new Point();
pt2.x = 10;
pt2.y = 20;
確定兩點(diǎn)之間的距離
import flash.geom.*;
var pt1:Point = new Point(circle1.x, circle1.y);
var pt2:Point = new Point(circle2.x, circle2.y);
var distance:Number = Point.distance(pt1, pt2);
平移坐標(biāo)空間
如果兩個顯示對象位于不同的顯示對象容器中,則它們可能位于不同的坐標(biāo)空間。您可以使
用 DisplayObject 類的 localToGlobal() 方法將坐標(biāo)平移到舞臺中相同 (全局)坐標(biāo)空間。
例如,下面的代碼確定不同顯示對象容器中兩個顯示對象(circle1 和 circle2)的注冊點(diǎn)
之間的距離:
import flash.geom.*;
var pt1:Point = new Point(circle1.x, circle1.y);
pt1 = circle1.localToGlobal(pt1);
var pt2:Point = new Point(circle1.x, circle1.y);
pt2 = circle2.localToGlobal(pt2);
var distance:Number = Point.distance(pt1, pt2);
同樣,要確定名為 target 的顯示對象的注冊點(diǎn)與舞臺上特定點(diǎn)之間的距離,您可以使用
DisplayObject 類的 localToGlobal() 方法:
import flash.geom.*;
var stageCenter:Point = new Point();
stageCenter.x = this.stage.stageWidth / 2;
stageCenter.y = this.stage.stageHeight / 2;
var targetCenter:Point = new Point(target.x, target.y);
targetCenter = target.localToGlobal(targetCenter);
var distance:Number = Point.distance(stageCenter, targetCenter);
按指定的角度和距離移動顯示對象
您可以使用 Point 類的 polar() 方法將顯示對象按特定角度移動特定距離。例如,下列代碼
按 60 度將 myDisplayObject 對象移動 100 個像素:
import flash.geom.*;
var distance:Number = 100;
var angle:Number = 2 * Math.PI * (90 / 360);
var translatePoint:Point = Point.polar(distance, angle);
myDisplayObject.x += translatePoint.x;
myDisplayObject.y += translatePoint.y;
Rectangle 對象 Rectangle 對象定義一個矩形區(qū)域。 Rectangle 對象有一個位置,該位置由其左上角的 x 和
y 坐標(biāo)以及 width 屬性和 height 屬性定義。www.zjpiwd.com通過調(diào)用 Rectangle() 構(gòu)造函數(shù)可以定義新
Rectangle 對象的這些屬性,如下所示:
import flash.geom.Rectangle;
var rx:Number = 0;
var ry:Number = 0;
var rwidth:Number = 100;
var rheight:Number = 50;
var rect1:Rectangle = new Rectangle(rx, ry, rwidth, rheight);
調(diào)整 Rectangle 對象的大小和進(jìn)行重新定位
更改 Rectangle 對象的 x 和 y 屬性直接重新定位該對象
import flash.geom.Rectangle;
var x1:Number = 0;
var y1:Number = 0;
var width1:Number = 100;
var height1:Number = 50;
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);
trace(rect1) // (x=0, y=0, w=100, h=50)
rect1.x = 20;
rect1.y = 30;
trace(rect1); // (x=20, y=30, w=100, h=50)
如以下代碼所示,如果更改 Rectangle 對象的 left 或 top 屬性,也可以重新定位,并且該
對象的 x 和 y 屬性分別與 left 和 top 屬性匹配。學(xué)生范文網(wǎng)。但是,Rectangle 對象的左下角位置不發(fā)
生更改,所以調(diào)整了對象的大小。
import flash.geom.Rectangle;
var x1:Number = 0;
var y1:Number = 0;
var width1:Number = 100;
var height1:Number = 50;
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);
trace(rect1) // (x=0, y=0, w=100, h=50)
rect1.left = 20;
rect1.top = 30;
trace(rect1); // (x=30, y=20, w=70, h=30)
同樣,如下面的示例所示,如果更改 Rectangle 對象的 bottom 或 right 屬性,該對象的左
上角位置不發(fā)生更改,所以相應(yīng)地調(diào)整了對象的大小。
import flash.geom.Rectangle;
var x1:Number = 0;
var y1:Number = 0;
var width1:Number = 100;
var height1:Number = 50;
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);
trace(rect1) // (x=0, y=0, w=100, h=50)
rect1.right = 60;
trect1.bottom = 20;
trace(rect1); // (x=0, y=0, w=60, h=20)
也可以使用 offset() 方法重新定位 Rectangle 對象,如下所示:
import flash.geom.Rectangle;
var x1:Number = 0;
var y1:Number = 0;
var width1:Number = 100;
var height1:Number = 50;
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);
trace(rect1) // (x=0, y=0, w=100, h=50)
rect1.offset(20, 30);
trace(rect1); // (x=20, y=30, w=100, h=50)
offsetPt() 方法工作方式類似,只不過它是將 Point 對象作為參數(shù),而不是將 和 偏移
量值作為參數(shù)。
還可以使用 inflate() 方法調(diào)整 Rectangle 對象的大小,該方法包含兩個參數(shù),dx 和 dy。
dx 參數(shù)表示矩形的左邊和右邊距中心的像素?cái)?shù),而 dy 參數(shù)表示矩形的頂邊和底邊距中心的
像素?cái)?shù):
import flash.geom.Rectangle;
var x1:Number = 0;
var y1:Number = 0;
var width1:Number = 100;
var height1:Number = 50;
var rect1:Rectangle = new Rectangle(x1, y1, width1, height1);
trace(rect1) // (x=0, y=0, w=100, h=50)
rect1.inflate(6,4);
trace(rect1); // (x=-6, y=-4, w=112, h=58)
inflatePt() 方法作方式類似,只不過它是將 Point 對象作為參數(shù),而不是將dx和dy的值
作為參數(shù)。
確定 Rectangle 對象的聯(lián)合和交集
可以使用 union() 方法來確定由兩個矩形的邊界形成的矩形區(qū)域:
import flash.display.*;
import flash.geom.Rectangle;
var rect1:Rectangle = new Rectangle(0, 0, 100, 100);
trace(rect1); // (x=0, y=0, w=100, h=100)
var rect2:Rectangle = new Rectangle(120, 60, 100, 100);
trace(rect2); // (x=120, y=60, w=100, h=100)
trace(rect1.union(rect2)); // (x=0, y=0, w=220, h=160)
可以使用 intersection() 方法來確定由兩個矩形重疊區(qū)域形成的矩形區(qū)域:
import flash.display.*;
import flash.geom.Rectangle;
var rect1:Rectangle = new Rectangle(0, 0, 100, 100);
trace(rect1); // (x=0, y=0, w=100, h=100)
var rect2:Rectangle = new Rectangle(80, 60, 100, 100);
trace(rect2); // (x=120, y=60, w=100, h=100)
trace(rect1.intersection(rect2)); // (x=80, y=60, w=20, h=40)
同樣,可以使用 intersects() 方法查明兩個顯示對象的邊界矩形是否重疊。可以使用
DisplayObject 類的 getRect() 方法來包括顯示對象筆觸可添加到邊界區(qū)域中的其它任何
空間。
Matrix 對象 Matrix 類表示一個轉(zhuǎn)換矩陣,它確定如何將點(diǎn)從一個坐標(biāo)空間映射到另一個坐標(biāo)空間?梢
對顯示對象執(zhí)行不同的圖形轉(zhuǎn)換,方法是設(shè)置 Matrix 對象的屬性,將該 Matrix 對象應(yīng)用于
Tr a ns f orm 對象的 matrix 屬性,然后應(yīng)用該 Tr ans f o rm 對象作為顯示對象的 transform 屬
性。這些轉(zhuǎn)換函數(shù)包括平移 ( 和 重新定位) 、旋轉(zhuǎn)、縮放和傾斜。
Matrix 對象
雖然可以通過直接調(diào)整 Matrix 對象的屬性(a、b、c、d、tx 和 ty)來定義矩陣,但更簡
單的方法是使用 createBox() 方法。使用此方法提供的參數(shù)可以直接定義生成的矩陣的縮
放、旋轉(zhuǎn)和平移效果。例如,下面的代碼創(chuàng)建一個 Matrix 對象,具有效果是水平縮放 2.0、
垂直縮放 3.0、旋轉(zhuǎn) 45 度、向右移動(平移) 10 個像素并向下移動 20 個像素:
var matrix:Matrix = new Matrix();
var scaleX:Number = 2.0;
var scaleY:Number = 3.0;
var rotation:Number = 2 * Math.PI * (45 / 360);
var tx:Number = 10;
var ty:Number = 20;
matrix.createBox(scaleX, scaleY, rotation, tx, ty);
還可以使用 scale()、rotate() 和 translate() 方法調(diào)整 Matrix 對象的縮放、旋轉(zhuǎn)和平
移效果。請注意,這些方法合并了現(xiàn)有 Matrix 對象的值。例如,下面的代碼調(diào)用兩次
scale() 和 rotate() 方法以對 Matrix 對象進(jìn)行設(shè)置,它將對象放大 4 倍并旋轉(zhuǎn) 60 度:
var matrix:Matrix = new Matrix();
var rotation:Number = 2 * Math.PI * (30 / 360); // 30°
var scaleFactor:Number = 2;
matrix.scale(scaleFactor, scaleFactor);
matrix.rotate(rotation);
matrix.scale(scaleX, scaleY);
matrix.rotate(rotation);
myDisplayObject.transform.matrix = matrix;
要將傾斜轉(zhuǎn)換應(yīng)用到 Matrix 對象,請調(diào)整該對象的 b 或 c 屬性。調(diào)整 b 屬性將矩陣垂直傾
斜,并調(diào)整 c 屬性將矩陣水平傾斜。以下代碼使用系數(shù) 2 垂直傾斜 myMatrix Matrix 對象:
var skewMatrix:Matrix = new Matrix();
skewMatrix.b = Math.tan(2);
myMatrix.concat(skewMatrix);
可以將矩陣轉(zhuǎn)換應(yīng)用到顯示對象的. transform 屬性。例如,以下代碼將矩陣轉(zhuǎn)換應(yīng)用于名為
myDisplayObject 的顯示對象:
var matrix:Matrix = myDisplayObject.transform.matrix;
var scaleFactor:Number = 2;
var rotation:Number = 2 * Math.PI * (60 / 360); // 60°
matrix.scale(scaleFactor, scaleFactor);
matrix.rotate(rotation);
myDisplayObject.transform.matrix = matrix;
第一行將 Matrix 對象設(shè)置為 myDisplayObject 顯示對象所使用的現(xiàn)有轉(zhuǎn)換矩陣
(myDisplayObject 顯示對象的 transformation 屬性的 matrix 屬性)。這樣,調(diào)用的
Matrix 類方法將對顯示對象的現(xiàn)有位置、縮放和旋轉(zhuǎn)產(chǎn)生累積影響。
定義 MatrixTransformer 類
MatrixTransformer 類包含應(yīng)用 Matrix 對象的幾何變形的靜態(tài)方法。
transform() 方法
transform() 方法包含以下屬性的參數(shù):
■ sourceMatrix — 此方法轉(zhuǎn)換的輸入矩陣
■ xScale 和 yScale — 和 縮放系數(shù)
■ dx 和 dy — 和 平移量 (以像素為單位)
■ rotation — 旋轉(zhuǎn)量(以度為單位)
■ skew — 傾斜系數(shù) (以百分比表示)
■ skewType — 傾斜的方向,"right" 或 "left"
返回值為生成的矩陣。
transform() 方法調(diào)用下列類的靜態(tài)方法:
■ skew()
■ scale()
■ translate()
■ rotate()
每種方法都返回應(yīng)用了轉(zhuǎn)換的源矩陣。
skew() 方法
skew() 方法通過調(diào)整矩陣的 b 和 c 屬性來傾斜矩陣?蛇x參數(shù) unit 確定用于定義傾斜角度
的單位,如果必要,該方法會將 angle 值轉(zhuǎn)換為弧度:
if (unit == "degrees")
{
angle = Math.PI * 2 * angle / 360;
}
if (unit == "gradients")
{
angle = Math.PI * 2 * angle / 100;
}
scale() 方法
如下面的示例所示,如果提供的縮放系數(shù)為百分比,則 scale() 方法將首先調(diào)整縮放系數(shù),
然后使用矩陣對象的 scale() 方法:
if (percent)
{
xScale = xScale / 100;
yScale = yScale / 100;
}
sourceMatrix.scale(xScale, yScale);
return sourceMatrix;
translate() 方法只需通過調(diào)用矩陣對象的 translate() 方法即可應(yīng)用 dx 和 dy 平移系
數(shù),如下所示:
sourceMatrix.translate(dx, dy) ;
返回 sourceMatrix;
rotate() 方法
rotate() 方法將輸入的旋轉(zhuǎn)系數(shù)轉(zhuǎn)換為弧度(如果提供的是角度或漸變) ,然后調(diào)用矩陣對
象的 rotate() 方法:
if (unit == "degrees")
{
angle = Math.PI * 2 * angle / 360;
}
if (unit == "gradients")
{
angle = Math.PI * 2 * angle / 100;
}
sourceMatrix.rotate(angle);
return sourceMatrix;
【ActionScript從入門到高手教程全集(七)幾何相關(guān)的類】相關(guān)文章:
1.ActionScript從入門到高手教程全集(六) 事件處理
2.ActionScript從入門到高手教程全集(四)錯誤處理
3.ActionScript從入門到高手教程全集(三)字符串的處理
4.ActionScript3.0從入門到高手教程全集(二)日期和定時器的處理