第 5期 丁华锋 等 :一种基于 MATLAB的 STL文件分层切片算法 ·103 ·
(3) 以三角 面 片的局 部拓 扑信 息为基 础 的切 片
算法 ]。该算法对前 述算法 的缺点进行 了完 善 .不
用创建所有三角面片之 间的拓扑关系 ,提高 了寻找当
前切片层三角面片 、输 出轮廓线的效率。此算 法首先
建立一个集合 ,用来放三角面片 ,然后 找到和此时的
切平面相交的三角形面片 ,把这些三角形面片放入到
集合 中 ,集合 里 的三 角形 面片 根据 切平 面 变化 而变
化 ,当切平面 由当前平面到下一个时 ,把不 和这个平
面相交 的三角面片删除 ,若有新 的三角面片与该平 面
相交时 ,再 把符合 此条件的三角面片加进来 ,接着对
在集 合里面的三角面片创建拓扑关 系 。求 出与切平面
相交 的点 ,最后 把这 些 交点 依次 相连 即得到 了轮 廓
线。该算 法需动态储存三 角面片和这些 三角 面片的拓
扑信 息 ,这仍是一个 比较费时的工作 。
精确性 和 稳 定 性 是 分 层 切 片 算 法 应 具 有 的特
点 。本文作 者提 出一种 新 的算法 ,首 先将 三角 面 片
进行 排序 ,快 速准确 地找 到 和当前 切平 面 相交 的三
角 面片 ,然后 建立 出这 些三 角面 片 的毗邻 关 系 ,最
后 求 出交 点 ,将 交 点 依 次 相 连 输 出 轮 廓 线 .运 用
MATLAB强大 的运算功 能使 得 这种算 法 的稳 定 性 和
精确 性更好 。
1 算 法的基本思想
本方法在分析 以上优点 ,得 出以下 的结 论 :z
越小 ,越早与切平 面相交 ;Z ; 越大 ,越 晚 与切平 面
相交 。当分层平面大于三角形的最大值 或者小 于三角
形 的最小 值 时 ,三角 形 不会 与之 相交 。参 照这 些特
点 ,读取 STL模型文 件 后 ,对 三 角 面 片 进 行排 序 ,
删除不在 当前层的三角形 .在求出交点之前对 三角面
片进行排序 、精简 ,然后 创建这 些的三角面片的邻接
关系 ,最后求出交 点 。生成 轮廓线 。
2 算法实现的基本过 程
因为 MATLAB软 件有 强 大 的矩 阵运算 功 能 .可
以用快速准确的运算本算 法。
2.1 数据 的读 取
STL文件 中 即包 含字 符 .又包 含 数 值 ,因此 对
STL文件一行一行地进行读取 .读 取 出来法 向量坐标
和顶 点坐标 ,根 据 STL文件 中法 向量坐 标行 与顶 点
坐标行 的首 字母不 一样 .把顶点 坐标与法 向量坐标分
别存 于两个矩阵中 .表示 形式如 下 :
facet normal=[nx ny nz;…]
vertex=[vlx vly vlz;v2x v2y v2z;v3x v3y v3z;… ]
其中 “;” 代 表矩 阵 中的行 分 隔符 , “fact nor-
mal” 表示 三角面片法向量的坐标矩 阵 。“vertex”代
表三 角面片顶点 的坐标矩 阵 ,vertex中每 一行代 表三
角面 片的一个顶点 坐标 ,每 3行就代表一个三角面 片
的 3个顶点坐标 ,每个 三角形 面片对 应一个 法 向量 ,
这样这个 STL文件共有 n个 法 向量 坐标 与 3n个顶 点
坐标 。这个过程就完成 了对 STL文件 的读取 。
2.2 数 据 的整理
2.2.1 顶点和法 向量整合
因为之前操作得到的三角形的顶点坐标和法向量
坐标在两个不 同的矩阵 中.因此本步是 将法向量和顶
点坐标集合到一个矩阵 中。
一
个 STL模 型有 n个三 角形 ,则有 3n个 顶点坐
标。首先将 这些顶 点坐标 按顺序 每 3个组成一个新矩
阵 ,这样 得 到 n个 矩 阵 (命 名 为 ddl,dd2,…,
ddn),这 n个矩 阵 每一 个对 应一 个 三角形 ,并且 和
法向量矩阵中的法 向量是 按顺序对应 的 ;其次 ,因为
MATLAB中的运算都是对列进行操作 的,所 以对每个
三角形顶点矩 阵 dd (以下如不 另加说 明就用 dd代表
这 n个顶点矩 阵 ,对 dd操作 就是对 这 /-¥个 矩 阵分 别
做 同一 操作 ) 的第 三列 (即 轴 向坐标 )进 行升 序
排列 ,得到矩 阵 dd 。这样 得 到的 dd 顶点 坐标 的顺
序就有 了 (即 轴向值最小 的点在第一行 ,最 大的点
在最后 一行 )。然 后对 dd 做转 置运 算,得 到矩 阵
dd,。接着把 dd,按 列输 出得 到一维 数 组 (即 1行 9
列矩 阵)。把所得 到的 n个 一维 矩阵 按列并 且按顺 序
组合 ,这样就得到 了一个 9行 n列的矩 阵。每一 行即
如下形式 ,以 vertex…表示
Vertex
…
=
[vlx vly vlz v2x v2y v2z v3x v3y v3z]
这个矩 阵每一行对应 1个三角面片的 3个顶 点坐
标信息 即 1个三角形 。由于这个过程中两个矩 阵的 同
一
行还是对应 的同 1个三角形的信息 ,所以把 两个矩
阵接起来 .即
triangle= [facet normal,vertex… ]= [nx ny nz
vlx vly vlz v2x v2y v2z v3x v3y v3z;…]
这样 .每一行就可以完整地代表 1个 三角形 的信
息 ,并且每个三角形 3个 顶点有 了一定顺序 的排列 。
2.3 数 据的 筛选
把所在分层平面上的三角面片筛选 出来就是把不
在当前平面上的三角面片做删除处理 ,即把当前分层
方 向上的最小值大于 当前切平面数值和最大值小于当
前平面数值 的三角面片删除 。剩下的三角面片即为在
当前 分层切平面上与其相交的三角面片 。
筛选算 法 在 MATLAB实现 过 程 :因为 MATLAB
中不可 以根据矩阵 的某一列 中某个数而删除该数所在
行 ,所 以先对第 6列进行 升序操 作 ,找 到第 6列数值
中与分层平 面数 值相 同 (若 没有 则找 小于 分层 平 面
数值 的差最 小 ) 的值所 在 的最 大行 数 ,将 大 于这一
行数 的行全部删除 。这样就把最小值大于分层 平面的
三角形删除 。然后再对 删除后 的矩 阵 的第 12列进行