QT中读取STL并显示
STL数据格式有两种一种是二进制 一种是ASCII STL另外一种是Binary STL。
目录
Binary 二进制:
ASCII STL
Binary 二进制:
二进制STL文件用固定的字节数来给出三角面片的几何信息。
【80】80个字节的文件头,用于存贮文件名
【4】 4 个字节的int描述模型的三角面片个数(小端存储)
【50*n】一个三角面片占用固定的50个字节(小端存储),依次是:
【12】3个4字节浮点数(角面片的法矢量)
【12】3个4字节浮点数(1个顶点的坐标)
【12】3个4字节浮点数(2个顶点的坐标)
【12】3个4字节浮点数(3个顶点的坐标)个
【2】三角面片的最后2个字节用来描述三角面片的属性信息。
一个完整二进制STL文件的大小为三角形面片数乘以 50再加上84个字节。
solid name //一个三角面
facet normal ni nj nkouter loopvertex v1x v1y v1zvertex v2x v2y v2zvertex v3x v3y v3zendloop
endfacet//更多三角面···endsolid name
ASCII STL
ASCII STL,每一个facet由7行数据组成,outer loop后面三个顶点的顺序沿法线矢量逆时针排序,格式如下:
solid name // 文件名及文件路径facet normal ni nj nk // 三角形法向量的三个分量outer loopvertex v1x v1y v1z // 第一个顶点坐标vertex v2x v2y v2z // 第二个顶点坐标vertex v3x v3y v3z // 第三个顶点坐标endloop
endfacet // 完成一个三角形的定义endsolid name // 整个文件结束
读取代码
//这个函数是判断是否是二进制还是ASCII码形式 然后调动不同的函数处理
// 传入的文件的位置
bool stldata::readfile(const std::string & pfile)
{std::ifstream in(pfile.c_str(), std::ifstream::in);if (!in)return false;std::string headStr;getline(in, headStr, ' ');in.close();if (headStr.empty())return false;bool isreadsucceed = false;if (headStr[0] == 's'){isreadsucceed=ReadASCII(pfile);}else{isreadsucceed=ReadBinary(pfile);}return isreadsucceed;
}/*********************************
*读取ASCII格式的stl
*********************************/
bool stldata::ReadASCII(const std::string & pfile)
{int i = 0, j = 0, cnt = 0, pCnt = 0;char a[100];char str[100];double x = 0, y = 0, z = 0;std::ifstream in(pfile.c_str(), std::ifstream::in);if (!in)return false;pNewTri = new Triangle3D();do{i = 0;cnt = 0;in.getline(a, 100, '\n');while (a[i] != '\0'){if (!islower((int)a[i]) && !isupper((int)a[i]) && a[i] != ' ') //为数字和小数点的时候跳出去 break;cnt++;i++;}while (a[cnt] != '\0'){str[j] = a[cnt];cnt++;j++;}str[j] = '\0';j = 0;if (sscanf(str, "%lf%lf%lf", &x, &y, &z) == 3){switch (pCnt%4){case 0: pNewTri->normal.setxyz(x,y,z); break;case 1: pNewTri->vertex[0].setxyz(x, y, z); break;case 2: pNewTri->vertex[1].setxyz(x, y, z); break;case 3: pNewTri->vertex[2].setxyz(x, y, z);pNewTri->cal_angle_theta();triList.push_back(pNewTri);pNewTri = new Triangle3D(); break;default:break;}pCnt=++pCnt%4;}} while (!in.eof());return true;
}/*********************************
*读取Binary格式的stl
*********************************/
bool stldata::ReadBinary(const std::string & pfile)
{char str[80];std::ifstream in(pfile.c_str(), std::ifstream::in | std::ifstream::binary);if (!in)return false;in.read(str, 80); //前80个字节是作者 姓名等其他信息//number of trianglesint triangles;in.read((char*)&triangles, sizeof(int)); //stl 数量if (triangles == 0)return false;for (int i = 0; i < triangles; i++){pNewTri = new Triangle3D();float coorXYZ[12];in.read((char*)coorXYZ, 12 * sizeof(float));pNewTri->normal.setxyz(coorXYZ[0], coorXYZ[1], coorXYZ[2]);pNewTri->vertex[0].setxyz(coorXYZ[3], coorXYZ[4], coorXYZ[5]);pNewTri->vertex[1].setxyz(coorXYZ[6], coorXYZ[7], coorXYZ[8]);pNewTri->vertex[2].setxyz(coorXYZ[9], coorXYZ[10], coorXYZ[11]);pNewTri->cal_angle_theta();triList.push_back(pNewTri);in.read((char*)coorXYZ, 2); //属性信息}in.close();return true;
}
参考文献:
https://blog.csdn.net/just0kk/article/details/53967846
https://blog.csdn.net/woniu199166/article/details/79271093
QT中读取STL并显示相关推荐
- QT学习之解决QT中QIcon图标不显示的问题
QT学习之解决QT中QIcon图标不显示的问题 参考文章: (1)QT学习之解决QT中QIcon图标不显示的问题 (2)https://www.cnblogs.com/yang12318/p/1069 ...
- emwin从外部flash中读取bmp图片显示
在emwin中有提供了一个从外部读取图片数据进行显示的函数,如下: 而且提供了官方例程,不过官方历程中从外部读取是从外部文件系统中进行读取的bmp图片进行显示,官方例程如下 /* ********** ...
- 如何在QT中读取串口数据
总是能在别人的博客中学到太多太多,谢谢各位对知识的无私共享,谢谢大家 前言 去年我使用Qt编写串口通信程序时,将自己的学习过程写成了教程(Qt编写串口通信程序全程图文讲解),但是由于时间等原因,我只实 ...
- Qt中Qlabel 图片拖放显示
Qt中Qlabel接受图片拖放 1. 先在ui框中放入label控件,并调至合适大小: 暂时就命名为:label 2. 代码中头文件应包含: #include <QUrl> #includ ...
- QT中png图片无法显示的问题
最近在学霍亚飞的<Qt Creator快速入门>,在练习的时候,发现png图片老是不能运行:网上搜索了一下解决方法: 总结如下: 1.最基本的是看自己文件路径是不是对的,有时候设置的是相对 ...
- 用JSP从数据库中读取图片并显示在网页上
环境:mysql+tomcat: <1>先在mysql下建立如下的table. 并insert图像. mysql.sql文件如下: CREATE TABLE photo ( photo_ ...
- QT界面中实现视频帧显示的多种方法及应用
QT界面中实现视频帧显示的多种方法及应用 (一) 引言 1.1 视频帧在QT界面中的应用场景 1.2 不同方法的性能和适用性分析 1.2.1 使用QLabel和QPixmap 1.2.2 使用QPai ...
- QT中使用OpenGL绘制图形
Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...
- Qt中使用OpenGL进行绘图
Qt Creator中的3D绘图及动画教程(参照NeHe) 刚刚学习了Qt Creator,发现Qt提供了QtOpenGL模块,对OpenGL做了不错的封装,这使得我们可以很轻松地在Qt程序中使用Op ...
最新文章
- 重磅!《2021中国开源发展蓝皮书》发布
- .Net开发时有没有好的页面开发框架?
- python 模拟用户点击浏览器_Python-模拟浏览器-下载文献
- android bootloader阶段GPIO的控制
- 【转】Java中字符串中子串的查找共有四种方法(indexof())
- SpringMVC获取请求参数-集合类型
- 音视频PaaS的“未毕之旅”
- java开发用怎么软件开发_Java 9中的5个功能将改变您开发软件的方式(还有2个不会)...
- AFNetworking 3.1.0 使用中某些知识点讲解
- 【移植Linux 3.4.2内核第一步】之简单修改
- Python shutil.md
- 面试珍藏:最常见的200多道Java面试题(2019年最新版)
- Linux centos 使用yum安装MySQL
- 20个优秀的 CSS 网格系统(CSS Grid Systems)推荐
- java维护_java配置和维护
- React骚操作——jsx遇到template-directive
- 3.JUC线程高级-同步容器 ConcurrentHashMap
- SOP、DIP、PLCC、TQFP、PQFP、TSOP、BGA封装解释
- 【力扣面试】面试题 04.02. 最小高度树(就是创建二叉平衡树)
- python将列表元素全部小写_python实现创建新列表和新字典,并使元素及键值对全部变成小写...
热门文章
- Pytorch中torchvision.datasets.ImageFolder报错:Found 0 files in subfolders of:XXX,完美解决!
- Oracle Parallel Query
- Jekins的简介和使用
- Hive 插入数据报错FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask.
- 还是学生的时候 想着存些对我有用 的url
- 中文词性标注的简单实现
- [附源码]Python计算机毕业设计大学生社团管理系统
- linux - grep命令
- JSP 编译和运行过程与JSP源码简单分析
- JAVA学习:将字符串转成数字