【Delaunay三角网】scipy.spatial.Delaunay函数解析及其与Geopandas结合绘制Delaunay三角网

常用参数解析

  • points: 包含x,y坐标的点,用于生成Delaunay三角网。格式:[[x1, y1], [x2, y2], [x3, y3], …]
  • incremental: 是否允许继续加点,默认False

常用属性解析

  • points:即你输入的那些点
    在这里插入图片描述

  • simplices:Delaunay函数生成的那些三角形,每个三角形用其三个顶点的顶点号表示,每个三角形的顶点号按照逆时针排列
    在这里插入图片描述

  • neighbors:每个三角形的邻居三角形,每个三角形至多三个邻居,第k个邻居在第k个顶点的对面(就是和第k个顶点相对,见下图),-1表示那条边没有邻居三角形:
    在这里插入图片描述
    在这张图片中黑色的数字表示顶点号,红色的数字表示三角形号,对于0号三角形假设它的顶点号组成为[3, 0, 2],那么它的邻居三角形的组成为[-1, -1, 1]。第一个顶点, 即3号顶点对应的边为[0,2]是一个边界边,没有

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
利用delaunay函数划分网格欢迎指点探讨-DelaunayWithGrid.m 本帖最后由 liuf412044725 于 2013-6-8 17:47 编辑 近期论坛上有不少讨论delaunay函数的帖子。似乎主要有以下问题: 1、delaunay函数各参数的意义 2、知道几何边界时,用delaunay函数划分三角形网格由于区域内部没有点,质量很差,怎么改进 3、怎样避免产生过于狭长的delaunay 三角形 4、 凹多边形的情况怎么处理 第1个问题,看看帮助应该能解决。第2个问题,delaunay本来是用来对离散点进行三角剖分,内部没有点时并不合适。除非特别处理。第3个问题,估计是利用delaunay和meshgrid来划网格,边界附近会产生狭长的delaunay 三角形,这个也可以做特别处理。第4个问题,可以用在划分好网格后删掉域外的三角形即可。 由于我也经常使用delaunay来处理背景积分问题,因此仔细琢磨了一下用delaunay来划分已知边界的几何区域的可行方案,在此和大家分享一下,也是抛砖引玉,希望大家有更好的方法。 方案一:先对区域delaunay剖分,删掉域外的三角形,然后将剩下的三角形的边细分,得到新的离散点,然后再次delaunay剖分,然后再次细分边,这样循环下去,直到达到一定的尺寸为止 方案二:利用delaunay和meshgrid函数。将边界细分得到相比原区域边界更加密集边界点,用meshgrid得到包含整个区域的点,将域内的点和边界点一起delaunay 剖分。 讨论: 方案一对于一开始就有很小边界段的情况情况较差,容易出现狭长单元(比如边界有圆弧的话属于这种情况)。还有就是前一步的边界轮廓很清楚,看着别扭。方案二中间的网格能搞保证形状较好。对于边界附近的内部点,容易导致边界单元畸变,可以将离边界太近的点进行删除,这样得到的形状比较好 综合来说,方案二较好,尤其是当删掉离边界太近的内部点。贴出程序,望大家多多指点,共同进步。 P.S. 当然,matlab自身也有很好的网格划分函数,在pdetool中有用到,不过关于几何描述那块比较难以理解(我不是很理解)。另外matlab语言写的划分网格的程序很多,网上可以找到不少很优秀的。这里仅限于简单的使用delaunay来划分。
首先,我们需要生成一些三维坐标点作为曲面的数据。我们可以使用NumPy库中的meshgrid函数来生成网格坐标点,然后将其转换为一维数组。 ```python import numpy as np from scipy.spatial import Delaunay import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection # 生成网格坐标点 x, y = np.meshgrid(np.linspace(-1, 1, 10), np.linspace(-1, 1, 10)) z = x**2 + y**2 # 将坐标点转换为一维数组 points = np.vstack([x.ravel(), y.ravel(), z.ravel()]).T ``` 接下来,我们使用Delaunay函数来生成三角剖分,这将返回一个包含所有三角形顶点索引的数组。 ```python tri = Delaunay(points) ``` 然后,我们可以使用Poly3DCollection函数绘制三角形。这个函数需要一个由三角形顶点组成的二维数组,我们可以从Delaunay函数返回的数组中提取这些顶点。 ```python fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制三角网格 verts = [points[tri.simplices[i]] for i in range(len(tri.simplices))] ax.add_collection(Poly3DCollection(verts, facecolors='w', edgecolors='k', alpha=0.25)) # 添加坐标轴标签 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show() ``` 完整代码如下: ```python import numpy as np from scipy.spatial import Delaunay import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.art3d import Poly3DCollection # 生成网格坐标点 x, y = np.meshgrid(np.linspace(-1, 1, 10), np.linspace(-1, 1, 10)) z = x**2 + y**2 # 将坐标点转换为一维数组 points = np.vstack([x.ravel(), y.ravel(), z.ravel()]).T # 生成三角剖分 tri = Delaunay(points) # 绘制三角网格 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') verts = [points[tri.simplices[i]] for i in range(len(tri.simplices))] ax.add_collection(Poly3DCollection(verts, facecolors='w', edgecolors='k', alpha=0.25)) # 添加坐标轴标签 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值