python实现
思路参考:https://bbs.csdn.net/topics/391070188
思路:判断多边形、线段是否和另一多边形相交,可先判断他们的控制矩形是否相交。然后再做点是否在多边形中的判断。【多边形的控制矩形,即能围住多边形的最小矩形。】
当矩形的边与多边形的顶点相交的时刻,不记为两图形相交。
可用的测试代码如下:
# !/usr/bin/python3.6
# --coding:utf-8--
# 多边形座标值
lsP = [(238, 204), (1079, 216), (1201, 662), (499, 649), (138, 469)]
polygon_x_max, polygon_x_min, y_temp = max(lsP)[0], min(lsP)[0], [i[1] for i in lsP]
polygon_y_max, polygon_y_min = max(y_temp), min(y_temp)
# 矩形座标值
rectangle_x_max, rectangle_x_min = 1117, 785
rectangle_y_max, rectangle_y_min = 716, 366
rectangle_points = [[rectangle_x_min, rectangle_y_min], [rectangle_x_max, rectangle_y_min], [rectangle_x_min, rectangle_y_max], [rectangle_x_max, rectangle_y_max]]
oddNodes = False
# 判断矩形与多边形控制矩形是否相交
# for point in rectangle_points:
if (polygon_x_min < rectangle_x_max < polygon_x_max or polygon_x_min < rectangle_x_min < polygon_x_max) and (polygon_y_min < rectangle_y_min < polygon_y_max or polygon_y_min < rectangle_y_max < polygon_y_max):
# 判断矩形顶点与多边形边的关系
for point in rectangle_points:
x, y = point[0], point[1]
j = len(lsP) - 1
for i in range(len(lsP)):
if lsP[i][1] < y < lsP[j][1] or lsP[j][1] < y < lsP[i][1] and x >= lsP[i][0] or x >= lsP[j][0]:
if (lsP[i][0] + (y - lsP[i][1]) / (lsP[j][1] - lsP[i][1]) * (lsP[j][0] - lsP[i][0]))<x:
oddNodes = True
j = i
print(oddNodes)
最后一个if判断的思路,利用两个三角形的比例关系求出交点在起点的左边还是右边;用图去理解如下。
这是我看到别人博客画的很优秀的图,顺手复制过来的,哈哈…
别人博客:https://www.jianshu.com/p/ba03c600a557
如果有其他好的想法,还请不吝赐教~