一种复杂平面片交线段的求取方法与流程

文档序号:14437274阅读:414来源:国知局
一种复杂平面片交线段的求取方法与流程

本发明属于计算机图形学技术领域,涉及一种复杂平面片交线段的求取方法,可用于CAD、CAM、CAE、虚拟现实、3D打印等领域的几何建模和画法几何学的计算机辅助教学。



背景技术:

在现代科学技术的飞速发展下,计算机虚拟现实、动画仿真等技术也日益成熟,对图形实时绘制与自然景物仿真也成为人类的一个迫切的愿望,布尔运算成为了至关重要的技术之一。目前,三维几何模型越来越复杂,虚拟环境的规模越来越大。同时,人们对实时交互和真实场景的需求越来越高,也对研究人员提出了巨大的挑战,使得布尔运算再次成为了研究的热点之一。在三维几何建模过程中一方面需要组合简单实体(如多面体、圆柱体、圆锥体、圆球体等)为复杂实体,另一方面需要把复杂实体解析为简单实体的组合,这两个过程都可以归结为几何实体的布尔运算问题。而在这两个过程中,复杂平面片的交线段的求取方法便是其中的基础也是核心问题,即要处理三维实体布尔运算问题,必须要研究平面片的交线段的求取方法。在几何建模领域中,比起其它专门算法,平面片的交运算具有更大的通用性和基础性,从而也成为计算机几何造型和CAD、CAM、CAE、虚拟现实、3D打印等领域必不可少的工具之一。此外,画法几何学中平面与平面相交问题也是教学的重点和难点内容,研究复杂平面片的求交算法有助于开展相关内容的计算机辅助教学。因此,对复杂平面片的交线段的研究,具有重要的学术意义和应用价值。

目前研究带内环的平面片即复杂平面片间的求交运算的公开文献并不是很多。传统求交线段的方法是利用一个平面片上的线段与另一个平面求交得出交点进而求出交线段,其出发点是利用直线与平面求交。文献“画法几何及机械制图”(陕西科学技术出版社,2002年7月,作者:西北工业大学工程制图教研室)介绍了利用直线与平面求交点来求取两个不带内环的平面片交线段的方法,这是一种在平面片两个已知投影上进行尺规作图求取交线段的方法;文献“计算机图形学”(清华大学出版社,1995年8月,作者:孙家广)给出了两个带内环多边形(分别记作A、B)求交算法的四个步骤:①将多边形A的所有边与多边形B求交,求出所有有效交点;②将多边形B的所有边与多边形A求交,求出所有有效交点;③将所有交点先按y,再按x的大小进行排序;④将每对交点的中点与A和B进行包含性检测,若该中点既在A中又在B中,则该对交点定义了一条交线段;文献“计算机图形学几何工具算法详解”(电子工业出版社,2005年1月,作者:Philip J.Schneider、David H.Eberly,周长发译)介绍了由两个平面的方程求取理论交线的方法,但其用两个平面法矢量的线性组合表示交线上的一个点存在概念错误,因为空间点只能用矢径表示,矢量不能表示空间点。可以看出,已有研究成果存在以下问题:(1)算法较为复杂,实现难度较大。因为算法涉及到线面求交、交点有效性判断、交点多次排序、点在多边形内的检测等众多工作;(2)算法计算量大。算法存在大量的点在多边形内的检测,这项工作首先需要将空间点和多边形转换为二维的点和多边形,这需要一定的计算量,而且检测本身计算量也大;(3)算法存在完备性问题,如当所有交点的x、y坐标都相等时,用x、y坐标进行交点排序就会失效;(4)算法效率不高,体现在相对于需要的结果而言,不少的边与面求交是无用的、点在多边形内的检测也是无用的,交点排序需要进行两次也是低效的。



技术实现要素:

本发明的目的在于克服上述已有技术的不足,提供一种算法简单、可靠、计算量小的复杂平面片的交线段的求取方法。

本发明的目的是这样实现的:一种复杂平面片的交线段的求取方法,其特征是:至少包括如下步骤:

步骤101:读入第一平面片A和第二平面片B的数据,依次读入第一平面片A和第二平面片B的数据,将第一平面片A的所有顶点、边、外环和内环的数据分别读入到A_Point_list、A_Line_list、A_Outer_Loop_list、A_Inners_Loop_list链表中,将第二平面片B的所有顶点、边、外环和内环的数据分别读入到B_Point_list、B_Line_list、B_Outer_Loop_list、B_Inners_Loop_list链表中;

