Return 如果直线与多边形相交,则为布尔值
Return a Boolean if Line intersects a Polygon
如何让我的行列表 return 成为布尔值列表,当它们与多边形相交时,不显示 return 为真值的行?
目前我的代码绘制了一条从原点 (0,0) 到 XY 笛卡尔平面上所有点的线。我希望能够使与多边形 return 相交的线成为布尔值。这有望让我不显示 return 为真值的行。
即
IF Lineintersection == True:
不显示线
别的:
显示行
origin = [0,0]
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import LineString
from shapely.geometry import Point, Polygon
import descartes
quality = 7
x = np.linspace(-1,1,quality)
y = np.linspace(-1,1,quality)
X,Y = np.meshgrid(x,y)
polycoords = [[-1, 1], [-1, 0.5], [0, 0.5], [0, 1]]
clip_poly = shapely.geometry.Polygon(polycoords)
positions = np.vstack([Y.ravel(), X.ravel()])
#plt.scatter(*positions[::-1])
fig = plt.figure()
ax = fig.add_subplot(111)
for i in range(len(positions)):
for j in range(len(positions[i])):
plt.scatter(*positions[::-1])
x1 = positions[0][j]
y1 = positions[1][j]
line = LineString([origin, (x1, y1)])
x2, y2 = line.xy
lines = plt.plot(0, 0, x2, y2, color='green', linewidth=1, solid_capstyle='round')
polygon = Polygon(polycoords)
polygonbuilding = ax.add_patch(descartes.PolygonPatch(clip_poly, fc='pink', alpha=0.3))
plt.show()
Result from above code
我想您可以通过从两个 for
循环中删除多边形创建来简化您的代码,例如通过在创建线之前创建多边形(另外请注意,您在您的原始代码,一次在 clip_poly
变量中,一次在 polygon
变量中)。
然后您将能够调用您正在处理的几何对象的 intersects
方法(此处为 polygon
和 line
)。
我将你的两个 for
循环简化为一个循环,直接解包 x1
和 y1
坐标(我还将 plt.scatter
调用移到了循环之外):
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import LineString
from shapely.geometry import Point, Polygon
import descartes
origin = [0,0]
quality = 7
x = np.linspace(-1,1,quality)
y = np.linspace(-1,1,quality)
X,Y = np.meshgrid(x,y)
polycoords = [[-1, 1], [-1, 0.5], [0, 0.5], [0, 1]]
positions = np.vstack([Y.ravel(), X.ravel()])
fig = plt.figure()
ax = fig.add_subplot(111)
polygon = Polygon(polycoords)
polygonbuilding = ax.add_patch(
descartes.PolygonPatch(polygon, fc='pink', alpha=0.3))
plt.scatter(*positions[::-1])
for x1, y1 in positions.T:
line = LineString([origin, (x1, y1)])
if not polygon.intersects(line): # <- the condition you were looking for
x2, y2 = line.xy
plt.plot(0, 0, x2, y2, color='green', linewidth=1, solid_capstyle='round')
plt.show()
如何让我的行列表 return 成为布尔值列表,当它们与多边形相交时,不显示 return 为真值的行?
目前我的代码绘制了一条从原点 (0,0) 到 XY 笛卡尔平面上所有点的线。我希望能够使与多边形 return 相交的线成为布尔值。这有望让我不显示 return 为真值的行。
即 IF Lineintersection == True: 不显示线 别的: 显示行
origin = [0,0]
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import LineString
from shapely.geometry import Point, Polygon
import descartes
quality = 7
x = np.linspace(-1,1,quality)
y = np.linspace(-1,1,quality)
X,Y = np.meshgrid(x,y)
polycoords = [[-1, 1], [-1, 0.5], [0, 0.5], [0, 1]]
clip_poly = shapely.geometry.Polygon(polycoords)
positions = np.vstack([Y.ravel(), X.ravel()])
#plt.scatter(*positions[::-1])
fig = plt.figure()
ax = fig.add_subplot(111)
for i in range(len(positions)):
for j in range(len(positions[i])):
plt.scatter(*positions[::-1])
x1 = positions[0][j]
y1 = positions[1][j]
line = LineString([origin, (x1, y1)])
x2, y2 = line.xy
lines = plt.plot(0, 0, x2, y2, color='green', linewidth=1, solid_capstyle='round')
polygon = Polygon(polycoords)
polygonbuilding = ax.add_patch(descartes.PolygonPatch(clip_poly, fc='pink', alpha=0.3))
plt.show()
Result from above code
我想您可以通过从两个 for
循环中删除多边形创建来简化您的代码,例如通过在创建线之前创建多边形(另外请注意,您在您的原始代码,一次在 clip_poly
变量中,一次在 polygon
变量中)。
然后您将能够调用您正在处理的几何对象的 intersects
方法(此处为 polygon
和 line
)。
我将你的两个 for
循环简化为一个循环,直接解包 x1
和 y1
坐标(我还将 plt.scatter
调用移到了循环之外):
import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import LineString
from shapely.geometry import Point, Polygon
import descartes
origin = [0,0]
quality = 7
x = np.linspace(-1,1,quality)
y = np.linspace(-1,1,quality)
X,Y = np.meshgrid(x,y)
polycoords = [[-1, 1], [-1, 0.5], [0, 0.5], [0, 1]]
positions = np.vstack([Y.ravel(), X.ravel()])
fig = plt.figure()
ax = fig.add_subplot(111)
polygon = Polygon(polycoords)
polygonbuilding = ax.add_patch(
descartes.PolygonPatch(polygon, fc='pink', alpha=0.3))
plt.scatter(*positions[::-1])
for x1, y1 in positions.T:
line = LineString([origin, (x1, y1)])
if not polygon.intersects(line): # <- the condition you were looking for
x2, y2 = line.xy
plt.plot(0, 0, x2, y2, color='green', linewidth=1, solid_capstyle='round')
plt.show()