Python 中的区域交集

2023-11-27

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

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

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

Output of the code for 2 conditions

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

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

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


Note:

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

  • 这些线存储为点数组(每条线大约 1000 个点)。定义管子的两条线不一定具有相同数量的点,但 Python 可以在 1 秒内将所有这些线作为其弧长的函数进行插值。

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

  • 使用绘图编辑绘图以获得右侧的结果...效率不高!


Edit:

  • 我不知道如何使用 plt.fill_ Between 进行多重交叉(我可以在此处执行两个条件,但当眼睛判断的行太多时,我需要代码自动执行此操作)。

  • 现在我只是生成线条。我没有写任何东西来寻找最终的解决方案,因为我绝对不知道哪种结构最适合这个。 [但是,以前版本的代码能够找到两个不同管子的线之间的交点,我计划将它们作为多边形传递给 shapely,但这意味着其他几个问题..]

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


问题用Shapely解决了!

我将每个管子定义为Polygon,面积 A 是MultiPolygon作为其管子的联合而构建的对象。

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

整个事情几乎是瞬间发生的。我不知道 Shapely 对于大型物体如此有效 [每管大约 2000 个点,每个区域 10 个管,4 个区域]。

感谢您的帮助! :)

Edit:

一个工作示例。

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()

和情节:

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的区域交集 的相关文章

随机推荐

  • QT 5.0 QDebug编译错误

    我在使用 QDebug 编译代码时遇到问题 但我确实需要它 include
  • PHP 获取静态方法

    我想通过 var 调用类方法 如下所示 var read params array some parameter if MyClass has the static method var echo MyClass var params el
  • Zod Schema Validation 中至少一个/最少一个字段

    我已经使用 JOI 实现了此代码 其中用户必须发送 userId 和正文中的至少一个键 如何使用 ZOD 实现相同的功能 params Joi object keys userId Joi required custom objectId
  • 浅拷贝还是深拷贝?

    我对这两种将一个对象复制到另一个对象的方法有点陌生 我很困惑 无法找出深层复制和浅层复制之间的主要区别 我已经了解了很多关于此的理论 但我需要用适当的例子进行解释 我有一个程序 可以将一个对象复制到另一个对象中 gt class A pub
  • 计算两个日期间隔之间每月的天数

    我有一组事件 每个事件都有开始日期和结束日期 但它们发生的时间跨度为几个月 我想创建一个表格来显示每个月此事件的天数 我有下面的例子 event start date lt as Date 23 10 2012 d m Y event en
  • 上下文版本冲突错误,Google colab

    我正在尝试在 Google colab 上安装并运行 sunpy 它需要 astropy 版本 3 1 或更高版本的软件包 即使在安装 astropy 版本 3 2 1 后 当我导入 sunpy 时 它也会出现以下错误 Contextual
  • Android Activity 的唯一 ID

    我需要获取 Android 活动实例的唯一 ID 我想获取activitymanager在日志中写入的字符串 例如 ActivityManager HistoryRecord的活动暂停超时 450495a0 但我不知道如何得到它 有人知道我
  • 如何从 PHP 压缩或转换为低质量 MP3 文件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何 PHP 库或函数可以将 MP3 文件转换为较低质量 我想通过 PHP 将 128Kbps 或更高质量的 MP3 文件压缩 转换为 64K
  • Javascript:console.log 到 html

    我想将 console log 输出写入 div 层 例如 document write console log 5 1 Incorrect random example 有人可以解决我的问题吗 谢谢 EDIT 我的意思是 例如 conso
  • Passport-local mongoose node.js 支持多种用户类型

    我想要两种类型的用户登录 用户 客户端 我到底如何在 app js 中为这两种类型创建 localStrategies 序列化和反序列化用户 我有两个单独的模式 都使用 PassportLocalMongoose 插件 我目前配置我的护照如
  • 在 Android 中按主页按钮后应用程序被杀死时未打开主活动

    在我的应用程序中 活动 A 是启动器活动 从 A 称为 B 从 B 称为 C 我有超过 5 个活动 在 C 中 当我按下主页按钮 并再次打开我的应用程序时 它会打开 C 这对我来说没问题 但是在按下 C 中的主页按钮后 当它空闲一段时间并且
  • System.exit(0) 没有关闭我的所有活动? [复制]

    这个问题在这里已经有答案了 我有 2 个活动 因此活动 1 转到活动 2 然后在活动 2 上我有一个退出按钮 但是当我点击它时 它只退出了活动2并再次返回到活动1 基本上感觉就像我刚刚再次启动应用程序一样 我不知道为什么 这是我的代码 Bu
  • 在两个 WAR 之间共享应用程序上下文?

    有没有办法在两个部署的战争之间共享应用程序上下文 一场战争需要连接另一场战争的服务 我不知道从哪里开始 我们的团队有相同的要求 在 Tomcat 中的多个 WAR 之间共享 Spring bean 老实说 诸如 不要这样做 之类的答案没有帮
  • 张量流:使用队列运行器有效地馈送评估/训练数据

    我正在尝试运行张量流图来训练模型并使用单独的评估数据集定期进行评估 训练和评估数据都是使用队列运行器实现的 我当前的解决方案是在同一个图中创建两个输入并使用tf cond依赖于一个is training占位符 我的问题通过以下代码突出显示
  • 如何从命令提示符使用 mysqldump 添加日期和时间以及备份文件名称并定义备份文件的路径

    我使用此命令从 mysqldump 进行备份 mysqldump uroot ptrackerdb alldatabases gt test sql 现在我想用我的备份文件添加日期时间 例如当前日期和时间 例如 test 25July201
  • 常见的 Haskell 运算符有可发音的名称吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我正在阅读为大善而学 Haskell 而且我从来不知道 Haskell 运算符
  • ElementClickInterceptedException:消息:元素单击被拦截:元素

    我试图单击 所有主题 和 所有状态 复选框 然后搜索结果 当我运行脚本时 会打开一个大小为 1036x674 的 Chrome 窗口 如果我不理会窗口 则会出现元素单击拦截错误 如果我最小化或最大化窗口 我的脚本就可以正常工作 我正在使用
  • 如何在 python 中的活动连接上启动 TLS?

    以下是我当前在端口 587 上连接到 gmail 的 smtp 服务器的代码 发出 STARTTLS 命令后 我如何完成 TLS 会话协商并开始发出 AUTH LOGIN 和 MAIL FROM 等命令 我省略了 Base64 编码的 gm
  • TestCoroutineDispatcher 和 TestCoroutineScope 均不处理协程测试异常

    使用这个manual测试协程 编写预期抛出异常的测试会导致崩溃 而不是通过测试 我想知道我做错了什么 private val testDispatcher TestCoroutineDispatcher Before fun setup p
  • Python 中的区域交集

    我有一个代码 它采用条件 C 作为输入 并将问题的解决方案计算为 x y 空间上的 允许区域 A 该区域由多个 管 组成 这些 管 由两条永远不会交叉的线定义 我要寻找的最终结果必须满足 k 个条件 C1 Ck 因此是 k 个区域 A1 A