system: [SYSTEM]

user: 2. 激光打标映射算法 将图案映射到模型表面的关键在于建立一种曲面展平的方法，以建立曲面与二维平面之间的映射关系，然后得到平面图案和曲面之间的映射关系。本文提出一种激光打标解决方案，以在曲面的某一区域标记出平面图案，同时尽可能减小图案的变形。 2.1. 待打标曲面展平算法 本文主要针对三角网格模型，平面图案由离散点序列近似表示。三角网格模型T由其顶点集 { p i } 和三角面片集 { F j } = { ( p l ， p m ， p n ) } 组成，其中 p l ， p m ， p n 为一个三角网格的三个顶点，其中点集 { p i } 进一步可以分为内部顶点 { x k } 和外缘顶点 { y j } 。已知平面图案由一组曲线 { C i } 组成，每一条曲线 C i 可以由离散点集 { m k } 近似表示；平面图案的边界点集为 { b t } ，其中 t ≥ 3 ；网格模型上打标曲面的边界点集为 { d t } ； { b t } 中的每个点在 { d t } 中都能通过相同的索引找到对应点。 建立打标曲面与展平平面映射关系算法主要分为3步，首先映射网格曲面的边界点，然后映射除边界点以外的内部点，最后映射网格的三角面，即可构建网格曲面与二维平面之间的映射关系。 2.1.1. 弧长法映射外缘顶点 { y j } 采用弧长法映射外缘顶点，如图1所示，假设外缘顶点 y j 介于顶点 d t 与 d t + 1 之间， b 与 b t + 1 分别表示其位置向量，其映射在曲面上的顶点 y ′ j 由位置向量表示如式(1)所示。 图1. 映射外缘顶点示意图 y ′ j = b t + y j d t ^ d t d t + 1 b t + 1 − b t | b t + 1 − b t | (1) 其中， y j d t ^ 表示三角网格上顶点 y j 和 d t 之间的弧长， | b t + 1 − b t | 表示映射平面上两个顶点之间的距离。 2.1.2. 凸映射算法映射内部顶点 { x j } 利用凸映射算法将内部点映射到二维平面，记对应的映射点集为 { x ′ j } ，如图2。映射后要求三角网格各边之间没有交叉，交叉点仅存在公共顶点处；另外要求映射面中的小平面尽可能保持原始形状 [ 10 ]。基于凸映射算法映射内部顶点 [ 10 ] [ 11 ] [ 12 ]，其基本思想是将映射后的内部点 { x ′ j } 看做其邻域的凸组合，如式(2)。 图2. 映射内部顶点示意图 x ′ i = ∑ j λ i j x j + ∑ k λ i k y k (2) 其中系数满足： λ i j > 0 ∑ j λ i j + ∑ k λ i k = 1 (3) 上述方程式表示映射的内部点 x ′ j 同其邻域中的点都可以组成凸组合，即位于同一个凸包内，如果与邻域点组成的是凸多边形，则多边形内部各条边没有交叉。内部点 { x ′ j } 关于方程式(2)可以组成一个线性方程组，如果外环多边形 { y j } 是凸多边形，根据论文 [ 11 ] [ 12 ] [ 13 ] [ 14 ] 证明可知其解 x ′ j 是唯一存在的。 内部顶点 和其映射点 具有相同的三角网格结构，因此求解凸映射算法简化为计算凸缘系数 和求解线性方程组。基于三角网格结构 ， ，采用论文 [ 10 ] [ 11 ] [ 12 ] 类似的方法计算 ，以满足保持形状不发生严重变形的要求。伪代码如表1所示。 Table 1 Pseudo-code mapping interior vertice Algorithm: CalculateInternalNodeCoordinate(Surf， Pln) Description: Calculating the coordinates of internal vertexes in a planar pattern region Input: Surf//collection of surface facets Pln//collection of planar facets Output: Pln 1 Create matrix A and B which are used for sparse matrix equation AX = B 2 FOR each Pnt3d_i which is vertex in Surf DO 3 get index_i which is index of Pnt3d_i in Surf 4 IF Pnt3d_i is on the boundary THEN 5 add (index_i， 1.0) to A 6 get Pnt2d_Bnd_i which is vertex in Pln by index_i 7 add Pnt2d_Bnd_i to B 8 ELSE 9 get Vec_Pnt3d_i which stores adjacent vertexes of Pnt3d_i and Vec_index_i which stores related indexes of Vec_Pnt3d_i 10 create Total_Angle_i， Vec_Length_i and Vec_Angle_i for flattened adjacent vertexes 11 FOR each j DO 12 calculate Angle_j which is angle of three vertexes which are Vec_Pnt3d_i(j)， Pnt3d_i and Vec_Pnt3d_i(j+1) 13 add Angle_j to Vec_Angle_i 14 Total_Angle_i += Angle_j 15 calculate Length_j which is length between Vec_Pnt3d_i(j) and Pnt3d_i 16 add Length_j to Vec_Length ENDFOR 17 FOR each j DO 18 Vec_Angle_i(j) = Vec_Angle_i(j) / Total_Angle_i * 2 * Pi 19 calculate Vec_Pnt2d_i which stores coordinates of flattened adjacent vertexes by Vec_Length_i and Vec_Angle_i 20 calculate f_i which is linear combination relationship between Pnt2d_i which is related to Pnt3d_i and Vec_Pnt2d_i by Pnt2d_i， index_i， Vec_Pnt2d_i and Vec_Pnt3d_i 21 add f_i to A and B 22 calculate Vec_Pnt2d which stores coordinates of nodes in a planar pattern region by solving the sparse matrix equation AX = B ENDFOR ENDFOR 23 FOR each i DO 24 IF Vec_Pnt2d(i) is not on the boundary THEN add (i， Vec_Pnt2d(i)) to Pln ENDFOR END 表1. 映射内部顶点算法 2.1.3. 采用线性插值映射三角面片 原始三角网格模型与展平后的三角网格之间的对应关系，可以利用三角网格的重心坐标创建，如图3所示， 为原始模型上某三角面片 中的任意一点， 与三角面片 为其映射对应部分，两者具有相同的重心坐标 。 图3. 映射三角面片示意图 基于 ， ， ，可以得到： (4) 三角网格 中映射点 坐标计算公式为： (5) 如图4所示，上图为待打标模型的三角网格示意图，下图为利用上述算法得到展平后的平面网格，上图中的每一个三角网格在下图中都能找到相对应的网格。 图4. 三角网格展平示意图 2.2. 映射图案到模型表面 在模型曲面被展平以后，可以通过两步将平面图案包裹到物体模型表面：1) 将待打标图案与通过展平曲面得到的二维平面对齐，使得图案中的每个离散点在平面中都有确定的坐标；2) 利用上节构造的三角网格与展开平面之间的映射关系，将图案映射到三维网格模型上。 如图5中(a)所示为待打标平面图案局部示意图，将平面图案与网格曲面展平得到的平面对齐，这样图案就与三角网格模型建立了映射关系，如上图(b)所示。例如图案中G的一个顶点 根据映射关系进一步得到 在原始网格中的坐标，记为 ，如图(c)所示，即可将平面图案映射到三角网格模型的曲面上。 图5. 图案映射流程示意图 为了验证上述算法的有效性，基于Microsoft Visual Studio 2015平台，使用C++作为开发语言，开展以下仿真实验。如图6所示为汽车面板的三角网格模型，首先利用展平算法将其映射到二维平面上，映射后效果如图4所示。然后将待打标六边形图案和展平后的平面对齐，以建立图案和三角网格模型之间的映射关系，同时还能保证打标到模型孔隙上的图案被去除掉。 图6. 汽车面板三角网格模型 根据图7可以看到，映射到曲面上的图案整体没有发生严重的变形，如图中A1倾斜区域效果亦较好；但由于局部曲率变化较大，如图中B1区域，图案打标后发生轻微的扭曲变形。 图7. 汽车面板激光打标仿真结果