经纬坐标点的多边形区域判断

经纬坐标点的多边形区域判断

python 实现,封装成函数,

def is_pt_in_poly(x, y, point_list, point_list_size):
isum = 0.0
icount = point_list_size

for i in range(icount//2):
    # 选取各段直线
    # 1) 确定索引
    # 2)根据索引确定边界线段
    parallel_weight = 0

    if i < icount // 2 - 2:
        index_n1 = i - 1
        index_a1 = i + 1
        index_a2 = i + 2

    elif i == icount // 2 - 2:
        index_n1 = i - 1
        index_a1 = i + 1
        index_a2 = 0

    elif i == icount // 2 - 1:
        index_n1 = i - 1
        index_a1 = 0
        index_a2 = 1

    x_0 = point_list[i * 2]
    y_0 = point_list[i * 2 + 1]
    x_n1 = point_list[index_n1 * 2]
    y_n1 = point_list[index_n1 * 2 + 1]
    x_a1 = point_list[index_a1 * 2]
    y_a1 = point_list[index_a1 * 2 + 1]
    x_a2 = point_list[index_a2 * 2]
    y_a2 = point_list[index_a2 * 2 + 1]

    # 计算判定的点与各线段的交点
    if ( y >= min(y_0, y_a1) ) & ( y <= max(y_0, y_a1) ) :

        # 1、点重叠顶点 
        if ( x == x_0 ) & (y == y_0) :
            return  1
        
        # 2、点过顶点
        elif y == y_0 :
            # 边界水平
            if y_0 == y_a1:
                if x < min(x_0, x_a1):
                    if y_0 - y_n1 > 0:
                        parallel_weight += 0.5
                    elif y_0 - y_n1 < 0:
                        parallel_weight += -0.5
                    else:
                        parallel_weight += 0

                    if y_a1 - y_0 > 0:
                        parallel_weight += 0.5
                    elif y_a1 - y_0 < 0:
                        parallel_weight += -0.5
                    else:
                        parallel_weight += 0

                    if y_a2 - y_a1 > 0:
                        parallel_weight += 0.5
                    elif y_a2 - y_a1 < 0:
                        parallel_weight += -0.5
                    else:
                        parallel_weight += 0
                elif x > max(x_0, x_a1):
                    pass
                else:
                    return 1
            # 边界不水平
            else:
                if y_n1 != y:
                    if x < x_0:
                        if ( y_0 - y_n1 ) * ( y_a1 - y_0) > 0:
                            isum += 1 
                        else:
                            pass
                    elif x > x_0:
                        pass
                else:
                    pass
            
        # 3、点过尾点
        elif  y == y_a1 :
            pass

        # 4、点过边界 (边界垂直和一般情况)
        else:
            if x_0 == x_a1:
                if x < x_0 :
                    isum += 1
                elif x > x_0:
                    pass
                else:
                    return 1 # 在线段上 
            else:
                line_poin_x = x - (x_a1 * y - x_0 * y - x_a1 * y_0 + x_0 * y_a1) / (y_a1 - y_0)
                if line_poin_x < 0:
                    isum += 1
                elif line_poin_x > 0:
                    pass 
                else :
                    return 1
    else:
        pass

    isum = isum + abs(parallel_weight)

if isum % 2 == 0:
    return 0
else:
    return 1

 [1]: https://wenku.baidu.com/view/5e3913a2b0717fd5360cdccf.html?qq-pf-to=pcqq.c2c
 [2]: https://blog.csdn.net/qq_22929803/article/details/46818009

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值