当我们要求三维空间中的线和一个实体或一个面的交点时,可能您会查到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来求三维中两个元素间的交点,这两个函数主要用于二维求交。它返回的是从某个视图看过去的“表观”交点,不是三维中的真实交点。