乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 53|回复: 3

三角形中的点

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-12-22 08:23:41 | 显示全部楼层 |阅读模式
  1.   static void ArxPntInTri_getit(void)
  2.   {
  3.     ads_point ads_testpnt;
  4.     AcGePoint3d a,b,c,p;
  5.    
  6.     if(acedGetPoint(NULL,_T("\nPick Point to test: "),ads_testpnt) != RTNORM)
  7.     {
  8.       PRNTERR
  9.       return;
  10.     }
  11.     p = asPnt3d(ads_testpnt);
  12.     AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  13.     AcDbBlockTableRecordPointer pBlockTableRecord(pDb->currentSpaceId(),kForRead);
  14.     TRYRETVOID (pBlockTableRecord.openStatus());
  15.     AcDbBlockTableRecordIterator* pIter;
  16.     TRYRETVOID (pBlockTableRecord->newIterator( pIter ))
  17.    
  18.     for (pIter->start();!pIter->done();pIter->step())
  19.     {
  20.       AcDbObjectId entId;
  21.       TRYMSG(pIter->getEntityId(entId));
  22.       AcDbEntityPointer pEnt(entId,AcDb::kForRead);
  23.       AcDbFace* pFace = AcDbFace::cast(pEnt);
  24.       if(pFace)
  25.       {
  26.         TRYMSG(pFace->getVertexAt(0,a));
  27.         TRYMSG(pFace->getVertexAt(1,b));
  28.         TRYMSG(pFace->getVertexAt(2,c));
  29.         if(isInTriangle(AcGePoint2d(a.x,a.y),AcGePoint2d(b.x,b.y),
  30.                         AcGePoint2d(c.x,c.y),AcGePoint2d(p.x,p.y)))
  31.         {
  32.           TRYMSG(pFace->upgradeOpen());
  33.           TRYMSG(pFace->setColorIndex(1));
  34.         }
  35.       }
  36.     }
  37.     delete pIter;
  38.   }
  39.   //http://www.blackpawn.com/texts/pointinpoly/default.html
  40.   static bool isInTriangle(const AcGePoint2d &a,
  41.                                  const AcGePoint2d &b,
  42.                                  const AcGePoint2d &c,
  43.                                  const AcGePoint2d &p)
  44.   {
  45.     AcGeVector2d v0 = c-a;
  46.     AcGeVector2d v1 = b-a;
  47.     AcGeVector2d v2 = p-a;
  48.     double  dot00 = v0.dotProduct(v0);
  49.     double  dot01 = v0.dotProduct(v1);
  50.     double  dot02 = v0.dotProduct(v2);
  51.     double  dot11 = v1.dotProduct(v1);
  52.     double  dot12 = v1.dotProduct(v2);
  53.     double invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
  54.     double  u = (dot11 * dot02 - dot01 * dot12) * invDenom;
  55.     double  v = (dot00 * dot12 - dot01 * dot02) * invDenom;
  56.     return (u > 0) && (v > 0) && (u + v “带有源代码的汇编”,您可以查看生成的代码。代码
  57. 中的一个小t周在构建时会做什么非常有趣。
  58. [code]struct EsChecker
  59. {
  60.     static Acad::ErrorStatus op(Acad::ErrorStatus es)
  61.     {
  62.         if(es != Acad::eOk) {
  63.             EsPrint(es);
  64.         }
  65.         return es;
  66.     }
  67.     __declspec(noinline) static void EsPrint(Acad::ErrorStatus es)
  68.     {
  69.         acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),
  70.             __LINE__, acadErrorStatusText(es), _T(__FUNCTION__));
  71.     }
  72. };

用法:
  1. EsChecker::op(pDb->getFilename(pcszFilename));

回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-12-22 15:31:06 | 显示全部楼层
但是,如果我想返回上的函数,我需要再次测试错误状态eOk对吗?
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-12-22 18:02:27 | 显示全部楼层
我想在es!=eOk
在本例中,宏从函数中返回并打印错误消息。当它们嵌套时,它执行一种堆栈跟踪
我没有尝试过,但在其他地方扩展__FUNCTION__可能无法提供正确的信息。
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2009-12-22 18:31:43 | 显示全部楼层
我想我可以开始使用异常来展开堆栈。我只是跟随ARX风格和宏节省打字..
你对例外有什么看法?我了解到编译器拒绝展开try catch中的循环
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 22:13 , Processed in 0.173918 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表