[发明专利]一种三维平面实体的布尔运算方法有效
申请号: | 201410369841.X | 申请日: | 2014-07-30 |
公开(公告)号: | CN104134236B | 公开(公告)日: | 2017-01-18 |
发明(设计)人: | 许社教;邱扬;张居峰;徐延雪;田锦;杜美玲 | 申请(专利权)人: | 西安电子科技大学 |
主分类号: | G06T17/10 | 分类号: | G06T17/10 |
代理公司: | 西安吉盛专利代理有限责任公司61108 | 代理人: | 张培勋 |
地址: | 710071 陕西省*** | 国省代码: | 陕西;61 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | 本发明涉及一种三维平面实体的布尔运算方法,其基本思想是认为两个三维平面实体A和B布尔运算的结果是由保留面和修改面组成的,先通过给定的方法产生两个实体布尔运算所用的四个共享信息链表A_out_B、A_in_B、B_out_A、B_in_A,然后按照布尔运算类型由共享信息链表形成布尔运算结果。本发明具有简单易行、算法逻辑严密和几何完备性好、算法运算量小等优点,可用于CAD、CAM、CAE、计算机动画、虚拟现实等领域的三维实体建模。 | ||
搜索关键词: | 一种 三维 平面 实体 布尔 运算 方法 | ||
【主权项】:
一种三维平面实体的布尔运算方法,其特征是:包括如下步骤:步骤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_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;所示的步骤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。
下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于西安电子科技大学,未经西安电子科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/patent/201410369841.X/,转载请声明来源钻瓜专利网。