天天看點

as3 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——将另一個點的坐标添加到此點的坐标以建立一個新點。還記得矢量相加的幾何意義嗎?

as3 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——從此點的坐标中減去另一個點的坐标以建立一個新點。既然有了加法,當然有減法了。看看矢量的減法意義:

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