基于方向的参数曲面三角化方法、装置、设备及存储介质与流程

文档序号:16323788发布日期:2018-12-19 05:49阅读:153来源:国知局
基于方向的参数曲面三角化方法、装置、设备及存储介质与流程

本发明涉及计算机辅助设计和视觉渲染领域,具体涉及基于方向的参数曲面三角化方法、装置、设备及存储介质。

背景技术

对曲面的镶嵌运算广泛应用于cad,cam,快速成形和计算机视觉渲染领域。人们已经研发出很多算法应用针对于曲面的镶嵌运算,这些计算方法大多产生在计算机开始流行和大规模普及的初期。然而在移动互联网和saas软件开始普及的今天,各式各样的cad,cam等应用也在向云端和移动端靠拢。移动设备和浏览器通常对曲面镶嵌算法的要求会更严格,它需要镶嵌算法能够更好的权衡曲面镶嵌算法运行过程中所占用的各种计算资源和最后产生的三角形数量。

现有的针对于被剪切或未被剪切参数化曲面(trimmedparametricsurface)的镶嵌算法基本分为三类。

方法一:利用参数化曲面生成一组位于曲面上的点,这些点的间隔距离满足一定要求,以使得这些点与相邻的点之间构成的多面体与原曲面的误差控制在一个小的范围内。然后在这些点之中挑选出位于内环、外环线包围的范围之内的点。最后将这些挑选出来的点和剪切面的内环和外环线上的点组合形成新的点集,再对这个点集做三角化运算。

方法二:将参数化曲面划分成很多个小矩形,这些小矩形必须满足一定规则以使得它们构成的平面块能够足够逼近原来的曲面。然后用剪切线来切割这些小矩形,形成新的多边形。最后对上一步生成的所有多边形分别做三角化运算。

方法三:采用迭代的形式将剪切面划分成一个个的直纹面,剪切线也被划分成一片片小段构成直纹面的边界。最后对这些直纹面做三角化运算。

这些方法在处理参数曲面和剪切线的镶嵌时运算量都非常大,方法一虽然简化了获取剪切面内的点的过程,但是对一组二维空间的点做三角化运算时却又需要构造复杂的树形结构,其运算量一点都没有减少。方法二在面对曲面阶次较高或者曲面较大时会产生大量的矩形,在对分析这些矩形和剪切线的交点并重新构造多边形的运算量异常的巨大。方法三中往往会独立的处理被分割的曲面,这会导致在曲面相邻处产生间隙,因此还需要额外的消除间隙算法来配合。



技术实现要素:

为了降低被剪切曲面或未被剪切参数化曲面镶嵌算法的运算量。更好的权衡内存,显卡,cpu(centralprocessingunit,中央处理器)等计算资源,更适合于在移动端和浏览器运行,本发明拟提供基于方向的参数曲面三角化方法、装置、设备及存储介质。

本发明提供一种基于方向的参数曲面三角化方法,包括如下步骤。

在参数坐标系上,在参数化曲面的参数直角坐标空间内,在平行纵轴或平行横轴的第一方向上,将被剪切曲面或未被剪切曲面的原像分割成一组有向小面,每个所述有向小面都不含空心区域且仅由一条外环线包围而成。

在平行纵轴或平行横轴的与所述第一方向不同的第二方向上,对所述有向小面的外环线进行切割操作,得到外环线分割点。

对所述外环线分割点,沿所述第二方向进行单调递增的迭代式三角化运算,得到三角形序列。

进一步地,所述参数化曲面上所有点组成的集合的原像在参数空间上位于一个在u方向从umin到umax,v方向从vmin到vmax组成的一个矩形之中。

进一步地,所述将被剪切曲面或未被剪切曲面的原像分割成一组有向小面,包括如下步骤。

在所述第一方向上取一组相互平行的分割向量[v1,v2,v3,…vn]或者[u1,u2,u3,…um],其中,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax,umin﹤u1﹤u2﹤u3…﹤um﹤umax。

对所述分割向量选择一个特定的长度生成一组与第二方向平行的分割有向线段;这些有向线段或者其延长线与第一方向坐标轴的交点分别为v1,v2,v3,…vn或者u1,u2,u3,…um,每个所述分割有向线段的两个端点在所述第二方向上的坐标均为umin-0.1、umax+0.1或vmin-0.1、vmax+0.1。

将所有分割有向线段转化为分割有向边,对所有所述分割有向边与所述被剪切曲面或未被剪切曲面在参数空间上的原像的内环和外环线做互相分割操作,得到一组分割组合有向边和被分割后的被剪切曲面或未被剪切曲面的内环和外环线,所述一组分割组合有向边分别进行拷贝后再进行反向操作,即得到一组逆向分割组合有向边。

重新连接组合所述分割组合有向边、所述逆向分割组合有向边和所述被分割后的被剪切曲面或未被剪切曲面的内环和外环线,形成一组所述有向小面。

进一步地,所述对所述有向小面的外环线进行分割处理得到外环线分割点,包括如下步骤。

在所述第二方向上生成一组分割直线,所述分割直线队列中的所有直线与第二方向坐标轴的交点分别为u1,u2,u3,…,um或者v1,v2,v3,…,vn,其中,umin﹤u1﹤u2﹤u3…﹤um﹤umax,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax。

用所述分割直线队列对每一个所述有向小面的外环线进行求交运算,得到的交点的有序集合,即为所述外环线分割点集合。

