ActionScript从入门到高手教程全集(七)几何相关的类

时间:2013-08-22 12:55:19 ActionScript 我要投稿

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.sundxs.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从入门到高手教程全集(二)日期和定时器的处理

5.Flash显示编程-ActionScript从入门到精通教程(六)

6.Flash ActionScript3.0入门教程全集

7.Flash ActionScript3.0高级教程全集

8.学做西餐从入门到精通的教程