找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1270|回复: 6

请问用arx如何判断一点是否在面域内啊?

[复制链接]
发表于 2002-1-31 03:23:32 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-31 04:35:32 | 显示全部楼层

Re: 请问用arx如何判断一点是否在面域内啊?

最初由 leemanzhuo 发布
[B]请问用arx如何判断一点是否在面域内啊? [/B]



1、用AcDbRegion::getPlane(..)得到面域平面

virtual Acad::ErrorStatus
getPlane(

    AcGePlane& regionPlane) const;

regionPlane        Returns the plane containing the region

Returns with regionPlane set to the plane containing the region. If the region isNull, then regionPlane is set to the WCS X-Y plane.
Returns Acad::eOk is successful. If there is an error in the ACIS modeler while obtaining the area, then Acad::eGeneralModelingFailure is returned.


2、然后用AcGeSurface::isOn,判断点是否在平面上。


Adesk::Boolean
isOn(

    const AcGePoint3d& pnt,

    const AcGeTol& tol = AcGeContext::gTol) const;

pnt        Input point on surface
tol        Input tolerance

Returns Adesk::kTrue if the point pnt is on the surface within tolerance tol.equalPoint(). Returns Adesk::kFalse otherwise.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-1-31 13:06:08 | 显示全部楼层
我知道用arx比lisp容易实现,但我对arx又不懂,请问能给出详细代码吗?谢谢了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-2-8 09:12:47 | 显示全部楼层
晓东的办法只能判断点是否在平面内而不能判断点是否一定在面域内,面域是有边界的,可以用如下办法,需要
BOOL PointInBrep(AcDbRegion *pRegion, AcGePoint3d Pt)
{
        if (pRegion == NULL) return FALSE;
        AcBrBrep brep;
        if (brep.set(*m_pRegion) != AcBr::eOk) return FALSE;
        AcBr::Relation relation;
        AcBr::ErrorStatus esbr = brep.getPointRelationToBrep(Pt, relation);
        if (esbr != AcBr::eOk) return FALSE;
        switch(relation)
        {
        case AcBr::kBoundary:// return CXtBrepUtility::eOnBoundary;
        case AcBr::kInside: return TRUE;
        default: return FALSE;
        }
}

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

使用道具 举报

发表于 2004-8-30 09:57:49 | 显示全部楼层
这是我自己参考别人的程序做的判断一个点是否在封闭的Polyline中,可能对看这个帖子的人有一些帮助,可能有些地方考虑得不够周到,请大家帮忙测一下

  1. BOOL IsInClosePline( AcGePoint3d testPt,AcDbObjectId PolyLineId )
  2. {
  3.         AcDbPolyline * pPolyline;
  4.         if(acdbOpenObject( pPolyline, PolyLineId, AcDb::kForRead )!=Acad::eOk)
  5.         {
  6.                 return  FALSE;
  7.         }
  8.         pPolyline->close();

  9.         int start = 0;
  10.         AcGeVector3d currentVector, previosVector, contrVector, refVector;
  11.         int count = 0, countDir = 1;
  12.        
  13.         AcGePoint3d point;
  14.         pPolyline->getPointAt(start,point);
  15.         previosVector = point - testPt;

  16.         for (int j = start + 1; j <= pPolyline->numVerts() ; j++)
  17.         {
  18.                 if ( j == pPolyline->numVerts() ) j = start;
  19.                
  20.                 pPolyline->getPointAt(j,point);
  21.                 currentVector = point - testPt;
  22.                 if (contrVector.isZeroLength() && !previosVector.isEqualTo(currentVector))
  23.                         contrVector = previosVector + currentVector;

  24.                 refVector = previosVector.crossProduct(currentVector);
  25.                 if (previosVector.angleTo(contrVector, refVector) < previosVector.angleTo(currentVector, refVector))
  26.                 {
  27.                         count += countDir;
  28.                         countDir *= -1;
  29.                 }
  30.                 previosVector = currentVector;

  31.                 if (j == start) break;
  32.         }
  33.         if (count)
  34.                 return (true); // point is included to the polygon
  35.         else
  36.                 return (false); // point is not included to the polygon
  37. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 01:00 , Processed in 0.382373 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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