首页 > 编程语言 >python实现STL模型文件体积表面积计算

python实现STL模型文件体积表面积计算

时间:2023-11-08 16:12:35浏览次数:37  
标签:表面积 area STL vertices python mesh 计算 data

没有什么特殊的算法,直接用包,开箱即用

from stl import mesh
import numpy as np

# 读取stl文件
filename = './text.stl'
mesh_data = mesh.Mesh.from_file(filename)

xyz = (mesh_data.max_ - mesh_data.min_)
sizel = round(xyz[0] / 10, 2)
sizew = round(xyz[1] / 10, 2)
sizeh = round(xyz[2] / 10, 2)

# 计算体积
volume, _, _ = mesh_data.get_mass_properties()

# 计算表面积
surface_area = 0.0
for triangle in mesh_data.vectors:
    # 获取三角形的三个顶点
    a = triangle[0]
    b = triangle[1]
    c = triangle[2]
    # 计算三角形的面积并累加
    surface_area += 0.5 * np.linalg.norm(np.cross(b - a, c - a))

print("Surface Area:", surface_area)

print("Volume:", volume)

 

下面是PHP计算体积和表面积 应该是顶点问题 计算有bug 等有空再来修复 仅做参考

<?php
// 从STL文件中解析顶点信息
// 从二进制STL文件中解析顶点信息
function parseBinarySTLFile($filePath) {
    $vertices = array();

    // 读取STL文件内容
    $stlContent = file_get_contents($filePath);
//var_dump($stlContent);
    // 假设STL文件头部80字节为文件头信息,跳过这部分
    $stlContent = substr($stlContent, 80);

    // 之后的4字节为三角形数量,按little-endian解析
    $numTriangles = unpack('V', substr($stlContent, 0, 4))[1];
    $stlContent = substr($stlContent, 4);

    // 依次解析每个三角形的顶点信息
    for ($i = 0; $i < $numTriangles; $i++) {
        // 每个三角形占据50个字节,包括面法向量和三个顶点坐标
        $data = unpack('f*', substr($stlContent, 0, 50));
        $vertices[] = array(
            [$data[3], $data[4], $data[5]],
            [$data[6], $data[7], $data[8]],
            [$data[9], $data[10], $data[11]]
        );
        $stlContent = substr($stlContent, 50);
    }
    return $vertices;
}

// 计算模型体积
function calculateModelVolume($vertices) {
    $volume = 0;

    // 对于每个三角形,计算有向体积并累加
    foreach ($vertices as $triangle) {
        // 以第一个顶点为起点,计算有向体积
        $v321 = $triangle[2][0] * $triangle[1][1] * $triangle[0][2];
        $v231 = $triangle[1][0] * $triangle[2][1] * $triangle[0][2];
        $v312 = $triangle[2][0] * $triangle[0][1] * $triangle[1][2];
        $v132 = $triangle[0][0] * $triangle[2][1] * $triangle[1][2];
        $v213 = $triangle[1][0] * $triangle[0][1] * $triangle[2][2];
        $v123 = $triangle[0][0] * $triangle[1][1] * $triangle[2][2];

        $volume += (1.0 / 6.0) * (-$v321 + $v231 + $v312 - $v132 - $v213 + $v123);
        //return (-v321 + v231 + v312 - v132 - v213 + v123)/6.0;
    }

    return abs($volume);
}


// 计算模型表面积
function calculateModelSurfaceArea($vertices) {
    $surfaceArea = 0;

    // 对于每个三角形,计算面积并累加
    foreach ($vertices as $triangle) {
        // 计算三角形的两条边的向量
        $v1 = array(
            $triangle[1][0] - $triangle[0][0],
            $triangle[1][1] - $triangle[0][1],
            $triangle[1][2] - $triangle[0][2]
        );
        $v2 = array(
            $triangle[2][0] - $triangle[0][0],
            $triangle[2][1] - $triangle[0][1],
            $triangle[2][2] - $triangle[0][2]
        );

        // 计算三角形的面积(使用向量叉乘)
        $crossProduct = array(
            $v1[1] * $v2[2] - $v1[2] * $v2[1],
            $v1[2] * $v2[0] - $v1[0] * $v2[2],
            $v1[0] * $v2[1] - $v1[1] * $v2[0]
        );
        $triangleArea = 0.5 * sqrt(pow($crossProduct[0], 2) + pow($crossProduct[1], 2) + pow($crossProduct[2], 2));

        // 累加三角形的面积
        $surfaceArea += $triangleArea;
    }

    return $surfaceArea;
}


function calculateModelDimensions($vertices) {
    $minX = $maxX = $vertices[0][0][0];
    $minY = $maxY = $vertices[0][0][1];
    $minZ = $maxZ = $vertices[0][0][2];
    foreach ($vertices as $triangle) {
        foreach ($triangle as $vertex) {
            $minX = min($minX, $vertex[0]);
            $maxX = max($maxX, $vertex[0]);
            $minY = min($minY, $vertex[1]);
            $maxY = max($maxY, $vertex[1]);
            $minZ = min($minZ, $vertex[2]);
            $maxZ = max($maxZ, $vertex[2]);
        }
    }

    $width = $maxX - $minX;
    $height = $maxY - $minY;
    $depth = $maxZ - $minZ;

    return array('width' => $width, 'height' => $height, 'depth' => $depth);
}



