繁体   English   中英

Python中的区域交集

[英]Area intersection in Python

我有一个代码,其中使用条件C作为输入,并将我的问题的解决方案计算为(x,y)空间上的“允许区域”A。 该区域由数个“管”组成,由两条永不交叉的线定义。

我要寻找的最终结果必须满足k个条件{C1,..,Ck},因此是k个区域{A1,..,Ak}之间的交点S。

这是一个有2个条件的示例(A1:绿色,3个试管。A2:紫色,1个试管); 溶液S为红色。

输出2种条件的代码

当我处理每个大约10个试管的4个区域时,如何找到S? (最后的情节太糟糕了!)

我需要能够绘制它,并找到平均坐标和S点的方差(每个坐标的方差)。 [如果有一种知道点P是否属于S的有效方法,我将仅使用Monte Carlo方法]。

理想情况下,我还希望能够实现从S中删除的“禁止使用的管道” [这可能比将S与禁止区域的外部相交要复杂得多,因为来自同一区域的两条管道可以交叉(即使定义管的线永不交叉)。


注意:

  • 该代码还存储直线的弧长。

  • 线存储为点阵列(每条线约1000点)。 定义管的两条线不一定具有相同数量的点,但是Python可以根据其弧长在1秒内对所有点进行插值。

  • 这些线是参数函数(即我们不能写y = f(x),因为允许这些线是垂直的)。

  • 用油漆编辑了该图以得到正确的结果...效率不高!


编辑:

  • 我不知道如何在多个交叉点上使用plt.fill_between(我可以在这里针对2个条件进行此操作,但是当需要进行多行眼图判断时,我需要代码来自动执行此操作)。

  • 现在,我只生成这些行。 我没有写任何东西来寻找最终的解决方案,因为我绝对不知道哪种结构最适合此解决方案。 [但是,该代码的先前版本能够找到2条不同管的线之间的交点,并且我打算将它们作为多边形传递给形状,但这隐含了其他一些问题。

  • 我想我不能用sets来做到这一点:以所需的精度扫描整个(x,y)区域代表大约6e8点... [由于步长可变(适应于曲率),这些线只有1e3点。 ,但整个问题都很大]

用Shapely解决问题!

我将每个管定义为Polygon ,区域A是作为其管的并集构建的MultiPolygon对象。

然后, intersection方法计算出我正在寻找的解决方案(所有区域之间的重叠)。

整个过程几乎是瞬时的。 我不知道大型物体的形状是否如此好(每根管大约2000个点,每个区域10个管,4个区域)。

谢谢您的帮助! :)

编辑:

一个有效的例子。

import matplotlib.pyplot as plt
import shapely
from shapely.geometry import Polygon
from descartes import PolygonPatch
import numpy as np

def create_tube(a,height):
    x_tube_up = np.linspace(-4,4,300)
    y_tube_up = a*x_tube_up**2 + height
    x_tube_down = np.flipud(x_tube_up)          #flip for correct definition of polygon
    y_tube_down = np.flipud(y_tube_up - 2)

    points_x = list(x_tube_up) + list(x_tube_down)
    points_y = list(y_tube_up) + list(y_tube_down)

    return Polygon([(points_x[i], points_y[i]) for i in range(600)])

def plot_coords(ax, ob):
    x, y = ob.xy
    ax.plot(x, y, '+', color='grey')


area_1 = Polygon()          #First area, a MultiPolygon object
for h in [-5, 0, 5]:
    area_1 = area_1.union(create_tube(2, h))

area_2 = Polygon()
for h in [8, 13, 18]:
    area_2 = area_2.union(create_tube(-1, h))

solution = area_1.intersection(area_2)      #What I was looking for

##########  PLOT  ##########

fig = plt.figure()
ax = fig.add_subplot(111)

for tube in area_1:
    plot_coords(ax, tube.exterior)
    patch = PolygonPatch(tube, facecolor='g', edgecolor='g', alpha=0.25)
    ax.add_patch(patch)

for tube in area_2:
    plot_coords(ax, tube.exterior)
    patch = PolygonPatch(tube, facecolor='m', edgecolor='m', alpha=0.25)
    ax.add_patch(patch)

for sol in solution:
    plot_coords(ax, sol.exterior)
    patch = PolygonPatch(sol, facecolor='r', edgecolor='r')
    ax.add_patch(patch)

plt.show()

和剧情:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM