mdlKISolid_rayTestBody


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