Point类的使用

时间:2024-03-13 21:13:11

关于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

 

 

返回包含 xy 坐标的值的字符串。

 

 

 

下个逐个说明用法:

 

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 返回包含 xy 坐标的值的字符串 不转换的话返回的是Object,转换后为String,可以用typeof测试

 

好了说完了,我感觉polar最重要了,就这个没理解.汗

 

=================

 

AS3:PointクラスについてAdd Starscientre

 

結構躓いたPointクラスについてのメモ.

 

Pointクラスについて

Pointクラスはその名の通り,点の座標を扱います.

 

インスタンスを生成する為には,2つのNumber型の引数が必要です.

 

newして生成したインスタンスをtraceで表示すると,第一引数がx座標,第二引数がy座標として表示されます.

 

pt:Point = new Point(50,50);trace(pt); //出力:(x=50,y=50)

クラスプロパティ,クラスメソッド

長さを測るlength

基準点(0,0)から対象とする点までの距離がわかります.

 

pt:Point = new Point(50,50);trace(pt.length); //出力 : 70.71067811865476
点同士の演算

加算・・・add()

 

減算・・・subtract()

 

距離計測・・・Point.distance()

 

等価・・・equals()

 

var pt1:Point = new Point(100,100);var pt2:Point = new Point(50,50);var pt3:Point = new Point();pt3 = pt1.add(pt2); //加算trace(pt3); //出力(x=150,y=150)pt3 = pt1.subtract(pt2); //減算trace(pt3); //出力(x=50,y=50)var tmp:Number = Point.distance(pt1,pt2); //距離を代入trace(tmp); //出力:70.71067811865476trace(pt1.equals(pt2)); //出力:false
2点の間の点を計算するinterpolate()

3つの引数を与えます.

 

第一引数・・・Point

 

第二引数・・・Point

 

第三引数・・・0~1までの値

 

2つの点の間の点を返します.3つ目の引数が1に近いほど,第一引数の点に近くなり,0に近いほど,第二引数の点に近くなります.

 

var pt1:Point = new Point(100,100);var pt2:Point = new Point(300,300);var pt3:Point = Point.interpolate(pt1,pt2,1);trace(pt3); //出力:(x=100,y=100)pt3 = Point.interpolate(pt1,pt2,0);trace(pt3); //出力:(x=300,y=300)pt3 = Point.interpolate(pt1,pt2,0.5);trace(pt3); //出力:(x=200,y=200)
点の距離を変えるnormalize()

ベクトルの角度は保ち,距離のみを変更できます.

 

normalizeに与える引数(Number型)の距離に変更できます.

 

このとき角度は固定です.

 

例えば,(1,1)にある点の距離を5にしたい場合.

 

基準点が(0,0)なので(1,1)の距離は√(2)です.

 

距離5になるには,座標はどこに移動すればいいでしょうか?

 

ぱっと思いつくのは(3,4)または(4,3)でしょう.

 

しかし,これらの座標に移動すると,基準点からの角度が変わってしまいます.

 

もっと簡単に考えると,元の点の座標,x,yの比率と移動した点の,x,yの比率が変化してしまいます

 

(1,1) = x:y = 1:1.

 

(3,4) = x:y = 3:4.

 

この比率を保ったまま移動すると,角度は保ったまま,距離のみ移動する事ができます.

 

さきほどの(1,1)にある点をnormalizeメソッドを使用し,距離5に変更すると,返ってくる座標は(3.5355,3.5355)です.

 

x,yの比率が1:1となってますね.

 

(座標値が巫女さんになってますね,素敵ですね)

 

var pt1:Point = new Point(1,1);trace("距離=" + pt1.length + "座標 = " + pt1); //出力:距離=5 座標=(x=3,5355....y=3,5355....)
長さと角度を指定して,点を返すPoint.polar()

polarは引数を二つ,長さと角度を与えて,基準点からその長さ,角度に応じた場所の点を返します.

 

ちなみに角度はラジアンです.

 

距離√2,角度π/4を与えると,点(1,1)が返ってくるわけです.

 

var pt1:Point;pt1=Point.polar(Math.sqrt(2),Math.PI/4); //距離√2,角度π/4を与えるtrace(pt1); //出力:(x=1,y=1)

まとめ?

Point型についてはほとんど紹介しましたー.

 

結構ややこしい所もありますね><

 

いい加減,はてなシンタックスハイライトAS3が無いのにイライラしてきた.

 

酷い迫害ですね!ぷんすか.

 



数学だいじだなー.

 



今日から後期です.夏休みおわりですって.やーねー.

 

 

 

====================================

 

 

 

 

 

 

 

 

 

 

当要运算两点距离时,我见不少人都是用最原始的运算方法,其实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();

 

                        }

 

                }