进一步地,所述对所述外环线分割点沿所述第二方向进行单调递增的迭代式三角化运算得到三角形序列,包括如下步骤。

对所述每一组外环线分割点集合,按所述第二方向从小到大排序得到一个点队列。

对整个点队列按从小到大的顺序构成三角形组;逐个检查所述三角形组中每个三角形的合法性,直到检查完所有的点,并得到一组以3个点为一个单元的新队列,且每一个单元的三个点所组成的三角形全部合法;所述检查所述三角形组的合法性包括:判断每个三角形包围的面积内部是否包含所述点队列的其他点,如果不包含,则判定所述三角形合法;如果包含,则对所述内部点进行分裂操作,进一步对分裂后的两组点队列再次按从小到大的顺序构成三角形组,检查所述三角形组的合法性。

逆时针方向连接所述新的队列中每一个单元的点,得到一组有向的三角形。

本发明还提供一种基于方向的参数曲面三角化装置,包括小面分割单元、点分割单元、三角形迭代单元。

小面分割单元在参数坐标系上,在参数化曲面的参数直角坐标空间内,在平行纵轴或平行横轴的第一方向上,将被剪切曲面或未被剪切曲面的原像分割成一组有向小面,每个所述有向小面都不含空心区域且仅由一条外环线包围而成。

点分割单元在平行纵轴或平行横轴的与所述第一方向不同的第二方向上,对所述有向小面的外环线进行切割操作,得到外环线分割点。

三角形迭代单元对所述外环线分割点,沿所述第二方向进行单调递增的迭代式三角化运算,得到三角形序列。

进一步地,所述小面分割单元包括分割向量模块、分割线段模块、分割操作模块、组合模块。

分割向量模块所述第一方向上取一组相互平行的分割向量[v1,v2,v3,…vn]或者[u1,u2,u3,…um],其中,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax,umin﹤u1﹤u2﹤u3…﹤um﹤umax。

分割线段模块对所述分割向量选择一个特定的长度生成一组与第二方向平行的分割有向线段;这些有向线段与第一方向坐标轴的交点分别为v1,v2,v3,…vn或者u1,u2,u3,…um,每个所述分割有向线段的两个端点在所述第二方向上的坐标均为umin-0.1、umax+0.1或vmin-0.1、vmax+0.1。

分割操作模块将所有分割有向线段转化为分割有向边,对所有所述分割有向边与所述被剪切曲面或未被剪切曲面在参数空间上的原像的内环和外环线做互相分割操作,得到一组分割组合有向边和被分割后的被剪切曲面或未被剪切曲面的内环和外环线,所述一组分割组合有向边分别进行拷贝后再进行反向操作,即得到一组逆向分割组合有向边。

组合模块重新连接组合所述分割组合有向边、所述逆向分割组合有向边和所述被分割后的被剪切曲面或未被剪切曲面的内环和外环线,形成一组所述有向小面。

进一步地,所述点分割单元包括直线模块、点分割模块。

直线模块在所述第二方向上生成一组分割直线,所述分割直线队列中的所有直线与第二方向坐标轴的交点分别为u1,u2,u3,…,um或者v1,v2,v3,…,vn,其中,umin﹤u1﹤u2﹤u3…﹤um﹤umax,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax。

点分割模块用所述分割直线队列对每一个所述有向小面的外环线进行求交运算,得到的交点的有序集合,即为所述外环线分割点集合。

所述三角形迭代单元包括点队列模块、迭代模块、三角形序列模块。

点队列模块对所述每一组外环线分割点,按所述第二方向从小到大排序得到一个点队列。

迭代模块对整个点队列按从小到大的顺序构成三角形组;逐个检查所述三角形组中每个三角形的合法性,直到检查完所有的点,并得到一组以3个点为一个单元的新队列,且每一个单元的三个点所组成的三角形全部合法;所述检查所述三角形组的合法性包括:判断每个三角形包围的面积内部是否包含所述点队列的其他点,如果不包含,则判定所述三角形合法;如果包含,则对所述内部点进行分裂操作,进一步对分裂后的两组点队列再次按从小到大的顺序构成三角形组,检查所述三角形组的合法性。

三角形序列模块逆时针方向连接所述新的队列中每一个单元的点,得到一组有向的三角形。

本发明还提供一种电子设备,包括存储器、处理器及存储在该存储器上并可在该处理器上运行的计算机程序,程序被该处理器执行时实现所述的基于方向的参数曲面三角化方法。

本发明还提供一种计算机可读存储介质,其上存储有处理器程序,该处理器程序用于执行所述的基于方向的参数曲面三角化方法。

本发明取得的有益效果如下。

将剪切曲面的点合理条状化后在一个方向上做方向性递增式迭代三角化运算,既保证了平面的近似度又保证了剪切曲线的完整度,保证了独立处理分割曲面时不会产生间隙。

通过建立单一方向的递增式点集模型规避了大范围二维空间点的三角化运算,仅仅对一个维度方向的划分曲面规避了面向整个平面的大量矩形求交点和重构多边形的运算,节省了对运算资源的占用。

附图说明

图1是本发明实施例方法流程示意图;

图2是本发明实施例装置组成示意图;

图3是本发明实施例在参数坐标系上被剪切曲面切割成有向小面示意图;

图4是本发明实施例有向小面切割成外环线分割点示意图;

