[python][原创]判断2个多边形是不是重叠

代码适合矩形或者多边形是不是和另一个多边形有重叠

from shapely.geometry import Point, LineString
from shapely.geometry import Polygon,MultiPoint  #多边形
import matplotlib.pyplot as plt
point = Point(4, 4)
poly1 =Polygon([(0, 0), (1,1),(2, 0), (2, 2), (0, 2)])
poly = Polygon([(0, 0), (2,2),(3, 0), (3, 3), (0, 3)])
print(poly.area)
print(poly.intersects(poly1))
ax = plt.gca()                                 #获取到当前坐标轴信息
ax.xaxis.set_ticks_position('top')   #将X坐标轴移到上面
ax.invert_yaxis()                            #反转Y坐标轴
plt.plot(*poly.exterior.xy)
plt.plot(*poly1.exterior.xy)
plt.show()
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
判断两个多边形是否重叠,可以采用SAT(Seperating Axis Theorem) 分离轴定理的方法,该方法适用于判断任意形状的多边形是否重叠。以下是Python代码示例: ```python def overlap_polygons(p1, p2): """ 判断两个多边形是否重叠 :param p1: 第一个多边形的顶点坐标,格式为 [(x1, y1), (x2, y2), ...] :param p2: 第二个多边形的顶点坐标,格式为 [(x1, y1), (x2, y2), ...] :return: 如果两个多边形重叠,则返回 True,否则返回 False """ def get_projected_axis(poly): """ 获取多边形在投影轴上的投影 """ axes = [] for i in range(len(poly)): p1 = poly[i] p2 = poly[(i+1)%len(poly)] edge = (p1[1] - p2[1], p2[0] - p1[0]) length = (edge[0]**2 + edge[1]**2)**0.5 axis = (edge[0]/length, edge[1]/length) axes.append(axis) return axes def get_projection(poly, axis): """ 获取多边形在投影轴上的投影区域 """ min_p = max_p = sum_p = dot_product(poly[0], axis) for p in poly[1:]: projection = dot_product(p, axis) sum_p += projection if projection < min_p: min_p = projection elif projection > max_p: max_p = projection return (min_p, max_p, sum_p / len(poly)) def dot_product(p, axis): """ 计算点和向量之间的点积 """ return p[0]*axis[0] + p[1]*axis[1] def overlap_on_axis(poly1, poly2, axis): """ 判断两个多边形在某个投影轴上的投影是否重叠 """ p1_min, p1_max, p1_avg = get_projection(poly1, axis) p2_min, p2_max, p2_avg = get_projection(poly2, axis) overlap = max(p1_min, p2_min) <= min(p1_max, p2_max) if overlap: return max(p1_avg, p2_avg) - min(p1_avg, p2_avg) else: return 0 axes = get_projected_axis(p1) + get_projected_axis(p2) for axis in axes: overlap = overlap_on_axis(p1, p2, axis) if overlap == 0: return False return True ``` 以上代码只是示例,实际应用时需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值