python射线法判断一个点在图形区域内外


Posted in Python onJune 28, 2019

用python 实现的代码:判断一个点在图形区域内外,供大家参考,具体内容如下

# -*-encoding:utf-8 -*-
# file:class.py
#
 
"""
信息楼
0 123.425658,41.774177
1 123.425843,41.774166
2 123.425847,41.774119
3 123.42693,41.774062
4 123.426943,41.774099
5 123.427118,41.774089
6 123.427066,41.773548
7 123.426896,41.773544
8 123.426916,41.773920
9 123.425838,41.773965
10 123.425804,41.773585
11 123.425611,41.773595
图书馆
0 123.425649,41.77303
1 123.426656,41.772993
2 123.426611,41.772398
3 123.425605,41.772445
"""
 
 
class Point:
 lat = ''
 lng = ''
 
 def __init__(self,lat,lng):
 self.lat = lat #纬度
 self.lng = lng #经度
 
 def show(self):
 print self.lat," ",self.lng
 
 
#将信息楼的边界点实例化并存储到points1里
point0 = Point(123.425658,41.774177)
point1 = Point(123.425843,41.774166)
point2 = Point(123.425847,41.774119)
point3 = Point(123.42693,41.774062)
point4 = Point(123.426943,41.774099)
point5 = Point(123.427118,41.774089)
point6 = Point(123.427066,41.773548)
point7 = Point(123.426896,41.773544)
point8 = Point(123.426916,41.773920)
point9 = Point(123.425838,41.773961)
point10 = Point(123.425804,41.773585)
point11 = Point(123.425611,41.773595)
 
points1 = [point0,point1,point2,point3,
   point4,point5,point6,point7,
   point8,point9,point10,point11,
  ]
 
 
#将图书馆的边界点实例化并存储到points2里
point0 = Point(123.425649,41.77303)
point1 = Point(123.426656,41.772993)
point2 = Point(123.426611,41.772398)
point3 = Point(123.425605,41.772445)
 
points2 = [point0,point1,point2,point3]
 
 
'''
将points1和points2存储到points里,
points可以作为参数传入
'''
points = [points1,points2]
 
 
'''
输入一个测试点,这个点通过GPS产生
建议输入三个点测试
在信息学馆内的点:123.4263790000,41.7740520000 123.42699,41.773592 
在图书馆内的点: 123.4261550000,41.7726740000 123.42571,41.772499 123.425984,41.772919 
不在二者内的点: 123.4246270000,41.7738130000
在信息学馆外包矩形内,但不在信息学馆中的点:123.4264060000,41.7737860000
'''
#lat = raw_input(please input lat)
#lng = raw_input(please input lng)
lat = 123.42699
lng = 41.773592
point = Point(lat,lng)
 
debug = raw_input("请输入debug")
if debug == '1':
 debug = True
else:
 debug = False
 
#求外包矩形
def getPolygonBounds(points):
 length = len(points)
 #top down left right 都是point类型
 top = down = left = right = points[0]
 for i in range(1,length):
 if points[i].lng > top.lng:
  top = points[i]
 elif points[i].lng < down.lng:
  down = points[i]
 else:
  pass
 if points[i].lat > right.lat:
  right = points[i]
 elif points[i].lat < left.lat:
  left = points[i]
   else:
   pass
 
 point0 = Point(left.lat,top.lng)
 point1 = Point(right.lat,top.lng)
 point2 = Point(right.lat,down.lng)
 point3 = Point(left.lat,down.lng)
 polygonBounds = [point0,point1,point2,point3]
 return polygonBounds
 
#测试求外包矩形的一段函数
if debug:
 poly1 = getPolygonBounds(points[0])
 print "第一个建筑的外包是:"
 for i in range(0,len(poly1)):
 poly1[i].show() 
 poly2 = getPolygonBounds(points[1])
 print "第二个建筑的外包是:"
 for i in range(0,len(poly2)):
 poly2[i].show() 
 
 
#判断点是否在外包矩形外
def isPointInRect(point,polygonBounds):
 if point.lng >= polygonBounds[3].lng and \
  point.lng <= polygonBounds[0].lng and \
  point.lat >= polygonBounds[3].lat and \
  point.lat <= polygonBounds[2].lat:\
  return True
 else:
 return False
 
#测试是否在外包矩形外的代码
if debug:
 if(isPointInRect(point,poly1)):
 print "在信息外包矩形内"
 else:
 print "在信息外包矩形外"
 
 if(isPointInRect(point,poly2)):
 print "在图书馆外包矩形内"
 else:
 print "在图书馆外包矩形外"
 
 
 
