在实现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
原文:https://www.cnblogs.com/oiwio-wsf/p/12622963.html