找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5015|回复: 38

[分享] 判断点在闭合 AcGeCurve3d 内

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-3-15 08:32:26 | 显示全部楼层 |阅读模式

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

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

×
这个算法有很多种,用 AcBrBrep 、AcDbMPolygon、面积法、角度等等,另外看到 G 版用 AutoLisp 写的一个方法,试着把这个方法用 ARX 写出来了,
G版Autolisp参考:http://bbs.mjtd.com/blog-161460-430.html
0.jpg
向量关系判断

  1. static double isLeft (AcGeVector3d &A,AcGeVector3d &B)
  2.         {
  3.                 return A.x*B.y-A.y*B.x;
  4.         }
复制代码
曲线顺逆时针判断

  1.         static bool CurveClockwize(AcGeCurve3d *&geCurve)
  2.         {
  3.                 AcGeBoundBlock3d box=geCurve->boundBlock();
  4.                 AcGePoint3d p1,p2;
  5.                 box.getMinMaxPoints(p1,p2);
  6.                 AcGePoint3d pt1=geCurve->closestPointTo(p1);
  7.                 AcGePoint3d pt2=geCurve->closestPointTo(AcGePoint3d(p2.x,p1.y,0));
  8.                 AcGePoint3d pt3=geCurve->closestPointTo(p2);
  9.                 AcGePoint3d pt4=geCurve->closestPointTo(AcGePoint3d(p1.x,p2.y,0));
  10.                 double pam1=geCurve->paramOf(pt1);
  11.                 double pam2=geCurve->paramOf(pt2);
  12.                 double pam3=geCurve->paramOf(pt3);
  13.                 double pam4=geCurve->paramOf(pt4);
  14.                 if ((pam1<=pam2 && pam2<=pam3 && pam3<=pam4)||
  15.                         (pam2<=pam3 && pam3<=pam4 && pam4<=pam1)||
  16.                         (pam3<=pam4 && pam4<=pam1 && pam1<=pam2)||
  17.                         (pam4<=pam1 && pam1<=pam2 && pam2<=pam3))
  18.                 {
  19.                         return false;
  20.                 }
  21.                 return true;
  22.         }
复制代码
判断函数
游客,如果您要查看本帖隐藏内容请回复

测试

  1.         static void asdkMyGroupMyCommand () {
  2.                 // Put your command code here
  3.                 ads_name ent;
  4.                 ads_point pt;
  5.                 if (RTNORM!=acedEntSel(L"\nPick Curve: ",ent,pt))
  6.                 {
  7.                         return;
  8.                 }
  9.                 AcDbObjectId id;
  10.                 acdbGetObjectId(id,ent);
  11.                 AcDbEntityPointer pEnt(id,AcDb::kForRead);
  12.                 if (pEnt.openStatus()!=Acad::eOk)
  13.                 {
  14.                         return;
  15.                 }
  16.                 if (!pEnt->isKindOf(AcDbCurve::desc()))
  17.                 {
  18.                         return;
  19.                 }
  20.                 AcDbCurve *pCurve=AcDbCurve::cast(pEnt);

  21.                 if (RTNORM!=acedGetPoint(NULL,L"\nTest Point: ",pt))
  22.                 {
  23.                         return;
  24.                 }
  25.                 AcGeCurve3d *geCurve;
  26.                 //Acad::ErrorStatus es=CConversion::AcDbCurveToAcGeCurve(geCurve,pCurve);
  27.                 Acad::ErrorStatus es=pCurve->getAcGeCurve(geCurve);
  28.                 pCurve->close();
  29.                 if (es!=Acad::eOk)
  30.                 {
  31.                         pCurve->close();
  32.                         geCurve=NULL;
  33.                         return;
  34.                 }
  35.                 int n=isPntInside(geCurve,asPnt3d(pt));
  36.                 switch (n)
  37.                 {
  38.                 case -1:
  39.                         {
  40.                                 acutPrintf(L"\nOutside!");
  41.                                 break;
  42.                         }
  43.                 case 0:
  44.                         {
  45.                                 acutPrintf(L"\nIsOn!");
  46.                                 break;
  47.                         }
  48.                 case 1:
  49.                         {
  50.                                 acutPrintf(L"\nInside!");
  51.                                 break;
  52.                         }
  53.                 default:
  54.                         break;
  55.                 }
  56.                
  57.                 delete geCurve;
  58.                 geCurve=NULL;
  59.         }
复制代码

评分

参与人数 1D豆 +10 收起 理由
XDSoft + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 859个

财富等级: 财运亨通

 楼主| 发表于 2016-3-15 08:48:16 | 显示全部楼层
gxl-PtInCurveP  函数中处理 d1 d2 是针对 pline, AcDbPolyline 节点的 pamram 是 0.0 1.0 ...
AcGeCurve3d 类 paramOf 求得的参数和 AcDbCurve 中的 param 意义是不同的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2016-3-16 19:44:47 | 显示全部楼层
在这一句吗?
AcGePoint3d ptNear, ptFirstDeriv;

bool isleft = (isLeft(pt - ptNear, ptFirstDeriv) > 0);

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

使用道具 举报

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

使用道具 举报

已领礼包: 2409个

财富等级: 金玉满堂

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

使用道具 举报

已领礼包: 2963个

财富等级: 家财万贯

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 79个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 271个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 271个

财富等级: 日进斗金

发表于 2016-12-16 18:03:24 | 显示全部楼层
测试了一下,代码好象通不过。请教楼主:这代码调试编译过没有?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-12-16 18:12:44 | 显示全部楼层

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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-2-21 20:20 , Processed in 0.458677 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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