当我们要求三维空间中的线和一个实体或一个面的交点时,可能您会查到mdlKISolid_rayTestBody这个函数。经过反复测试,其返回的交点值总是不正确。需要改用mdlKISolid_getEntities函数才能取得正确的交点。如下代码是一个例子:
void lineSrufaceIntersect()
{
MSElementDescrP edP = NULL;
mdlAssoc_getElementDescr(&edP, NULL, 621, ACTIVEMODEL, FALSE);
DPoint3d intersectPt, rayOrg = { 1929, 11371, 25396 }, rayDir = { 0, 0, -1 };
KIBODY* pBody = NULL;
double* params = NULL;
KIENTITY_LIST* hits = NULL;
Transform trans;
int status = mdlKISolid_elementToBody2(&pBody, &trans, edP, MASTERFILE, 1, FALSE);
Transform invBodyTransform;
mdlTMatrix_getInverse(&invBodyTransform, &trans);
mdlKISolid_beginCurrTrans(MASTERFILE);
mdlCurrTrans_invtransPointArray(&rayOrg, &rayOrg, 1);
mdlTMatrix_transformPoint(&rayOrg, &invBodyTransform);
mdlKISolid_endCurrTrans();
mdlTMatrix_transformVector((DVec3d*)&rayDir, &invBodyTransform);
mdlKISolid_listCreate(&hits);
if (SUCCESS == mdlKISolid_getEntities(hits, ¶ms, &rayOrg, &rayDir, 1.0E-8,
mdlKISolid_faceType(), pBody, ACTIVEMODEL))
{
int hitCnt;
mdlKISolid_listCount(&hitCnt, hits);
for (int i = 0; i<hitCnt; i++)
{
mdlVec_projectPoint(&intersectPt, &rayOrg, (DVec3d*)&rayDir, params[i]);
mdlKISolid_beginCurrTrans(MASTERFILE);
mdlTMatrix_transformPoint(&intersectPt, &trans);
mdlCurrTrans_transformPointArray(&intersectPt, &intersectPt, 1);
mdlKISolid_endCurrTrans();
displayMsg("x=%.2f, y=%.2f, z=%.2f", intersectPt.x, intersectPt.y, intersectPt.z);
}
dlmSystem_mdlFree(params);
mdlKISolid_listDelete(&hits);
}
else mdlDialog_dmsgsPrint("ERROR in mdlKISolid_getEntities");
mdlKISolid_freeBody(pBody);
mdlElmdscr_freeAll(&edP);
}
不能用mdlIntersect_allBetweenElms或mdlIntersect_allBetweenExtendedElms来求三维中两个元素间的交点,这两个函数主要用于二维求交。它返回的是从某个视图看过去的“表观”交点,不是三维中的真实交点。