AS3教程:Point類計算兩點間距離

當要運算兩點距離時,我見不少人都是用最原始的運算方法,其實2.0開始就有了Point類,可以計算兩點間距離,除此之外,Point類還可用于計算矢量,某些看似復(fù)雜的計算,用上Point類就會變得簡單。當然,要巧用Point類,必需要有矢量的知識。雖然,3.0的Point類和2.0的區(qū)別不大,但我之所以把這帖放在as3討論區(qū),是因為as3的Point類廣泛地被其他類應(yīng)用。最明顯的是globalToLocal和localToGlobal這兩個方法,2.0這兩個方法的參數(shù)和返回值都是Object,但3.0都變?yōu)镻oint類了,使得Point類的應(yīng)用更名正言順了。
廢話少說,言歸正轉(zhuǎn),首先我們看看Point類的屬性:
x:Number——該點的水平坐標
y:Number——該點的垂直坐標
length:Number——從(0,0)到此點的線段長度(只讀屬性)
從length屬性我們可以看到,實際上一個Point類的實例是一個以(0,0)為始點,以(x,y)為終點的矢量,因此,我們可以應(yīng)用Point類進行一些簡單的矢量運算?,F(xiàn)在我們看看Point類給我們提供什么有用的方法:
distance(pt1:Point, pt2:Point):Number——返回 pt1 和 pt2 之間的距離。這個就是大家傻傻地用Math.sqart()寫一長串代碼計算出來的兩點間距離了。
add(v:Point):Point——將另一個點的坐標添加到此點的坐標以創(chuàng)建一個新點。還記得矢量相加的幾何意義嗎?設(shè)a、b為矢量,則a b=c,圖中矢量c就是矢量a加矢量b的結(jié)果。
這個用來計算合力最方便。我們可以把物體的重心放到(0,0)點上,然后可以利用Point類的add方法簡單計算各種力的合力。你可能會提出一個問題:如何把力轉(zhuǎn)換成點的坐標呢?下面這個方法可以幫你解決這個問題。
polar(len:Number, angle:Number):Point——將一對極坐標轉(zhuǎn)換為笛卡爾點坐標。
學(xué)過物理力學(xué)的人都知道,力是有大小有方向的矢量,而這個方法的正好提供了把力轉(zhuǎn)換成點坐標的方法。len就是力的大小,angle就是力角度。轉(zhuǎn)換后計算合力,得出合力的坐標點,再讀取這點的length屬性,就可得到合力的大小,再利用Math.atan2(y,x)計算力的方向。多簡單的運算!
offset(dx:Number, dy:Number):void——按指定量偏移 Point 對象。dx 的值將添加到 x 的原始值中以創(chuàng)建新的 x 值。 dy 的值將添加到 y 的原始值中以創(chuàng)建新的 y 值。這個要和add區(qū)分開來,因為offset是直接把值加到x、y值上。
subtract(v:Point):Point——從此點的坐標中減去另一個點的坐標以創(chuàng)建一個新點。既然有了加法,當然有減法了??纯词噶康臏p法意義:設(shè)a、b為矢量,則b-a=c,圖中矢量c就是矢量b減去矢量a的結(jié)果。
用這個運算,你可以方便地只用一個Point類實例來記錄某兩點間的距離和斜率。在某些場合,這個很有用。例如當需要計算和記錄某點集合里各點與其他點之間的關(guān)系時,如果分別運算距離和角度,你得用兩個一一對應(yīng)的數(shù)組記錄,當然也可以用一個多聯(lián)數(shù)組,但絕對比不上用一個Point類實例組成的一維數(shù)組簡單得多,如果要對這些結(jié)果進行比較或者有下一步運算時,用這種方法更顯優(yōu)勢。
interpolate(pt1:Point, pt2:Point, f:Number):Point——確定兩個指定點之間的點。參數(shù) f 確定新的內(nèi)插點相對于參數(shù) pt1 和 pt2 指定的兩個端點所處的位置。參數(shù) f 的值越接近 1.0,則內(nèi)插點就越接近第一個點(參數(shù) pt1)。參數(shù) f 的值越接近 0,則內(nèi)插點就越接近第二個點(參數(shù) pt2)。
這個方法更了不起。因為它能幫我們確定兩點之間的一點,只要我們知道這點在線段中位置。實際上f是一個比例值,
f=待定點到pt2的距離/整條線段的長度
這個用來計算一些已知比例關(guān)系的點很方便。例如求地圖上的某點在實際場景上的點坐標,我們只需選取一段過這點的線段,計算出f,就可以代入實際場景中對應(yīng)線段,求出對應(yīng)的點。
normalize(thickness:Number):void——將 (0,0) 和當前點之間的線段縮放為設(shè)定的長度。這個實際上就是設(shè)置矢量的大小的方法。得到的結(jié)果是矢量的大小變?yōu)樵O(shè)定值,x、y值改變了,但是矢量的方向不變。
從Point類的屬性和方法看,Point類實際上是一個徹頭徹尾的矢量類,它幾乎包含了所有關(guān)于矢量的基本運算。所以,要計算矢量,應(yīng)優(yōu)先考慮使用Point類。
PS:順帶說說globalToLocal和localToGlobal,這兩個方法在as3里是DisplayObject的方法,它們可以方便地隨意地轉(zhuǎn)換不同顯示對象中的相對坐標,它的參數(shù)和返回值都是Point類實例,所以在as3里應(yīng)用Point類計算點與點間的關(guān)系,更具優(yōu)勢。例如mc1中有一點p1(x1,y1),mc2中有一點p2(x2,y2),如果mc1和mc2的關(guān)系很復(fù)雜,要求p1到p2的距離,如果不用這兩個方法,這個運算就很復(fù)雜,用上它們就簡單得多了,所求的距離d=Point.distance(p2,mc2.globalToLocal(mc1.localToGlobal(p1)));
相關(guān)文章
- flash cs6想要實現(xiàn)鼠標跟隨效果?該怎么制作呢?今天我們就來看看使用as2.0實現(xiàn)鼠標跟隨效果的教程,需要的朋友可以參考下2019-05-19
- Flash cs6怎么使用代碼輸入中英文文本?Flash cs6中可以使用文字工具直接輸入文本,也可以使用代碼來輸入文本,該怎么使用代碼輸入文本呢?請看下文詳細的教程,需要的朋友2018-03-11
- flash as3.0抽象類怎么定義? as3.0中有很多抽象類,該怎么定義抽象類和抽象方法呢?下面我們就來看看簡單的例子,需要的朋友可以參考下http://www.dbjr.com.cn/softs/408402.2018-02-28
flash cs6中怎么使用ActionScript3.0?
flash cs6中怎么使用ActionScript3.0?flash cs6中想要使用ActionScript3.0功能,該怎么使用呢?下面我們就來看看詳細的教程,需要的朋友可以參考下2018-01-25- 本教程給大家分享一個Flash小教程,教大家在Flash CS6中怎么實現(xiàn)鼠標點擊決定圖像位置?方法很簡單,感興趣的朋友歡迎前來一起分享學(xué)習(xí)2018-01-12
- 本教程教腳本之家的ActionScript教程學(xué)習(xí)者在Flash中如何用代碼將圖片放在自己想要的舞臺位置,教程講解的詳細,感興趣的朋友歡迎前來分享學(xué)習(xí)2017-11-20
在Flash CS6中使用with函數(shù)繪制背景圖教程
本教程教腳本之家的ActionScript教程學(xué)習(xí)者如何在Flash CS6中使用with函數(shù)繪制背景圖?教程一步步講解的挺詳細,方法也不難,非常適合Flash新手入門學(xué)習(xí)2017-11-18Flash怎么設(shè)置元件坐標?flash使用代碼設(shè)置元件的坐標的教程
Flash怎么設(shè)置元件坐標?flash中導(dǎo)如的元件需要添加坐標,該怎么定位元件坐標呢?下面我們就來看看flash使用代碼設(shè)置元件的坐標的教程,需要的朋友可以參考下2017-10-11- Flash怎么制作來回搖擺的花朵的動畫?Flash中想要給花朵制作一段搖擺的動畫效果,該怎么制作呢?下面我們就來看看詳細的教程,很簡單,需要的朋友可以參考下2017-05-23
- Flash怎么制作流動七彩色的文字?想要讓文字動起來,該怎么使用flash給文字制作一個流動七彩色的動畫呢?下面我們就來看看詳細的教程,需要的朋友可以參考下2017-04-23