多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > 計算幾何問題匯總--點與線的位置關(guān)系

計算幾何問題匯總--點與線的位置關(guān)系

來源:程序員人生   發(fā)布時間:2016-09-26 08:53:10 閱讀次數(shù):3105次

點與點之間, 線與線之間,點與線之間的位置關(guān)系是1類非常重要的問題。它不但是平面幾何學的基石,也常常利用于LBS(Location Based Service),社交網(wǎng)絡(luò),和數(shù)據(jù)庫查詢等領(lǐng)域。

本文中,我將給出判斷這些關(guān)系的相干算法,作為參考。需要說明的是,我給出的這些問題的解法,都是建立在2維平面空間之上。有關(guān)多維空間的位置關(guān)系,大家可以仿照2維空間中問題的思路,做相應(yīng)的拓展。

語言上,我用確當然還是Python.

點與點之間的距離

先從最簡單的點與點的位置關(guān)系說起。1般情況下,我們只關(guān)心點與點之間的距離。

1. 點類的定義

為使算法思路更加清晰,先定義點類Point,既然是在2維空間上,那末每一個點都應(yīng)當有兩個屬性:x, y分別代表點的橫縱坐標。

class Point(object): """Point are two-dimension""" def __init__(self, x, y): self.x = x self.y = y

接下來就看看如何計算兩點之間距離:固然可以用初中學的歐氏距離最基本的計算方法。但是斟酌到代碼編寫的效力,和方便以后向高維空間拓展。我在本文中將盡可能使用向量計算。

而為了簡化代碼,我們使用對向量運算已相當做熟的庫numpy

2. 兩點之間距離的計算

明顯,兩點可以構(gòu)成向量,而向量的長度則是其內(nèi)積的開方??臻g中,點A與點B的距離可以用向量AB??的模|AB??|表示。所以,現(xiàn)在需要做的,就是寫1個函數(shù),以兩點為參數(shù),計算由這兩點構(gòu)成的向量的模。

為了和本文以后的問題保持編碼風格上1致,同時簡化代碼編寫。我使用對向量運算已極其成熟的庫numpy幫助計算。并且定義了1個新的類Vector,類Vector以向量的出發(fā)點和終點作為輸入,生成1個只具有屬性x和y的向量對象。

最后,和前面定義的類放在1起,代碼以下:

import numpy as np # numpy help us do some vector calculation class Point(object): """Point are two-dimension""" def __init__(self, x, y): self.x = x self.y = y class Vector(object): """start and end are two points""" def __init__(self, start, end): self.x = end.x - start.x self.y = end.y - start.y def pointDistance(p1, p2): """calculate the distance between point p1 and p2""" # v: a Vector object v = Vector(p1, p2) # translate v to a ndarray object t = np.array([v.x, v.y]) # calculate the inner product of ndarray t return float(np.sqrt(t @ t))

說明1下,在Python3.5以后的版本中,使用numpy庫時,ndarray對象之間的乘法可以用@,代替之前的v1.dot(v2)這樣的情勢。

點與線之間的位置關(guān)系

1. 線的分類

點與線之間的位置關(guān)系就要略微復雜1些了,復雜的地方在于線分線段和直線兩種情況。但是,在定義類的時候我都用兩點來代表線段(直線)的兩個屬性。因而,最少代碼看上去是沒甚么分別的。

不同的地方在于,線段的兩個點事兩個端點,而直線的兩個點是直線上任意兩點。

class Segment(object): """the 2 points p1 and p2 are unordered""" def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 class Line(object): """p1 and p2 are 2 points in straight line""" def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2

需要注意的是,這里并沒有說線段的兩個點是甚么順序(不1定說左側(cè)的點就是p1,右側(cè)就是p2)

2. 點與線的位置關(guān)系

(1) 計算點到直線的距離

如Fig.1(a)所示,現(xiàn)要求點C到直到直線AB的距離。還是向量法,據(jù)向量知識可知:

cosCAB=AC???AB??|AC??|?|AB??|


再由3角形知識可知,線段AD的長度為:

|AC??|?cosCAB


所以,AD??可以這樣計算:

AD??=AB??|AB??|?|AD??|=AB??|AB??|?|AC??|?cosCAB=AB???AC??|AB??|2AB??


AD??計算完成以后,可以根據(jù)AD??相應(yīng)的坐標值得到點D的坐標,再由上面點和點之間的距離,便可得到線段CD的長度。

這里寫圖片描述

給出完全的代碼以下:

import numpy as np # numpy help us do some vector calculation class Point(object): """Point are two-dimension""" def __init__(self, x, y): self.x = x self.y = y class Segment(object): """the 2 points p1 and p2 are unordered""" def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 class Line(object): """p1 and p2 are 2 points in straight line""" def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 class Vector(object): """start and end are two points""" def __init__(self, start, end): self.x = end.x - start.x self.y = end.y - start.y def pointDistance(p1, p2): """calculate the distance between point p1 and p2""" # v: a Vector object v = Vector(p1, p2) # translate v to a ndarray object t = np.array([v.x, v.y]) # calculate the inner product of ndarray t return float(np.sqrt(t @ t)) def pointToLine(C, AB): """calculate the shortest distance between point C and straight line AB, return: a float value""" # two Vector object vector_AB = Vector(AB.p1, AB.p2) vector_AC = Vector(AB.p1, C) # two ndarray object tAB = np.array([vector_AB.x, vector_AB.y]) tAC = np.array([vector_AC.x, vector_AC.y]) # vector AD, type: ndarray tAD = ((tAB @ tAC) / (tAB @ tAB)) * tAB # get point D Dx, Dy = tAD[0] + AB.p1.x, tAD[1] + AB.p1.y D = Point(Dx, Dy) return pointDistance(D, C)

(2) 判斷點是不是在直線上
既然已能夠計算點到直線的距離了,那末,只需要看點到直線的距離是不是為0便可知道這個點在不在直線上。

接著上面的代碼,可以寫出以下函數(shù):

def pointInLine(C, AB): """determine whether a point is in a straight line""" return pointToLine(C, AB) <
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 欧美性猛片xxxxⅹ免费 | 日韩乱码视频 | 在线天堂av影院 | 日本免费不卡视频一区二区三区 | 亚洲欧美国产精品久久久 | 最新欧美18videosex性欧美 | 大杳蕉伊人狼人久久一本线 | 亚洲国产精品线播放 | 欧美日韩午夜视频 | 国产一精品一aⅴ一免费 | 国产亚洲精品久久久久久久久激情 | 最新欧美精品一区二区三区不卡 | 精品视频69v精品视频 | 亚洲大胆视频 | 亚洲天堂久久久 | 亚洲最大视频网 | 国产一区二区三区不卡在线观看 | 亚洲欧洲在线观看 | 亚洲精品免费视频 | 99精品国产一区二区三区 | 男女视频在线观看免费 | 精品三级国产一区二区三区四区 | 国产精品视频播放 | 性生生活网站免费 | 最猛黑人xxxⅹ黑人猛交 | 久久精品a一国产成人免费网站 | 一本免费视频 | 波多野结衣亚洲一区二区三区 | 国产成人精品久久综合 | 欧洲freexxxx性| 欧美在线成人免费国产 | 爽爽视频在线观看 | 日本福利片秋霞国产午夜 | 国产精品亚洲二区在线 | 久操免费在线 | 国产精品免费综合一区视频 | 欧美午夜理伦三级理论三级 | xxnx日本免费护士 | 最近高清中文在线观看国语字幕7 | 91精品一区二区三区久久久久 | 亚洲国产精品高清在线一区 |