// STL文件路径
$stlFilePath = '111.stl';

// 解析STL文件并获取顶点信息
$vertices = parseBinarySTLFile($stlFilePath);
//var_dump($vertices);
// 计算模型体积
$modelVolume = calculateModelVolume($vertices);

// 表面积
//$area = calculateModelSurfaceArea($vertices);

// 计算模型的长宽高尺寸
//$modelDimensions = calculateModelDimensions($vertices);

// 输出模型的长宽高尺寸
//echo "Model Dimensions: Width = " . $modelDimensions['width'] . ", Height = " . $modelDimensions['height'] . ", Depth = " . $modelDimensions['depth'];

//echo $area;
// 输出模型体积
echo "The volume of the STL model is: " . $modelVolume;
?>

 

标签:表面积,area,STL,vertices,python,mesh,计算,data
From: https://www.cnblogs.com/we-jack/p/17817627.html

相关文章

  • python初学者学习笔记-第八章-模块和包
    chapter8/模块和包8.1.模块8.1.1模块简介类、函数、变量等,都可重复使用。为了方便调用,我们通常把他们放到Python文件之中。单个文件的代码阅读和调用都比较混乱。代码最好分开存储,相似功能的代码放在一起。模块可以帮助我们实现这样的功能。后缀为py的文件都是python的......
  • python ElementTree操作xml节点
    pythonElementTree操作xml节点,包括增删改查xml原文<Voucher><Id>967a198783d14835860574c697478156</Id><Remark>main摘要443344245567583384475</Remark><Delete>需要删除的节点1</Delete><DetailList><Det......
  • 简单实现Python采集B站视频
    我们今天要学习的是如何利用Python的requests库编写一个采集B站的小爬虫,都是一些很基础的内容,简单易学,没有什么太过复杂的东西,一起来看看吧。首先安装库:```bashpipinstallrequests```然后,我们可以开始编写爬虫程序:```pythonimportrequestsproxy_host='www.duoip.cn'proxy_......
  • Python采集抖音快手商户
    抖音快手不仅是一个短视频平台,而且也是当下很多商家争抢进场的热门电商平台,以下是一个用Python实现采集抖音快手的爬虫程序,用于采集抖音快手的商家,对于做竞品同行数据分析来说,一定非常不错的。```pythonimportrequestsfrombs4importBeautifulSoup#请求URLurl='https://ww......
  • Python和requests库结合采集豆瓣短评
    Python是一种常用的程序语言,今天我们就用Python和requests库结合,来写一个采集豆瓣短评的程序,非常的简单,一起来学学吧。```pythonimportrequestsfrombs4importBeautifulSoup#设置代理proxy=f'http://{proxy_host}:{proxy_port}'headers={'User-Agent':'Mozilla/5.......
  • JSTL fmtformatNumber日期、 数字、货币格式化
    JSTLfmt:formatNumber日期、数字、货币格式化使用<fmt>标签应先导入<%@taglibprefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt"%>其uri可在fmt.tld文件下 1、日期格式化<fmt:formatDatevalue=“${XXX.date}”pattern=“yyyy-MM-ddHH:mm:ss”/> value:要......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-25-处理单选和多选按钮-中篇
    1.简介上一篇中宏哥讲解和介绍的单选框有点多,而且由于时间的关系,宏哥决定今天讲解和分享复选框的相关知识。2.什么是单选框、复选框?单选按钮一般叫raidobutton,就像我们在电子版的单选答题过程一样,单选只能点击一次,如果点击其他的单选,之前单选被选中状态就会变成未选中。单......
  • python基础-数据类型及常用方法
    数字类型int:是整形,用来记录没有小数点的数字,例如:1、2、3、4等等age=18print(age)print(type(age))float:是浮点型,用来记录有小数点的数字,例如:12.3、100.001等money=88888.88print(money)print(type(money)) str:是字符串类型,用来记录描述性质的东西,例如......
  • 基于三维点云数据的主成分分析方法(PCA)的python实现
    https://github.com/mengxingshifen1218/learning-pointcloud/blob/master/%E6%B7%B1%E8%93%9D/CH1/PointCloudHomework1/pca_normal.py  KD-Tree原理详解https://zhuanlan.zhihu.com/p/112246942构建算法:Input:无序化的点云,维度kOutput:点云对应的kd-treeAlgorithm:1......
  • 1.Python操控Excel之读取
    1.读取excel文件数量和创建Sheet文件: 2.生成N列N行的值: 3.取到N行N列的值: 4.取到不同的行: 5.从表单中取行和列: 6.使用循环遍历多列,再遍历每一列的每个数据: 7.先遍历2行到6行,再遍历每一行的每一个数据: 8.获取到2行2列的值: 9.rowOfCellObjects访问每一行:......