Python編程實現點到直線距離計算


在實現TextMountain時,生成TCBP時需要計算文本區域點到四條邊的距離,由於計算量大,所以最好是使用矩陣運算,提高運行效率。

基礎講解:

由於需要使用到矩陣運算,最好采用向量的方法來進行表示。

為了講述方便,我們設直線為x軸,用向量oq表示,對於點p,要計算p到直線oq的距離,我們可以任取直線上一點(這里取o)得到向量op,根據圖中公式可以求得點到直線的垂足d到點p的向量dp(x,y),則點到直線的距離為sqrt(xx+yy)

編程實現

            def get_pt_line_dis(pt, line, lpt):
                '''
                獲取點到直線的距離
                :param pt: 點坐標,[n,2]
                :param line: 直線向量 [m,2]
                :param lpt: 直線上的一個點 [m,2]
                :return: 點與直線的距離以及直線到點的垂直單位向量
                '''
      		EPS=10-9
                pt = np.tile(pt[:, np.newaxis, :], (1, line.shape[0], 1)) #[n,m,2]
                line = np.tile(line[np.newaxis, ...], (pt.shape[0], 1, 1)) #[n,m,2]
                lpt = np.tile(lpt[np.newaxis, ...], (pt.shape[0], 1, 1)) #[n,m,2]
                array_trans = pt - lpt #[n,m,2] array_trans[i,j]表示第i個點與第j條直線某端點組成的向量,圖中op
                array_temp = np.sum(array_trans * line, axis=2) / (line[..., 0] ** 2 + line[..., 1] ** 2) #[n,m] 
                array_temp = np.tile(array_temp[..., np.newaxis], (1, 1, 2)) #[n,m,2]
                array_temp = array_temp * line #[n,m,2]計算圖中od
                v = array_trans - array_temp #圖中dp [n,m,2] v[i,j]表示第i個點與第j條直線的垂直向量
                distance = np.linalg.norm(v, axis=2)
                v = v / (distance[..., np.newaxis] + EPS)
                return distance, v


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM