关于Point类的使用
Point 类表示二维坐标系统中的一个位置,其中 x 表示水平轴,y 表示垂直轴。
说的简单点,就是我们从高手开始学的坐标系统,学过基本的数学知识应该就会用。
创建坐标的一个点的方法如下
import flash.geom.Point
var myPoint:Point=new Point()
//var myPoint:flash.geom.Point = new flash.geom.Point();
属性摘要
修饰符
|
属性
|
说明
|
---|---|---|
length:Number
|
从 (0,0) 到此点的线段长度。
|
|
x:Number
|
该点的水平坐标。
|
|
y:Number
|
该点的垂直坐标。
|
方法摘要
修饰符
|
签名
|
说明
|
---|---|---|
add(v:Point) : Point
|
将另一个点的坐标添加到此点的坐标以创建一个新点。
|
|
clone() : Point
|
创建此 Point 对象的副本。
|
|
static
|
distance(pt1:Point, pt2:Point) : Number
|
返回 pt1 和 pt2 之间的距离。
|
equals(toCompare:Object) : Boolean
|
确定两个点是否相同。
|
|
static
|
interpolate(pt1:Point, pt2:Point, f:Number) : Point
|
确定两个指定点之间的点。
|
normalize(length:Number) : Void
|
将 (0,0) 和当前点之间的线段缩放为设定的长度。
|
|
offset(dx:Number, dy:Number) : Void
|
按指定量偏移 Point 对象。
|
|
static
|
polar(len:Number, angle:Number) : Point
|
将一对极坐标转换为笛卡尔点坐标。
|
subtract(v:Point) : Point
|
从此点的坐标中减去另一个点的坐标以创建一个新点。
|
|
toString() : String
|
返回包含 x 和 y 坐标的值的字符串。
|
下个逐个说明用法:
1.add用法:将另一个点的坐标添加到此点的坐标以创建一个新点,意思就跟向量相加一样
import flash.geom.Point;
var point_1:Point = new Point(4, 8);
var point_2:Point = new Point(1, 2);
var resultPoint:Point = point_1.add(point_2);
trace(resultPoint.toString());
// (x=5, y=10)
2. clone 创建对象副本
import flash.geom.Point;
var myPoint:Point = new Point(1, 2);
var clonedPoint:Point = myPoint.clone();
trace(clonedPoint.x);
// 1
trace(clonedPoint.y);
// 2
3.distance 计算第一个点和第二个点之间的距离,
计算公式为distance=((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))的开方
import flash.geom.Point;
var point_1:Point = new Point(0, 0);
var point_2:Point = new Point(3, 4);
var distanceBetween:Number = Point.distance(point_1, point_2);
trace(distanceBetween); // 5
4.equals 确定两个点坐标是否相同,相同则为 true;如果不相同,则为 false
import flash.geom.Point;
var point_1:Point = new Point(1, 2);
var point_2:Point = new Point(1, 2);
var point_3:Point = new Point(4, 8);
trace(point_1.equals(point_2)); // true
trace(point_1.equals(point_3)); // false
5.interpolate 返回两个指定点之间的点,比如两点连成一直线,interpolate就是返回直线上的点,有三个参数,官方帮助文件
参数
pt1:flash.geom.Point - 第一个点。
pt2:flash.geom.Point - 第二个点。
f:Number - 两个点之间的内插级别。指示新点将位于 pt1 和 pt2 连成的直线上的什么位置。如果 f=0,则返回 pt1;如果 f=1;则返回 pt2。
但我发现刚好是相反的,大家注意
import flash.geom.Point;
var point_1:Point = new Point(-100, -100);
var point_2:Point = new Point(50, 50);
var interpolatedPoint1:Point = Point.interpolate(point_1, point_2, 0);
var interpolatedPoint2:Point = Point.interpolate(point_1, point_2, .5);
var interpolatedPoint3:Point = Point.interpolate(point_1, point_2, 1);
trace(interpolatedPoint1.toString());
// (x=50, y=50)
trace(interpolatedPoint2.toString());
// (x=-25, y=-25)
trace(interpolatedPoint3.toString());
// (x=-100, y=-100)
6.length 从 (0,0) 到此点的线段长度 ,这个很简单,直接用勾骨定理计算
import flash.geom.Point;
var myPoint:Point = new Point(3,4);
trace(myPoint.length); // 5
7.normalize 设定(0,0) 和当前点之间的线段的缩放长度 normalize改变,坐标也将随着缩放改变
import flash.geom.Point;
var normalizedPoint:Point = new Point(3, 4);
trace(normalizedPoint.length); // 5
trace(normalizedPoint.toString()); // (x=3, y=4)
normalizedPoint.normalize(10);
trace(normalizedPoint.length); // 10
trace(normalizedPoint.toString()); // (x=6, y=8)
8.offset 按指定量偏移 Point 对象。dx 的值将添加到 x 的原始值中以创建新的 x 值。dy 的值将添加到 y 的原始值中以创建新的 y 值
import flash.geom.Point;
var myPoint:Point = new Point(1, 2);
trace(myPoint.toString()); // (x=1, y=2)
myPoint.offset(4, 8);
trace(myPoint.toString()); // (x=5, y=10)
比较add和offset的区别,
add是两个点之间的相加,offset是偏移 Point自身对象
9.polar 将一对极坐标转换为笛卡尔点坐标 暂时还不理解,55555,先放着,-_-
10.subtract 从此点的坐标中减去另一个点的坐标以创建一个新点
跟add方法相反
import flash.geom.Point;
var point_1:Point = new Point(4, 8);
var point_2:Point = new Point(1, 2);
var resultPoint:Point = point_1.subtract(point_2);
trace(resultPoint.toString()); // (x=3, y=6)
11.toString 返回包含 x 和 y 坐标的值的字符串 不转换的话返回的是Object,转换后为String,可以用typeof测试
好了说完了,我感觉polar最重要了,就这个没理解.汗
AS3:Pointクラスについて
Pointクラスについて
クラスプロパティ,クラスメソッド
長さを測るlength
点同士の演算
2点の間の点を計算するinterpolate()
点の距離を変えるnormalize()
長さと角度を指定して,点を返すPoint.polar()
まとめ?
====================================
当要运算两点距离时,我见不少人都是用最原始的运算方法,其实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)));
(责任编辑:大鸟)
============
例一画剑头
var _shape:Shape = new Shape ();
var _line:Shape = new Shape ();
var _PI:Number = Math.PI;
//原点坐标
var centerX:Number=300;
var centerY:Number = 300;
var exAngle:Number = _PI * ( 1 + 1 / 4);
Amap();
function Amap()
{
DrawCenterPoint();
addChild (_line);
addChild (_shape);
stage.addEventListener (Event.ENTER_FRAME,onDo);
}
function DrawCenterPoint():void
{
graphics.beginFill(0xff0000, 1);
graphics.drawCircle(centerX, centerY, 5);
graphics.endFill();
}
function onDo(e:Event):void
{
Draw (mouseX,mouseY);
}
function Draw(targetX:Number, targetY:Number):void
{
//直线长度
var len:Number = Math.sqrt((targetY - centerY) * (targetY - centerY) + (targetX - centerX) * (targetX - centerX));
var angle:Number = Math.atan2((targetY -centerY) , (targetX - centerX));
var p1:Point = Point.polar(len, angle);
var p2:Point = Point.polar(40, angle + exAngle);
var p3:Point = Point.polar(40, angle - exAngle);
p1.offset(centerX, centerY);
p2.offset(p1.x, p1.y);
p3.offset(p1.x, p1.y);
with(_line.graphics){
clear();
lineStyle(1);
moveTo(centerX,centerY);
lineTo(p1.x, p1.y);
}
with(_shape.graphics){
clear();
beginFill(1, 0xff0000);
moveTo(p1.x, p1.y);
lineTo(p1.x, p1.y);
lineTo(p2.x, p2.y);
lineTo(p3.x, p3.y);
endFill();
}
}