图5是本发明实施例外环线分割点单调递增迭代三角化示意图;

图6是本发明一实施例被剪切参数化曲面示意图;

图7是本发明另一实施例被剪切参数化曲面示意图;

图8是本发明实施例将直角坐标uv平面分割成m×n个矩形示意图;

图9是本发明实施例获得切割被剪切参数化曲面的分割向量流程示意图;

图10是本发明实施例组合有向边定义示意图;

图11是本发明实施例组合有向边a穿越b定义示意图;

图12是本发明实施例组合有向边a和b的互相分割操作定义示意图;

图13是本发明实施例连接异源有向边定义示意图;

图14是本发明实施例分割有向线段示意图;

图15是本发明实施例分割有向边示意图;

图16是本发明实施例逆向分割组合有向边示意图;

图17是本发明实施例连接组合形成有向小面流程示意图;

图18是本发明实施例获得外环线分割点流程示意图;

图19是本发明实施例点拷贝分裂操作定义示意图;

图20是本发明实施例进行单调递增的迭代化三角形运算得到三角形序列流程示意图;

图21是本发明实施例合法三角形检测运算流程示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,以下将结合附图和实施例,对本发明技术方案的具体实施方式进行更加详细、清楚的说明。然而,以下描述的具体实施方式和实施例仅是说明的目的,而不是对本发明的限制。其只是包含了本发明一部分实施例,而不是全部的实施例,本领域技术人员对于本发明的各种变化获得的其他实施例,都属于本发明保护的范围。

一种基于方向的参数曲面三角化方法,如图1所示,图1是本发明实施例方法流程示意图,包括如下步骤。

步骤100:在参数坐标系上,在参数化曲面的参数直角坐标空间内,在平行纵轴或平行横轴的第一方向上,将被剪切曲面或未被剪切曲面的原像分割成一组有向小面,每个有向小面都不含空心区域且仅由一条外环线包围而成。如图3所示,图3是本发明实施例在参数坐标系上被剪切曲面切割成有向小面示意图。

参数化曲面是指在欧式3维空间的曲面,它由2个参数和一组参数方程所定义。设这两个参数为u,v,那么参数化曲面上所有的点都可以由以下参数方程组得到。

x=f1(u,v)

y=f2(u,v)

z=f3(u,v)

其中umin<=u<=umax;vmin<=v<=vmax。u,v两个参数组成一个参数空间。参数化曲面上所有的点的集合是u,v参数在参数空间上的点的集合通过上述参数方程得到的一个映射。参数化曲面上所有点组成的一个集合的任意一个子集在u,v参数空间上相对应的映射关系形成的点的集合被称为该子集的原像。而参数化曲面上的点的集合的任意一个子集被称为其原像的像。被剪切曲面或未被剪切曲面上所有点的集合是参数化曲面上所有点的集合的一个子集。这个子集在参数空间上的原像由一条外边界线和多条内边界线所包围。每个边界线可以形成一个由起点指向终点的有向环,其中由外边界形成的有向环称为外环,内边界形成的有向环称为内环。被剪切曲面或未被剪切曲面上所有点的集合的原像就是所有有向环左侧所包围的区域的点的集合和所有有向环线上点的集合的并集。因此,剪切曲面或未剪切曲面的原像都是由1条外环和0条或多条内环包围而成。

如图6、图7所示,图6是本发明一实施例被剪切参数化曲面示意图。

图7是本发明另一实施例被剪切参数化曲面示意图。

在步骤100中,将被剪切曲面或未被剪切曲面分割成一组有向小面,包括如下步骤。

步骤110:在第一方向上取一组分割向量[v1,v2,v3,…vn]或者[u1,u2,u3,…um],其中,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax,umin﹤u1﹤u2﹤u3…﹤um﹤umax。

如图3左图所示,在一实施例中,内部区域为环1和环2之间的区域,第一方向为v的方向,一组分割向量的值为v1、v2、v3、v4。

在另一实施例中,如果选择u的方向为第一方向,则这组分割向量的值为u1、u2、u3、…um。

图8是本发明实施例将直角坐标uv平面分割成m×n个矩形示意图;如图8所示,在从uv平面映射到三维曲面的时候,不考虑存在切割线的情况(不考虑被剪切曲面的情况,仅考虑参数曲面),将uv平面分割成m×n个矩形(其中u方向分割m-1次,v方向n-1次),每个矩形又可分割成2个三角形,总共形成2×m×n个在u,v平面上的三角形。这些三角形按照每个顶点在3维曲面上的映射互相连接起来也可以形成一个3维空间的三角形,因此这也对应3维空间上的2×m×n个三角形。在一定误差的约定条件下,我们总能找到合适的分割点位置和合适的m,n值,在uv平面上,沿u方向分割m-1次,v方分割n-1次获得2×m×n个在3维空间上的三角形来近似表达3维空间上的曲面。u方向的分割点形成u方向的分割向量[u1,u2,u3,...um-1],同样v方向的分割向量为[v1,v2,...vn-1]。如果某个方向不需要分割即可保证误差条件,则该方向上的分割向量为空。

图9是本发明实施例获得切割被剪切曲面或未被剪切曲面的分割向量流程示意图。

参数曲面的u,v分割向量[u1,u2,u3,...um-1],[v1,v2,...vn-1]按照用户的判据方案根据整体的参数曲面生成。

