一种三维平面实体的布尔运算方法技术

技术编号:10600863 阅读:249 留言:0更新日期:2014-11-05 13:47
本发明专利技术涉及一种三维平面实体的布尔运算方法,其基本思想是认为两个三维平面实体A和B布尔运算的结果是由保留面和修改面组成的,先通过给定的方法产生两个实体布尔运算所用的四个共享信息链表A_out_B、A_in_B、B_out_A、B_in_A,然后按照布尔运算类型由共享信息链表形成布尔运算结果。本发明专利技术具有简单易行、算法逻辑严密和几何完备性好、算法运算量小等优点,可用于CAD、CAM、CAE、计算机动画、虚拟现实等领域的三维实体建模。

【技术实现步骤摘要】
一种三维平面实体的布尔运算方法
本专利技术属于计算机图形学
,涉及一种三维平面实体的布尔运算方法,具体地说是两个三维平面实体通过并、交、差布尔运算以得到新的三维实体的方法,可用于CAD、CAM、CAE、计算机动画、虚拟现实等领域的三维实体建模。
技术介绍
随着现代科学技术的飞速发展,尤其是计算机虚拟现实、动画仿真等技术的日益成熟,人们迫切希望能对现实世界进行真实模拟,而布尔运算成为了至关重要的技术之一。目前,三维几何模型越来越复杂,虚拟环境规模越来越大,同时,人们对实时交互和真实场景的需求越来越高,因此向研究人员提出了巨大的挑战,并再次让布尔运算成为了研究的热点。在三维几何建模(即几何造型)过程中一方面需要组合简单实体(如多面体、圆柱体、圆锥体、圆球体等)为复杂实体,另一方面需要把复杂实体解析为简单实体的组合,这两个过程都可以归结为几何实体的布尔运算问题。在几何建模领域中,比起其它专门算法,实体布尔运算具有较大的通用性和基础性,成为计算机几何造型和CAD、CAM、CAE、虚拟现实等领域必不可少的工具。因此,对三维实体布尔运算技术的研究,具有重要的学术意义和应用价值。三维实体布尔运算在商用软件中已很成熟,但其实现方法在公开文献上尚未见到。在计算机图形学领域,三维布尔运算的主要实现方式有半空间法、八叉树法、BRep(边界表示)法等,半空间法和八叉树法目前已基本不采用,BRep法是目前三维实体布尔运算的主要实现方式。BRep方法是用点、边、面、环以及它们之间相互的邻接关系定义三维实体,实体表面、边界线、交线等都显式给出,参与布尔运算的实体、运算中几何元素处理以及运算得到的实体都采用BRep形式。由于曲面可以由平面片逼近,因此多面体之间的布尔运算是实现包括曲面在内的复杂实体建模的基础。目前研究基于BRep形式的三维实体布尔运算的公开文献并不是很多。论文“基于降维的三维布尔运算算法与实现”(上海交通大学硕士学位论文,2008年2月,作者:周志超)提出三维布尔运算的结果由保留面和修改面组成,其修改面由截切平面与剖面通过传统的二维布尔运算得到,且保留面和修改面的获取方法依三维布尔运算的类型(并、交、差)不同而不同,该文的三维布尔运算、二维布尔运算都是一种运算类型对应一种算法;文献“计算机图形学”(清华大学出版社,1995年8月,作者:孙家广)介绍了Muuss和Butler于1991年提出的“求交共享、分类、归并”的非正则三维形体布尔运算方法,“求交共享”是先将一个形体中的边、环、面所有几何元素与另一个形体的所有几何元素进行求交,然后通过一定的拓扑算子将交点、交线插入形体中而被两个形体所共享;“分类”是把每个形体经求交后被适当分割的几何元素与另一形体进行比较,以决定这些元素是包含于(in)另一形体,还是在另一形体之外(out),还是在另一形体边界上(on),分类包括点的分类、边的分类和环的分类;“归并”是根据并、交、差运算类型对几何元素分类结果进行取舍,以决定哪些元素作为结果保留,哪些元素被丢弃。可以看出,已有研究成果存在以下问题:(1)算法复杂,实现难度较大;(2)算法完备性缺乏强有力的理论支撑;(3)算法运算量较大。
技术实现思路
本专利技术的目的在于克服上述已有技术的不足,提供一种算法简单、算法运算量小的三维平面实体的布尔运算方法。本专利技术的目的是这样实现的:一种三维平面实体的布尔运算方法,其特征是:至少包括如下步骤:步骤101:依次读入实体A和实体B的数据,将实体A的所有顶点、边、环和面的数据分别读入到A_Point_list、A_Line_list、A_Loop_list、A_Face_list链表中,实体B的所有顶点、边、环和面的数据分别读入到B_Point_list、B_Line_list、B_Loop_list、B_Face_list链表中;步骤102:遍历链表A_Point_list、A_Line_list、A_Loop_list、A_Face_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_Loop_list、B_Face_list求取实体B的包围盒值B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z;步骤103:判断实体A的包围盒与实体B的包围盒是否相交,若相交则转至步骤107,若不相交则转至步骤104;步骤104:判断实体A和实体B相离还是内含,若相离转至步骤106,若内含转至步骤105;步骤105:若实体B内含于实体A,令A_out_B=A,B_out_A=null,A_in_B=null,B_in_A=B,转至步骤121;若实体A内含于实体B,令B_out_A=B,A_out_B=null,B_in_A=null,A_in_B=A,转至步骤121;这里链表A_out_B用于存储实体A中不与实体B相交的保留面和实体A中与实体B相交的修改面,链表B_out_A存储实体B中不与实体A相交的保留面和实体B中与实体A相交的修改面,链表A_in_B存储实体A中与实体B相交所产生的修改面,链表B_in_A存储实体B中与实体A相交所产生的修改面;保留面是实体的原有面,经过布尔运算未发生变化而被保留下来的面,修改面是经过布尔运算将原有面进行了修改并用于组成布尔运算所得实体的面;步骤106:实体A与实体B相离,则将实体A的所有面存入A_out_B,实体B的所有面存入B_out_A,并令A_in_B=null、B_in_A=null,转至步骤121;步骤107:遍历实体A的链表A_Point_list、A_Line_list、A_Loop_list、A_Face_list,取实体A的一个面FA;步骤108:判断面FA是否与实体B相交,若不相交,转至步骤109,如果相交,转至步骤110;步骤109:将实体A的面FA存入链表A_out_B,转至步骤113;步骤110:用面FA截切实体B,得到剖面多边形,记该多边形为F1;步骤111:对面FA多边形和剖面多边形F1进行Weiler—Atherton内裁剪运算,将内裁剪结果存入A_in_B中;步骤112:对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算,外裁剪结果存入A_out_B中;步骤113:判断实体A的面是否全部处理完,若未处理完转至步骤107,若处理完,则转至步骤114;步骤114:遍历实体B的链表B_Point_list、B_Line_list、B_Loop_list、B_Face_list,取实体B的一个面FB;步骤115:判断面FB是否与实体A相交,若不相交,转至步骤116,如果相交,转至步骤117;步骤116:将实体B的面FB存入链表B_out_A,转至步骤120;步骤117:用面FB截切实体A,得到剖面多边形,记该多边形为F2;步骤118:对面FB多边形和剖面多边形F2进行Weiler—Atherton内裁剪运算,将内裁剪结果存入B_in_A中;步骤119:对面FB多边形和剖面多边形F2进行Weiler—Atherton外裁剪运算,将外裁本文档来自技高网
...
一种三维平面实体的布尔运算方法

