IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 利用Python读取三角形网格数据并图形化显示 -> 正文阅读

[Python知识库]利用Python读取三角形网格数据并图形化显示

前言

利用有限元方法计算一些数值问题,经常需要剖网格,得到的网格拓扑信息,如果能图形化显示对我们Debug程序也方便,下面利用Python语言读取文本中的网格拓扑信息,然后图形化显示,且可以选择是否显示节点或者单元编号信息。具体代码和数据可以去我的 Github下载。

数据格式

1. 节点数据格式

id_1 x1 y1
id_2 x2 y2

For Example (Node.txt)
1 0 0
2 5 0
3 5 4
4 0 4
5 0 2
6 1 1
7 2 1
8 2 2
9 1 2
10 1 1.5

2. 单元编号数据格式

id_1 tri_id1 tri_id2 tri_id3 tag
id_2 tri_id1 tri_id2 tri_id3 tag

注:tag 有时可以表示这个三角形单元的一些特殊信息,画图时亦可以用其显示三角形颜色。

For Example (Triangles.txt)
1 41 42 46 3.7
2 29 7 43 3.7
3 34 14 38 3.7
4 42 35 46 3.7
5 11 44 59 3.7
6 35 42 49 3.7
7 34 38 43 3.7
8 38 29 43 3.7
9 41 24 42 3.7
10 41 46 61 3.7

程序

1 读取节点信息

def read_Nodes(node_file):
    Nodes = []
    f = open(node_file)
    lines = f.readlines()
    for line in lines:
        data = re.findall(r'\d+\.?\d*', line)
        id = int(data[0])
        x = float(data[1])
        y = float(data[2])
        da = [x, y]
        Nodes.append(da)
    return Nodes
    

2 读取网格拓扑信息

def read_Triangles(triangle_file):
    Triangles = []
    Tags = []
    f = open(triangle_file)
    lines = f.readlines()
    for line in lines:
        data = re.findall(r'\d+\.?\d*', line)
        id = int(data[0])
        id_1 = int(data[1])
        id_2 = int(data[2])
        id_3 = int(data[3])
        tag = float(data[4])
        da = [id_1, id_2, id_3]
        Triangles.append(da)
        Tags.append(tag)
    return Triangles, Tags

3 网格图形化

def plotMesh(Nodes, Triangles, Tags, showNodeId = True, showTriangleId = True, showTriangleTag = False):
    fig, ax = plt.subplots()
    patches = []
    triangleId = 0
    colors = []
    for triangle in Triangles:
        triangleId = triangleId + 1
        polygon = []
        colors.append(Tags[triangleId-1])
        for id in triangle:
            polygon.append(Nodes[id-1])
        for i in range(len(polygon)):
            line_x = []
            line_y = []
            line_x.append(polygon[i][0])
            if i+1 == len(polygon) :
                line_x.append(polygon[0][0])
            else:
                line_x.append(polygon[i+1][0])
            line_y.append(polygon[i][1])
            if i+1 == len(polygon) :
                line_y.append(polygon[0][1])
            else:
                line_y.append(polygon[i+1][1])
            plt.plot(line_x, line_y, 'r-')
        patches.append(Polygon(polygon, True))
        center_x = sum([_[0] for _ in polygon]) / len(polygon)
        center_y = sum([_[1] for _ in polygon]) / len(polygon)
        if showTriangleId :
            ax.annotate(triangleId, (center_x, center_y), color='red', weight='bold', fontsize=7, ha='center', va='center')
    if showNodeId :
        nodeId = 0
        for node in Nodes:
            nodeId = nodeId + 1
            ax.annotate(nodeId, (node[0], node[1]), color='black', weight='bold', fontsize=9, ha='center', va='center')
    collection = PatchCollection(patches)
    if showTriangleTag :
        collection.set_array(np.array(colors))
    ax.add_collection(collection)
    fig.colorbar(collection, ax=ax)
    ax.axis('equal')
    plt.show()

4 完整代码

import re
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection


def read_Nodes(node_file):
    Nodes = []
    f = open(node_file)
    lines = f.readlines()
    for line in lines:
        data = re.findall(r'\d+\.?\d*', line)
        id = int(data[0])
        x = float(data[1])
        y = float(data[2])
        da = [x, y]
        Nodes.append(da)
    return Nodes


def read_Triangles(triangle_file):
    Triangles = []
    Tags = []
    f = open(triangle_file)
    lines = f.readlines()
    for line in lines:
        data = re.findall(r'\d+\.?\d*', line)
        id = int(data[0])
        id_1 = int(data[1])
        id_2 = int(data[2])
        id_3 = int(data[3])
        tag = float(data[4])
        da = [id_1, id_2, id_3]
        Triangles.append(da)
        Tags.append(tag)
    return Triangles, Tags


def plotMesh(Nodes, Triangles, Tags, showNodeId = True, showTriangleId = True, showTriangleTag = False):
    fig, ax = plt.subplots()
    patches = []
    triangleId = 0
    colors = []
    for triangle in Triangles:
        triangleId = triangleId + 1
        polygon = []
        colors.append(Tags[triangleId-1])
        for id in triangle:
            polygon.append(Nodes[id-1])
        for i in range(len(polygon)):
            line_x = []
            line_y = []
            line_x.append(polygon[i][0])
            if i+1 == len(polygon) :
                line_x.append(polygon[0][0])
            else:
                line_x.append(polygon[i+1][0])
            line_y.append(polygon[i][1])
            if i+1 == len(polygon) :
                line_y.append(polygon[0][1])
            else:
                line_y.append(polygon[i+1][1])
            plt.plot(line_x, line_y, 'r-')
        patches.append(Polygon(polygon, True))
        center_x = sum([_[0] for _ in polygon]) / len(polygon)
        center_y = sum([_[1] for _ in polygon]) / len(polygon)
        if showTriangleId :
            ax.annotate(triangleId, (center_x, center_y), color='red', weight='bold', fontsize=7, ha='center', va='center')
    if showNodeId :
        nodeId = 0
        for node in Nodes:
            nodeId = nodeId + 1
            ax.annotate(nodeId, (node[0], node[1]), color='black', weight='bold', fontsize=9, ha='center', va='center')
    collection = PatchCollection(patches)
    if showTriangleTag :
        collection.set_array(np.array(colors))
    ax.add_collection(collection)
    fig.colorbar(collection, ax=ax)
    ax.axis('equal')
    plt.show()


if __name__ == "__main__":
    node_file = "Nodes.txt"
    triangle_file = "Triangles.txt"
    Nodes = read_Nodes(node_file)
    Triangles, Tags = read_Triangles(triangle_file)
    showNodeId = True
    showTriangleId = True
    plotMesh(Nodes, Triangles, Tags, showNodeId, showTriangleId)

结果

1. 不显示编号信息

在这里插入图片描述

2. 显示编号信息

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-10 12:21:06  更:2021-11-10 12:22:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:50:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码