Python 如何均匀地填充由3d点列表给出的凸形凸起的体积?

Python 如何均匀地填充由3d点列表给出的凸形凸起的体积?,python,numpy,scipy,convex-hull,Python,Numpy,Scipy,Convex Hull,我有一个由生成的3d点列表给出的凸形 我希望整个体积以某种有效的方式均匀地填充3d点 如果我有一个快速的方法来知道一个点是在凸出的还是在凸出的,我可能会以某种分辨率对每个体素进行矢量化,如果它在“内部”,则返回它的中心;如果它在“外部”,则不返回该体素的任何内容 示例: 对于2d点,如scipy的ConvexHull示例 我想计算一个在红线内均匀分布的点列表 如何才能非常有效地做到这一点?以下是一些(未优化)示例代码,演示如何使用.equations属性,该属性包含凸面外壳的曲面法线 将n

我有一个由生成的3d点列表给出的凸形

我希望整个体积以某种有效的方式均匀地填充3d点

如果我有一个快速的方法来知道一个点是在凸出的还是在凸出的,我可能会以某种分辨率对每个体素进行矢量化,如果它在“内部”,则返回它的中心;如果它在“外部”,则不返回该体素的任何内容


示例:

对于2d点,如scipy的ConvexHull示例

我想计算一个在红线内均匀分布的点列表

如何才能非常有效地做到这一点?

以下是一些(未优化)示例代码,演示如何使用
.equations
属性,该属性包含凸面外壳的曲面法线

将numpy导入为np
从scipy导入空间
##树立榜样##
#创建采样点
np.随机种子(17)
样本=np.随机均匀(-5,5,(100,2))
#选取凸子集
大纲=样本[(样本**2).总和(1)eps).任何(0)
内=(轮廓)。equations@np.c_[样本,np.one(len(样本))].T<-eps.全部(0)
边界=~(外部|内部)
##密谋##
进口派拉布
闭合=np.平铺(轮廓.点[轮廓.顶点],(2,1))
关闭=关闭[:len(关闭)//2+1]
pylab.plot(*closed.T,'b')
pylab.plot(*样本[outside].T,'og')
pylab.plot(*样本[inside].T,'or')
pylab.plot(*样本[boundary].T,'oy')
pylab.show()

您有权访问
凸凹
对象本身还是仅访问顶点?@paul panzer我有权访问。然后您可以使用包含曲面法线的
.equations
属性来测试输入/输出。在我看来,您必须提供要在“均质”中检查的点坐标或用简单的英语在每个点的坐标后加上一个
1
。然后矩阵相乘并检查结果的列。一个全正的列表示一个内部点。一个负的坐标就足以把你放在外面,一个非负但非严格正的列表示你在表面的某个地方。或者e反过来说,也就是负的,我说的是正的,反之亦然。@PaulPanzer你能展示代码吗?我不太明白你的意思谢谢你!不幸的是,我们仍然在使用python 2.7…是否有一个快速替换
@
?@Gulzar有
matmul
dot
的方法。你能解释一下
.c\u
在这里?我发现这部分不清楚,尽管它最终对我有用。@Gulzar
c\u
是列堆栈器;在这里它在
示例的末尾添加了一列一个列它可以工作!但是……我注意到它检查每一个点,每一个方程。我想知道是否有更快的方法。我能想到一种方法我脑子里最重要的是翻过一个维度(比如x),找到船体上的第一个点和最后一个点。其他点都在里面,不需要检查。搜索可以用o(nlogn)完成。有没有更快捷的方法,也许是智能单纯形法?
import numpy as np
from scipy import spatial

## set up example ##
# create sample points
np.random.seed(17)
samples = np.random.uniform(-5,5,(100,2))
# pick convex subset
outline = samples[(samples**2).sum(1)<4]
outline = spatial.ConvexHull(outline)
# choose tolerance for detection of boundary points
eps = 1e-9

## classify ##
outside = (outline.equations@np.c_[samples, np.ones(len(samples))].T > eps).any(0)
inside = (outline.equations@np.c_[samples, np.ones(len(samples))].T < -eps).all(0)
boundary = ~(outside|inside)

## plot ##
import pylab
closed = np.tile(outline.points[outline.vertices],(2,1))
closed = closed[:len(closed)//2+1]
pylab.plot(*closed.T,'b')
pylab.plot(*samples[outside].T,'og')
pylab.plot(*samples[inside].T,'or')
pylab.plot(*samples[boundary].T,'oy')
pylab.show()