ActionScript從入門到高手教程全集(七)幾何相關的類
ActionScript從入門到高手教程全集(七)幾何相關的類
flash.geom 包中包含用于定義幾何對象 (如,點、矩形和轉換矩陣)的類。您可使用這些
類來定義在其它類中使用的對象的屬性。
學習目錄
幾何學基礎知識
使用 Point 對象
使用 Rectangle對象
使用 Matrix對象
例如:將矩陣轉換用于顯示對象
很多人都可能會在學校努力學習幾何學這門學科,過后又幾乎忘干凈了。
但就算只了解一點這方面的知識,也可能會在ActionScript中派上大用場。
flash.geom 包中包含用于定義幾何對象 (如,點、矩形和轉換矩陣)的類。
所有幾何類都基于以下概念:將屏幕上的位置表示為二維平面。
可以將屏幕看作是具有水平(x) 軸和垂直 (y) 軸的平面圖形。
屏幕上的任何位置 (或 “點”)可以表示為 x 和 y 值對,即該位置的 “坐標” 。
每個顯示對象(包括舞臺)具有其自己的“坐標空間”;實質上,這是其用于標繪子顯示對
象、圖畫等位置的圖形。通常,“原點” (x 和 y 軸相交的位置,其坐標為 0, 0)位于顯示
對象的左上角。
使用 Point 對象 Point 對象定義一對笛卡爾坐標。它表示二維坐標系中的某個位置。其中 表示水平軸, 表示垂直軸。
要定義 Point 對象,請設置它的 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;
確定兩點之間的距離
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);
平移坐標空間
如果兩個顯示對象位于不同的顯示對象容器中,則它們可能位于不同的坐標空間。您可以使
用 DisplayObject 類的 localToGlobal() 方法將坐標平移到舞臺中相同 (全局)坐標空間。
例如,下面的代碼確定不同顯示對象容器中兩個顯示對象(circle1 和 circle2)的注冊點
之間的距離:
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 的顯示對象的注冊點與舞臺上特定點之間的距離,您可以使用
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 對象定義一個矩形區域。 Rectangle 對象有一個位置,該位置由其左上角的 x 和
y 坐標以及 width 屬性和 height 屬性定義。www.c6799.com通過調用 Rectangle() 構造函數可以定義新
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);
調整 Rectangle 對象的大小和進行重新定位
更改 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 屬性匹配。學生范文網。但是,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.left = 20;
rect1.top = 30;
trace(rect1); // (x=30, y=20, w=70, h=30)
同樣,如下面的示例所示,如果更改 Rectangle 對象的 bottom 或 right 屬性,該對象的左
上角位置不發生更改,所以相應地調整了對象的大小。
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 對象作為參數,而不是將 和 偏移
量值作為參數。
還可以使用 inflate() 方法調整 Rectangle 對象的大小,該方法包含兩個參數,dx 和 dy。
dx 參數表示矩形的左邊和右邊距中心的像素數,而 dy 參數表示矩形的頂邊和底邊距中心的
像素數:
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 對象作為參數,而不是將dx和dy的值
作為參數。
確定 Rectangle 對象的聯合和交集
可以使用 union() 方法來確定由兩個矩形的邊界形成的矩形區域:
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() 方法來確定由兩個矩形重疊區域形成的矩形區域:
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() 方法來包括顯示對象筆觸可添加到邊界區域中的其它任何
空間。
Matrix 對象 Matrix 類表示一個轉換矩陣,它確定如何將點從一個坐標空間映射到另一個坐標空間。可以
對顯示對象執行不同的圖形轉換,方法是設置 Matrix 對象的屬性,將該 Matrix 對象應用于
Tr a ns f orm 對象的 matrix 屬性,然后應用該 Tr ans f o rm 對象作為顯示對象的 transform 屬
性。這些轉換函數包括平移 ( 和 重新定位) 、旋轉、縮放和傾斜。
Matrix 對象
雖然可以通過直接調整 Matrix 對象的屬性(a、b、c、d、tx 和 ty)來定義矩陣,但更簡
單的方法是使用 createBox() 方法。使用此方法提供的參數可以直接定義生成的矩陣的縮
放、旋轉和平移效果。例如,下面的代碼創建一個 Matrix 對象,具有效果是水平縮放 2.0、
垂直縮放 3.0、旋轉 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() 方法調整 Matrix 對象的縮放、旋轉和平
移效果。請注意,這些方法合并了現有 Matrix 對象的值。例如,下面的代碼調用兩次
scale() 和 rotate() 方法以對 Matrix 對象進行設置,它將對象放大 4 倍并旋轉 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;
要將傾斜轉換應用到 Matrix 對象,請調整該對象的 b 或 c 屬性。調整 b 屬性將矩陣垂直傾
斜,并調整 c 屬性將矩陣水平傾斜。以下代碼使用系數 2 垂直傾斜 myMatrix Matrix 對象:
var skewMatrix:Matrix = new Matrix();
skewMatrix.b = Math.tan(2);
myMatrix.concat(skewMatrix);
可以將矩陣轉換應用到顯示對象的. transform 屬性。例如,以下代碼將矩陣轉換應用于名為
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 對象設置為 myDisplayObject 顯示對象所使用的現有轉換矩陣
(myDisplayObject 顯示對象的 transformation 屬性的 matrix 屬性)。這樣,調用的
Matrix 類方法將對顯示對象的現有位置、縮放和旋轉產生累積影響。
定義 MatrixTransformer 類
MatrixTransformer 類包含應用 Matrix 對象的幾何變形的靜態方法。
transform() 方法
transform() 方法包含以下屬性的參數:
■ sourceMatrix — 此方法轉換的輸入矩陣
■ xScale 和 yScale — 和 縮放系數
■ dx 和 dy — 和 平移量 (以像素為單位)
■ rotation — 旋轉量(以度為單位)
■ skew — 傾斜系數 (以百分比表示)
■ skewType — 傾斜的方向,"right" 或 "left"
返回值為生成的矩陣。
transform() 方法調用下列類的靜態方法:
■ skew()
■ scale()
■ translate()
■ rotate()
每種方法都返回應用了轉換的源矩陣。
skew() 方法
skew() 方法通過調整矩陣的 b 和 c 屬性來傾斜矩陣。可選參數 unit 確定用于定義傾斜角度
的單位,如果必要,該方法會將 angle 值轉換為弧度:
if (unit == "degrees")
{
angle = Math.PI * 2 * angle / 360;
}
if (unit == "gradients")
{
angle = Math.PI * 2 * angle / 100;
}
scale() 方法
如下面的示例所示,如果提供的縮放系數為百分比,則 scale() 方法將首先調整縮放系數,
然后使用矩陣對象的 scale() 方法:
if (percent)
{
xScale = xScale / 100;
yScale = yScale / 100;
}
sourceMatrix.scale(xScale, yScale);
return sourceMatrix;
translate() 方法只需通過調用矩陣對象的 translate() 方法即可應用 dx 和 dy 平移系
數,如下所示:
sourceMatrix.translate(dx, dy) ;
返回 sourceMatrix;
rotate() 方法
rotate() 方法將輸入的旋轉系數轉換為弧度(如果提供的是角度或漸變) ,然后調用矩陣對
象的 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從入門到高手教程全集(七)幾何相關的類】相關文章:
1.ActionScript從入門到高手教程全集(六) 事件處理
2.ActionScript從入門到高手教程全集(四)錯誤處理
3.ActionScript從入門到高手教程全集(三)字符串的處理
4.ActionScript3.0從入門到高手教程全集(二)日期和定時器的處理