You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在三角剖分上绘制矢量数据流线图且无需网格插值?

三角剖分上直接绘制矢量数据流线的方法

目前matplotlib本身没有原生支持三角剖分矢量数据流线的函数,但可以通过两种核心思路实现无需网格插值的流线绘制,完全基于原始三角网格数据:

方法1:基于三角单元特性手动追踪流线

三角剖分的每个单元是三角形,FEM场景中矢量场通常在单元内采用线性插值形式,可基于此手动推进流线:

  • 对每个流线起点,判断其所在的三角形单元
  • 利用单元内的线性矢量场,计算流线在该单元内的走向和出点
  • 从出点进入相邻单元,重复追踪直到流线离开网格或矢量趋近于零
  • 用matplotlib.lines.Line2D逐段绘制流线

这种方法完全依托原始三角数据,无额外插值步骤,边界处理直接利用网格拓扑信息。核心逻辑示例:

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

# 示例三角剖分与节点矢量数据
points = np.random.rand(50, 2)
tri = Delaunay(points)
u = np.random.randn(50)
v = np.random.randn(50)

def trace_streamline(start_point, tri, u, v, max_steps=100):
    current_point = start_point.copy()
    streamline = [current_point]
    for _ in range(max_steps):
        # 定位当前点所在的三角形单元
        simplex = tri.find_simplex(current_point)
        if simplex == -1:
            break  # 离开网格,终止追踪
        # 获取单元的三个节点索引
        nodes = tri.simplices[simplex]
        # 计算当前点在单元内的重心权重
        b = tri.transform[simplex, :2].dot(current_point - tri.transform[simplex, 2])
        weights = np.array([1 - b[0] - b[1], b[0], b[1]])
        # 插值得到当前点的矢量值
        current_u = np.dot(weights, u[nodes])
        current_v = np.dot(weights, v[nodes])
        # 自适应步长计算
        step_norm = np.linalg.norm([current_u, current_v])
        if step_norm < 1e-6:
            break
        step = 0.01 * step_norm
        # 更新当前点位置
        current_point += step * np.array([current_u, current_v])
        streamline.append(current_point)
    return np.array(streamline)

# 绘制三角网格与流线
fig, ax = plt.subplots()
ax.triplot(points[:,0], points[:,1], tri.simplices, color='gray', linewidth=0.5)
# 生成若干随机起点
start_points = np.random.rand(5, 2) * (points.max(axis=0) - points.min(axis=0)) + points.min(axis=0)
for sp in start_points:
    streamline = trace_streamline(sp, tri, u, v)
    ax.plot(streamline[:,0], streamline[:,1], color='cornflowerblue')
plt.show()

方法2:借助FEM专用库实现

部分专注于有限元模拟的工具库内置了三角网格流线的原生支持,无需手动处理插值:

  • FEniCS/DOLFINx:可直接基于定义在三角网格上的有限元函数计算流线,通过dolfinx.plot模块完成绘制
  • PyVista:支持导入三角网格与矢量场数据,使用streamlines方法直接生成并绘制流线,底层基于VTK的流线算法,全程无需转规则网格

关键注意事项

  • 手动追踪时,自适应步长能平衡计算精度与效率
  • 边界处理可利用三角网格的边界单元标记,避免流线越界
  • 使用FEM库时,需确保矢量场的拓扑与三角网格完全匹配

内容的提问来源于stack exchange,提问作者Georges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:55:23