CN104134236A - 一种三维平面实体的布尔运算方法 - Google Patents
一种三维平面实体的布尔运算方法 Download PDFInfo
- Publication number
- CN104134236A CN104134236A CN201410369841.XA CN201410369841A CN104134236A CN 104134236 A CN104134236 A CN 104134236A CN 201410369841 A CN201410369841 A CN 201410369841A CN 104134236 A CN104134236 A CN 104134236A
- Authority
- CN
- China
- Prior art keywords
- entity
- polygon
- face
- intersection point
- list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Image Generation (AREA)
Abstract
本发明涉及一种三维平面实体的布尔运算方法,其基本思想是认为两个三维平面实体A和B布尔运算的结果是由保留面和修改面组成的,先通过给定的方法产生两个实体布尔运算所用的四个共享信息链表A_out_B、A_in_B、B_out_A、B_in_A,然后按照布尔运算类型由共享信息链表形成布尔运算结果。本发明具有简单易行、算法逻辑严密和几何完备性好、算法运算量小等优点,可用于CAD、CAM、CAE、计算机动画、虚拟现实等领域的三维实体建模。
Description
技术领域
本发明属于计算机图形学技术领域,涉及一种三维平面实体的布尔运算方法,具体地说是两个三维平面实体通过并、交、差布尔运算以得到新的三维实体的方法,可用于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外裁剪运算,将外裁剪结果存入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链表的合并。
所示的步骤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:结果为两个包围盒不相交;
步骤205:结果为两个包围盒相交。
所示的步骤108中判断面FA是否与实体B相交,包括以下步骤:
步骤301:读取面FA与实体B的所有面的信息;
步骤302:求面FA的包围盒;
步骤303:判断面FA的包围盒与实体B的包围盒是否相交,若不相交,则转至步骤304,若相交,则转至步骤305;
步骤304:结果为面FA与实体B不相交;
步骤305:实体B的面是否全部判断完,若判断完,则转至步骤304,若未判断完,则转至步骤306;
步骤306:取出实体B的一个面FB;
步骤307:把面FA的所有边与面FB求交,得到理论交点集U;
步骤308:把面FB的所有边与面FA求交,得到理论交点集V;
步骤309:判断交点集U或V是否存在有效交点,若不存在,则转至步骤305,否则转至步骤310;
步骤310:结果为面FA与实体B相交。
所示的步骤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_list;
步骤508:在主多边形顶点表数组data_M中,取未遍历过的第一个交点作为裁剪结果的每个多边形起点且作为当前交点,并将其存入顶点表loopTmp.Point_list中,在data_M中标记该交点已遍历过;
步骤509:判断当前交点为“入点”还是“出点”,若当前交点为“入点”,则转至步骤510;若当前交点为“出点”,则转至步骤511;
步骤510:进入主多边形顶点表数组data_M中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.Point_list中,在data_M中标记该交点已遍历过,转至步骤512;
步骤511:进入裁剪多边形顶点表数组data_C中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.Point_list中,在data_C中标记该交点已遍历过,转至步骤512;
步骤512:判断当前交点是否与裁剪结果多边形起点相同,若不同,则转至步骤509,若相同,则转至步骤513;
步骤513:判断主多边形顶点表数组data_M中交点是否全部遍历完,若未遍历完,则转至步骤508,若遍历完,则转至步骤514;
步骤514:将顶点表loopTmp.Point_list中的顶点按顺序存入链表A_in_B。
所示的步骤112中对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算,将外裁剪结果存入A_out_B中,包括以下步骤:
步骤601:读取面FA的数据信息,并将面FA作为主多边形,读取剖面多边形F1的数据信息,并将剖面多边形F1作为裁剪多边形;
步骤602:遍历主多边形环、边和顶点链表,按外环逆时针顺序、内环顺时针顺序将顶点链表中的点存入数组data_I中;
步骤603:遍历裁剪多边形环、边和顶点链表,按外环顺时针顺序、内环逆时针顺序将顶点链表中的点存入数组data_J中;
步骤604:求出主多边形和裁剪多边形的所有交点,将交点信息存入数组inters_P中,每个交点信息包括交点所属的主多边形和裁剪多边形的边的位置、“入”或“出”标记及交点坐标;这里,交点为“入点”是指在该点处主多边形进入了裁剪多边形,交点为“出点”是指在该点处主多边形离开了裁剪多边形;
步骤605:根据交点位置将交点插入主多边形顶点表数组data_I,插入交点后的主多边形顶点表数组记为data_MM;
步骤606:根据交点位置将交点插入裁剪多边形顶点表数组data_J,插入交点后的裁剪多边形顶点表数组记为data_CC;
步骤607:建立空的裁剪结果多边形顶点表loopTmp.P_list;
步骤608:在主多边形顶点表数组data_MM中,取未遍历过的第一个交点作为裁剪结果的每个多边形起点且作为当前交点,并将其存入顶点表loopTmp.P_list中,在data_MM中标记该交点已遍历过;
步骤609:判断当前交点为“入点”还是“出点”,若当前交点为“出点”,则转至步骤610;若当前交点为“入点”,则转至步骤611;
步骤610:进入主多边形顶点表数组data_MM中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.P_list中,在data_MM中标记该交点已遍历过,转至步骤612;
步骤611:进入裁剪多边形顶点表数组data_CC中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.P_list中,在data_CC中标记该交点已遍历过,转至步骤612;
步骤612:判断当前交点是否与裁剪结果多边形起点相同,若不同,则转至步骤609,若相同,则转至步骤613;
步骤613:判断主多边形顶点表数组data_MM中交点是否全部遍历完,若未遍历完,则转至步骤608,若遍历完,则转至步骤614;
步骤614:将顶点表loopTmp.P_list中的顶点按顺序存入链表A_out_B。
所示的步骤115中判断面FB是否与实体A相交,包括的步骤与步骤108中的步骤301~步骤310相同,所不同的是将步骤301~步骤310中的FA变为FB,FB变为FA,实体B变为实体A。
所示的步骤117中用面FB截切实体A,得到剖面多边形F2,包括的步骤与步骤110中的步骤401~步骤410相同,所不同的是将步骤401~步骤410中的FA变为FB,实体B变为实体A,剖面多边形F1变为剖面多边形F2。
所示的步骤118中对面FB多边形和剖面多边形F2进行Weiler—Atherton内裁剪运算,将内裁剪结果存入B_in_A中,包括的步骤与步骤111中的步骤501~步骤514相同,所不同的是将步骤501~步骤514中的FA变为FB,剖面多边形F1变为剖面多边形F2,内裁剪结果A_in_B变为B_in_A。
所示的步骤119中对面FB多边形和剖面多边形F2进行Weiler—Atherton外裁剪运算,将外裁剪结果存入B_out_A中,包括的步骤与步骤112中的步骤601~步骤614相同,所不同的是将步骤601~步骤614中的FA变为FB,剖面多边形F1变为剖面多边形F2,外裁剪结果A_out_B变为B_out_A。
本发明有如下优点:
(1)所提出的三维实体布尔运算算法思路清晰、简便,算法模块化程度高、易于实现;
(2)所提出的布尔运算算法逻辑严密、几何完备性好,算法鲁棒性高;
(3)所提出的布尔运算算法通过对产生的共享信息简单组合便得到并、交、差三种运算结果,对于同时需要多种布尔运算结果的场合优势突出;
(4)所提出的布尔运算算法运算量小。
附图说明
图1是本发明的总流程图;
图2是判断两个实体包围盒是否相交的流程图;
图3是判断实体A的一个面与实体B是否相交的流程图;
图4是用实体A的一个面截切实体B时求取剖面多边形的流程图;
图5是实体A的一个面多边形与该面截切实体B时所得的剖面多边形进行Weiler—Atherton内裁剪运算以获得A_in_B结果的流程图;
图6是实体A的一个面多边形与该面截切实体B时所得的剖面多边形进行Weiler—Atherton外裁剪运算以获得A_out_B结果的流程图;
图7(a)是实体A和实体B进行布尔运算的示例图,图7(b)是实体A的一个面截切实体B时求取剖面多边形的示例图;
图8是图7(a)所示的实体A和实体B进行布尔运算时生成的四个链表A_out_B、A_in_B、B_out_A、B_in_A的结果。
具体实施方式
本发明的三维平面实体采用BRep表示形式,即用点、边、面、环以及它们之间相互的邻接关系定义三维平面实体,其中面的外环顶点顺序规定为逆时针方向、内环顶点顺序规定为顺时针方向。
本发明的两个三维平面实体布尔运算的结果由保留面和修改面组成。保留面是实体的原有面,经过布尔运算未发生变化而被保留下来的面,修改面是经过布尔运算将原有面进行了修改并用于组成布尔运算所得实体的面。
本发明的基本思想是先产生两个三维平面实体布尔运算所用的四个共享信息链表A_out_B、A_in_B、B_out_A、B_in_A,然后按照布尔运算类型由共享信息链表形成布尔运算结果。其中,链表A_out_B用于存储实体A中不与实体B相交的保留面和实体A中与实体B相交的修改面,链表B_out_A存储实体B中不与实体A相交的保留面和实体B中与实体A相交的修改面,链表A_in_B存储实体A中与实体B相交所产生的修改面,链表B_in_A存储实体B中与实体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链表中;参照图7(a),实体A有6个面,每个面只有一个外环,每个环有4条边,每个边含两个顶点,6个面的环分别为{4-3-7-8-4}、{2-1-5-6-2}、{5-1-4-8-5}、{3-2-6-7-3}、{1-2-3-4-1}、{6-5-8-7-6},实体B也有6个面,每个面只有一个外环,每个环有4条边,每个边含两个顶点,6个面的环分别为{4’-3’-7’-8’-4’}、{2’-1’-5’-6’-2’}、{5’-1’-4’-8’-5’}、{3’-2’-6’-7’-3’}、{1’-2’-3’-4’-1’}、{6’-5’-8’-7’-6’};
步骤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;参照图7(a),实体A的包围盒值A.min.X.、A.min.Y、A.min.Z分别为顶点1的x、y、z坐标值,A.max.X、A.max.Y、A.max.Z分别为顶点7的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分别为顶点7’的x、y、z坐标值;
步骤103:判断实体A的包围盒与实体B的包围盒是否相交,若相交则转至步骤107,若不相交则转至步骤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:结果为两个包围盒不相交;
步骤205:结果为两个包围盒相交。对于图7(a),经判断实体A的包围盒和实体B的包围盒相交。
步骤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;
步骤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;
步骤108中判断面FA是否与实体B相交的方法,参照图3,包括以下步骤:
步骤301:读取面FA与实体B的所有面的信息;
步骤302:求面FA的包围盒;
步骤303:判断面FA的包围盒与实体B的包围盒是否相交,若不相交,则转至步骤304,若相交,则转至步骤305;
步骤304:结果为面FA与实体B不相交;
步骤305:实体B的面是否全部判断完,若判断完,则转至步骤304,若未判断完,则转至步骤306;
步骤306:取出实体B的一个面FB;
步骤307:把面FA的所有边与面FB求交,得到理论交点集U;
步骤308:把面FB的所有边与面FA求交,得到理论交点集V;
步骤309:判断交点集U或V是否存在有效交点,若不存在,则转至步骤305,否则转至步骤310;
步骤310:结果为面FA与实体B相交。参照图7(a),面{2-1-5-6-2}、{5-1-4-8-5}、{1-2-3-4-1}与实体B相交。
步骤109:将实体A的面FA存入链表A_out_B,转至步骤113;参照图7(a),与实体B不相交的3个面{4-3-7-8-4}、{3-2-6-7-3}、{6-5-8-7-6}存入链表A_out_B;
步骤110:用面FA截切实体B,得到剖面多边形,记该多边形为F1;
步骤110中用面FA截切实体B,得到剖面多边形F1的方法,参照图4,包括以下步骤:
步骤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的数据。参照图7(b),以实体A的面{1-2-3-4-1}为例,用其截切实体B时所得的剖面多边形F1为{16’-17’-18’-11-16’}。
步骤111:对面FA多边形和剖面多边形F1进行Weiler—Atherton内裁剪运算,将内裁剪结果存入A_in_B中;
步骤111中对面FA多边形和剖面多边形F1进行Weiler—Atherton内裁剪运算的方法,参照图5,包括以下步骤:
步骤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_list;
步骤508:在主多边形顶点表数组data_M中,取未遍历过的第一个交点作为裁剪结果的每个多边形起点且作为当前交点,并将其存入顶点表loopTmp.Point_list中,在data_M中标记该交点已遍历过;
步骤509:判断当前交点为“入点”还是“出点”,若当前交点为“入点”,则转至步骤510;若当前交点为“出点”,则转至步骤511;
步骤510:进入主多边形顶点表数组data_M中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.Point_list中,在data_M中标记该交点已遍历过,转至步骤512;
步骤511:进入裁剪多边形顶点表数组data_C中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.Point_list中,在data_C中标记该交点已遍历过,转至步骤512;
步骤512:判断当前交点是否与裁剪结果多边形起点相同,若不同,则转至步骤509,若相同,则转至步骤513;
步骤513:判断主多边形顶点表数组data_M中交点是否全部遍历完,若未遍历完,则转至步骤508,若遍历完,则转至步骤514;
步骤514:将顶点表loopTmp.Point_list中的顶点按顺序存入链表A_in_B。参照图7(b),以实体A的面{1-2-3-4-1}为例,它与剖面多边形{16’-17’-18’-11-16’}内裁剪的结果为{11-10-1-12-11},并存入链表A_in_B中。
步骤112:对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算,外裁剪结果存入A_out_B中;
步骤112中对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算的方法,参照图6,包括以下步骤:
步骤601:读取面FA的数据信息,并将面FA作为主多边形,读取剖面多边形F1的数据信息,并将剖面多边形F1作为裁剪多边形;
步骤602:遍历主多边形环、边和顶点链表,按外环逆时针顺序、内环顺时针顺序将顶点链表中的点存入数组data_I中;
步骤603:遍历裁剪多边形环、边和顶点链表,按外环顺时针顺序、内环逆时针顺序将顶点链表中的点存入数组data_J中;
步骤604:求出主多边形和裁剪多边形的所有交点,将交点信息存入数组inters_P中,每个交点信息包括交点所属的主多边形和裁剪多边形的边的位置、“入”或“出”标记及交点坐标;这里,交点为“入点”是指在该点处主多边形进入了裁剪多边形,交点为“出点”是指在该点处主多边形离开了裁剪多边形;
步骤605:根据交点位置将交点插入主多边形顶点表数组data_I,插入交点后的主多边形顶点表数组记为data_MM;
步骤606:根据交点位置将交点插入裁剪多边形顶点表数组data_J,插入交点后的裁剪多边形顶点表数组记为data_CC;
步骤607:建立空的裁剪结果多边形顶点表loopTmp.P_list;
步骤608:在主多边形顶点表数组data_MM中,取未遍历过的第一个交点作为裁剪结果的每个多边形起点且作为当前交点,并将其存入顶点表loopTmp.P_list中,在data_MM中标记该交点已遍历过;
步骤609:判断当前交点为“入点”还是“出点”,若当前交点为“出点”,则转至步骤610;若当前交点为“入点”,则转至步骤611;
步骤610:进入主多边形顶点表数组data_MM中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.P_list中,在data_MM中标记该交点已遍历过,转至步骤612;
步骤611:进入裁剪多边形顶点表数组data_CC中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.P_list中,在data_CC中标记该交点已遍历过,转至步骤612;
步骤612:判断当前交点是否与裁剪结果多边形起点相同,若不同,则转至步骤609,若相同,则转至步骤613;
步骤613:判断主多边形顶点表数组data_MM中交点是否全部遍历完,若未遍历完,则转至步骤608,若遍历完,则转至步骤614;
步骤614:将顶点表loopTmp.P_list中的顶点按顺序存入链表A_out_B。参照图7(b),以实体A的面{1-2-3-4-1}为例,它与剖面多边形{16’-17’-18’-11-16’}外裁剪的结果为{4-10-11-12-2-3-4},并存入链表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;
步骤115中包括的步骤与步骤108中的步骤301~步骤310相同,所不同的是将步骤301~步骤310中的FA变为FB,FB变为FA,实体B变为实体A。
步骤116:将实体B的面FB存入链表B_out_A,转至步骤120;
步骤117:用面FB截切实体A,得到剖面多边形,记该多边形为F2;
步骤117中包括的步骤与步骤110中的步骤401~步骤410相同,所不同的是将步骤401~步骤410中的FA变为FB,实体B变为实体A,剖面多边形F1变为剖面多边形F2。
步骤118:对面FB多边形和剖面多边形F2进行Weiler—Atherton内裁剪运算,将内裁剪结果存入B_in_A中;
步骤118中包括的步骤与步骤111中的步骤501~步骤514相同,所不同的是将步骤501~步骤514中的FA变为FB,剖面多边形F1变为剖面多边形F2,内裁剪结果A_in_B变为B_in_A。
步骤119:对面FB多边形和剖面多边形F2进行Weiler—Atherton外裁剪运算,将外裁剪结果存入B_out_A中;
步骤119包括的步骤与步骤112中的步骤601~步骤614相同,所不同的是将步骤601~步骤614中的FA变为FB,剖面多边形F1变为剖面多边形F2,外裁剪结果A_out_B变为B_out_A。
步骤120:判断实体B的面是否全部处理完,若未处理完转至步骤114,若处理完,则转至步骤121;
经过以上步骤,对于图7(a)所示的两个实体A和B,得到图8所示的四个共享信息链表A_out_B、A_in_B、B_out_A、B_in_A的结果。
步骤121:判断实体A和实体B的布尔运算类型,若为并运算A∪B,则转至步骤122;若为交运算A∩B,则转至步骤123;若为差运算A-B,则转至步骤124,若为差运算B-A,则转至步骤125;
步骤122:结果为链表A_out_B和B_out_A的合并;对于图7(a)所示的两个实体A和B,A∪B的结果为{4-3-7-8-4}、{6-2-12-13-14-5-6}、{4-8-5-14-15-10-4}、{3-2-6-7-3}、{2-3-4-10-11-12-2}、{6-5-8-7-6}、{4’-3’-11-10-15-8’-4’}、{2’-1’-5’-6’-2’}、{5’-1’-4’-8’-5’}、{2’-6’-13-12-11-3’-2’}、{1’-2’-3’-4’-1’}、{8’-15-14-13-6’-5’-8’}等12个面;
步骤123:结果为链表A_in_B和B_in_A的合并;对于图7(a)所示的两个实体A和B,A∩B的结果为{1-14-13-12-1}、{1-10-15-14-1}、{1-12-11-10-1}、{15-10-11-7’-15}、{11-12-13-7’-11}、{13-14-15-7’-13}等6个面;
步骤124:结果为将B_in_A中面的顶点顺序反向后得到的链表和A_out_B链表的合并;对于图7(a)所示的两个实体A和B,A-B的结果为{15-7’-11-10-15}、{11-7’-13-12-11}、{13-7’-15-14-13}、{4-3-7-8-4}、{6-2-12-13-14-5-6}、{4-8-5-14-15-10-4}、{3-2-6-7-3}、{2-3-4-10-11-12-2}、{6-5-8-7-6}等9个面;
步骤125:结果为将A_in_B中面的顶点顺序反向后得到的链表和B_out_A链表的合并;对于图7(a)所示的两个实体A和B,B-A的结果为{1-12-13-14-1}、{1-14-15-10-1}、{1-10-11-12-1}、{4’-3’-11-10-15-8’-4’}、{2’-1’-5’-6’-2’}、{5’-1’-4’-8’-5’}、{2’-6’-13-12-11-3’-2’}、{1’-2’-3’-4’-1’}、{8’-15-14-13-6’-5’-8’}等9个面。
Claims (10)
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链表的合并。
2.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤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:结果为两个包围盒不相交;
步骤205:结果为两个包围盒相交。
3.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤108中判断面FA是否与实体B相交,包括以下步骤:
步骤301:读取面FA与实体B的所有面的信息;
步骤302:求面FA的包围盒;
步骤303:判断面FA的包围盒与实体B的包围盒是否相交,若不相交,则转至步骤304,若相交,则转至步骤305;
步骤304:结果为面FA与实体B不相交;
步骤305:实体B的面是否全部判断完,若判断完,则转至步骤304,若未判断完,则转至步骤306;
步骤306:取出实体B的一个面FB;
步骤307:把面FA的所有边与面FB求交,得到理论交点集U;
步骤308:把面FB的所有边与面FA求交,得到理论交点集V;
步骤309:判断交点集U或V是否存在有效交点,若不存在,则转至步骤305,否则转至步骤310;
步骤310:结果为面FA与实体B相交。
4.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤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的数据。
5.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤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_list;
步骤508:在主多边形顶点表数组data_M中,取未遍历过的第一个交点作为裁剪结果的每个多边形起点且作为当前交点,并将其存入顶点表loopTmp.Point_list中,在data_M中标记该交点已遍历过;
步骤509:判断当前交点为“入点”还是“出点”,若当前交点为“入点”,则转至步骤510;若当前交点为“出点”,则转至步骤511;
步骤510:进入主多边形顶点表数组data_M中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.Point_list中,在data_M中标记该交点已遍历过,转至步骤512;
步骤511:进入裁剪多边形顶点表数组data_C中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.Point_list中,在data_C中标记该交点已遍历过,转至步骤512;
步骤512:判断当前交点是否与裁剪结果多边形起点相同,若不同,则转至步骤509,若相同,则转至步骤513;
步骤513:判断主多边形顶点表数组data_M中交点是否全部遍历完,若未遍历完,则转至步骤508,若遍历完,则转至步骤514;
步骤514:将顶点表loopTmp.Point_list中的顶点按顺序存入链表A_in_B。
6.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤112中对面FA多边形和剖面多边形F1进行Weiler—Atherton外裁剪运算,将外裁剪结果存入A_out_B中,包括以下步骤:
步骤601:读取面FA的数据信息,并将面FA作为主多边形,读取剖面多边形F1的数据信息,并将剖面多边形F1作为裁剪多边形;
步骤602:遍历主多边形环、边和顶点链表,按外环逆时针顺序、内环顺时针顺序将顶点链表中的点存入数组data_I中;
步骤603:遍历裁剪多边形环、边和顶点链表,按外环顺时针顺序、内环逆时针顺序将顶点链表中的点存入数组data_J中;
步骤604:求出主多边形和裁剪多边形的所有交点,将交点信息存入数组inters_P中,每个交点信息包括交点所属的主多边形和裁剪多边形的边的位置、“入”或“出”标记及交点坐标;这里,交点为“入点”是指在该点处主多边形进入了裁剪多边形,交点为“出点”是指在该点处主多边形离开了裁剪多边形;
步骤605:根据交点位置将交点插入主多边形顶点表数组data_I,插入交点后的主多边形顶点表数组记为data_MM;
步骤606:根据交点位置将交点插入裁剪多边形顶点表数组data_J,插入交点后的裁剪多边形顶点表数组记为data_CC;
步骤607:建立空的裁剪结果多边形顶点表loopTmp.P_list;
步骤608:在主多边形顶点表数组data_MM中,取未遍历过的第一个交点作为裁剪结果的每个多边形起点且作为当前交点,并将其存入顶点表loopTmp.P_list中,在data_MM中标记该交点已遍历过;
步骤609:判断当前交点为“入点”还是“出点”,若当前交点为“出点”,则转至步骤610;若当前交点为“入点”,则转至步骤611;
步骤610:进入主多边形顶点表数组data_MM中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.P_list中,在data_MM中标记该交点已遍历过,转至步骤612;
步骤611:进入裁剪多边形顶点表数组data_CC中同位置交点处,从该交点下一个顶点起由前往后取顶点一直取到交点处且该交点作为当前交点,并把取到的点存入顶点表loopTmp.P_list中,在data_CC中标记该交点已遍历过,转至步骤612;
步骤612:判断当前交点是否与裁剪结果多边形起点相同,若不同,则转至步骤609,若相同,则转至步骤613;
步骤613:判断主多边形顶点表数组data_MM中交点是否全部遍历完,若未遍历完,则转至步骤608,若遍历完,则转至步骤614;
步骤614:将顶点表loopTmp.P_list中的顶点按顺序存入链表A_out_B。
7.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤115中判断面FB是否与实体A相交,包括的步骤与步骤108中的步骤301~步骤310相同,所不同的是将步骤301~步骤310中的FA变为FB,FB变为FA,实体B变为实体A。
8.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤117中用面FB截切实体A,得到剖面多边形F2,包括的步骤与步骤110中的步骤401~步骤410相同,所不同的是将步骤401~步骤410中的FA变为FB,实体B变为实体A,剖面多边形F1变为剖面多边形F2。
9.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤118中对面FB多边形和剖面多边形F2进行Weiler—Atherton内裁剪运算,将内裁剪结果存入B_in_A中,包括的步骤与步骤111中的步骤501~步骤514相同,所不同的是将步骤501~步骤514中的FA变为FB,剖面多边形F1变为剖面多边形F2,内裁剪结果A_in_B变为B_in_A。
10.根据权利要求1所述的一种三维平面实体的布尔运算方法,其特征是:所示的步骤119中对面FB多边形和剖面多边形F2进行Weiler—Atherton外裁剪运算,将外裁剪结果存入B_out_A中,包括的步骤与步骤112中的步骤601~步骤614相同,所不同的是将步骤601~步骤614中的FA变为FB,剖面多边形F1变为剖面多边形F2,外裁剪结果A_out_B变为B_out_A。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410369841.XA CN104134236B (zh) | 2014-07-30 | 2014-07-30 | 一种三维平面实体的布尔运算方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410369841.XA CN104134236B (zh) | 2014-07-30 | 2014-07-30 | 一种三维平面实体的布尔运算方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104134236A true CN104134236A (zh) | 2014-11-05 |
CN104134236B CN104134236B (zh) | 2017-01-18 |
Family
ID=51806905
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410369841.XA Expired - Fee Related CN104134236B (zh) | 2014-07-30 | 2014-07-30 | 一种三维平面实体的布尔运算方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104134236B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105205206A (zh) * | 2015-08-19 | 2015-12-30 | 西安电子科技大学 | 一种复杂平面片交线段的求取方法 |
CN107564103A (zh) * | 2017-08-18 | 2018-01-09 | 西安电子科技大学 | 一种三维平面实体的布尔并运算方法 |
WO2018132989A1 (zh) * | 2017-01-19 | 2018-07-26 | 深圳市百能信息技术有限公司 | 一种弧段多边形二维布尔运算方法 |
CN108943724A (zh) * | 2017-05-19 | 2018-12-07 | 三纬国际立体列印科技股份有限公司 | 切层图像处理方法以及立体打印设备 |
CN109636917A (zh) * | 2018-11-02 | 2019-04-16 | 北京微播视界科技有限公司 | 三维模型的生成方法、装置、硬件装置 |
CN109782272A (zh) * | 2018-12-30 | 2019-05-21 | 中国电子科技集团公司第十五研究所 | 三维雷达体的布尔融合方法 |
CN113536199A (zh) * | 2021-07-23 | 2021-10-22 | 中航材导航技术(北京)有限公司 | 一种三维空域体的几何运算方法 |
CN113609545A (zh) * | 2021-05-08 | 2021-11-05 | 杭州群核信息技术有限公司 | 基于方案数据的拆改建比对方法、装置、电子设备及介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0681243B1 (en) * | 1994-04-28 | 1998-12-02 | Hewlett-Packard GmbH | Method for performing boolean operations on geometric objects in a computer-aided design system |
US7031790B2 (en) * | 2002-09-23 | 2006-04-18 | Autodesk, Inc. | Operator for sculpting solids with sheet bodies |
CN101609565A (zh) * | 2009-05-22 | 2009-12-23 | 南京师范大学 | 基于L-Rep模型的三维实体布尔运算方法 |
-
2014
- 2014-07-30 CN CN201410369841.XA patent/CN104134236B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0681243B1 (en) * | 1994-04-28 | 1998-12-02 | Hewlett-Packard GmbH | Method for performing boolean operations on geometric objects in a computer-aided design system |
US7031790B2 (en) * | 2002-09-23 | 2006-04-18 | Autodesk, Inc. | Operator for sculpting solids with sheet bodies |
CN101609565A (zh) * | 2009-05-22 | 2009-12-23 | 南京师范大学 | 基于L-Rep模型的三维实体布尔运算方法 |
Non-Patent Citations (6)
Title |
---|
ARISTIDES A.G.REQUICHA 等: "Boolean Operations in Solid Modeling:Boundary Evaluation and Merging Algorithms", 《PROCEEDINGS OF THE IEEE》 * |
MIGUEL GRANADOS 等: "Boolean Operations on 3D Selective Nef Complexes:Data Structure, Algorithms, and Implementation", 《ESA 2003》 * |
YVON GARDAN 等: "An algorithm reducing 3D Boolean operations to a 2D problem: concepts and results", 《COMPUTER-AIDED DESIGN》 * |
刘子阳: "实体建模与模型简化技术研究", 《中国优秀硕士学位论文全文数据库 信息科技辑 (月刊)》 * |
周志超: "基于降维的三维布尔运算算法与实现", 《微计算机信息》 * |
赖文 等: "三维布尔运算的降维算法", 《东华大学学报(自然科学版)》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105205206A (zh) * | 2015-08-19 | 2015-12-30 | 西安电子科技大学 | 一种复杂平面片交线段的求取方法 |
CN105205206B (zh) * | 2015-08-19 | 2018-05-15 | 西安电子科技大学 | 一种复杂平面片交线段的求取方法 |
WO2018132989A1 (zh) * | 2017-01-19 | 2018-07-26 | 深圳市百能信息技术有限公司 | 一种弧段多边形二维布尔运算方法 |
CN108943724A (zh) * | 2017-05-19 | 2018-12-07 | 三纬国际立体列印科技股份有限公司 | 切层图像处理方法以及立体打印设备 |
CN107564103A (zh) * | 2017-08-18 | 2018-01-09 | 西安电子科技大学 | 一种三维平面实体的布尔并运算方法 |
CN107564103B (zh) * | 2017-08-18 | 2023-02-28 | 西安电子科技大学 | 一种三维平面实体的布尔并运算方法 |
CN109636917A (zh) * | 2018-11-02 | 2019-04-16 | 北京微播视界科技有限公司 | 三维模型的生成方法、装置、硬件装置 |
CN109782272A (zh) * | 2018-12-30 | 2019-05-21 | 中国电子科技集团公司第十五研究所 | 三维雷达体的布尔融合方法 |
CN113609545A (zh) * | 2021-05-08 | 2021-11-05 | 杭州群核信息技术有限公司 | 基于方案数据的拆改建比对方法、装置、电子设备及介质 |
CN113536199A (zh) * | 2021-07-23 | 2021-10-22 | 中航材导航技术(北京)有限公司 | 一种三维空域体的几何运算方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104134236B (zh) | 2017-01-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104134236A (zh) | 一种三维平面实体的布尔运算方法 | |
CN100559398C (zh) | 自动的深度图像配准方法 | |
Zhang et al. | An efficient approach to directly compute the exact Hausdorff distance for 3D point sets | |
CN104966317B (zh) | 一种基于矿体轮廓线的三维自动建模方法 | |
Panozzo et al. | Weighted averages on surfaces | |
CN108073682B (zh) | 基于参数视图函数查询数据库 | |
Pérez et al. | A comparison of hole-filling methods in 3D | |
CN100585638C (zh) | 基于线框的曲面体三维边界表示模型重建方法及其装置 | |
Liu et al. | A complete statistical inverse ray tracing approach to multi-view stereo | |
CN115661374B (zh) | 一种基于空间划分和模型体素化的快速检索方法 | |
Yang et al. | Complex 3d general object reconstruction from line drawings | |
Miao et al. | SymmSketch: Creating symmetric 3D free-form shapes from 2D sketches | |
Ruan et al. | Efficient exact collision detection between ellipsoids and superquadrics via closed-form Minkowski sums | |
CN105205206B (zh) | 一种复杂平面片交线段的求取方法 | |
CN102663789A (zh) | 将二维平面内含洞及岛的多边形三角化的方法 | |
CN115661353A (zh) | 基于二维服装图像与三维人体模型搭配的算法 | |
Jin et al. | Mesh fusion using functional blending on topologically incompatible sections | |
CN107767458A (zh) | 不规则三角网曲面几何拓扑一致分析方法及系统 | |
Karamete et al. | An algorithm for discrete booleans with applications to finite element modeling of complex systems | |
Cheng | Retracted: Application of VR computer image technology in 3D virtualization of sports human science | |
CN107564103A (zh) | 一种三维平面实体的布尔并运算方法 | |
Li et al. | An Improved RANSAC Surface Reconstruction Study | |
Shi et al. | A cylindrical neighborhood for multi-view range images processing | |
Liu et al. | Shape from silhouette outlines using an adaptive dandelion model | |
Gong | Application and Practice of Artificial Intelligence Technology in Interior Design |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170118 Termination date: 20170730 |
|
CF01 | Termination of patent right due to non-payment of annual fee |