python判断点在直线的哪一侧_利用python或者其他软件判断一个坐标点是否在不规则区域内...

-- coding: UTF-8 --

def isRayIntersectsSegment(poi, s_poi, e_poi): # [x,y] [lng,lat]

# 输入:判断点,边起点,边终点,都是[lng,lat]格式数组

if e_poi[1] == s_poi[1]: # 排除与射线平行、重合,线段首尾端点重合的情况

return False

if s_poi[1] > poi[1] and e_poi[1] > poi[1]: # 线段在射线上边

return False

if s_poi[1] < poi[1] and e_poi[1] < poi[1]: # 线段在射线下边

return False

if s_poi[1] == poi[1] and e_poi[1] > poi[1]: # 交点为下端点,对应spoint

return False

if e_poi[1] == poi[1] and s_poi[1] > poi[1]: # 交点为下端点,对应epoint

return False

if s_poi[0] < poi[0] and e_poi[1] < poi[1]: # 线段在射线左边

return False

xseg = e_poi[0] - (e_poi[0] - s_poi[0]) * (e_poi[1] - poi[1]) / (e_poi[1] - s_poi[1]) # 求交

if xseg < poi[0]: # 交点在射线起点的左侧

return False

return True # 排除上述情况之后

def isPoiWithinPoly(poi, poly):

# 输入:点,多边形三维数组

# poi = [114.3771791319310,22.7497690992367]

# poly=[[114.373239,22.766905],[114.377016,22.762948],[114.379763,22.755033],[114.386801,22.755983],[114.392809,22.758199],[114.400877,22.761681],[114.400877,22.769437],[114.40534,22.775769],[114.412893,22.77561],[114.417013,22.769437],[114.420618,22.763897],[114.42079,22.762473],[114.415983,22.760573],[114.408945,22.758832],[114.402422,22.756457],[114.394354,22.753925],[114.385084,22.751708],[114.379419,22.751234],[114.375986,22.748701],[114.373411,22.746168],[114.366888,22.743001],[114.364656,22.741102]] #三维数组

# 可以先判断点是否在外包矩形内

# if not isPoiWithinBox(poi,mbr=[[0,0],[180,90]]): return False

# 但算最小外包矩形本身需要循环边,会造成开销,本处略去

sinsc = 0 # 交点个数

for epoly in poly: # 循环每条边的曲线->each polygon 是二维数组[[x1,y1],…[xn,yn]]

for i in range(len(epoly) - 1): # [0,len-1]

s_poi = epoly[i]

e_poi = epoly[i + 1]

if isRayIntersectsSegment(poi, s_poi, e_poi):

sinsc += 1 # 有交点就加1

return True if sinsc % 2 == 1 else False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值