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