判断m≧n?。

如果是,则转步骤111。

如果否,则转步骤112。

步骤111:取预处理分割向量为[u1,u2,u3,...um-1]。

遍历被剪切曲面或未被剪切曲面在uv平面上外环线的所有多段线获得剪切曲面在uv平面上的u方向上的极值ui和uj。

在预处理分割向量上取介于ui和uj之间的所有值,得到新的预处理分割向量[ut,ut+1,…us],其中ut>ui,us<uj。

遍历所有uv平面上的所有内环,检查是否每一个内环在u方向上的跨度都夹着上一步生成的预处理分割向量中的至少一个值,如果没有则生成一个新的u值,这个u值处于该内环在u方向上跨度的中点,并把这个u值按大小顺序插入到上一步所生成的预处理分割向量中。以保证后面分割成有向小面时,所有的小面不含内环,且仅由一条外环线组成。

转到步骤113。

步骤112:取预处理分割向量为[v1,v2,...vn-1]。

遍历被剪切曲面或未被剪切曲面在uv平面上外环线的所有多段线获得剪切曲面在uv平面上的v方向上的极值vi和vj。

在预处理分割向量上取介于vi和vj之间的所有值,得到新的预处理分割向量[vt,vt+1,…vs],其中vt>vi,vs<vj。

遍历所有uv平面上的所有内环,检查是否每一个内环在v方向上的跨度是否都夹着上一步生成的预处理分割向量中的至少一个值,如果没有则生成一个新的v值,这个v值处于该内环在v方向上跨度的中点,并把这个v值按大小顺序插入到上一步所生成的预处理分割向量中。

步骤113:得到剪切曲面的分割向量设为[t1,t2,t3,…tk]。

步骤120:对分割向量选择一个特定的长度生成一组平行于第二方向的分割有向线段;这些有向线段在第一方向上的点的坐标为[t1,t2,t3,…tk],每个分割有向线段的两个端点在第二方向上的坐标均为umin-0.1、umax+0.1或vmin-0.1、vmax+0.1。之所以选择加减0.1,是为了保证分割有向线段的长度足够分割有向小面,0.1代表一个较小的正数,取其他类似的正数也没有问题。

图14是本发明实施例分割有向线段示意图。如图14左图所示,如果v的方向为第一方向,则将生成n条分别以坐标(umin-0.1、vi)为起点,以坐标(umax+0.1,vi)为终点的一组分割有向线段。这一步得到的分割有向线段记作[s1,s2,s3,...si],这里的i从1取到n。

如图14右图所示,如果u的方向为第一方向,则将生成m条分别以坐标(um、vmin-0.1)为起点,以坐标(um,vmax+0.1)为终点的一组分割有向线段。这一步得到的分割有向线段记作[s1,s2,s3,...si],这里的i从1取到m。

步骤130:将所有分割有向线段转化为分割有向边。这些有向边的上游边信息和下游边信息都为空。对所有分割有向边与被剪切曲面或未被剪切曲面在参数空间上的原像的内环和外环线做互相分割操作,得到一组分割组合有向边si_1,si_2,...si_j和被分割后的被剪切曲面或未被剪切曲面的内环和外环线。其中i从1取到k,j的值由每一组分割有向边被分割的次数决定。一组分割组合有向边分别进行拷贝后再进行反向操作,即得到一组逆向分割组合有向边ri_1,ri_2,...ri_j,其中i从1取到k,j的值由每一组分割有向边被分割的次数决定。

如图12所示,图12是本发明实施例组合有向边a和b的互相分割操作定义示意图。

如图10所示,图10是本发明实施例组合有向边定义示意图。

有向线段的定义:有向线段由起点和终点两个在坐标系上的坐标来定义。有向线段指的是起点坐标指向终点坐标的线段。

有向多段线的定义:有向多段线由一组有序的位于坐标系上的坐标来定义。坐标数量大于2,按顺序第一个坐标为该有向多段线的起点,最后一个坐标是该有向多段线的终点,其他点称为中间点。设这组有序坐标是(x1,y1),(x2,y2)…(xn,yn),有向多段线指的是按顺序连接这一组坐标的多段线。

有向边的定义:有向边是一种数据结构,它包含以下属性。

几何信息,一条有向线段或者有向多段线。

上游边信息,指向另外一条有向边,被指向的另外一条有向边的下游信息一定指向本条有向边。如果有向边记做e,则其上游边信息记做e.prev。

下游边信息,指向另外一条有向边,被指向的另外一条有向边的上游信息一定指向本条有向边。如果有向边记做e,则其下游边信息记做e.next。

起点端点信息,指向一个端点数据结构。

终点端点信息,指向一个端点数据结构。

端点的定义:端点是一种数据结构,它包含以下属性。

几何信息,一个参数坐标系上点的坐标数据。

有向边集合,一个包含所有以此端点为起点或者终点的有向边的集合。

组合有向边的定义:组合有向边是一组有序的有向边的集合。这些有向边按顺序满足以下条件。

假设集合中有n条边(n>=2),并且满足第i条边的下游边信息指向第i+1条边,第i+1条边的上游边信息指向第i条边的,i的取值从1到n-1。

第1条有向边的上游边信息可以为空,也可以指向第n条边。

如果第1条边的上游边信息指向第n条边,那么根据定义,第n条边的下游边信息也指向第1条边。此时,这个组合有向边也称作有向环。