#采用射线法,计算测试点是否任意一个建筑内
def isPointInPolygon(point,points):
 #定义在边界上或者在顶点都建筑内
 Bound = Vertex = True
 count = 0
 precision = 2e-10
 
 #首先求外包矩形
 polygonBounds = getPolygonBounds(points)
 
 #然后判断是否在外包矩形内,如果不在,直接返回false
 if not isPointInRect(point, polygonBounds):
 if debug:
  print "在外包矩形外"
 return False
 else:
 if debug:
  print "在外包矩形内"
 
 length = len(points)
 p = point
 p1 = points[0]
 for i in range(1,length):
 if p.lng == p1.lng and p.lat == p1.lat:
  if debug:
  print "Vertex1"
  return Vertex
 
 p2 = points[i % length]
 if p.lng == p2.lng and p.lat == p2.lat:
  if dubug:
  print "Vertex2"
  return Vertex
 
 if debug: 
  print i-1,i
  print "p:"
  p.show()
  print "p1:"
  p1.show()
  print "p2:"
  p2.show()
 
 if p.lng < min(p1.lng,p2.lng) or \
  p.lng > max(p1.lng,p2.lng) or \
  p.lat > max(p1.lat,p2.lat): 
  p1 = p2
  if debug:
  print "Outside"
  continue
 
 elif p.lng > min(p1.lng,p2.lng) and \
  p.lng < max(p1.lng,p2.lng):
  if p1.lat == p2.lat:
  if p.lat == p1.lat and \
   p.lng > min(p1.lng,p2.lng) and \
   p.lng < max(p1.lng,p2.lng):
   return Bound
  else:
   count = count + 1
   if debug:
   print "count1:",count
   continue
  if debug:
  print "into left or right"   
 
  a = p2.lng - p1.lng
  b = p1.lat - p2.lat
  c = p2.lat * p1.lng - p1.lat * p2.lng
  d = a * p.lat + b * p.lng + c
  if p1.lng < p2.lng and p1.lat > p2.lat or \
   p1.lng < p2.lng and p1.lat < p2.lat: 
  if d < 0:
   count = count + 1
   if debug:
   print "count2:",count
  elif d > 0:
   p1 = p2
   continue
  elif abs(p.lng-d) < precision :
   return Bound
  else :    
  if d < 0:
   p1 = p2
   continue
  elif d > 0:
   count = count + 1
   if debug:
   print "count3:",count
  elif abs(p.lng-d) < precision :
   return Bound
 else:
  if p1.lng == p2.lng:
  if p.lng == p1.lng and \
   p.lat > min(p1.lat,p2.lat) and \
   p.lat < max(p1.lat,p2.lat):
    return Bound
  else:
  p3 = points[(i+1) % length]
  if p.lng < min(p1.lng,p3.lng) or \
   p.lng > max(p1.lng,p3.lng):
   count = count + 2
   if debug:
   print "count4:",count
  else:
   count = count + 1
   if debug:
   print "count5:",count 
 p1 = p2
 if count % 2 == 0 :
 return False
 else :
 return True
 
 
 
length = len(points)
flag = 0
for i in range(length):
 if isPointInPolygon(point,points[i]):
 print "你刚才输入的点在第 %d 个建筑里" % (i+1)
 print "然后根据i值,可以读出建筑名,或者修改传入的points参数"
 break
 else:
 flag = flag + 1
 
if flag == length:
 print "在头 %d 建筑外" % (i+1)

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程中的文件操作攻略
Oct 16 Python
python版本的读写锁操作方法
Apr 25 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
详解Python中的四种队列
May 21 Python
python读取LMDB中图像的方法
Jul 02 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
Python的UTC时间转换讲解
Feb 26 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
pytorch实现手写数字图片识别
May 20 Python
Python实现视频中添加音频工具详解
Dec 06 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 #Python
如何使用Python 打印各种三角形
Jun 28 #Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 #Python
python 列表转为字典的两个小方法(小结)
Jun 28 #Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 #Python
使用Python画股票的K线图的方法步骤
Jun 28 #Python
连接pandas以及数组转pandas的方法
Jun 28 #Python
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
thinkphp配置文件路径的实现方法
2016/08/30 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
Js切换功能的简单方法
2010/11/23 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
js charAt的使用示例
2014/02/18 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Python之循环结构
2019/01/15 Python
python实现对输入的密文加密
2019/03/20 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
法律专业个人实习自我鉴定
2013/09/23 职场文书
战友聚会邀请函
2014/01/18 职场文书
简单的辞职信范文
2014/01/18 职场文书
学生安全责任书范本
2014/07/24 职场文书
领导欢迎词致辞
2015/01/23 职场文书
运动会报道稿大全
2015/07/23 职场文书
2019各种承诺书范文
2019/06/24 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python