使用 scipy 数值积分计算 3d 形状的体积

2024-01-06

我已经编写了一个用于计算立方体和半空间相交体积的函数,现在我正在为其编写测试。

我尝试像这样以数字方式计算体积:

integral = scipy.integrate.tplquad(lambda z, y, x: int(Vector(x, y, z).dot(normal) < distance),
                                   -0.5, 0.5,
                                   lambda x: -0.5, lambda x: 0.5,
                                   lambda x, y: -0.5, lambda x, y: 0.5,
                                   epsabs=1e-5,
                                   epsrel=1e-5)

...基本上我对整个立方体进行积分,每个点根据它是否位于半空间内而获得值 1 或 0。 这变得非常慢(每次调用超过几秒)并且不断向我发出警告,例如

scipy.integrate.quadpack.IntegrationWarning: The integral is probably divergent, or slowly convergent

有没有更好的方法来计算这个体积?


特征函数的积分在数学上是正确的,但不实用。这是因为大多数集成方案旨在集成多项式在某种程度上确实如此,因此所有“相对平稳”的功能都相当好。然而,特征函数一点也不平滑。多项式式的积分不会有任何结果。

更适合的方法是首先构建域的离散版本,然后简单地总结小四面体的体积。

3D 离散化可以通过以下方式完成皮加尔网格 https://github.com/nschloe/pygalmesh(矿井接口项目CGAL https://www.cgal.org/)。下面的代码将截止立方体离散化为

您可以通过减少来提高精度max_cell_circumradius and/or max_edge_size_at_feature_edges,但是网格划分将需要更长的时间。此外,您可以指定“特征边”来准确解析相交边。即使像元尺寸最粗,这也会给您带来完全正确的结果。

import pygalmesh
import numpy


c = pygalmesh.Cuboid([0, 0, 0], [1, 1, 1])
h = pygalmesh.HalfSpace([1.0, 2.0, 3.0], 4.0, 10.0)
u = pygalmesh.Intersection([c, h])
mesh = pygalmesh.generate_mesh(
    u, max_cell_circumradius=3.0e-2, max_edge_size_at_feature_edges=1.0e-2
)


def compute_tet_volumes(vertices, tets):
    cell_coords = vertices[tets]
    a = cell_coords[:, 1, :] - cell_coords[:, 0, :]
    b = cell_coords[:, 2, :] - cell_coords[:, 0, :]
    c = cell_coords[:, 3, :] - cell_coords[:, 0, :]
    # omega = <a, b x c>
    omega = numpy.einsum("ij,ij->i", a, numpy.cross(b, c))
    # https://en.wikipedia.org/wiki/Tetrahedron#Volume
    return abs(omega) / 6.0

