點到線段的最短距離

請叫我未雨先森IP屬地: 江蘇
字數(shù) 1,366

點到線段最短距離的運算與點到直線的最短距離的運算二者之間存在一定的差別,即求點到線段最短距離時需要考慮參考點在沿線段方向的投影點是否在線段上,若在線段上才可采用點到直線距離公式,如圖1所示。

圖1(a)最短距離為點P與其在線段AB上投影C之間的線段PC

(b)最短距離為點P與端點B(或A)所構(gòu)成的線段PB(或PA)

具體算法主要有以下三種:

1、方法——經(jīng)典算法

該算法直接用高中時所學(xué)習(xí)到的解析幾何知識對點到線段的距離進行求解。其基本思想是先判斷點在線段端點、點在線上等等的特殊情況,逐步的由特殊到一般,當(dāng)忽略點在線段上的特殊情況時,判斷點到線段方向的垂線是否落在線段上的方法是通過比較橫縱坐標(biāo)的方式來判斷,最后把不同的判斷情況用不同的幾何方式來進行處理計算得出結(jié)果。

由上面敘述的基本思路可以知道這種算法雖然很容易理解和接受,但從算法的實用性的角度分析還是有很大的缺點的,首先是算法復(fù)雜,計算量巨大,大量的比較判斷、距離計算、角度計算等等,實際應(yīng)用中往往是需要求由大量線段組成的折線到某點的最短距離,如此用這樣的算法計算量是不能想象的。其次經(jīng)典算法中使用的一些簡化運算的函數(shù)不利于語言的重新包裝,如果想換編程語言的話,就比較麻煩了。

2、方法二——面積算法

該方法主要是先判斷投影點是否在線段上,投影點在線段延長線上時,最短距離長度為點到端點的線段長度;當(dāng)投影點在線段上時,先使用海倫公式計算三角形面積,再計算出三角形的高,即為最短距離。

運用面積算法求解點到線段最短距離思路很清晰,也很容易理解。從效率方面考慮,比如需要多次計算平方、根號,這對于大量數(shù)據(jù)進行運算是負擔(dān)很重的。求面積就必須把三條邊長全部求出,并且用到的海倫公式也需要進行開方運算,計算過程顯得繁瑣。

3、方法三——矢量算法

矢量算法過程清晰,如果具有一定的空間幾何基礎(chǔ),則是解決此類問題時應(yīng)優(yōu)先考慮的方法。當(dāng)需要計算的數(shù)據(jù)量很大時,這種方式優(yōu)勢明顯。

由于矢量具有方向性,故一些方向的判斷直接根據(jù)其正負號就可以得知,使得其中的一些問題得以很簡單的解決。

用此方法考慮,我們只需要找到向量在

方向上的投影,具體如下:

上面的是方向上的單位向量,其意義是給所求向量確定方向。是的兩個向量的內(nèi)積,且,其中θ為向量AP與AB之間的夾角。是向量長度。

那么即為上圖中線段AC的長度值,不帶有方向性。此數(shù)值與上述表征方向的整體構(gòu)成有大小、有方向的新向量,即為在方向上的投影向量,C為投影點。

根據(jù)得到的,由向量的方向性可知:如果情況是上圖(a)所示,那么0<r<1,;如果是如圖(b)所示的情況,那么r>=1,;如果是如圖(c)所示的情況,那么得到r≤0;

特殊情況如點在線段上、點在端點、點在線段延長線上等等的情況全部適用于此公式,只是作為特殊情況出現(xiàn),無需另作討論。這也是矢量算法思想的優(yōu)勢所在。

故根據(jù)r值的不同,最短距離

C#代碼為:

publicstaticdoublePointToSegDist(doublex,doubley,doublex1,doubley1,doublex2,doubley2)

{

doublecross?=?(x2?-?x1)?*?(x?-?x1)?+?(y2?-?y1)?*?(y?-?y1);

if(cross?<=?0)returnMath.Sqrt((x?-?x1)?*?(x?-?x1)?+?(y?-?y1)?*?(y?-?y1));

doubled2?=?(x2?-?x1)?*?(x2?-?x1)?+?(y2?-?y1)?*?(y2?-?y1);

if(cross?>=?d2)returnMath.Sqrt((x?-?x2)?*?(x?-?x2)?+?(y?-?y2)?*?(y?-?y2));

doubler?=?cross?/?d2;

doublepx?=?x1?+?(x2?-?x1)?*?r;

doublepy?=?y1?+?(y2?-?y1)?*?r;

returnMath.Sqrt((x?-?px)?*?(x?-?px)?+?(py?-?y1)?*?(py?-?y1));

}

后記:編程考驗的不光是寫代碼的能力,更多的是對一個問題的優(yōu)質(zhì)解決方法,點到線段最短距離的求解,在數(shù)學(xué)上可能就是一個公式的問題,編程是深究起來卻有如此巧妙的解決方法,記錄本文方法,更多的是對以后學(xué)習(xí)的一個啟發(fā)!

return?Math.Sqrt((x-px)*(x-px)+(py-y)*(py-y))

轉(zhuǎn)載自:http://blog.sina.com.cn/s/blog_5d5c80840101bnhw.html

最后編輯于
©著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
0人點贊
總資產(chǎn)1共写了1.0W字获得13个赞共5个粉丝
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內(nèi)容