簡體   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