【技术保护点】
一种三维平面实体的布尔运算方法,其特征是:包括如下步骤:步骤101:依次读入实体A和实体B的数据,将实体A的所有顶点、边、环和面的数据分别读入到A_Point_list、A_Line_list、A_Loop_list、A_Face_list链表中,实体B的所有顶点、边、环和面的数据分别读入到B_Point_list、B_Line_list、B_Loop_list、B_Face_list链表中;步骤102:遍历链表A_Point_list、A_Line_list、A_Loop_list、A_Face_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_Loop_list、B_Face_list求取实体B的包围盒值B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z;步骤103:判断实体A的包围盒与实体B的包围盒是否相交,若相交则转至步骤107,若不相交则转至步骤104;步骤104:判断实体A和实体B相离还是内含,若相离转至步骤106,若内含转至步骤105;步骤105:若实体B内含于实体A,令A_out_B=A,B_out_A=null,A_in_B=null,B_in_A=B,转至步骤121;若实体A内含于实体B,令B_out_A=B,A_out_B=null,B_in_A=null,A_in_B=A,转至步骤121;这里链表A_out_B用于存储实体A中不与实体B相交的保留面和实体A中与实体B相交的修改面,链表B_out_A存储实体B中不与实体A相交的保留面和实体B中与实体A相交的修改面,链表A_in_B存储实体A中与实体B相交所产生的修改面,链表B_in_A存储实体B中与实体A相交所产生的修改面;保留面是实体的原有面,经过布尔运算未发生变化而被保留下来的面,修改面是经过布尔运算将原有面进行了修改并用于组成布尔运算所得实体的面;步骤106:实体A与实体B相离,则将实体A的所有面存入A_out_B,实体B的所有面存入B_out_A,并令A_in_B=null、B_in_A=null,转至步骤121;步骤107:遍历实体A的链表A_Point_list、A_Line_list、A_Loop_list、A_Face_list,取实体A的一个面FA;步骤108:判断面FA是否与实体B相交,若不相交,转至步骤109,如果相交,转至步骤110;步骤109:将实体A的面FA存入链表A_out_B,转至步骤113;步骤110:用面FA截切实体B,得到剖面多边形,记该多边形为F1;步骤111:对面FA多边形和剖面多边形F1进行Weiler—Atherton内裁剪运算,将内裁剪结果存入A_in_B中;步骤112:对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算,外裁剪结果存入A_out_B中;步骤113:判断实体A的面是否全部处理完,若未处理完转至步骤107,若处理完,则转至步骤114;步骤114:遍历实体B的链表B_Point_list、B_Line_list、B_Loop_list、B_Face_list,取实体B的一个面FB;步骤115:判断面FB是否与实体A相交,若不相交,转至步骤116,如果相交,转至步骤117;步骤116:将实体B的面FB存入链表B_out_A,转至步骤120;步骤117:用面FB截切实体A,得到剖面多边形,记该多边形为F2;步骤118:对面FB多边形和剖面多边形F2进行Weiler—Atherton内裁剪运算,将内裁剪结果存入B_in_A中;步骤119:对面FB多边形和剖面多边形F2进行Weiler—Atherton外裁剪运算,将外裁剪结果存入B_out_A中;步骤120:判断实体B的面是否全部处理完,若未处理完转至步骤114,若处理完,则转至步骤121;步骤121:判断实体A和实体B的布尔运算类型,若为并运算A∪B,则转至步骤122;若为交运算A∩B,则转至步骤123;若为差运算A‑B,则转至步骤124,若为差运算B‑A,则转至步骤125;步骤122:结果为链表A_out_B和B_out_A的合并;步骤123:结果为链表A_in_B和B_in_A的合并;步骤124:结果为将B_in_A中面的顶点顺序反向后得到的链表和A_out_B链表的合并;步骤125:结果为将A_in_B中面的顶点顺序反向后得到的链表和B_out_A链表的合并。...

