找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2392|回复: 8

[求助]:如何判断两个面域(AcDbRegion)是否相交?

[复制链接]
发表于 2004-9-8 17:42:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
如何判断两个面域(AcDbRegion)相交,有重叠的区域?
如果使用函数booleanOper做交集运算,什么样子的结果可以认为这两个面域相交?
各位大哥帮帮忙啊!!
谢谢了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-9-9 14:24:14 | 显示全部楼层
面与面在空间中不是相交就是平行(包括重叠),换句话说只要两各面的法线向量一样就是平行(包括重叠),其他情况就是相交。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-9-9 16:39:55 | 显示全部楼层
不是判断两个平面的关系,是在2d的情况下,已知两个有边界的区域,怎么判断他们又相互重叠的部分,我看论坛上用函数booleanOper的两个返回值来验证,但是在我的程序中并不好用,每次返回的结果都是一样的,验证不出来是否相交,现在将代码附上,那位高手帮忙看看!

  1. BOOL IsAreaIntersect(AcDbObjectId area1, AcDbObjectId area2)
  2. {
  3.         AcDbObjectIdArray  a1,a2;
  4.         a1.append(area1);
  5.         AcDbRegion * pRegion1 = GetRegion(a1);
  6.         a2.append(area2);
  7.         AcDbRegion * pRegion2 = GetRegion(a2);
  8.    
  9.     BOOL bResult=FALSE;
  10.     if(pRegion1->booleanOper(AcDb::kBoolIntersect, pRegion2) == Acad::eOk){
  11.         if ((pRegion2->isNull()==Adesk::kTrue)&&(pRegion1->isNull()!=Adesk::kTrue)){
  12.                 bResult=TRUE;
  13.         }
  14.     }
  15.     delete pRegion1;
  16.     delete pRegion2;
  17.    
  18.     return bResult;
  19. }

  20. AcDbRegion* :GetRegion(AcDbObjectIdArray ObjIds)
  21. {
  22.         AcDbVoidPtrArray  curveSegments;
  23.         int ll=ObjIds.length();
  24.         for(int i=0;i<ObjIds.length();i++)
  25.         {
  26.                 AcDbObject * pObj;
  27.                 if( acdbOpenObject(pObj, ObjIds[i], AcDb::kForRead)!= Acad::eOk )  return NULL;
  28.                 pObj->close();
  29.                 curveSegments.append(pObj);
  30.         }

  31.         AcDbVoidPtrArray  regions;
  32.         Acad::ErrorStatus es = AcDbRegion::createFromCurves(curveSegments,regions);

  33.         for(i = 0; i < curveSegments.length(); i++)
  34.                 ((AcDbCurve *)curveSegments[i])->close();

  35.         int nCount = regions.length();

  36.         if (es == Acad::eOk)
  37.         {
  38.                 if ( nCount == 1)
  39.                         return ((AcDbRegion *)regions[0]);
  40.                 else
  41.                 {
  42.                         for(i = 0; i < nCount; i++)
  43.                         {
  44.                                 delete (AcDbRegion *)regions[i];
  45.                         }
  46.                         return NULL;
  47.                 }
  48.         }
  49.         else
  50.         {
  51.                 for(i = 0; i < nCount; i++)
  52.                 {
  53.                         delete (AcDbRegion *)regions[i];
  54.                 }
  55.                 return NULL;
  56.         }
  57. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-9-9 17:04:37 | 显示全部楼层

Re: [求助]:如何判断两个面域(AcDbRegion)是否相交?

最初由 lyousme 发布
[B]如何判断两个面域(AcDbRegion)相交,有重叠的区域?
如果使用函数booleanOper做交集运算,什么样子的结果可以认为这两个面域相交?
各位大哥帮帮忙啊!!
谢谢了 [/B]

求交集有几种结果

1 有交集,交集的面积不等于任何一个,此时是相交关系

2 有交集,交集的面积等于其中的一个,此时是包含关系

3 无交集,不相交
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-9 17:25:58 | 显示全部楼层
If the Boolean operation is successful, then pOtherRegion's ACIS object is deleted (so its isNull() method returns Adesk::kTrue) and Acad::eOk is returned.
If pOtherRegion is NULL, then Acad::eInvalidInput is returned.
If the Boolean operation between the two regions fails, then the ACIS objects of both regions are deleted and either Acad::eNonCoplanarGeometry or Acad::eGeneralModelingFailure is returned. The Acad::eNonCoplanarGeometry status indicates the two regions were found to be in different planes.
好好看看,应该都在里边,事实你没有权利删除pRegion1;pRegion2;,因为内存不是你分配的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-9-9 17:47:37 | 显示全部楼层
补充一句 Boolen  之前先对 Region1 Region2 拷贝副本,用副本 Boolen
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-9 18:16:17 | 显示全部楼层
最初由 eachy 发布
[B]补充一句 Boolen  之前先对 Region1 Region2 拷贝副本,用副本 Boolen [/B]


速度会很慢的,有什么好办法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-9-10 09:00:35 | 显示全部楼层
谢谢eachy兄,我总算明白应该如何做了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-20 10:03:05 | 显示全部楼层
求交完成后交集的ID是AcDbObjectId area1吗?如果不是怎样从pRegion1得到?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-27 18:20 , Processed in 0.243806 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表