假设有向边a的起点端点为p0,终点端点为p1。a的上游边为ap(如果存在),a的下游边为an(如果存在)。定义以下操作为有向边的反向操作。

首先对有向边的几何信息进行反向,如果有向边的几何信息指向一条有向线段则将该几何信息指向一条新有向线段,新有向线段的起点坐标等于旧有向线段的终点,新有向线段的终点等于旧有向线段的起点。如果有向边的几何信息指向一条有向多段线则将该几何信息指向一条新的有向多段线,新有向多段线上坐标的顺序与旧有向多段线上坐标顺序相反。

其次对有向边的上下游边的信息进行反向,如果ap存在,则将a的下游边信息指向ap;接着,如果an存在,则将a的上游边信息指向an。

最后对有向边的端点信息进行反向,将a的终点端点信息指向p0,并将a的起点信息指向p1。

假设组合有向边a有n条有向边收尾相连形成,定义以下操作为组合有向边的反向操作:对组成组合有向边的n条有向边中从第1条开始按顺序逐个进行有向边的方向操作。

设有向边a和一个坐标点(x,y),且该坐标点位于a所指向的几何信息所指的有向线段或者有向多段线上,那么定义以下操作为对有向边a在坐标(x,y)点进行分割操作。

首先对a指向的几何信息进行分割,如果a指向的几何信息是有向线段,则生成两个新的有向线段s1和s2,s1的起点与a的起点的坐标重合,终点与坐标点(x,y)重合,s2的起点与坐标点(x,y)重合,终点与a的终点的坐标重合;如果a指向的几何信息是有向多段线,设有向多段线上从起点到终点的坐标按顺序依次是(x1,y1),(x2,y2),(x3,y3),…(xn,yn),而坐标(x,y)位于(xk,yk)和(xk+1,yk+1)相连的线段上(1<=k<n),据此生成两个新的有向多段线s1和s2,s1上的有序坐标组为(x1,y1),(x2,y2),(x3,y3),…(xk,yk),(x,y),s2上的有序坐标组为(x,y),(xk+1,yk+1),(xk+2,yk+2)…(xn,yn)。

其次对有向边的上下游信息进行分割,有向边a分割生成两个新的有向边a1和a2,其中a1的几何信息指向上一步所生成的s1,a2的几何信息指向上一步所生成的s2。设a的上游边信息指向ap(如果存在),下游边信息指向an(如果存在)。那么如果ap存在,则将ap的下游边信息指向a1,a1上游边信息指向ap;如果an存在,则将an的上游边信息指向a2,a2下游边信息指向an;最后将a1下游边信息指向a2,a2上游边信息指向a1。

最后对有向边的端点进行分割,设a的起点端点为p1,终点端点为p2。首先在p1中的有向边集合中移除a,并加入a1,同时让a1的起点端点信息指向p1。生成一个新端点pm,pm的几何信息等于坐标(x,y),有向边集合由a1,和a2组成。然后将a1终点端点的信息指向pm,a2起点端点的信息指向pm,最后将a2终点端点信息指向p2并在p2的有向边集合中移除a。

设组合有向边a和一个坐标点(x,y),且该坐标点位于组成a的某个有向边e所指向的几何信息所指的有向线段或者有向多段线上,那么对有向边e的分割操作即为对组合有向边a在(x,y)点进行分割操作。

设组合有向边a和b,定义以下操作为a和b做互相分割操作。

求出a和b的所有交点,设为(x1,y1),(x2,y2),...(xn,yn)。针对a和b在所有的交点坐标逐个做分割操作。操作执行后,a被分割成a1,a2,a3,...an+1,b被分割成b1,b2,b3,...bn+1。

图15是本发明实施例分割有向边示意图。如图15所示,si与被剪切曲面或未被剪切曲面的内环线和外环线做相互分割操作,第i条分割有向边被分割成了分割组合有向边,该组合有向边从起点到终点的顺序包含si_1、si_2、...si_j其中j>=1。

图16是本发明实施例逆向分割组合有向边示意图。如图16所示,对分割组合有向边si_1,si_2,...si_j进行拷贝反向,得到逆向分割组合有向边ri_1、ri_2、...ri_j,其中si_j的起点是ri_j的终点,si_j的终点为ri_j的起点。

步骤140:重新连接组合分割组合有向边、逆向分割组合有向边和被分割后的被剪切曲面或未被剪切曲面的内环和外环线,形成一组有向小面。

图17是本发明实施例连接组合形成有向小面流程示意图。设si_1,si_2,...si_j中第m个分割组合有向边为si_m(1<=m<=j),对si_m做如下流程图的操作。

取i=1。

步骤141:取m=1,并定义isinner=false,表示当前有向边在被剪切或未被剪切曲面的外部。

步骤142:取si_m的终点vb。

步骤143:判断经过vb端点的有向边中是否存在属于被剪切曲面或未被剪切曲面的原像的内环或者外环的有向边。

如果否,则进入步骤144;如果是,则进入步骤147。

步骤144:m++。

步骤145:判断m是否大于等于j?

如果是,则i++;进入步骤146;如果否,则返回步骤142继续执行。

步骤146:判断i是否大于等于k?

如果是,则结束;如果否,则返回步骤141。

步骤147:找出经过vb端点且属于内或者外环线的射入边li和射出边lo以及经过该点的逆向分割有向线段组中的射入边ri_in和射出边ri_out。