【技术特征摘要】
1.一种三维平面实体的布尔运算方法,其特征是:包括如下步骤:步骤101:依次读入实体A和实体B的数据,将实体A的所有顶点、边、环和面的数据分别读入到A_Point_list、A_Line_list、A_Loop_list、A_Face_list链表中,实体B的所有顶点、边、环和面的数据分别读入到B_Point_list、B_Line_list、B_Loop_list、B_Face_list链表中;步骤102:遍历链表A_Point_list、A_Line_list、A_Loop_list、A_Face_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_Loop_list、B_Face_list求取实体B的包围盒值B.min.X.、B.min.Y、B.min.Z、B.max.X、B.max.Y、B.max.Z;步骤103:判断实体A的包围盒与实体B的包围盒是否相交,若相交则转至步骤107,若不相交则转至步骤104;步骤104:判断实体A和实体B相离还是内含,若相离转至步骤106,若内含转至步骤105;步骤105:若实体B内含于实体A,令A_out_B=A,B_out_A=null,A_in_B=null,B_in_A=B,转至步骤121;若实体A内含于实体B,令B_out_A=B,A_out_B=null,B_in_A=null,A_in_B=A,转至步骤121;这里链表A_out_B用于存储实体A中不与实体B相交的保留面和实体A中与实体B相交的修改面,链表B_out_A存储实体B中不与实体A相交的保留面和实体B中与实体A相交的修改面,链表A_in_B存储实体A中与实体B相交所产生的修改面,链表B_in_A存储实体B中与实体A相交所产生的修改面;保留面是实体的原有面,经过布尔运算未发生变化而被保留下来的面,修改面是经过布尔运算将原有面进行了修改并用于组成布尔运算所得实体的面;步骤106:实体A与实体B相离,则将实体A的所有面存入A_out_B,实体B的所有面存入B_out_A,并令A_in_B=null、B_in_A=null,转至步骤121;步骤107:遍历实体A的链表A_Point_list、A_Line_list、A_Loop_list、A_Face_list,取实体A的一个面FA;步骤108:判断面FA是否与实体B相交,若不相交,转至步骤109,如果相交,转至步骤110;步骤109:将实体A的面FA存入链表A_out_B,转至步骤113;步骤110:用面FA截切实体B,得到剖面多边形,记该多边形为F1;步骤111:对面FA多边形和剖面多边形F1进行Weiler—Atherton内裁剪运算,将内裁剪结果存入A_in_B中;步骤112:对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算,外裁剪结果存入A_out_B中;步骤113:判断实体A的面是否全部处理完,若未处理完转至步骤107,若处理完,则转至步骤114;步骤114:遍历实体B的链表B_Point_list、B_Line_list、B_Loop_list、B_Face_list,取实体B的一个面FB;步骤115:判断面FB是否与实体A相交,若不相交,转至步骤116,如果相交,转至步骤117;步骤116:将实体B的面FB存入链表B_out_A,转至步骤120;步骤117:用面FB截切实体A,得到剖面多边形,记该多边形为F2;步骤118:对面FB多边形和剖面多边形F2进行Weiler—Atherton内裁剪运算,将内裁剪结果存入B_in_A中;步骤119:对面FB多边形和剖面多边形F2进行Weiler—Atherton外裁剪运算,将外裁剪结果存入B_out_A中;步骤120:判断实体B的面是否全部处理完,若未处理完转至步骤114,若处理完,则转至步骤121;步骤121:判断实体A和实体B的布尔运算类型,若为并运算A∪B,则转至步骤122;若为交运算A∩B,则转至步骤123;若为差运算A-B,则转至步骤124,若为差运算B-A,则转至步骤125;步骤122:结果为链表A_out_B和B_out_A的合并;步骤123:结果为链表A_in_B和B_in_A的合并;步骤124:结果为将B_in_A中面的顶点顺序反向后得到的链表和A_out_B链表的合并;步骤125:结果为将A_in_B中面的顶点顺序反向后得到的链表和B_out_A链表的合并;所示的步骤110中用面FA截切实体B,得到剖面多边形F1,包括以下步骤:步骤401:读取面FA与实体B的所有面的信息;步骤402:取出实体B的一个面F;步骤403:判断面FA与面F是否相交,若不相交,则转至步骤405,若相交,则转至步骤404;步骤404:求面FA与面F的交线段,将其保存在相交线段链表IntersLine_list中;步骤405:判断实体B的面是否遍历完,若未遍历完,则转至步骤402,若遍历完,则转至步骤406;步骤406:搜索链表IntersLine_list中的交线段,按相邻线段端点重合的规则构造环,将构造的环存入链表Loop_list;步骤407:求取面FA的外法线矢量;步骤408:求取链表Loop_list中各环所在平面的法向量;步骤409:判断各环法向量是否与FA的外法线矢量方向相同,若方向相同则环的顶点顺序不变,若方向相反则将环的顶点顺序逆序排列,经过方向处理后的各环仍保存在链表Loop_list中;步骤410:在环链表Loop_list中找出内环,将内环的顶点顺序逆序排列,最终得到的环链表Loop_list即为剖面多边形F1的数据;所示的步骤111中对面FA多边形和剖面多边形F1进行Weiler—Atherton内裁剪运算,将内裁剪结果存入A_in_B中,包括以下步骤:步骤501:读取面FA的数据信息,并将面FA作为主多边形,读取剖面多边形F1的数据信息,并将剖面多边形F1作为裁剪多边形;步骤502:遍历主多边形环、边和顶点链表,按外环逆时针顺序、内环顺时针顺序将顶点链表中的点存入数组data_P中;步骤503:遍历裁剪多边形环、边和顶点链表,按外环逆时针顺序、内环顺时针顺序将顶点链表中的点存入数组data_Q中;步骤504:求出主多边形和裁剪多边形的所有交点,将交点信息存入数组intersection_Point中,每个交点信息包括交点所属的主多边形和裁剪多边形的边的位置、“入”或“出”标记及交点坐标;这里,交点为“入点”是指在该点处主多边形进入了裁剪多边形,交点为“出点”是指在该点处主多边形离开了裁剪多边形;步骤505:根据交点位置将交点插入主多边形顶点表数组data_P,插入交点后的主多边形顶点表数组记为data_M;步骤506:根据交点位置将交点插入裁剪多边形顶点表数组data_Q,插入交点后的裁剪多边形顶点表数组记为data_C;步骤507:建立空的裁剪结果多边形顶点表loopTmp.Point_li...

【专利技术属性】
技术研发人员:许社教邱扬张居峰徐延雪田锦杜美玲
申请(专利权)人:西安电子科技大学
类型:发明
国别省市:陕西;61

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

1