步骤102:遍历链表A_Point_list、A_Line_list、A_Outer_Loop_list求取第一平面片A的包围盒值A.min.X.、A.min.Y、A.min.Z、A.max.X、A.max.Y、A.max.Z;遍历链表B_Point_list、B_Line_list、B_Outer_Loop_list求取第二平面片B的包围盒值B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z;

步骤103:判断第一平面片A的包围盒与第二平面片B的包围盒是否相交,若相交则转至步骤105,若不相交则转至步骤104;

步骤104:第一平面片A与第二平面片B不相交,则令A_inter_B=null,转至步骤116;

步骤105:遍历第一平面片A的链表A_Point_list中,取前三个点构造平面方程YA;

步骤106:遍历第二平面片B的链表B_Point_list中,取前三个点构造平面方程YB;

步骤107:由平面方程YA和YB求取平面片A和B的理论交线,由理论交线形成一个长线段,将其记为L;

步骤108:遍历第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_C中;

步骤109:判断第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段是否全部遍历完,未遍历完则转至步骤108,否则转至步骤110;

步骤110:求data_C中的交点在线段L上的投影系数,将其保存在数组tmp_1中,按照tmp_1中投影系数从小到大的顺序对交点进行排序并删除重复交点,将排序后的交点保存在数组data_A中,相对应的投影系数保存在数组coefficient_A中;这里投影系数的概念为:设点为P,线段的起始端点和终止端点分别为M、N,点P在线段向量上的投影系数定义为:

步骤111:遍历第二平面片B的B_Outer_Loop_list链表和B_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_D中;

步骤112:判断第二平面片B的B_Outer_Loop_list链表和B_Inners_Loop_list链表中的线段是否全部遍历完,未遍历完则转至步骤111,否则转至步骤113;

步骤113:求data_D中的交点在线段L上的投影系数,将其保存在数组tmp_2中,按照tmp_2中投影系数从小到大的顺序对交点进行排序并删除重复交点,将排序后的交点保存在数组data_B中,相对应的投影系数保存在数组coefficient_B中;

步骤114:将数组coefficient_A中的投影系数按前后顺序,每两个投影系数构成一个区间;将数组coefficient_B中的投影系数按前后顺序,每两个投影系数构成一个区间;求取这些区间的交集,将结果保存在数组coefficient_U中;

步骤115:按照coefficient_U中投影系数对应的交点对形成交线段,将得到的交线段保存在链表A_inter_B中;

步骤116:第一平面片A和第二平面片B求交结果为链表A_inter_B中的线段。

所述的步骤103中判断第一平面片A的包围盒和第二平面片B的包围盒是否相交,包括以下步骤:

步骤201:如果第一平面片A的包围盒的A.max.X小于第二平面片B的包围盒的B.min.X或者第一平面片A的包围盒的A.min.X大于第二平面片B的包围盒的B.max.X,转至步骤204,否则转至步骤202;

步骤202:如果第一平面片A的包围盒的A.max.Y小于第二平面片B的包围盒的B.min.Y或者第一平面片A的包围盒的A.min.Y大于第二平面片B的包围盒的B.max.Y,转至步骤204,否则转至步骤203;

步骤203:如果第一平面片A的包围盒的A.max.Z小于第二平面片B的包围盒的B.min.Z或者第一平面片A的包围盒的A.min.Z大于第二平面片B的包围盒的B.max.Z,转至步骤204,否则转至步骤205;

步骤204:结果为第一平面片A的包围盒与第二平面片B的包围盒不相交;

步骤205:结果为第一平面片A的包围盒与第二平面片B的包围盒相交。

所述的步骤107中由平面方程YA和YB求取平面片A和B的理论交线,由理论交线形成一个长线段,将其记为L,包括以下步骤:

步骤301:将平面方程YA:A1x+B1y+C1z+D1=0表示的平面记为平面A,求出平面A的单位法向量的分量分别为

步骤302:将平面方程YB:A2x+B2y+C2z+D2=0表示的平面记为平面B,求出平面B的单位法向量的分量分别为

步骤303:判断等式|nAx|=|nBx|,|nAy|=|nBy|,|nAz|=|nBz|是否同时成立,若同时成立则转至步骤304,否则转至步骤305;

步骤304:结果为两平面无交线;

