【问题标题】:python scipy Delaunay plotting point cloudpython scipy Delaunay绘制点云
【发布时间】:2011-09-26 03:07:39
【问题描述】:

我有一个点列表=[p1,p2,p3...] 其中 p1 = [x1,y1],p2=[x2,y2] ...

我想使用 scipy.spatial.Delaunay 对这些点云进行三角剖分,然后将其绘制出来

我该怎么做?

Delaunay 的文档真的很稀缺

到目前为止我有这个代码

from subprocess import Popen, PIPE
import os


os.environ['point_num'] = "2000"

cmd = 'rbox $point_num D2 | tail -n $point_num'
sub_process = Popen(cmd, shell=True,stdout=PIPE,stderr=PIPE)
output = sub_process.communicate()
points = [line.split() for line in output[0].split('\n') if line]
x = [p[0] for p in points if p]
y = [p[1] for p in points if p]

import matplotlib.pyplot as plt
plt.plot(x,y,'bo')

from scipy.spatial import Delaunay

dl = Delaunay(points)
convex = dl.convex_hull

from numpy.core.numeric import reshape,shape
convex = reshape(convex,(shape(convex)[0]*shape(convex)[1],1))
convex_x = [x[i] for i in convex]
convex_y = [y[i] for i in convex]

plt.plot(convex_x,convex_y,'r')
plt.show()

谢谢

【问题讨论】:

  • 样式提示:将from numpy.core.numeric import ... 替换为from numpy import ... -- 在Python 中通常没有严格的私有区域,但最好从最顶层的命名空间导入。另外,您要绘制什么 - 凸包或 delaunay 三角剖分(在您的示例代码之前,我的第一个答案是......)
  • 感谢您的提示!我对此一无所知!

标签: python scipy triangulation delaunay


【解决方案1】:

编辑:绘制凸包

import numpy as np
from scipy.spatial import Delaunay

points = np.random.rand(30, 2) # 30 points in 2-d
tri = Delaunay(points)

# Make a list of line segments: 
# edge_points = [ ((x1_1, y1_1), (x2_1, y2_1)),
#                 ((x1_2, y1_2), (x2_2, y2_2)),
#                 ... ]
edge_points = []
edges = set()

def add_edge(i, j):
    """Add a line between the i-th and j-th points, if not in the list already"""
    if (i, j) in edges or (j, i) in edges:
        # already added
        return
    edges.add( (i, j) )
    edge_points.append(points[ [i, j] ])

# loop over triangles: 
# ia, ib, ic = indices of corner points of the triangle
for ia, ib, ic in tri.vertices:
    add_edge(ia, ib)
    add_edge(ib, ic)
    add_edge(ic, ia)

# plot it: the LineCollection is just a (maybe) faster way to plot lots of
# lines at once
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

lines = LineCollection(edge_points)
plt.figure()
plt.title('Delaunay triangulation')
plt.gca().add_collection(lines)
plt.plot(points[:,0], points[:,1], 'o', hold=1)
plt.xlim(-1, 2)
plt.ylim(-1, 2)

# -- the same stuff for the convex hull

edges = set()
edge_points = []

for ia, ib in tri.convex_hull:
    add_edge(ia, ib)

lines = LineCollection(edge_points)
plt.figure()
plt.title('Convex hull')
plt.gca().add_collection(lines)
plt.plot(points[:,0], points[:,1], 'o', hold=1)
plt.xlim(-1, 2)
plt.ylim(-1, 2)
plt.show()

请注意,仅使用scipy.spatial.Delaunay 来计算复杂的船体可能是大材小用,因为原则上只计算船体比计算三角测量更快。不幸的是,Scipy 中还没有用于直接使用 Qhull 计算 hull 的接口。

【讨论】:

猜你喜欢
  • 2021-04-18
  • 2015-04-06
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2017-10-31
  • 2021-12-26
  • 2020-10-17
  • 2017-01-06
相关资源
最近更新 更多