vol = numpy.sum(compute_tet_volumes(mesh.points, mesh.get_cells_type("tetra")))
print(f"{vol:.8e}")
8.04956436e-01
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 scipy 数值积分计算 3d 形状的体积 的相关文章

  • 哪种算法可以有效地找到路径一定距离内的一组点?

    给定一组点s 一组 x y 坐标 和由连接一组点的线段组成的路径l 描述一种有效的算法 可用于从s在指定距离内d路径的l 其实际应用可能是查找沿城市之间的公路旅行路径 10 英里内任意位置的餐馆列表 For example in the f
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram
  • 将多边形“对齐”在一起

    我有一组代表行政区的多边形 这些区域是手工数字化的 多边形之间有很小的空间 多边形之间应该接触 可能还有重叠的多边形 如何让多边形对齐在一起 填充间隙并消除重叠 首选 QGIS ArcGIS 或 Python 库解决方案 但欢迎算法建议 我
  • 如何有效地从 loadmat 函数生成的嵌套 numpy 数组中提取值?

    python中是否有更有效的方法从嵌套的python列表中提取数据 例如A array array 12000000 dtype object 我一直在使用A 0 0 0 0 当你有很多像 A 这样的数据时 这似乎不是一个有效的方法 我也用
  • 是否可以将 cython 函数作为参数传递给 scipy 函数?

    Scipy 有许多函数接受 python 可调用来执行某些操作 特别是 我正在使用数学优化函数scipy optimize leastsq接受 Python 可调用作为目标函数参数 该目标函数可以通过以下方式调用leastsq在最小化过程中
  • 二维空间中的重叠线段

    我需要找出两条线是否相互重叠 如果两条线平行 我有返回 0 的交集代码 但接下来我需要知道这两条平行线是否重叠 Edit A C B D 1号线 A B 2号线 C D 我需要确定第 1 行是否与第 2 行重叠 但两条线的斜率都可以 gt
  • 内部有图像的 CSS 响应式圆圈

    蓝色div有固定的高度和响应宽度 里面应该有一个相同高度的圆形图像 这是我尝试过的 https jsfiddle net xnkkrhnt 1 https jsfiddle net xnkkrhnt 1 如何使完美的中心圆始终为蓝色 div
  • 如何将时间间隔划分为不同长度的部分?

    我有一个从 0 到t 我想把这个区间分成一个以2 25 2 25 1 5为周期的累积序列 方法如下 input start 0 stop 19 output sequence 0 2 25 4 5 6 8 25 10 5 12 14 25
  • python 中使用 scipy 截断正态分布

    我正在尝试使用截断正态分布scipy在Python3 我想做一些简单的事情 绘制以 0 5 为中心 范围从 0 到 1 的截断法线的 pdf 我有以下代码行 from scipy import truncnorm import matplo
  • 是否有任何算法可以计算给定定义形状的坐标的形状面积?

    所以我有一些接收 N 个随机数的函数2D点 是否有任何算法可以计算输入点定义的形状面积 你想要计算多边形的面积 http local wasp uwa edu au pbourke geometry polyarea 取自链接 转换为 C
  • Python 特征向量:numpy.linalg、scipy.linalg 和 scipy.sparse.linalg 之间的差异

    Scipy 和 Numpy 具有三个不同的函数来查找给定方阵的特征向量 它们是 numpy linalg eig a http docs scipy org doc numpy reference generated numpy linal
  • 如何在 CSS 中设置三角形蒙版的样式?

    我一直在研究如何使用 css 制作这个 逆三角形 背景 我指的是背景 固定 图像顶部底部的白色对角部分 我得到的最多的是形状 这显然不是一个好的解决方案 因为它是为了反应灵敏设计 我不在乎当窗口变窄时是否只有一条对角线 只要没有水平滚动即可
  • 判断一个点是否在直角三角形内

    我一直想知道最简单的方法来确定一个点是否位于三角形内 或者在这种情况下 判断一个点是否位于对角线切成两半的矩形内 假设我有一个 64x64 像素的矩形 对于这个矩形 如果传递的点位于矩形的左上角 我想返回 TRUE 值 否则返回 FALSE
  • 如何保存 numpy 数组图像并将它们放入单个文件夹中?

    我有一个 numpy 数组 其中包含 5000 个 28 x 28 图像 5000 28 28 我想将所有这些图像保存为 jpg 文件并将它们全部保存在一个文件夹中 实现这一目标最快 最有效的方法是什么 我尝试使用以下命令将 50 000
  • 内存错误:numpy.genfromtxt()

    我有一个 50 000x5 000 矩阵 浮点 文件 使用时x np genfromtxt readFrom dtype float 要将文件加载到内存中 我收到以下错误消息 文件 C Python27 lib site packages
  • OpenCV 旋转图像而不裁剪澄清

    我想扩展这个主题 参考用户 Lars Schillingmann 给出的这个 SO 问题和接受的答案 在 C 中的 OpenCV 中旋转图像而不裁剪 https stackoverflow com questions 22041699 ro
  • 如何将样条拟合转换为分段函数?

    假设我有 import numpy as np from scipy interpolate import UnivariateSpline true data I don t know this function x np linspac
  • 用给定均值截断正态分布

    python 是否可以生成具有给定期望值的截断正态分布 我知道 scipy stats truncnorm 可以给出截断的正态分布 该分布取平均值original正态分布作为参数 但我想创建一个截断正态分布 使得截断分布的期望值是一个特定值
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 加载内容时在 ImageView 中使用“动画圆圈”

    我目前在我的应用程序中使用一个列表视图 可能需要一秒钟才能显示 我目前所做的是使用列表视图的 id android empty 属性来创建 正在加载 文本

随机推荐