当前位置: 首页 > 面试题库 >

Python:从Scipy的Delaunay三角剖分中以3D计算Voronoi镶嵌

叶晋
2023-03-14
问题内容

我在新scipy中运行scipy.spatial.Delaunay的3D中有大约50,000个数据点(我使用的是0.10),这给了我一个非常有用的三角测量。

基于:http :
//zh.wikipedia.org/wiki/Delaunay_triangulation(“与Voronoi图的关系”部分)

…我想知道是否有一种简单的方法可以得到三角剖分的“对偶图”,即Voronoi Tesselation。

有什么线索吗?我对此进行的搜索似乎没有显示预先构建的scipy函数,我发现这几乎很奇怪!

谢谢,爱德华


问题答案:

邻接信息可以neighbors在Delaunay对象的属性中找到。不幸的是,该代码目前还没有向用户公开周围环境,因此您必须自己重新计算这些中心。

而且,不能以这种方式直接获得延伸到无穷大的Voronoi边缘。仍然可能,但还需要更多思考。

import numpy as np
from scipy.spatial import Delaunay

points = np.random.rand(30, 2)
tri = Delaunay(points)

p = tri.points[tri.vertices]

# Triangle vertices
A = p[:,0,:].T
B = p[:,1,:].T
C = p[:,2,:].T

# See http://en.wikipedia.org/wiki/Circumscribed_circle#Circumscribed_circles_of_triangles
# The following is just a direct transcription of the formula there
a = A - C
b = B - C

def dot2(u, v):
    return u[0]*v[0] + u[1]*v[1]

def cross2(u, v, w):
    """u x (v x w)"""
    return dot2(u, w)*v - dot2(u, v)*w

def ncross2(u, v):
    """|| u x v ||^2"""
    return sq2(u)*sq2(v) - dot2(u, v)**2

def sq2(u):
    return dot2(u, u)

cc = cross2(sq2(a) * b - sq2(b) * a, a, b) / (2*ncross2(a, b)) + C

# Grab the Voronoi edges
vc = cc[:,tri.neighbors]
vc[:,tri.neighbors == -1] = np.nan # edges at infinity, plotting those would need more work...

lines = []
lines.extend(zip(cc.T, vc[:,:,0].T))
lines.extend(zip(cc.T, vc[:,:,1].T))
lines.extend(zip(cc.T, vc[:,:,2].T))

# Plot it
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

lines = LineCollection(lines, edgecolor='k')

plt.hold(1)
plt.plot(points[:,0], points[:,1], '.')
plt.plot(cc[0], cc[1], '*')
plt.gca().add_collection(lines)
plt.axis('equal')
plt.xlim(-0.1, 1.1)
plt.ylim(-0.1, 1.1)
plt.show()


 类似资料:
  • 我想用3D Delaunay三角剖分表示一个曲面。顶点必须是我的原始输入数据,来自城市区域的激光雷达点云。因此,曲面必须调整/适应输入信息。 实际上,我需要做的是: 我有一个来自市区的3D点云(x,y,z) 我想知道我需要哪个功能。我看到了“3D表面网格生成”、“3D Delaunay三角测量”、“从点集进行表面重建”、“3D网格生成”和“3D阿尔法形状”。但是我不确定哪一个更适合我的工作/需要。

  • 我必须为学校作业实现多边形三角测量算法。我选择遵循《计算几何:算法与应用》一书中描述的算法。 输入是存储为双连通边列表的多边形。第一步是将多边形分割成单调的部分。为了做到这一点,有必要执行线扫描,并根据每个顶点的类型对其进行处理。根据作者的说法,顶点类型描述如下: 我们在P-图中区分了五种类型的顶点,见图3.3。其中四种类型是旋转顶点:开始顶点、分割顶点、结束顶点和合并顶点。它们的定义如下。如果一

  • Python3 实例 以下实例为通过用户输入三角形三边长度,并计算三角形的面积: 实例(Python 3.0+)# -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com a = float(input('输入三角形第一边长: ')) b = float(input('输入三角形第二边长: ')) c = fl

  • 在本节中,我们将通过简单的示例学习如何创建一个三维三角形。我们还将旋转这个三角形以查看它的所有边。 输出结果为:

  • 本文向大家介绍使用python计算三角形的斜边例子,包括了使用python计算三角形的斜边例子的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,还是直接看代码吧 注:中间的空格符是一对引号加一个空格 补充知识:三角形已知两边一斜角时求第三边的公式 已知三角形中的一个角θ \thetaθ和其对边b bb以及侧边a aa, 第三条边长的计算公式为 证明很简单, 用海伦公式和三角形两边一内角的

  • 问题内容: http://upload.wikimedia.org/math/f/e/5/fe56529cdaaaa9bb2f71c1ad8a1a454f.png <-区域公式 我试图从2D笛卡尔坐标系中的3个点(x,y)计算三角形的面积。我假设我的上述公式正确产生了三角形的面积(如果不是,请更正我),但是我的编译器说“运算符- 无法应用于java.awt.Point,java.awt.Point