乐筑天下

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

凸包

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-11-16 02:41:00 | 显示全部楼层 |阅读模式
  1. static int ccw(const AcGePoint3d &p1,const AcGePoint3d &p2, const AcGePoint3d &p3)
  2.   {
  3.     double or = (p2.x - p1.x)*(p3.y - p1.y)-(p2.y - p1.y)*(p3.x - p1.x);
  4.     if(or  0.0)
  5.       return 1;
  6.     else return 0;
  7.   }
  8.   static bool PointSortByX(const AcGePoint3d &a, const AcGePoint3d &b)
  9.   {
  10.     if(a.x == b.x)
  11.       return a.y isA() == AcDbPoint::desc())
  12.         {
  13.           AcDbPoint *pPoint = AcDbPoint::cast(pEnt);
  14.           if(pPoint)
  15.           {
  16.            vec.push_back(pPoint->position());
  17.           }
  18.         }
  19.         else if(pEnt->isA() == AcDbLine::desc())
  20.         {
  21.           AcDbLine *pLine = AcDbLine::cast(pEnt);
  22.           if(pLine)
  23.           {
  24.             vec.push_back(pLine->startPoint());
  25.             vec.push_back(pLine->endPoint());
  26.           }
  27.         }
  28.         else if(pEnt->isA() == AcDbPolyline::desc())
  29.         {
  30.           AcDbPolyline *pLine = AcDbPolyline::cast(pEnt);
  31.           if(pLine)
  32.           {
  33.             for(int i = 0 ; i numVerts() ; i++)
  34.             {
  35.               AcGePoint3d pt;
  36.               pLine->getPointAt(i,pt);
  37.               vec.push_back(pt);
  38.             }
  39.           }
  40.         }
  41.       }
  42.     }
  43.   }
  44.   static void sortPoints(PointVector &points, PointVector &ptsout)
  45.   {
  46.     PointVector upper;
  47.     PointVector lower;
  48.     AcGePoint3d left, right;
  49.     PointVector::const_iterator iter;
  50.     PointVector::const_reverse_iterator riter;
  51.     std::sort(points.begin(), points.end(), PointSortByX);
  52.     if(points.size() > 3)
  53.     {
  54.       left = points.front();
  55.       right = points.back();
  56.       for ( size_t i = 0 ; i  1)
  57.       {
  58.         if (ccw(pntQue[1],pntQue[0],points[i]) == 1)
  59.           pntQue.push_front(points[i++]);
  60.         else
  61.           pntQue.pop_front();
  62.       }
  63.       else
  64.         pntQue.push_front(points[i++]);
  65.     }
  66.     for(iter = pntQue.begin(); iter != pntQue.end(); ++iter)
  67.       ptsout.push_back(AcGePoint3d((*iter).x, (*iter).y , (*iter).z));
  68.    
  69.   }
  70.   // - ArxConvexHull._doit command (do not rename)
  71.   static void ArxConvexHull_doit(void)
  72.   {
  73.     PointVector::const_iterator iter;
  74.     PointVector basepoints,sortedPoints;
  75.     getPoints(basepoints);
  76.     sortPoints(basepoints,sortedPoints);
  77.     basepoints.clear();
  78.     grahamScan(sortedPoints,basepoints);
  79.     AcDbPolyline *pline = new AcDbPolyline(basepoints.size());
  80.     for(size_t i = 0 ; i addVertexAt(i,AcGePoint2d(basepoints[i].x,basepoints[i].y));
  81.     pline->setClosed(Adesk::kTrue);
  82.     AddEntityToDataBase(pline);
  83.   }
  84.   static void AddEntityToDataBase(AcDbEntity *pEnt)
  85.   {
  86.     AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  87.     AcDbBlockTableRecordPointer pBTR(pDb->currentSpaceId(), AcDb::kForWrite);
  88.     if (pEnt && Acad::eOk == pBTR.openStatus())
  89.     {
  90.       pBTR->appendAcDbEntity(pEnt);
  91.       pEnt->close();
  92.     }
  93.   }


kgbfhr5nks5.PNG

kgbfhr5nks5.PNG

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2009-11-16 15:45:16 | 显示全部楼层
干得不错,丹尼尔,干得好!
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2009-12-27 10:56:22 | 显示全部楼层

太好了,为delaunay解决了一个问题真是太好了。下一步工作是构建一条约束线。我能完成它。
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-14 06:22:11 | 显示全部楼层
丹尼尔先生:
我拿不到内部船体,为什么?
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-14 06:49:41 | 显示全部楼层

我不知道
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-14 09:46:33 | 显示全部楼层
:p:
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-15 09:54:05 | 显示全部楼层
:p:
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-25 22:53:26 | 显示全部楼层
static int CCW(const acgepoint 3d & P1,const AcGePoint3d &p2,const acgepoint 3d & P3)
{
double or =(p2 . x-P1 . x)*(P3 . y-P1 . y)-(p2 . y-P1 . y)*(P3 . x-P1 . x);
if(或
return-1;
else if(or > 0.0)
返回1;
否则返回0;}
//

回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-25 23:14:37 | 显示全部楼层
ccw=计数器时钟智慧
回复

使用道具 举报

11

主题

85

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
129
发表于 2010-1-31 03:42:12 | 显示全部楼层
里面有一个错误。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 22:09 , Processed in 0.231329 second(s), 77 queries .

© 2020-2025 乐筑天下

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