[算法]Python判断一个点是否在多边形内部
题目:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | # -*- coding:utf-8 -*- def rayCasting(p, poly): px = p[ 'x' ] py = p[ 'y' ] flag = False i = 0 l = len (poly) j = l - 1 #for(i = 0, l = poly.length, j = l - 1; i < l; j = i, i++): while i < l: sx = poly[i][ 'x' ] sy = poly[i][ 'y' ] tx = poly[j][ 'x' ] ty = poly[j][ 'y' ] #点与多边形顶点重合 if (sx = = px and sy = = py) or (tx = = px and ty = = py): return (px, py) #判断线段两端点是否在射线两侧 if (sy < py and ty > = py) or (sy > = py and ty < py): #线段上与射线 Y 坐标相同的点的 X 坐标 x = sx + (py - sy) * (tx - sx) / (ty - sy) #点在多边形的边上 if x = = px: return (px,py) #射线穿过多边形的边界 if x > px: flag = not flag j = i i + = 1 #射线穿过多边形边界的次数为奇数时点在多边形内 return (px,py) if flag else 'out' #根据数组下标奇偶数得到点的坐标 def getpoint(a): i = 0 zhima = [] while i < len (a.split( ',' )[ 1 :: 2 ]): zhima.append({ 'x' : float (a.split( ',' )[:: 2 ][i]), 'y' : float (a.split( ',' )[ 1 :: 2 ][i])}) i + = 1 return zhima #根据输入的点循环判断芝麻是否在多边形里面,如果全部在外面则输出no,否则输出芝麻的坐标 def rs(zhima, duobianxing): zm = getpoint(zhima) dbx = getpoint(duobianxing) count = 0 for point in zm: rs = rayCasting(point, dbx) if rs = = 'out' : count + = 1 else : print rs if count = = len (zm): print "no" zhima = "6,4,8,8,9,9" duobianxing = "1,1,7,3,5,7" rs(zhima,duobianxing) |
结果:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步