Python 确定顶点是否位于一组顶点的内部
如何确定一个图形是否位于另一个图形中 我的算法适用于以下矩阵:Python 确定顶点是否位于一组顶点的内部,python,vertex,Python,Vertex,如何确定一个图形是否位于另一个图形中 我的算法适用于以下矩阵: import numpy as np A = np.zeros((9,9)) for i in np.arange(1,8): for j in np.arange(1,8): A[i,j] = 1 for i in np.arange(2,4): for j in np.arange(2,4): A[i,j] = 2 prin
import numpy as np
A = np.zeros((9,9))
for i in np.arange(1,8):
for j in np.arange(1,8):
A[i,j] = 1
for i in np.arange(2,4):
for j in np.arange(2,4):
A[i,j] = 2
print(A)
生成矩阵:
[[-1. -1. -1. -1. -1. -1. -1. -1. -1.]
[-1. 1. 1. 1. 1. 1. 1. 1. -1.]
[-1. 1. 2. 2. 1. 1. 1. 1. -1.]
[-1. 1. 2. 2. 1. 1. 1. 1. -1.]
[-1. 1. 1. 1. 1. 1. 1. 1. -1.]
[-1. 1. 1. 1. 1. 1. 1. 1. -1.]
[-1. 1. 1. 1. 1. 1. 1. 1. -1.]
[-1. 1. 1. 1. 1. 1. 1. 1. -1.]
[-1. -1. -1. -1. -1. -1. -1. -1. -1.]]
要创建两个图形,请执行以下操作:
对于顶点:
V1 = [[(2.0, 1.333333), (1.333333, 3.0), (1.333333, 2.0), (2.0, 3.666667), (3.0, 3.666667), (3.666667, 3.0), (3.666667, 2.0), (3.0, 1.333333)]]
V2 = [[(1.0, 0.5), (0.5, 2.0), (0.5, 1.0), (0.5, 3.0), (0.5, 4.0), (0.5, 5.0), (0.5, 6.0), (0.5, 7.0), (1.0, 7.5), (2.0, 7.5), (3.0, 7.5), (4.0, 7.5), (5.0, 7.5), (6.0, 7.5), (7.0, 7.5), (7.5, 7.0), (7.5, 6.0), (7.5, 5.0), (7.5, 4.0), (7.5, 3.0), (7.5, 2.0), (7.5, 1.0), (7.0, 0.5), (6.0, 0.5), (5.0, 0.5), (4.0, 0.5), (3.0, 0.5), (2.0, 0.5)]]
和边缘列表:
e1 = [[[1.333333, 2.0], [2.0, 1.333333]], [[1.333333, 3.0], [1.333333, 2.0]], [[2.0, 3.666667], [1.333333, 3.0]], [[2.0, 1.333333], [3.0, 1.333333]], [[2.0, 3.666667], [3.0, 3.666667]], [[3.0, 1.333333], [3.666667, 2.0]], [[3.666667, 3.0], [3.666667, 2.0]], [[3.0, 3.666667], [3.666667, 3.0]]]
e2 = [[[0.5, 1.0], [1.0, 0.5]], [[0.5, 2.0], [0.5, 1.0]], [[0.5, 3.0], [0.5, 2.0]], [[0.5, 4.0], [0.5, 3.0]], [[0.5, 5.0], [0.5, 4.0]], [[0.5, 6.0], [0.5, 5.0]], [[0.5, 7.0], [0.5, 6.0]], [[1.0, 7.5], [0.5, 7.0]], [[1.0, 0.5], [2.0, 0.5]], [[1.0, 7.5], [2.0, 7.5]], [[2.0, 0.5], [3.0, 0.5]], [[2.0, 7.5], [3.0, 7.5]], [[3.0, 0.5], [4.0, 0.5]], [[3.0, 7.5], [4.0, 7.5]], [[4.0, 0.5], [5.0, 0.5]], [[4.0, 7.5], [5.0, 7.5]], [[5.0, 0.5], [6.0, 0.5]], [[5.0, 7.5], [6.0, 7.5]], [[6.0, 0.5], [7.0, 0.5]], [[6.0, 7.5], [7.0, 7.5]], [[7.0, 0.5], [7.5, 1.0]], [[7.5, 2.0], [7.5, 1.0]], [[7.5, 3.0], [7.5, 2.0]], [[7.5, 4.0], [7.5, 3.0]], [[7.5, 5.0], [7.5, 4.0]], [[7.5, 6.0], [7.5, 5.0]], [[7.5, 7.0], [7.5,
6.0]], [[7.0, 7.5], [7.5, 7.0]]]
正如Prune所建议的那样,
shapely
包满足了您的需要。虽然你的线环可以被认为是一个图形,但是把它们看作是嵌入在2D平面中的多边形更有用。
通过从点和边段创建Polygon
对象,可以使用contains
方法,所有shapely
对象都必须测试其中一个是否在另一个内部
您需要按顺序对边段进行排序。顺时针或逆时针方向可能无关紧要,因为shapely
可能通过在无限远处构造一个点并确保该点为“外部”来检测内部和外部
下面是一个完整的例子,来自您的帖子的原始正方形对:
from shapely.geometry import Polygon
p1 = Polygon([(0,0), (0,8), (8,8), (8,0)])
p2 = Polygon([(2,2), (2,4), (4,4), (4,2)])
print(p1.contains(p2))
多边形
对象的文档位于
对于
包含的方法,如果第一个图由顶点(0,0)、(0,8)、(8,0)组成,结果会是什么?哪一个顶点是连接的有关系吗?你已经把“图”的两个不同定义混为一谈了。一个是节点和边的网络,这就是networkx
所支持的。您的问题需要的是更常见的笛卡尔平面定义。您需要查找处理形状的算法和支持包--shapely
。如果您的形状足够简单(如正交矩形),请根据和重新发布代码。请参阅我的编辑。我会好好地搜寻。我认为networkx确实适用,因为我有顶点和边。我不熟悉这个模块,也不确定它的全部功能。判断一个点是否在多边形内的一个算法是在该方向(例如水平向右,但任何特定方向都可以)无限远地画一条线(或者,实际上,画到多边形范围外的点)然后查看它与多边形相交的边数:奇数表示该点位于多边形内部。当直线精确通过顶点时,必须进行特殊处理。