一种复杂平面片交线段的求取方法技术

技术编号:12613923 阅读:75 留言:0更新日期:2015-12-30 12:17
本发明专利技术涉及一种复杂平面片交线段的求取方法,其基本思想是认为两个复杂平面片求交的结果是由若干个线段组成的,首先由两个平面片所在的平面方程求出足够长的理论交线段;接着在每个平面片上求出边线段与理论交线段的交点,并按照交点的投影系数大小对交点进行排序,每对交点形成一个交线段,这样得到每个平面片交线段的集合;最后求出两个平面片交线段集合的交集,即为所求的两个复杂平面片的交线段。本发明专利技术具有简单易行、算法逻辑严密和几何完备性好、算法计算量小等优点,可用于CAD、CAM、CAE、虚拟现实、3D打印等领域的几何建模。

【技术实现步骤摘要】
一种复杂平面片交线段的求取方法
本专利技术属于计算机图形学
,涉及一种复杂平面片交线段的求取方法,可用于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月,作者:PhilipJ.Schneider、DavidH.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中本文档来自技高网
...
一种复杂平面片交线段的求取方法

【技术保护点】
一种复杂平面片交线段的求取方法,其特征是:包括如下步骤:步骤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在线段向量上的投影系数定义为:lp=(MP→,MN→)(MN→,MN→);]]>步骤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中的线段。...

【技术特征摘要】
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链表中;步骤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中的线段;所述的第一平面片A和第二平面片B为三维物体表面上的面片,采用BRep表示形式,即用点、边、环来定义复杂平面片,规定正对物体看去时,外环顶点顺序为逆时针方向、内环顶点顺序为顺时针方向;所述的步骤103中判断第一平面片A的包围盒和第二平面片B的包围盒是否相交,包括以下步骤:步骤201:如果第一平面片A的包围盒的A.max.X小于第二平面片B的包围盒的B.min.X或者第一平面片A的包围盒的A....

【专利技术属性】
技术研发人员:许社教邱扬杨矿生田锦杜美玲李唯唐亚刚叶松涛
申请(专利权)人:西安电子科技大学
类型:发明
国别省市:陕西;61

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1