Python德劳内三角剖分详解

 更新时间:2023年04月30日 09:34:40   作者:微小冷  
这篇文章主要为大家详细介绍了Python中德劳内三角剖分的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下

初步认识

对于熟悉matplotlib三维画图的人来说,最常用的应该是plot_surface,但这个函数的绘图逻辑是,将xy平面映射到z轴,所以没法一次性绘制球,只能把球分成两半,上半球和下半球分别绘制。

如果想一次性绘制封闭图形,则可通过tri_surface,其绘图逻辑便是将图形拆分成一个个三角面,然后在对这些三角面进行绘制。所以,将一个曲面拆分成三角面,便构成了一个非常现实的问题,德劳内三角剖分便是建立在这个问题背景之下的。

scipy.spatial中提供了Delaunay类,下面以二维散点为例,来初步认识一下。

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Delaunay

pts = np.array([[0, 0], [0, 1], [2, 0], [2, 1]])
tri = Delaunay(pts)
plt.triplot(pts[:,0], pts[:,1], tri.simplices)
plt.plot(pts[:,0], pts[:,1], 'o')
plt.show()

效果如下

构造函数和属性

Delaunay的构造函数如下

Delaunay(points, furthest_site=False, incremental=False, qhull_options=None)

各参数含义为

  • points 输入散点
  • furthest_site 为True时,计算最远点
  • incremental 为True时,允许增量添加点
  • qhull_options 为qhull参数,具体可参考qhull

在Delaunay对象中,有下面几个必须知道的常用属性

  • points 即输入的点集
  • simplices 三角面顶点在点集中的序号
  • neighbors 三角面相邻三角面的序号
  • equations 三角面方程

实战-画个球

想要画个球,第一步是要得到一个球

# N为点数
def getBall(N):
    pts = []
    while len(pts) < N:
        while True:
            u = np.random.uniform(-1, 1)
            v = np.random.uniform(-1, 1)
            r2 = u**2 + v**2
            if r2 < 1:
                break
        x = 2*u*np.sqrt(1-r2)
        y = 2*v*np.sqrt(1-r2)
        z = 1 - 2*r2
        pts.append((x,y,z))
    return np.vstack(pts)

下面测试一下

pts = getBall(200)
ax = plt.subplot(projection='3d')
ax.scatter(pts[:,0], pts[:,1], pts[:,2])
plt.show()  

接下来将这些随机点生成三角面,并进行绘图

tri = Delaunay(pts)

ax = plt.subplot(projection='3d')
for i in tri.simplices:
    ax.plot_trisurf(pts[i, 0], pts[i, 1], pts[i,2])

plt.show()

效果如下

看上去花花绿绿的这些三角形,便是通过德劳内三角剖分得到的,其equations属性可以查看这些三角面的方程参数

>>> tri.equations
array([[-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
        -1.00000000e+00,  2.41181971e-16],
       [-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
        -1.00000000e+00,  2.41181971e-16],
       [-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
        -1.00000000e+00,  2.41181971e-16],
       ...,
       [-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
        -1.00000000e+00,  2.41181971e-16],
       [-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
        -1.00000000e+00,  2.41181971e-16],
       [-2.35739179e-16, -1.64155539e-15, -1.54600295e-15,
        -1.00000000e+00,  2.41181971e-16]])
``

到此这篇关于Python德劳内三角剖分详解的文章就介绍到这了,更多相关Python德劳内三角剖分内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中关于os.path.pardir的一些坑

    python中关于os.path.pardir的一些坑

    这篇文章主要介绍了python中关于os.path.pardir的一些坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Python对HTML转义字符进行反转义的实现方法

    Python对HTML转义字符进行反转义的实现方法

    这篇文章主要介绍了Python对HTML转义字符进行反转义的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • pytorch __init__、forward与__call__的用法小结

    pytorch __init__、forward与__call__的用法小结

    这篇文章主要介绍了pytorch __init__、forward与__call__的用法小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 基于pytorch的RNN实现字符级姓氏文本分类的示例代码

    基于pytorch的RNN实现字符级姓氏文本分类的示例代码

    当使用基于PyTorch的RNN实现字符级姓氏文本分类时,我们可以使用一个非常简单的RNN模型来处理输入的字符序列,并将其应用于姓氏分类任务,本文给大家举了一个基本的示例代码,需要的朋友可以参考下
    2023-12-12
  • Python 字符替换的四方法

    Python 字符替换的四方法

    本文主要介绍了Python 字符替换的四方法,主要包括replace、translate、maketrans 和正则这是四种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Python发送邮件实现基础解析

    Python发送邮件实现基础解析

    这篇文章主要介绍了Python发送邮件实现基础解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 如何用python批量发送工资条邮件

    如何用python批量发送工资条邮件

    大家好,本篇文章主要讲的是如何用python批量发送工资条邮件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Python入门必须知道的11个知识点

    Python入门必须知道的11个知识点

    这篇文章主要为大家详细介绍了Python入门必须知道的11个知识点,帮助更好地了解python,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python实现读取excel写入mysql的小工具详解

    python实现读取excel写入mysql的小工具详解

    EXCEL 和 MySQL 大体上来说都可以算是"数据库",MySQL貌似有EXCEL的接口,但是最近在自学Python,用Python实现了一下,下面这篇文章主要给大家介绍了关于利用python实现读取excel写入mysql的一个小工具,需要的朋友可以参考下。
    2017-11-11
  • windows系统IIS部署Django项目的实践

    windows系统IIS部署Django项目的实践

    采用IIS服务器部署相比django提供的开发者服务器具有更好的并发访问能力,性能更加稳定,本文主要介绍了windows系统IIS部署Django项目的实践,具有一定的参考价值,感兴趣的可以了解一下
    2022-03-03

最新评论