步骤305:对平面A和平面B的单位法向量作矢量积运算,得到交线的方向向量的三个分量Nx=nAynBz-nAznBy,Ny=nAznBx-nAxnBz,Nz=nAxnBy-nAynBx;然后将方向向量单位化,得到交线的单位方向向量的三个分量

步骤306:若Nz≠0,求出交线上的一点记为P0(x0,y0,z0),这里

步骤307:若Ny≠0,求出交线上的一点记为P0(x0,y0,z0),这里

步骤308:若Nx≠0,求出交线上的一点记为P0(x0,y0,z0),这里

步骤309:两平面理论交线段的两个端点分别为(x0-n'xl,y0-n'yl,z0-n'zl)、(x0+n'xl,y0+n'yl,z0+n'zl),这里l=10000。

所述的步骤108中遍历第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_C中,包括以下步骤:

步骤401:遍历第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段,取出一条线段记为L1并标记已遍历,线段L1的两个端点分别记作P0、P1,线段L1的直线方程为这里P=P0,线段L的两个端点分别记作Q0、Q1,线段L的直线方程为这里Q=Q0,s、t为参数且0≤s,t≤1;

步骤402:将向量单位化,结果记作的分量分别记为mx、my、mz;将向量单位化,结果记作的分量分别记为nx、ny、nz

步骤403:判断等式|mx|=|nx|,|my|=|ny|,|mz|=|nz|是否同时成立,若同时成立则转至步骤404,否则转至步骤407;

步骤404:将线段L1的两个端点P0、P1分别代入线段L的直线方程中,线段L的两个端点Q0、Q1代入线段L1的直线方程中,如果方程都满足则转至步骤405,不满足则转至步骤406;

步骤405:结果为两线段共线,将端点P0、P1保存在数组data_C中;

步骤406:结果为两线段平行,转至步骤408;

步骤407:当线段相互跨立条件(P0-Q0)×(Q1-Q0)·((Q1-Q0)×(P1-Q0))≥0和(Q0-P0)×(P1-P0)·((P1-P0)×(Q1-P0))≥0同时满足时,转至步骤409,否则转至步骤408;

步骤408:两线段没有交点;

步骤409:求两线段交点的参数为

步骤410:将t代入方程中就可得到两线段的交点,将交点保存在数组data_C中。

所述的步骤111中遍历第二平面片B的B_Outer_Loop_list链表和B_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_D中所包含的步骤与步骤108中的步骤401~步骤410相同,所不同的是将步骤401~步骤410第一平面片A变为第二平面片B,data_C变为data_D。

本发明有如下优点:

(1)求交算法简单易行。算法将面与面二维求交问题转化为线段与线段一维求交问题,用一维的方法进行交点排序和集合运算来获取交线段,使复杂的求交运算变得简单;

(2)算法逻辑严密、几何完备性好。算法以理论交线为主线,围绕理论交线进行线段与线段求交、交点排序、线段集合求交,整个步骤逻辑关系严密,不存在几何处理上的漏洞;

(3)算法效率高、计算量小。算法的每一步工作相对于需要的结果而言都是有效的,整个计算量较小。

附图说明

图1是本发明的总流程图;

图2是判断两个平面片包围盒是否相交的流程图;

图3是求两个平面片理论长交线段的流程图;

图4是求平面片上线段与理论长交线段交点的流程图;

图5是第一平面片A和第二平面片B进行求交运算的示例图。

具体实施方式

本发明的复杂平面片确切说是第一平面片A和第二平面片B为三维物体表面上的面片,采用BRep表示形式,即用点、边、环来定义复杂平面片,规定正对物体看去时,外环顶点顺序为逆时针方向、内环顶点顺序为顺时针方向。

参照图1,本发明的两个复杂平面片的交线段的求取方法包括如下步骤:

步骤101:读入第一平面片A和第二平面片B的数据,依次读入第一平面片A和第二平面片B的数据,将第一平面片A的所有顶点、边、外环和内环的数据分别读入到A_Point_list、A_Line_list、A_Outer_Loop_list、A_Inners_Loop_list链表中,将第二平面片B的所有顶点、边、外环和内环的数据分别读入到B_Point_list、B_Line_list、B_Outer_Loop_list、B_Inners_Loop_list链表中;参照图5,第一平面片A有一个外环、一个内环,每个环有四条边,每个边有两个顶点,外环为{1-2-3-4-1}、内环为{5-6-7-8-5};第二平面片B有一个外环、一个内环,每个环有四条边,每个边有两个顶点,外环为{1’ -2’ -3’ -4’ -1’}、内环为{5’ -6’ -7’ -8’ -5’};

