找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2230|回复: 5

[原创] Brep GetLineContainment

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-9-2 14:00:31 | 显示全部楼层 |阅读模式

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

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

×
利用 Brep.GetLineContainment() 判断点和多边形关系

  1.         public static bool IsInside(this Point3d pt, Point3dCollection pts)
  2.         {
  3.             DBObjectCollection dbCol = new DBObjectCollection();
  4.             Polyline pl = new Polyline();
  5.             Plane plan = pl.GetPlane();
  6.             for (int i = 0; i < pts.Count; i++)
  7.             {
  8.                 pl.AddVertexAt(i, pts[i].Convert2d(plan), 0, 0, 0);
  9.             }
  10.             pl.Closed = true;
  11.             dbCol.Add(pl);
  12.             Region region = Region.CreateFromCurves(dbCol)[0] as Region;
  13.             Brep brep = new Brep(region);
  14.             LineSegment3d ln = new LineSegment3d(pt, pt);
  15.             Hit[] hit = brep.GetLineContainment(ln, 1);
  16.             if (hit == null)
  17.             {
  18.                 return false;
  19.             }
  20.             else
  21.             {
  22.                 return true;
  23.             }
  24.         }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2014-9-2 18:46:38 | 显示全部楼层
为什么不用GetPointContainment

点评

有这个函数?只在Arx手册中看到Point,没注意到net中这个函数 再修改修改  详情 回复 发表于 2014-9-2 19:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-9-2 19:26:50 来自手机 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-9-2 18:46
为什么不用GetPointContainment

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-9-2 21:21:14 | 显示全部楼层
这样改一改

  1.         public static int IsInside(this Point3d pt, IEnumerable<Point3d> pts)
  2.         {
  3.             double pi = Math.PI;
  4.             double fpi = -pi;
  5.             Point3dCollection npts = new Point3dCollection(pts.ToArray());
  6.             if (pts.First( ) != pts.Last())
  7.             {
  8.                 npts.Add(pts.First( ));
  9.             }
  10.             Plane plane = new Plane(new Point3d(0, 0, 0), new Vector3d(0, 0, 1));
  11.             double tol = 0.0;
  12.             for (int i = 0; i < npts.Count - 1; i++)
  13.             {
  14.                 Point3d p1 = npts[i];
  15.                 Point3d p2 = npts[i + 1];
  16.                 LineSegment3d ln = new LineSegment3d(p1, p2);
  17.                 if (ln.IsOn(pt))
  18.                 {
  19.                     return 0;
  20.                 }
  21.                 Vector3d vec1 = pt - p1;
  22.                 Vector3d vec2 = pt - p2;
  23.                 double an = vec1.AngleOnPlane(plane) - vec2.AngleOnPlane(plane);
  24.                 if (an > pi)
  25.                 {
  26.                     an -= pi;
  27.                 }
  28.                 else if (an < fpi)
  29.                 {
  30.                     an += pi;
  31.                 }
  32.                 tol += an;
  33.             }
  34.             if (Math.Abs(tol).Equals(pi))
  35.             {
  36.                 return 1;
  37.             }
  38.             else
  39.             {
  40.                 return -1;
  41.             }
  42.         }
复制代码

  1.         public static int IsInside(this Point3d pt, Curve cv)
  2.         {
  3.             if (!cv.Closed)
  4.             {
  5.                 return -1;
  6.             }
  7.             else if (cv is Circle)
  8.             {
  9.                 Circle circle = cv as Circle;
  10.                 Point3d pc = circle.Center;
  11.                 double radius = circle.Radius;
  12.                 double d = pt.DistanceTo(pc);
  13.                 if (Math .Abs( d-radius) < 1e-6)
  14.                 {
  15.                     return 0;
  16.                 }
  17.                 else if (d > radius)
  18.                 {
  19.                     return -1;
  20.                 }
  21.                 else
  22.                 {
  23.                     return 1;
  24.                 }
  25.             }
  26.             else if (cv is Ellipse)
  27.             {
  28.                 Curve3d c3d = cv.GetGeCurve();
  29.                 EllipticalArc3d e3d = c3d as EllipticalArc3d;
  30.                 if (e3d.IsOn(pt))
  31.                 {
  32.                     return 0;
  33.                 }
  34.                 else if (e3d.IsInside(pt))
  35.                 {
  36.                     return 1;
  37.                 }
  38.                 else
  39.                 {
  40.                     return -1;
  41.                 }
  42.             }
  43.             else
  44.             {
  45.                 DBObjectCollection dCol = new DBObjectCollection();
  46.                 dCol.Add(cv);
  47.                 Region region = Region.CreateFromCurves(dCol )[0] as Region;
  48.                 Brep brep = new Brep(region);
  49.                 PointContainment pc;
  50.                 brep.GetPointContainment(pt, out pc);
  51.                 switch (pc)
  52.                 {
  53.                     case PointContainment.Inside://内环内时?
  54.                         return 1;
  55.                     case PointContainment.OnBoundary://区域内或边上
  56.                         return 0;
  57.                     case PointContainment.Outside:
  58.                         return -1;
  59.                 }
  60.             }
  61.             return -1;
  62.         }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-9-2 21:28:58 来自手机 | 显示全部楼层
直接用这个枚举 inside.outside.onboundary作为返回值更直观些

点评

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2014-9-2 22:03:07 来自手机 | 显示全部楼层
雪山飞狐(lzh) 发表于 2014-9-2 21:28
直接用这个枚举 inside.outside.onboundary作为返回值更直观些

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-19 00:15 , Processed in 0.406316 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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