步骤148:判断si_m和si_m+1所在组合有向边是否穿越过li和lo所在的组合有向边。

如果否,返回步骤144继续执行;如果是,则进入步骤149。

步骤149:判断isinner是否等于ture。

如果否,则进入步骤1491;如果是则进入步骤1492。

步骤1491:分别连接li、si_m+1和ri_in、lo,并让isinner=ture,表示穿入曲面边界;返回144继续执行。

步骤1492:分别连接si_m、lo、li、ri_out,并且将si_m存入loopheaders队列中;如果i等于m则将ri_out也存入loopheaders队列中,最后让isinner=false表示穿出曲面边界,返回144继续执行。loopheaders队列最后存放了多个有向环中的其中一条有向边。

步骤148中,判断组合有向边的穿越。如图11所示,图11是本发明实施例组合有向边a穿越b定义示意图。

如图11所示,如果两条组合有向边a和b都穿过某个端点,a边在该端点的前异位点为ai,后异位点为ao;b边在该端点的前异位点为bi,后异位点为bo。穿过ai和o点的一条直线称为ai;如果ai、o和ao三点共线,本专利只讨论共线的情况,且bi位于ai的一侧,而bo位于ai的另一侧或在ai上,则称组合有向边a穿过组合有向边b。

前异位点和后异位点的定义如图10所示,图10是本发明实施例组合有向边定义示意图。如图10所示,假设存在两条有向边a和b,如果能够a的上游边属性不断迭代去寻找上游边的上游边能够找到b,或者通过a的下游边属性不断迭代去寻找下游边的下游边并能够找到b则称a和b是同源有向边,否则称它们是异源有向边。毫无疑问,根据组合有向边的定义,属于同一条组合边的有向边是同源有向边,不属于同一条组合边的有向边是异源有向边。并且,这个结论反过来也成立:同源有向边属于同一条组合有向边,异源有向边不属于同一条组合有向边。

如果在某个组合有向边中有两条相邻的有向边分别以某个端点为终点和起点,则称该组合有向边穿过该端点。

如果某个组合有向边穿过某端点,那么该组合有向边在该点的射入边的几何属性所指的有向多段线或有向线段上按顺序位于其上一个空间位置不同于该点的起点或中间点被称为该组合有向边在该端点的前异位点。如果该边上不存在前异位点,则按顺序对该边的上游边信息所指向的有向边并以该边的终点为基准来寻找前异位点。如果该组合有向边在该点的射出边的几何属性所指的有向多段线或有向线段上按顺序位于其下一个空间位置不同于该点的终点或中间点被称为该组合有向边在该端点的后异位点。如果该边上不存在后异位点,则按顺序对该边的下游边信息所指的有向边并以该边的起点为基准来寻找后异位点。

步骤1491和步骤1492中,连接各点的操作也称为连接异源有向边,图13是本发明实施例连接异源有向边定义示意图。如图13所示,如果两条组合有向边a和b,它们有一个共同的端点o。a在o点的射入边为a1,射出边为a2;b在o点的射入边为b1,射出边为b2。

定义以下操作为连接异源有向边:将a1的指向下游边属性指向b2(原来是指向a2),同时将b2的指向上游边的属性指向a1(原来是指向b1)。并且定义一个新的端点,几何信息属性与o点的几何信息属性一致,但是其射入边只有a1,射出边只有b1,并且将其作为a1的终点和b1的起点。对b1,a2做同样的连接操作也称为连接异源有向边。

如图3右图所示,在一实施例中,步骤100的处理后,v的方向为第一方向,在第一方向上将曲面分割成一组小面,各个小面是一条条的不含空心区域的且仅有一条外环线包围的小面。

步骤200:在平行纵轴或平行横轴的与第一方向不同的第二方向上,对有向小面的外环线进行切割操作,得到外环线分割点。如图4所示,图4是本发明实施例有向小面切割成外环线分割点示意图。

对有向小面的外环线进行切割处理得到外环线分割点,包括如下步骤。

步骤210:在第二方向上生成一组平行于第一方向坐标轴的分割直线,分割直线队列中的所有直线与第二方向的坐标轴的交点在第二坐标轴方向上的值分别为u1,u2,u3,…,um或者v1,v2,v3,…,vn,其中,umin﹤u1﹤u2﹤u3…﹤um﹤umax,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax。

在一实施例中,如果采用v方向作为第一方向,则取u方向为第二方向,u方向参数化曲面的向量[u1,u2,u3,...um-1]来生成的分割直线队列。这些直线在uv平面上的方程为u=ui(1<=i<=m-1)。

在另一实施例中,如果采用u方向作为第一方向,则取v方向为第二方向,v方向参数化曲面的向量[v1,v2,v3,...vn-1]来生成本步骤的分割直线队列。这些直线在uv平面上的方程为v=vi(1<=i<=n)。

步骤220:用分割直线队列对每一个有向小面的外环线进行求交运算,得到的交点的有序集合,即为外环线分割点集合。

如图18所示,图18是本发明实施例获得外环线分割点流程示意图。

i=1,并定义空队列secondresults。

步骤221:取步骤100得到的loopheaders中的第i个元素ei,且令e=ei;并假设es=ei,并取队列points为空。

步骤222:假设取到有向边为e。

