凸包
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 ***** 干得不错,丹尼尔,干得好!
太好了,为delaunay解决了一个问题真是太好了。下一步工作是构建一条约束线。我能完成它。 丹尼尔先生:
我拿不到内部船体,为什么?
我不知道 :p: :p: 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;}
//
?
ccw=计数器时钟智慧 里面有一个错误。
页:
[1]
2