当前位置: 首页 > news >正文

numpy meshgrid 转换成pygimli规则网格

import numpy as np
import pygimli as pg
from scipy.interpolate import griddata

import matplotlib.pyplot as plt

# 1. 生成 NumPy meshgrid
x = np.linspace(0, 10, 11)  # X方向坐标序列
y = np.linspace(0, 5, 6)    # Y方向坐标序列
X, Y = np.meshgrid(x, y)    # 生成网格坐标矩阵:cite[2]

# 2. 提取唯一坐标序列(从meshgrid矩阵中获取)
x_coords = np.unique(X)
y_coords = np.unique(Y)

# 3. 创建 pyGIMLi 规则网格
#    使用 pg.createGrid 并传入提取出的坐标序列
gimli_grid = pg.createGrid(x_coords, y_coords)

# 可视化检查一下生成的网格
pg.show(gimli_grid)
print("PyGIMLi 网格信息:")
print(f"节点数: {gimli_grid.nodeCount()}")
print(f"单元数: {gimli_grid.cellCount()}")

# 假设我们有一个基于原始 meshgrid 计算得到的函数值
Z_numpy = np.sin(X) * np.cos(Y)
# 获取所有单元中心的坐标,cell_centers 形状应为 (N, 2)
cell_centers = gimli_grid.cellCenters()

# 将单元中心坐标拆分成 x 和 y 分量
x_centers = cell_centers[:, 0]  # 所有x坐标
y_centers = cell_centers[:, 1]  # 所有y坐标
points = np.column_stack((X.ravel(), Y.ravel()))
values = Z_numpy.ravel()
# 现在将 (x_centers, y_centers) 作为元组传递给 griddata
# 这样 xi 就被正确识别为一系列二维点的坐标
gimli_cell_data = griddata(points, values, (x_centers, y_centers), method='nearest')

# 将插值后的数据分配给 pyGIMLi 网格
gimli_grid["MyData"] = gimli_cell_data
# 检查分配的数据
print(f"分配给网格的标量场数据: {gimli_grid['MyData']}")

pg.show(gimli_grid,gimli_grid["MyData"])

#将四边形节点转换成pygimli三角网格

import numpy as np
import pygimli as pg
import matplotlib.pyplot as plt

# 假设你已经有四边形网格的节点坐标
# 这里创建一个示例的四边形网格节点
x = np.linspace(0, 10, 6)  # x方向节点
y = np.linspace(0, 5, 4)   # y方向节点
X, Y = np.meshgrid(x, y)   # 创建网格

# 将节点展平并组合成坐标对
points = np.column_stack((X.ravel(), Y.ravel()))

# 方法1: 使用PyGIMLi的createMesh函数直接创建三角网格
# 这会自动对节点进行Delaunay三角剖分
tri_mesh = pg.Mesh(2)  # 创建二维网格

# 添加所有节点到网格中
for pt in points:
tri_mesh.createNode(pt[0], pt[1], 0.0)

# PyGIMLi会自动进行Delaunay三角剖分当你调用createMeshWithPoints时
# 或者使用更直接的方法:
tri_mesh = pg.meshtools.createMesh(points, quality=34, area=0.1)

print(f"三角网格节点数: {tri_mesh.nodeCount()}")
print(f"三角网格单元数: {tri_mesh.cellCount()}")

# 可视化三角网格
pg.show(tri_mesh)
plt.title("Delaunay三角网格")
plt.show()

from scipy.spatial import Delaunay

# 使用SciPy进行Delaunay三角剖分
tri = Delaunay(points)

# 创建PyGIMLi网格对象
tri_mesh = pg.Mesh(2)  # 二维网格

# 添加节点
node_ids = []
for pt in points:
node_ids.append(tri_mesh.createNode(pt[0], pt[1], 0.0))

# 添加三角形单元
for simplex in tri.simplices:
# 获取三角形的三个节点
nodes = [node_ids[i] for i in simplex]
# 创建三角形单元
tri_mesh.createTriangle(nodes[0], nodes[1], nodes[2])

print(f"转换后的三角网格信息:")
print(f"节点数: {tri_mesh.nodeCount()}")
print(f"三角形单元数: {tri_mesh.cellCount()}")

# 可视化
pg.show(tri_mesh)
plt.title("从SciPy Delaunay转换的三角网格")
plt.show()


# 创建边界多边形(假设你的四边形网格有特定边界)
polygon = pg.meshtools.createPolygon([
[0, 0],    # 左下角
[10, 0],   # 右下角  
[10, 5],   # 右上角
[0, 5]     # 左上角
], isClosed=True)

# 使用带约束的三角剖分
constrained_mesh = pg.meshtools.createMesh(points, boundary=polygon)

print(f"带约束的三角网格:")
print(f"节点数: {constrained_mesh.nodeCount()}")
print(f"单元数: {constrained_mesh.cellCount()}")

pg.show(constrained_mesh)
plt.title("带边界约束的三角网格")
plt.show()

http://www.dtcms.com/a/365975.html

相关文章:

  • cppreference_docs
  • 稳居全球TOP3:鹏辉能源“3+N” 布局,100Ah/50Ah等户储电芯产品筑牢市场优势
  • 【C++】Vector核心实现:类设计到迭代器陷阱
  • MySQL:表的约束上
  • C# 代码中的“熵增”概念
  • 单片机:GPIO、按键、中断、定时器、蜂鸣器
  • 《单链表经典问题全解析:5 大核心题型(移除元素 / 反转 / 找中点 / 合并 / 回文判断)实现与详解》
  • 【面试题】词汇表大小如何选择?
  • PS大神级AI建模技巧!效率翻倍工作流,悄悄收藏!
  • 本地化AI问答:告别云端依赖,用ChromaDB + HuggingFace Transformers 搭建离线RAG检索系统
  • OpenCV的阈值处理
  • ChartView的基本介绍与使用
  • shell编程从0基础--进阶 1
  • 如何高效记单词之:抓住首字母——以find、fund、fond、font为例
  • Linux `epoll` 机制的入口——`epoll_create`函数
  • Java并发编程中的CountDownLatch与CompletableFuture:同步与异步的完美搭档
  • 驱动增长的双引擎:付费搜索与自然搜索的终极平衡策略
  • Loot模板系统
  • helm应该安装在哪些节点
  • ABAQUS多尺度纤维增强混凝土二维建模
  • 微信小程序-day3
  • 【mac】macOS上的实用Log用法
  • 使用Navicat去批量传输数据库的表结构
  • fastlio配置与过程中遇到的问题
  • 51单片机----LED与数码管模块
  • C 语言标准输入输出库:`stdio.h` 的使用详解
  • 【WPS】WPSPPT 快速抠背景
  • Python学习笔记--使用Django修改和删除数据
  • 52.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--解决客户端调用接口404问题
  • 硬件:51单片机的按键、中断、定时器、PWM及蜂鸣器