步骤102:遍历链表A_Point_list、A_Line_list、A_Outer_Loop_list求取第一平面片A的包围盒值A.min.X.、A.min.Y、A.min.Z、A.max.X、A.max.Y、A.max.Z;遍历链表B_Point_list、B_Line_list、B_Outer_Loop_list求取第二平面片B的包围盒值B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z;参照图5,第一平面片A的包围盒值A.min.X.、A.min.Y、A.min.Z分别为顶点1的x、y、z坐标值,A.max.X、A.max.Y、A.max.Z分别为顶点3的x、y、z坐标值;第二平面片B的包围盒值B.min.X.、B.min.Y、B.min.Z分别为顶点1’的x、y、z坐标值,B.max.X、B.max.Y、B.max.Z分别为顶点3’的x、y、z坐标值;

步骤103:判断第一平面片A的包围盒与第二平面片B的包围盒是否相交,若相交则转至步骤105,若不相交则转至步骤104;

所述的步骤103中判断第一平面片A的包围盒和第二平面片B的包围盒是否相交,参照图2,包括以下步骤:

步骤201:如果第一平面片A的包围盒的A.max.X小于第二平面片B的包围盒的B.min.X或者第一平面片A的包围盒的A.min.X大于第二平面片B的包围盒的B.max.X,转至步骤204,否则转至步骤202;

步骤202:如果第一平面片A的包围盒的A.max.Y小于第二平面片B的包围盒的B.min.Y或者第一平面片A的包围盒的A.min.Y大于第二平面片B的包围盒的B.max.Y,转至步骤204,否则转至步骤203;

步骤203:如果第一平面片A的包围盒的A.max.Z小于第二平面片B的包围盒的B.min.Z或者第一平面片A的包围盒的A.min.Z大于第二平面片B的包围盒的B.max.Z,转至步骤204,否则转至步骤205;

步骤204:结果为第一平面片A的包围盒与第二平面片B的包围盒不相交;

步骤205:结果为第一平面片A的包围盒与第二平面片B的包围盒相交;参照图5,第一平面片A的包围盒与第二平面片B的包围盒相交。

步骤104:第一平面片A与第二平面片B不相交,则令A_inter_B=null,转至步骤116;

步骤105:遍历第一平面片A的链表A_Point_list中,取前三个点构造平面方程YA;

步骤106:遍历第二平面片B的链表B_Point_list中,取前三个点构造平面方程YB;

步骤107:由平面方程YA和YB求取平面片A和B的理论交线,由理论交线形成一个长线段,将其记为L;

所述的步骤107中由平面方程YA和YB求取平面片A和B的理论交线,由理论交线形成一个长线段,将其记为L,参照图3,包括以下步骤:

步骤301:将平面方程YA:A1x+B1y+C1z+D1=0表示的平面记为平面A,求出平面A的单位法向量的分量分别为

步骤302:将平面方程YB:A2x+B2y+C2z+D2=0表示的平面记为平面B,求出平面B的单位法向量的分量分别为

步骤303:判断等式|nAx|=|nBx|,|nAy|=|nBy|,|nAz|=|nBz|是否同时成立,若同时成立,说明两平面平行,则转至步骤304;否则转至步骤305;

步骤304:结果为两平面无交线;

步骤305:对平面A和平面B的单位法向量作矢量积运算,得到交线的方向向量的三个分量Nx=nAynBz-nAznBy,Ny=nAznBx-nAxnBz,Nz=nAxnBy-nAynBx;然后将方向向量单位化,得到交线的单位方向向量的三个分量

步骤306:若Nz≠0,求出交线上的一点记为P0(x0,y0,z0),这里

步骤307:若Ny≠0,求出交线上的一点记为P0(x0,y0,z0),这里

步骤308:若Nx≠0,求出交线上的一点记为P0(x0,y0,z0),这里

步骤309:两平面理论交线段的两个端点分别为(x0-n'xl,y0-n'yl,z0-n'zl)、(x0+n'xl,y0+n'yl,z0+n'zl),这里l=10000。参照图5,第一平面片A和第二平面片B的理论长交线段为L。

步骤108:遍历第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_C中;

所述的步骤108中遍历第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_C中,参照图4,包括以下步骤:

