MickD 发表于 2009-11-16 02:41:00

凸包

static int ccw(const AcGePoint3d &p1,const AcGePoint3d &p2, const AcGePoint3d &p3)
{
    double or = (p2.x - p1.x)*(p3.y - p1.y)-(p2.y - p1.y)*(p3.x - p1.x);
    if(or0.0)
      return 1;
    else return 0;
}
static bool PointSortByX(const AcGePoint3d &a, const AcGePoint3d &b)
{
    if(a.x == b.x)
      return a.y isA() == AcDbPoint::desc())
      {
          AcDbPoint *pPoint = AcDbPoint::cast(pEnt);
          if(pPoint)
          {
         vec.push_back(pPoint->position());
          }
      }
      else if(pEnt->isA() == AcDbLine::desc())
      {
          AcDbLine *pLine = AcDbLine::cast(pEnt);
          if(pLine)
          {
            vec.push_back(pLine->startPoint());
            vec.push_back(pLine->endPoint());
          }
      }
      else if(pEnt->isA() == AcDbPolyline::desc())
      {
          AcDbPolyline *pLine = AcDbPolyline::cast(pEnt);
          if(pLine)
          {
            for(int i = 0 ; i numVerts() ; i++)
            {
            AcGePoint3d pt;
            pLine->getPointAt(i,pt);
            vec.push_back(pt);
            }
          }
      }
      }
    }
}
static void sortPoints(PointVector &points, PointVector &ptsout)
{
    PointVector upper;
    PointVector lower;
    AcGePoint3d left, right;
    PointVector::const_iterator iter;
    PointVector::const_reverse_iterator riter;
    std::sort(points.begin(), points.end(), PointSortByX);
    if(points.size() > 3)
    {
      left = points.front();
      right = points.back();
      for ( size_t i = 0 ; i1)
      {
      if (ccw(pntQue,pntQue,points) == 1)
          pntQue.push_front(points);
      else
          pntQue.pop_front();
      }
      else
      pntQue.push_front(points);
    }
    for(iter = pntQue.begin(); iter != pntQue.end(); ++iter)
      ptsout.push_back(AcGePoint3d((*iter).x, (*iter).y , (*iter).z));
   
}
// - ArxConvexHull._doit command (do not rename)
static void ArxConvexHull_doit(void)
{
    PointVector::const_iterator iter;
    PointVector basepoints,sortedPoints;
    getPoints(basepoints);
    sortPoints(basepoints,sortedPoints);
    basepoints.clear();
    grahamScan(sortedPoints,basepoints);
    AcDbPolyline *pline = new AcDbPolyline(basepoints.size());
    for(size_t i = 0 ; i addVertexAt(i,AcGePoint2d(basepoints.x,basepoints.y));
    pline->setClosed(Adesk::kTrue);
    AddEntityToDataBase(pline);
}
static void AddEntityToDataBase(AcDbEntity *pEnt)
{
    AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
    AcDbBlockTableRecordPointer pBTR(pDb->currentSpaceId(), AcDb::kForWrite);
    if (pEnt && Acad::eOk == pBTR.openStatus())
    {
      pBTR->appendAcDbEntity(pEnt);
      pEnt->close();
    }
}



**** Hidden Message *****

frtfff 发表于 2009-11-16 15:45:16

干得不错,丹尼尔,干得好!

frtfff 发表于 2009-12-27 10:56:22


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

frtfff 发表于 2010-1-14 06:22:11

丹尼尔先生:
我拿不到内部船体,为什么?

frtfff 发表于 2010-1-14 06:49:41


我不知道

frtfff 发表于 2010-1-14 09:46:33

:p:

frtfff 发表于 2010-1-15 09:54:05

:p:

frtfff 发表于 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;}
//

frtfff 发表于 2010-1-25 23:14:37

ccw=计数器时钟智慧

frtfff 发表于 2010-1-31 03:42:12

里面有一个错误。
页: [1] 2
查看完整版本: 凸包