вот, поковырялся у себя в тестовых функциях, думаю пригодится )))
Acad::ErrorStatus FindTrianglePt(AcGePoint3d vertex1, AcGePoint3d vertex2, AcGePoint3d vertex3, AcGePoint3d &resPt)
{
Acad::ErrorStatus es = Acad::eAmbiguousInput;
double minZ = vertex1.z, maxZ = vertex1.z;
if (minZ > vertex2.z) minZ = vertex2.z;
if (minZ > vertex3.z) minZ = vertex3.z;
if (maxZ < vertex2.z) maxZ = vertex2.z;
if (maxZ < vertex3.z) maxZ = vertex3.z;
AcGeVector3d vecU(vertex2.asVector()-vertex1.asVector());
AcGeVector3d vecV(vertex3.asVector()-vertex1.asVector());
AcGePlane plane(vertex1, vecU, vecV); // плоскость по трем точкам треугольника
AcGeLineSeg3d line (AcGePoint3d(resPt.x,resPt.y,minZ), AcGePoint3d(resPt.x,resPt.y,maxZ));//линия для поиска пересечений с плоскостью
AcGePoint3d resultPoint;//временная точка, чтоб не поганить основную, если ничего не нужно
if (plane.intersectWith(line, resultPoint) == Adesk::kTrue)
{
resPt = resultPoint;
es = Acad::eOk;
}
return es;
}
в коде проверок нет, так что перед вызовом нужно убедиться на 100%, что точка лежит внутри или на границах треугольника, т.к. работа идет не с ограниченным рамками треугольником, а с бесконечной плоскостью.
vertex1, vertex2, vertex3 - это точки треугольника в 3D, resPt - это точка для которой нужно найти Z. то, что там лежит в Z на момент запуска - игнорируется.
ну и пример для тестирования функции
AcDbObjectId eId;
AcDbFace* pFace;
AcDbPoint* pPoint;
AcGePoint3d resPt;
ads_name entcont;
if ( RTNORM != acedEntSel(_T("\nУкажите 3DFace: "),entcont,asDblArray(resPt)) ) return;
acdbGetObjectId(eId,entcont);
if(acdbOpenObject(pFace, eId, AcDb::kForRead)!= Acad::eOk) return;
if (pFace == NULL) return;
if ( RTNORM != acedEntSel(_T("\nУкажите точку: "),entcont,asDblArray(resPt)) ) return;
acdbGetObjectId(eId,entcont);
if(acdbOpenObject(pPoint, eId, AcDb::kForRead)!= Acad::eOk) return;
if (pPoint == NULL) return;
AcGePoint3d vertex1, vertex2, vertex3; // тут три точки треугольника в пространстве
pFace->getVertexAt(0, vertex1);
pFace->getVertexAt(1, vertex2);
pFace->getVertexAt(2, vertex3);
resPt = pPoint->position(); // отсюда нужна только плановая проекция (Z игнорируется)
pPoint->close();
pFace->close();
if (Acad::eOk == FindTrianglePt(vertex1, vertex2, vertex3, resPt))
addPoint(false,resPt,1,_T("0"),ACDB_MODEL_SPACE); // это нарисует примитив "точка" в автокаде. функция не ObjectARX, так что работать не будет )))