在實現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