- static void ArxPntInTri_getit(void)
- {
- ads_point ads_testpnt;
- AcGePoint3d a,b,c,p;
-
- if(acedGetPoint(NULL,_T("\nPick Point to test: "),ads_testpnt) != RTNORM)
- {
- PRNTERR
- return;
- }
- p = asPnt3d(ads_testpnt);
- AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
- AcDbBlockTableRecordPointer pBlockTableRecord(pDb->currentSpaceId(),kForRead);
- TRYRETVOID (pBlockTableRecord.openStatus());
- AcDbBlockTableRecordIterator* pIter;
- TRYRETVOID (pBlockTableRecord->newIterator( pIter ))
-
- for (pIter->start();!pIter->done();pIter->step())
- {
- AcDbObjectId entId;
- TRYMSG(pIter->getEntityId(entId));
- AcDbEntityPointer pEnt(entId,AcDb::kForRead);
- AcDbFace* pFace = AcDbFace::cast(pEnt);
- if(pFace)
- {
- TRYMSG(pFace->getVertexAt(0,a));
- TRYMSG(pFace->getVertexAt(1,b));
- TRYMSG(pFace->getVertexAt(2,c));
- if(isInTriangle(AcGePoint2d(a.x,a.y),AcGePoint2d(b.x,b.y),
- AcGePoint2d(c.x,c.y),AcGePoint2d(p.x,p.y)))
- {
- TRYMSG(pFace->upgradeOpen());
- TRYMSG(pFace->setColorIndex(1));
- }
- }
- }
- delete pIter;
- }
- //http://www.blackpawn.com/texts/pointinpoly/default.html
- static bool isInTriangle(const AcGePoint2d &a,
- const AcGePoint2d &b,
- const AcGePoint2d &c,
- const AcGePoint2d &p)
- {
- AcGeVector2d v0 = c-a;
- AcGeVector2d v1 = b-a;
- AcGeVector2d v2 = p-a;
- double dot00 = v0.dotProduct(v0);
- double dot01 = v0.dotProduct(v1);
- double dot02 = v0.dotProduct(v2);
- double dot11 = v1.dotProduct(v1);
- double dot12 = v1.dotProduct(v2);
- double invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
- double u = (dot11 * dot02 - dot01 * dot12) * invDenom;
- double v = (dot00 * dot12 - dot01 * dot02) * invDenom;
- return (u > 0) && (v > 0) && (u + v “带有源代码的汇编”,您可以查看生成的代码。代码
- 中的一个小t周在构建时会做什么非常有趣。
- [code]struct EsChecker
- {
- static Acad::ErrorStatus op(Acad::ErrorStatus es)
- {
- if(es != Acad::eOk) {
- EsPrint(es);
- }
- return es;
- }
- __declspec(noinline) static void EsPrint(Acad::ErrorStatus es)
- {
- acutPrintf(_T("\nError: Line %ld [%s]\nIn function %s"),
- __LINE__, acadErrorStatusText(es), _T(__FUNCTION__));
- }
- };
用法:
- EsChecker::op(pDb->getFilename(pcszFilename));
|