python求图形面积_求高效的,计算两多边形重叠面积的算法,python实现
[Asm] 纯文本查看 复制代码import random
import time
from sympy.geometry import *
import numpy as np
from scipy import stats
def polygon_over_area(obj_a, obj_b):
p_a = obj_a # sympy.geometry.Polygon
p_b = obj_b
x_obj = p_a.intersection(p_b)
if not x_obj:
if p_b.encloses_point(p_a.vertices[0]):
return p_a.area
if p_a.encloses_point(p_b.vertices[0]):
return p_b.area
return 0
x_point = []
segment_list = []
for item in x_obj:
if isinstance(item, Point):
x_point.append(item)
elif isinstance(item, Segment):
for p in item.points:
if p in x_point:
x_point.remove(p)
else:
x_point.append(p)
segment_list.append(item)
region = []
a_point_in_b = []
for v in p_a.vertices:
if p_b.encloses_point(v):
a_point_in_b.append(v)
b_point_in_a = []
for v in p_b.vertices:
if p_a.encloses_point(v):
b_point_in_a.append(v)
new_region_point = a_point_in_b + b_point_in_a + x_point
over_area = 0
while 1:
if segment_list:
while 1:
if not segment_list:
select_segment = None
break
select_segment = segment_list.pop()
verify_point = select_segment.points[0]
point_segment = select_segment
need_continue = False
while 1:
if verify_point not in x_point:
for segment in segment_list:
if segment == point_segment:
continue
if segment.contains(verify_point):
point_segment = segment
if segment.points[1] == verify_point:
verify_point = segment.points[0]
else:
verify_point = segment.points[1]
break
else:
need_continue = True
break
else:
break
if need_continue:
continue
for side in p_a.sides:
if not side.contains(select_segment.points[0]):
continue
if not side.contains(select_segment.points[1]):
continue
a_side = side
break
else:
raise ValueError
for side in p_b.sides:
if not side.contains(select_segment.points[0]):
continue
if not side.contains(select_segment.points[1]):
continue
b_side = side
break
else:
raise ValueError
v_a = a_side.points[1] - a_side.points[0]
v_b = b_side.points[1] - b_side.points[0]
if (v_a[0] * v_b[0] < 0) or (v_a[1] * v_b[1] < 0):
continue
if select_segment.points[0] == a_side.points[1]:
end_point = a_side.points[1]
elif select_segment.points[0] == b_side.points[1]:
end_point = b_side.points[1]
elif select_segment.points[1] == a_side.points[1]:
end_point = a_side.points[1]
elif select_segment.points[1] == b_side.points[1]:
end_point = b_side.points[1]
else:
raise ValueError
while 1:
for segment in segment_list:
if segment.contains(end_point):
end_point = segment.points[0] if end_point == segment.points[1] else segment.points[1]
segment_list.remove(segment)
break
else:
break
point_line_a = []
point_line_b = []
for side in p_a.sides:
if side.contains(end_point):
point_line_a.append(side)
for side in p_b.sides:
if side.contains(end_point):
point_line_b.append(side)
if len(point_line_a) == 2:
if len(point_line_b) != 1:
raise ValueError
select_inner_point = end_point
select_polygon = p_a
next_polygon = p_b
break
elif len(point_line_b) == 2:
if len(point_line_a) != 1:
raise ValueError
select_inner_point = end_point
select_polygon = p_b
next_polygon = p_a
break
else:
raise ValueError
if not select_segment:
continue
elif a_point_in_b:
select_inner_point = a_point_in_b.pop()
select_polygon = p_a
next_polygon = p_b
elif b_point_in_a:
select_inner_point = b_point_in_a.pop()
select_polygon = p_b
next_polygon = p_a
else:
break
new_region_points = [select_inner_point]
while 1:
for side in select_polygon.sides:
if side.contains(select_inner_point) and side.points[1] != select_inner_point:
select_side = Segment(select_inner_point, side.points[1])
break
else:
raise ValueError
x_p_list = []
for x_p in x_point:
if select_side.contains(x_p):
if select_inner_point == x_p:
continue
x_p_list.append(x_p)
if x_p_list:
area = select_inner_point.distance(x_p_list[0])
next_point = x_p_list[0]
for x_p in x_p_list:
if 0 < select_inner_point.distance(x_p) < area:
area = select_inner_point.distance(x_p)
next_point = x_p
select_inner_point = next_point
x_point.remove(next_point)
select_polygon, next_polygon = next_polygon, select_polygon
else:
select_inner_point = select_side.points[1]
if select_inner_point in a_point_in_b:
a_point_in_b.remove(select_inner_point)
if select_inner_point in b_point_in_a:
b_point_in_a.remove(select_inner_point)
if select_inner_point in new_region_points:
over_area += Polygon(*new_region_points).area
break
else:
new_region_points.append(select_inner_point)
return over_area
python求图形面积_求高效的,计算两多边形重叠面积的算法,python实现相关推荐
- java 编程求图形面积_求java编程,计算长方形面积?
求java编程,计算长方形面积? mip版 关注:195 答案:2 悬赏:0 解决时间 2021-01-28 06:47 已解决 2021-01-27 08:26 求java编程,计算长方形面积 ...
- 凸多边形面积_C++计算任意多边形的面积
任意多边形的面积计算_拾忆楓灵的博客-CSDN博客blog.csdn.net 计算任意多边形的面积 - tenos - 博客园www.cnblogs.com 完美解决计算3D空间任意多边形面积_S ...
- 计算任意多边形的面积
转载自 对于凸多边形,很容易计算,如下图,以多边形的某一点为顶点,将其划分成几个三角形,计算这些三角形的面积,然后加起来即可.已知三角形顶点坐标,三角形面积可以利用向量的叉乘来计算. 对于凹多边形,如 ...
- 计算任意多边形的面积(Android)
需求 线段:算出地图上线段的实际长度 面积:算出地图上不规则多边形的实际面积 解决方案 1.线段的实际长度 直接使用高德的AMapUtils.calculateLineDistance(latLng, ...
- python自定义函数求差_[VBA]发布一个计算桩号之差的Excel自定义函数(VBA)
这是一个可以计算桩号之差(也就是得到长度)的Excel(或WPS)扩展函数,可以减少工程师在统计工程量时的工作量. 该函数具有一定的通用性.可以在MS Office和金山WPS上使用. 文末会给出使用 ...
- python求图形面积_如何使用python语言中的if语句实现求取图形面积
在python设计语言中,逻辑运算符和判断语句结合起来使用,可以实现不同的功能.一般情况下,如果知道三角形的三边,可以利用三边计算出它的面积:规范的四边形知道对角的两边,就可以计算出对应的面积.下面利 ...
- python log函数_求你别再花大价钱学 Python 之爬虫实战
引子 Python 基本概念 Python 优势和劣势 优势 Python 的劣势 Python 安装设置 Python 基本语法 程序例子 Python 基本语法 Python 爬虫实现 爬虫相关 ...
- 生物信息学python书籍推荐_求一份学习生物信息学的书单?
看起来你们组不做种群,不做进化,不做系统生物学,可能只是用组学手段为实验方法打打基础. 关于编程,推荐四本书: python学习手册(最基本,不用多说) 编写高质量代码 改善Python程序的91个建 ...
- c语言迭代法求平方根_求平方根问题 (C++ 实现)
下面是用二分法和牛顿迭代法求一个正数的平方根. 二分法 这里的题目稍微宽了一点点,包含了整数和小数的情况,这里二分法就不用多说了,如果中间值的平方与目标值在误差范围内,则返回,否则根据大小情况改变左/ ...
最新文章
- java 获取绝对路径
- 空值排序(oracle/sqlserver)
- (62)时钟中断切换线程,时间片管理, KiDispatchInterrupt
- 卡尺测量的最小范围_不知道这四大基本原则,你还有脸在测量圈混?
- oracle块空间的使用,Oracle管理存储架构(二)--Oracle管理数据块空间
- [Java基础][Java]toString()方法
- HTML中如何给HTML元素添加事件
- 机器人也开始怕疼了?科学家开发无需人工干预即可自愈的机器人
- ajax的content-download时间过慢问题的解决与思考
- pandas object格式转float64格式
- 主引导扇区(MBR)释疑
- 康托展开逆展开算法笔记
- 跨境erp系统功能分析
- linux下系统中的文件传输
- Jenkins的制品管理
- 2440裸机-14-中断与异常
- C++/MFC 面试题(一)
- Google Earth网页版初探
- 2021Vivo千镜杯
- 分支定界法 python_分支定界法
热门文章
- Nacos服务发现控制台预览
- Veeam 发布 2022 年数据保护趋势报告,开发者需关注哪些点?
- 快速搭建实验环境:使用 Terraform 部署 Proxmox 虚拟机
- 全网最详细TCP参数讲解,再也不用担心没有面试机会了......
- 寻找榜样的力量!CSDN【百万人学 AI】评选活动重磅启动
- 如何打通“鱼塘” ?腾讯启动“SaaS技术联盟” 共建技术中台
- Facebook隐私泄露事件继续发酵,黑客明码标价出售聊天信息
- 万字长文|深度剖析Service Mesh服务网格新生代Istio
- call() , apply() ,bind()的用法
- android tab 切换动画,Android之ViewPager+TabLayout组合实现导航条切换效果(微信和QQ底部多标签切换)...