`

用Point类进行矢量计算 actionscript

阅读更多

Point 对象定义一对笛卡尔坐标。它表示二维坐标系中的某个位置。其中 x 表示水平轴,y 表示垂直轴。

要定义 Point 对象,请设置它的 xy 属性,如下所示:

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;

确定两点之间的距离

可以使用 Point 类的 distance() 方法确定坐标空间两点之间的距离。例如,下面的代码确定同一显示对象容器中两个显示对象(circle1 和 circle2)的注册点之间的距离:

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);

平移坐标空间

如 果两个显示对象位于不同的显示对象容器中,则它们可能位于不同的坐标空间。您可以使用 DisplaylocalToGlobal() 方法将坐标平移到舞台中相同(全局)坐标空间。例如,下面的代码确定不同显示对象容器中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;

Point 类的其它用法

您可以将 Point 对象用于以下方法和属性:

方法或属性

说明

DisplayObjectContainer

areInaccessibleObjectsUnderPoint() getObjectsUnderPoint()

用于返回显示对象容器中某个点下的对象的列表。

BitmapData

hitTest()

用于定义 BitmapData 对象中的像素以及要检查点击的点。

BitmapData

applyFilter()

copyChannel()

merge()

paletteMap()

pixelDissolve()

threshold()

用于定义那些定义操作的矩形的位置。

Matrix

deltaTransformPoint()

transformPoint()

用于定义您要对其应用变形的点。

Rectangle

bottomRight

size

topLeft

用于定义这些属性。

--------------------------------------------------------------------------------------------

当 要运算两点距离时,我见不少人都是用最原始的运算方法,其实2.0开始就有了Point类,可以计算两点间距离,除此之外,Point类还可用于计算矢 量,某些看似复杂的计算,用上Point类就会变得简单。当然,要巧用Point类,必需要有矢量的知识。虽然,3.0的Point类和2.0的区别不 大,但我之所以把这帖放在as3讨论区,是因为as3的Point类广泛地被其他类应用。最明显的是globalToLocal和 localToGlobal这两个方法,2.0这两个方法的参数和返回值都是Object,但3.0都变为Point类了,使得Point类的应用更名正 言顺了。

废话少说,言归正转,首先我们看看Point类的属性:
x:Number——该点的水平坐标
y:Number——该点的垂直坐标
length:Number——从(0,0)到此点的线段长度(只读属性)
从length属性我们可以看到,实际上一个Point类的实例是一个以(0,0)为始点,以(x,y)为终点的矢量,因此,我们可以应用Point类进行一些简单的矢量运算。现在我们看看Point类给我们提供什么有用的方法:

distance(pt1:Point, pt2:Point):Number——返回 pt1 和 pt2 之间的距离。这个就是大家傻傻地用Math.sqart()写一长串代码计算出来的两点间距离了。

add(v:Point):Point——将另一个点的坐标添加到此点的坐标以创建一个新点。还记得矢量相加的几何意义吗?

设a、b为矢量,则a+b=c,图中矢量c就是矢量a加矢量b的结果。

这个用来计算合力最方便。我们可以把物体的重心放到(0,0)点上,然后可以利用Point类的add方法简单计算各种力的合力。你可能会提出一个问题:如何把力转换成点的坐标呢?下面这个方法可以帮你解决这个问题。

polar(len:Number, angle:Number):Point——将一对极坐标转换为笛卡尔点坐标。

学 过物理力学的人都知道,力是有大小有方向的矢量,而这个方法正好提供了把力转换成点坐标的方法。len就是力的大小,angle就是力角度。转换后计算合 力,得出合力的坐标点,再读取这点的length属性,就可得到合力的大小,再利用Math.atan2(y,x)计算力的方向。多简单的运算!

offset(dx:Number, dy:Number):void——按指定量偏移 Point 对象。dx 的值将添加到 x 的原始值中以创建新的 x 值。 dy 的值将添加到 y 的原始值中以创建新的 y 值。这个要和add区分开来,因为offset是直接把值加到x、y值上。

subtract(v:Point):Point——从此点的坐标中减去另一个点的坐标以创建一个新点。既然有了加法,当然有减法了。看看矢量的减法意义:

设a、b为矢量,则b-a=c,图中矢量c就是矢量b减去矢量a的结果。

用 这个运算,你可以方便地只用一个Point类实例来记录某两点间的距离和斜率。在某些场合,这个很有用。例如当需要计算和记录某点集合里各点与其他点之间 的关系时,如果分别运算距离和角度,你得用两个一一对应的数组记录,当然也可以用一个多联数组,但绝对比不上用一个Point类实例组成的一维数组简单得 多,如果要对这些结果进行比较或者有下一步运算时,用这种方法更显优势。

interpolate(pt1:Point, pt2:Point, f:Number):Point——确定两个指定点之间的点。参数 f 确定新的内插点相对于参数 pt1 和 pt2 指定的两个端点所处的位置。参数 f 的值越接近 1.0,则内插点就越接近第一个点(参数 pt1)。参数 f 的值越接近 0,则内插点就越接近第二个点(参数 pt2)。

这个方法更了不起。因为它能帮我们确定两点之间的一点,只要我们知道这点在线段中位置。实际上f是一个比例值,
f=待定点到pt2的距离/整条线段的长度

这个用来计算一些已知比例关系的点很方便。例如求地图上的某点在实际场景上的点坐标,我们只需选取一段过这点的线段,计算出f,就可以代入实际场景中对应线段,求出对应的点。

normalize(thickness:Number):void——将 (0,0) 和当前点之间的线段缩放为设定的长度。这个实际上就是设置矢量的大小的方法。得到的结果是矢量的大小变为设定值,x、y值改变了,但是矢量的方向不变。

从Point类的属性和方法看,Point类实际上是一个彻头彻尾的矢量类,它几乎包含了所有关于矢量的基本运算。所以,要计算矢量,应优先考虑使用Point类。

PS: 顺带说说globalToLocal和localToGlobal,这两个方法在as3里是DisplayObject的方法,它们可以方便地随意地转换 不同显示对象中的相对坐标,它的参数和返回值都是Point类实例,所以在as3里应用Point类计算点与点间的关系,更具优势。例如mc1中有一点 p1(x1,y1),mc2中有一点p2(x2,y2),如果mc1和mc2的关系很复杂,要求p1到p2的距离,如果不用这两个方法,这个运算就很复 杂,用上它们就简单得多了,所求的距离 d=Point.distance(p2,mc2.globalToLocal(mc1.localToGlobal(p1)));

分享到:
评论

相关推荐

    ActionScript3.0从零基础学习类

    在ActionScript3.0中,更加强调类和对象的使用,鼓励开发者摒弃在组件(如MC和BUTTON)上直接编写代码的习惯,转而使用面向对象的方法编写代码。 ### ActionScript3.0基础概念 1. **包(Package)**:包在...

    ActionScript开发技术大全

    26.1使用外部接口ExternalInterface类 565 26.1.1ExternalInterface类 565 26.1.2ActionScript与JavaScript交互 566 26.1.3ActionScript与桌面程序交互 567 26.2网页脚本交互示例 568 26.3桌面应用交互示例 571 26.4...

    ActionScript

    10. **优化与调试**:了解性能优化技巧,如减少不必要的计算、使用位运算等,以及如何利用ActionScript的内置调试工具,可以帮助开发者提高代码质量和运行效率。 通过深入学习和实践这些ActionScript开发技术,你...

    ActionScript3.0类大全(Word格式)

    15. **ActionScriptVersion 类**:此枚举类表示加载的 SWF 文件使用的 ActionScript 版本,这对于确定代码的兼容性和行为至关重要。 16. **AntiAliasType 类**:定义了 TextField 类中的文本消除锯齿类型,提供不同...

    ActionScript权威指南.pdf

    6. **图形与动画**:ActionScript提供了强大的图形绘制和动画制作功能,如使用Graphics类进行矢量绘图,以及时间轴控制和帧动画。 7. **音频和视频处理**:学习如何在Flash中播放、控制和操作音频和视频资源。 8. ...

    ActionScript2.0字典(CHM)

    4. **图形和动画**:了解如何绘制图形、使用Tween类创建平滑动画,以及如何处理位图和矢量图。 5. **网络通信**:ActionScript 2.0可以实现与服务器的XMLHttpRequest通信,进行数据交换,字典中会包含XML和Socket的...

    ActionScript碰撞检测封装类

    在游戏开发中,碰撞检测是不可或缺的一个重要环节,特别是在使用ActionScript进行开发时。ActionScript是一种基于ECMAScript的脚本语言,常用于Adobe Flash和Adobe AIR应用,尤其是在早期的网页游戏开发中广泛使用。...

    actionscript demo

    6. 动画和图形:AS3提供了丰富的图形和动画功能,如使用Shape和Graphics类绘制矢量图形,以及使用Tween类创建平滑的动画效果。 7. Sound和Video:AS3提供对音频和视频的全面支持,包括播放、控制、处理和合成等操作...

    ActionScript3.0 Tweener类(缓动类)

    Tweener flash缓动类 最初他是一个ActionScript 2.0版本的引擎,后来被移植到ActionScript 3.0,现在两个版本都有。实际上,Tweener至少部分是基于更早的一款ActionScript 1.0引擎MC Tween开发的,它发布于2003年。...

    actionscript 3.0动画制作教程

    4. **使用Timeline Control类**:ActionScript 3.0提供了`TimelineCtrl`类,用于控制时间轴的播放,如播放、暂停、停止、跳转到特定帧等。这些功能对于交互式动画至关重要。 5. **事件驱动编程**:AS3.0是事件驱动...

    actionscript概述及基础

    在使用Flash CS3 IDE进行开发时,设计和编码被明确地分离开来,这使得设计师和开发者可以更有效地协作。代码通常写在时间轴上或独立的脚本文件中,提高了代码的组织性和可读性。与之前的ActionScript 2.0相比,...

    actionscript3.0游戏实例教程

    6. **图形绘制**:学习使用Graphics类进行矢量图形绘制。 7. **交互设计**:用户输入处理,如键盘和鼠标事件监听。 8. **碰撞检测**:如何检测游戏中的对象是否发生碰撞。 9. **状态管理**:游戏的不同阶段(如开始...

    Actionscript中文帮助文档

    6. **ActionScript与XML/SWF/AAM整合**:ActionScript可以处理XML数据,与SWF(Shockwave Flash)文件进行交互,以及使用Action Message Format(AAM)进行组件通信。 7. **错误处理**:理解如何使用try-catch语句...

    ActionScript3中文手册

    例如,使用位运算符进行高效计算,以及利用DisplayObject容器进行舞台上的图形渲染。ActionScript3还支持位图缓存,提高了大型图形或复杂动画的性能。 此外,AS3支持网络通信,包括XMLSocket、URLLoader和...

    ActionScript 3.0 API文档(CHM+HTML最新中文完整)

    此版本包括支持 Adobe AIR 运行时环境的新 ActionScript 类、方法和属性。 在可能的情况下,特定于 AIR 的新项目都以其名称旁的这个小图标作为标志: 本手册提供了 ActionScript 语言中所支持元素的语法和用法信息...

    ActionScript3.0

    8. 图形绘制:利用Graphics类进行矢量图形绘制,以及BitmapData进行像素操作。 9. 教程和示例:书中可能会提供大量实例,帮助读者理解和应用这些技术。 总之,“ActionScript3.0_Cookbook”是一个宝贵的资源,对于...

    ActionScript 2.0入门系列

    ActionScript 2.0 是Adobe Flash Professional中使用的一种编程语言,用于创建交互式网页内容、游戏和动画。这个“ActionScript 2.0入门系列”很可能是为了引导初学者掌握这种语言的基础知识和核心概念。 在...

    ActionScript语句中文全解

    1. XML和JSON:ActionScript提供XML和JSON对象来处理这两种数据格式,方便与服务器进行数据交换。 2. URLLoader和URLRequest:用于加载网络资源,如文本、图像、XML等。 七、声音和视频 1. Sound和Video类:分别...

Global site tag (gtag.js) - Google Analytics