步骤223:求出e的几何信息所指向的有向线段或者有向多段线与直线队列的所有交点,并把这些交点坐标按有向边e上从起点到终点的顺序排序形成分割点队列。

将所得到的分割点添加到points点队列中让e等于e的下游边,即e=e.next。

判断e是否等于es?

如果否,则转到步骤223继续执行。

如果是,i++,并将points中的点以队列的形式完整存入secondresults。

判断i是否大于loopheaders队列的长度。

如果否,则转到步骤221继续执行。

如果是,则结束。

步骤300:对外环线分割点,沿第二方向进行单调递增的迭代式三角化运算,得到三角形序列。如图5所示,图5是本发明实施例外环线分割点单调递增迭代三角化示意图。

对外环线分割点沿第二方向进行单调递增的迭代式三角化运算得到三角形序列,包括如下步骤。

步骤310:对上一步中得到的secondresults中每一组点,按第二方向从小到大排序得到一个新的点队列。

对外环分割点进行排序,假设为a1,a2,a3...an总共n个点(n>=3),这个点的顺序是按第1步生成的有向环中从起点到终点的顺序。这里每个点都有一个prev和next属性,它们指向自己相邻的点。例如a1.prev=an,a1.next=a2;a2.prev=a1;a2.next=prev;...;an.prev=an-1,an.next=a1。

如果s200采用的是u方向,设a1,a2,...an的坐标分别为(u1,v1),(u2,v2),...(un,vn),那么对这些点,按坐标按u方向从小到大排序得到一个新队列b1,b2,...bn。同样,如果s200采用的是v方向,那么对a1,a2,...an按v方向从小到大排序可以得到一新队列b1,b2,...bn。前队列(a1,a2,...an)中第i个点ai与后队列(b1,b2,...bn)中第j个点bj相对应(1<=i<=n,1<=j<=n)。我们称bj为ai的递增顺序点,ai为bj的源点。这样排序之后,a1,a2,...an都增加一个属性c,我们能够通过这个属性以ai.c的形式检索到与它相对应的递增顺序点bj。同样b1,b2,...bn也都增加一个属性d,我们也能够通过这个属性以bj.d的形式找到与之相对应的在a1,a2,...an序列中的点ai。

步骤320:对secondresults中每一个点队列按从小到大的顺序构成三角形组。逐个检查三角形组中每个三角形的合法性,直到检查完所有的点,并得到一组以3个点为一个单元的新队列,且每一个单元的三个点所组成的三角形全部合法。检查三角形组的合法性包括:判断每个三角形包围的面积内部是否包含点队列的其他点。如果不包含,则判定三角形合法。如果包含,则对内部点进行分裂操作,进一步对分裂后的两组点队列再次按从小到大的顺序构成三角形组,检查三角形组的合法性。

图19是本发明实施例点拷贝分裂操作定义示意图。在这里对a1,a2,...an定义如下的分裂操作。如图19所示,在a1,a2,...an中取两个不相邻的点ax和ay,并对这两个点的属性做一个完整的拷贝生成ax’和ay’。如果按顺序进行以下赋值操作:ax.prev.next=ax’,ay.next.prev=ay’,ay’.prev=ax’,ax’.next=ay’,ax.prev=ay,ay.next=ax。这样的操作结果是得到两条自我封闭的点环其中一条按顺序包含ax’,ay’,另外一条按顺序包含ay,ax。

声明一个空的点队列trigs用来保存三角形点序列,完成所有运算后,trigs中第3i,3i+1和3i+2三个点组成一个三角形,i取自然数。

图20是本发明实施例进行单调递增的迭代化三角形运算得到三角形序列流程示意图。对secondresults中每一组队列分别进行以下操作。

取被处理的经过排序的队列inputarray=[b1,b2,...bn]。

步骤321:判断inputarray中元素数量是否小于3?

如果是,则转到步骤327。

如果否,则转到步骤322。

步骤322:判断inputarray中元素数量是否等于3?

如果是,设bl,bm,bn为inputarray队列中的前3个元素,ao,ap,aq是它们的源点。将bl.d,bl.d.next,bl.d.prev按顺序存入trigs队列中;转到步骤327。

如果否,设bl,bm,bn为inputarray队列中的前3个元素,ao,ap,aq是它们的源点。

步骤323:判断(ao.next等于ap)和(ao.prev等于aq)是否同时成立?

如果是,将ao,ap,aq的坐标按顺序存入到trigs队列中,并且让aq.next=ap,ap.prev=aq。

步骤324:删掉inputarray的第1个元素,得到更新后的inputarray的长度比之前少1。

转到步骤321。

如果否,判断(ao.next等于aq)和(ao.prev等于ap)是否同时成立?

如果是,将ao,aq,ap的坐标按顺序存入到trigs队列中,并且让ap.next=aq,aq.prev=ap。

转到步骤324。

如果否,进入步骤325,合法三角形检测运算。

步骤326,合法三角形检测运算得到一个或两个新的inputarray。

转到步骤321,(如果是两个新的inputarray则分别对两个新的inputarray跳转到步骤321)。

步骤327:运算结束。

如图21所示,图21是本发明实施例合法三角形检测运算流程示意图。

步骤325:设ao.next和ao.prev所对应的递增顺序点分别为bx,by。

判断x>y?

如果是,则在inputarray中按顺序取[bm…by-1,by+1,…bx]组成middles队列。

如果否,则在inputarray中按顺序取[bm…bx-1,bx+1,…by]组成middles队列。