步骤401:遍历第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段,取出一条线段记为L1并标记已遍历,线段L1的两个端点分别记作P0、P1,线段L1的直线方程为这里P=P0,线段L的两个端点分别记作Q0、Q1,线段L的直线方程为这里Q=Q0,s、t为参数且0≤s,t≤1;

步骤402:将向量单位化,结果记作的分量分别记为mx、my、mz;将向量单位化,结果记作的分量分别记为nx、ny、nz

步骤403:判断等式|mx|=|nx|,|my|=|ny|,|mz|=|nz|是否同时成立,若同时成立则转至步骤404,否则转至步骤407;

步骤404:将线段L1的两个端点P0、P1分别代入线段L的直线方程中,线段L的两个端点Q0、Q1代入线段L1的直线方程中,如果方程都满足则转至步骤405,不满足则转至步骤406;

步骤405:结果为两线段共线,将端点P0、P1保存在数组data_C中;

步骤406:结果为两线段平行,转至步骤408;

步骤407:当线段相互跨立条件(P0-Q0)×(Q1-Q0)·((Q1-Q0)×(P1-Q0))≥0和(Q0-P0)×(P1-P0)·((P1-P0)×(Q1-P0))≥0同时满足时,转至步骤409,否则转至步骤408;

步骤408:两线段没有交点;

步骤409:求两线段交点的参数为

步骤410:将t代入方程中就可得到两线段的交点,将交点保存在数组data_C中。

步骤109:判断第一平面片A的A_Outer_Loop_list链表和A_Inners_Loop_list链表中的线段是否全部遍历完,未遍历完则转至步骤108,否则转至步骤110。参照图5,data_C中保存的第一平面片A与理论长交线段L的交点为12、11、9、10。

步骤110:求data_C中的交点在线段L上的投影系数,将其保存在数组tmp_1中,按照tmp_1中投影系数从小到大的顺序对交点进行排序并删除重复交点,将排序后的交点保存在数组data_A中,相对应的投影系数保存在数组coefficient_A中;这里投影系数的概念为:设点为P,线段的起始端点和终止端点分别为M、N,点P在线段向量上的投影系数定义为:

参照图5,交点12、11、9、10的投影系数记为l12、l11、l9、l10,这里l11<l9<l10<l12;按投影系数从小到大对交点进行排序,排序后的交点顺序为11、9、10、12,保存在data_A中,相应的投影系数l11、l9、l10、l12保存在coefficient_A中;

步骤111:遍历第二平面片B的B_Outer_Loop_list链表和B_Inners_Loop_list链表中的线段,取出一个线段与线段L求交,求得的交点保存在数组data_D中;

步骤112:判断第二平面片B的B_Outer_Loop_list链表和B_Inners_Loop_list链表中的线段是否全部遍历完,未遍历完则转至步骤111,否则转至步骤113;参照图5,data_D中保存的第二平面片B与理论长交线段L的交点为10’、9’、11’、12’。

步骤113:求data_D中的交点在线段L上的投影系数,将其保存在数组tmp_2中,按照tmp_2中投影系数从小到大的顺序对交点进行排序并删除重复交点,将排序后的交点保存在数组data_B中,相对应的投影系数保存在数组coefficient_B中;参照图5,交点10’、9’、11’、12’的投影系数记为l10'、l9'、l11'、l12',这里l9'<l11'<l12'<l10';按投影系数从小到大对交点进行排序,排序后的交点顺序为9’、11’、12’、10’,保存在data_B中,相应的投影系数l9'、l11'、l12'、l10'保存在coefficient_B中;

步骤114:将数组coefficient_A中的投影系数按前后顺序,每两个投影系数构成一个区间;将数组coefficient_B中的投影系数按前后顺序,每两个投影系数构成一个区间;求取这些区间的交集,将结果保存在数组coefficient_U中;参照图5,第一平面片A的投影系数区间为[l11,l9]、[l10,l12],第二平面片B的投影系数区间为[l9‘,l11’]、[l12',l10’];第一平面片A和第二平面片B投影系数区间的交集为[l9‘,l9]、[l10,l10’],保存在coefficient_U中;

步骤115:按照coefficient_U中投影系数对应的交点对形成交线段,将得到的交线段保存在链表A_inter_B中;参照图5,第一平面片A和第二平面片B的交线段为9’-9、10-10’,保存在A_inter_B中;

步骤116:第一平面片A和第二平面片B求交结果为链表A_inter_B中的线段。

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