找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1348|回复: 0

[原创]:测试点和闭合曲线的位置关系

[复制链接]
发表于 2005-11-6 22:48:28 | 显示全部楼层 |阅读模式

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

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

×
学习ARX一周,今天终于写出了第一段代码,请大家批评指正.

射线法测试点和闭合曲线的位置关系。
考虑了 射线与曲线相切的特殊情况。



  1. Adesk::Boolean PointRelationToCurve(ads_point pt,AcDbCurve *pPline)
  2. {
  3.                 //acutPrintf("x %d",pt[X]);
  4.                 ads_point tmpP;
  5.                 AcDbRay *pRay =new AcDbRay();
  6.                 pRay->setBasePoint(asPnt3d(pt));
  7.                 pRay->setUnitDir(AcGeVector3d(1.0,0.0,0.0));


  8.                 AcGePoint3d pointOnCurve;       
  9.                 pPline->getClosestPointTo(asPnt3d(pt),pointOnCurve);

  10.                 ads_point pt1 = {pointOnCurve.x,pointOnCurve.y,pointOnCurve.z};
  11.                 if(acutDistance(pt,pt1)==0)
  12.                 {
  13.                         acutPrintf("\nON");
  14.                         return Adesk::kTrue;
  15.                 }
  16.                 AcGePoint3dArray points,points1;
  17.                 pPline->intersectWith(pRay,AcDb::kOnBothOperands,points);
  18.                 acutPrintf("\n交点数目:%d", points.length());

  19.                 AcGeVector3d fd,fd1,fd2;
  20.                 pRay->getFirstDeriv(asPnt3d(pt),fd);
  21.                 pRay->close();
  22.                 AcDbRay *pRay1;
  23.                 AcGePoint3d tmpPoint;
  24.                 ads_name tmpE;
  25.                 double min=0.00002;
  26.                 double paramBegin,paramEnd,param,param1,param2,angle1,angle2;
  27.                 for(int i=0;i<points.length();i++)
  28.                 {
  29.                         //acutPrintf("\n交点%d:%d,%d,%d",i,points[i].x,points[i].y,points[i].z);
  30.                         //pPline->getFirstDeriv(points[i],fd1);

  31.                         pPline->getStartParam(paramBegin);
  32.                         pPline->getEndParam(paramEnd);
  33.                         pPline->getParamAtPoint(points[i],param);

  34.                         /*addline(points[i]);*/

  35.                         if (param== paramBegin)
  36.                         {
  37.                                 param1=paramEnd-min;
  38.                                 param2=paramBegin+min;
  39.                         }
  40.                         else if (param==  paramEnd )
  41.                         {
  42.                                 param1=paramEnd-min;
  43.                                 param2=paramBegin+min;
  44.                         }
  45.                         else
  46.                         {
  47.                                 param1=param-min;
  48.                                 param2=param+min;
  49.                         }       
  50.                         pPline->getFirstDeriv(param1,fd1);
  51.                         pPline->getFirstDeriv(param2,fd2);       

  52.                         /*acutPrintf("\n1 %f:%f",param1,fd1.angleTo(fd));       
  53.                         acutPrintf(" %f %f %f",fd1.x,fd1.y,fd1.z);
  54.                         acutPrintf("\n2 %f:%f",param2,fd2.angleTo(fd));               
  55.                         acutPrintf(" %f %f %f",fd2.x,fd2.y,fd2.z);
  56.                         acutPrintf("\n");*/                       

  57.                         int valid=1;
  58.                         if ((fd1.y>0)&&(fd2.y<0)||(fd1.y<0)&&(fd2.y>0))
  59.                         {
  60.                                 valid=0;
  61.                                 acutPrintf("\n!!!");
  62.                         }

  63.                         /*acdbEntLast( tmpE);
  64.                         acedGetPoint(NULL,"",tmpP);
  65.                         acdbEntDel(tmpE);*/

  66.                         if (valid==1)
  67.                         {
  68.                                 points1.append(points[i]);
  69.                         }

  70.                 }
  71.                 //acutPrintf("\n交点数目:%d", points1.length());
  72.                 if((points1.length()%2)==1)
  73.                 {
  74.                         acutPrintf("\nIN");
  75.                         return Adesk::kTrue;
  76.                 }
  77.                 else
  78.                 {
  79.                         acutPrintf("\nOUT");
  80.                         return Adesk::kFalse;
  81.                 }
  82.                

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

本版积分规则

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

GMT+8, 2024-11-15 21:35 , Processed in 0.382548 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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