定义一个变量istrig=false。

在middles中从头到尾按顺序检查middles队列中元素所对应的源点是否在ao,ao.next,ao.prev三个点的坐标所围成的三角形内。如果检测到一个点在此三角形内,则停止检查后面的元素,并赋值istrig=ture,同时假设找到的这个点为bz。

判断istrig=true?

如果否,则将ao,ao.next,ao.prev三个点的坐标按顺序存入到trigs队列中,并且让ao.next.prev=ao.prev,ao.prev.next=ao.next。

在inputarray中去除掉第1个元素。

转到步骤3252。

如果是,则进入步骤3251的递增顺序点分裂流程。

步骤3251:对bz的源点和ao进行拷贝分裂操作,分裂后源点序列分割成两个闭环的点队列。

根据两个闭环点队列得到与它们对应的两组递增顺序点队列。

输出递增顺序点队列;并跳转到326。

步骤3252:得到新的inputarray,跳转到326。

步骤330:逆时针方向连接新的队列中每一个单元的点,得到一组有向的三角形。

一种基于方向的参数曲面三角化装置,包括小面分割单元1、点分割单元2、三角形迭代单元3。

小面分割单元1在参数坐标系上,在参数化曲面的参数直角坐标空间内,在平行纵轴或平行横轴的第一方向上,将被剪切曲面或未被剪切曲面的原像分割成一组有向小面。每个有向小面都不含空心区域且仅由一条外环线包围而成。点分割单元2在平行纵轴或平行横轴的与第一方向不同的第二方向上,对有向小面的外环线进行切割操作,得到外环线分割点。三角形迭代单元3对外环线分割点沿第二方向进行单调递增的迭代式三角化运算,得到三角形序列。

小面分割单元1包括分割向量模块11、分割线段模块12、分割操作模块13、组合模块14。

分割向量模块11在第一方向上取一组相互平行的分割向量[v1,v2,v3,…vn]或者[u1,u2,u3,…um]。其中,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax,umin﹤u1﹤u2﹤u3…﹤um﹤umax;分割线段模块12对分割向量选择一个特定的长度生成一组与第二方向平行的分割有向线段。这些有向线段与第一方向坐标轴的交点分别为v1,v2,v3,…vn或者u1,u2,u3,…um,每个分割有向线段的两个端点在第二方向上的坐标均为umin-0.1、umax+0.1或vmin-0.1、vmax+0.1。分割操作模块13将所有分割有向线段转化为分割有向边。对所有分割有向边与被剪切曲面或未被剪切曲面在参数空间上的原像的内环和外环线做互相分割操作,得到一组分割组合有向边和被分割后的被剪切曲面或未被剪切曲面的内环和外环线。一组分割组合有向边分别进行拷贝后再进行反向操作,即得到一组逆向分割组合有向边。组合模块14重新连接组合分割组合有向边、逆向分割组合有向边和被分割后的被剪切曲面或未被剪切曲面的内环和外环线,形成一组有向小面。

点分割单元2包括直线模块21、点分割模块22。

直线模块21在第二方向上生成一组分割直线。分割直线队列中的所有直线与第二方向坐标轴的交点分别为u1,u2,u3,…,um或者v1,v2,v3,…,vn,其中,umin﹤u1﹤u2﹤u3…﹤um﹤umax,vmin﹤v1﹤v2﹤v3…﹤vn﹤vmax。点分割模块22用分割直线队列对每一个有向小面的外环线进行求交运算,得到的交点的有序集合,即为外环线分割点集合。

三角形迭代单元3包括点队列模块31、迭代模块32、三角形序列模块33。

点队列模块31,用于对每一组外环线分割点集合。按第二方向从小到大排序得到一个点队列。迭代模块32,用于对整个点队列按从小到大的顺序构成三角形组。逐个检查三角形组中每个三角形的合法性,直到检查完所有的点,并得到一组以3个点为一个单元的新队列,且每一个单元的三个点所组成的三角形全部合法。检查三角形组的合法性包括:判断每个三角形包围的面积内部是否包含点队列的其他点。如果不包含,则判定三角形合法。如果包含,则对内部点进行分裂操作,进一步对分裂后的两组点队列再次按从小到大的顺序构成三角形组,检查三角形组的合法性。三角形序列模块33,用于逆时针方向连接新的队列中每一个单元的点,得到一组有向的三角形。

一种电子设备包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序。计算机程序包含用于执行本发明流程图的方法的程序代码,处理器执行计算机程序时实现如上所述的基于方向的参数曲面三角化方法。存储器、处理器通过总线与通信接口彼此相连。

一种计算机可读存储介质上存储有处理器程序,该处理器程序用于执行基于方向的参数曲面三角化方法。其中,计算机可读存储介质可以是只读存储器(rom)、随机存取存储器(ram)、光盘只读存储器(cd-rom)、磁带、软盘和光数据存储设备等。

需要说明的是,以上参照附图所描述的各个实施例仅用以说明本发明而非限制本发明的范围,本领域的普通技术人员应当理解,在不脱离本发明的精神和范围的前提下对本发明进行的修改或者等同替换,均应涵盖在本发明的范围之内。此外,除上下文另有所指外,以单数形式出现的词包括复数形式,反之亦然。另外,除非特别说明,那么任何实施例的全部或一部分可结合任何其它实施例的全部或一部分来使用。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1