几何求解 Python

一、点到直线的距离——批处理版本

import numpy as np

def point_distance_line(points, line_points1, line_points2):
    """
    计算点到直线的距离(向量化版本)
    """
    # 计算向量
    vec1 = line_points1 - points
    vec2 = line_points2 - points
    
    # 计算向量叉积
    cross_product = np.abs(np.cross(vec1, vec2))
    
    # 计算直线长度
    line_length = np.linalg.norm(line_points1 - line_points2, axis=1)
    
    # 计算点到直线的距离
    distance = cross_product / line_length
    
    return distance


# 生成测试数据
points = np.array([[2, 3], [1, 1], [3, 2]])
line_points1 = np.array([[0, 0], [0, 1], [1, 0]])
line_points2 = np.array([[1, 1], [1, 2], [2, 1]])

# 计算点到直线的距离
distance = point_distance_line(points, line_points1, line_points2)

print(distance)  # 输出:[ 2.12132034  0.70710678  1.11803399]

其中直线以两个点的形式给出,其中 points 为一个 n*2 的向量,表示待求点的坐标;line_points1, line_points2 都为 n*2 的向量,每一列分别为直线两个点的坐标。

二、点是否在多边形内部

def check_in_2d_polygon(points, polygon):
    inside = np.ones(points.shape[0]) < 0
    angle_sum = np.zeros(points.shape[0])
    for pg1, pg2 in zip(polygon[:-1, :], polygon[1:, :]):
        k = (pg1[1] - pg2[1]) / (pg1[0] - pg2[0] + 1e-7)  # 避免除0
        b = pg1[1] - k * pg1[0]
        dis = np.abs(k * points[:, 0] - 1 * points[:, 1] + b) / np.sqrt(k * k + 1)

        inside |= (dis < 1e-5) & (((pg1[0] <= points[:, 0]) & (points[:, 0] <= pg2[0])) | ((pg2[0] <= points[:, 0]) & (points[:, 0] <= pg1[0]))) # 是否在多边形边上
 
        # 计算夹角
        angle = np.arctan2(pg1[1] - points[~inside, 1], pg1[0] - points[~inside, 0]) - np.arctan2(pg2[1] - points[~inside, 1], pg2[0] - points[~inside, 0])

        angle[angle >= np.pi] -= np.pi * 2
        angle[angle <= -np.pi] += np.pi * 2
 
        # 累积
        angle_sum[~inside] += angle
    
    inside[~inside] = np.abs(np.abs(angle_sum[~inside]) - 2 * np.pi) < 1e-5 # 顺时针和逆时针分别为 2pi 和 -2pi
    return inside

输入 points 为一个 n*2 的向量,表示待求点的坐标;polygon 为一个 m*2 的向量,每一列为多边形每个顶点的坐标,其中首尾坐标相同构成一个封闭多边形。

算法使用夹角和的方法来判断一个点是否在多边形内。具体来说,通过计算点与多边形每个顶点之间的夹角,然后判断夹角和是否等于360度。如果夹角和等于360度,则点在多边形内,否则点在多边形外。

你可能感兴趣的:(Python,python,numpy,机器学习)