Как получить координаты центра масс TopoDS_Face?

Как и для TopoDS_Vertex, мы можем получить координаты с помощью:

int i=0;
exp0.Init(shape, TopAbs_VERTEX);
for(exp0.Init(shape, TopAbs_VERTEX); exp0.More(); exp0.Next()) {
    TopoDS_Vertex vertex = TopoDS::Vertex(exp0.Current());
    gp_Pnt pnt = BRep_Tool::Pnt(vertex);
    cout <<"Edge " << i << ": X: " << pnt.X() << " - Y:" << pnt.Y() << " - Z: " << pnt.Z();
    i++;
}

Я хотел бы знать, существует ли аналогичный механизм для получения координат TopoDS_Face.

РЕДАКТИРОВАТЬ

По предложению @jaba я сделал это, чтобы вычислить центр масс ряда точек:

vtkSmartPointer<vtkPoints> facePoints = vtkSmartPointer<vtkPoints>::New();
int i=0;
for(exp0.Init(shape, TopAbs_FACE); exp0.More(); exp0.Next(), i++, count++) {
    facePoints->Reset();
    TopoDS_Face aFace = TopoDS::Face(exp0.Current());
    for (TopExp_Explorer Vex(aFace, TopAbs_VERTEX); Vex.More(); Vex.Next()) {
        TopoDS_Vertex vertex = TopoDS::Vertex(Vex.Current());
        gp_Pnt pnt = BRep_Tool::Pnt(vertex);
        facePoints->InsertNextPoint(p);
    }
    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    polydata->SetPoints(facePoints);

    // Compute the center of mass
    vtkSmartPointer<vtkCenterOfMass> centerOfMassFilter = vtkSmartPointer<vtkCenterOfMass>::New();
    centerOfMassFilter->SetInputData(polydata);
    centerOfMassFilter->SetUseScalarsAsWeights(false);
    centerOfMassFilter->Update();
    double center[3];
    centerOfMassFilter->GetCenter(center);
}

person Bub Espinja    schedule 27.02.2019    source источник
comment
В следующий раз, пожалуйста, хотя бы подумайте о названии своего вопроса, прежде чем публиковать его.   -  person jaba    schedule 05.03.2019


Ответы (2)


Способ Open CASCADE для вычисления центра масс TopoDS_Face:

TopoDS_Face face = ...;

GProp_GProps shellProps;
BRepGProp::SurfaceProperties(face, shellProps);

if (shellProps.Mass() < Precision::Confusion())
{
    throw Exception("Failed to Calculate the area of the face.", __TRACE__);
}

const gp_Pnt centerOfMass = shellProps.CentreOfMass();

Это должно дать правильный результат. Если грани не ограничены выпуклыми многоугольниками, где вершины грани являются точками многоугольника, этот код все равно должен работать, но подходы с многоугольниками могут не сработать.

person Benjamin Bihler    schedule 04.03.2019
comment
Потрясающий! Это действительно делает то, что я хотел! - person Bub Espinja; 05.03.2019

Вам нужно получить вершину из грани, так как грань не имеет одной координаты. То, что вы делаете, выглядит вполне нормально, я просто добавил свой фрагмент, потому что ваш код не является самодостаточным.

for (TopExp_Explorer vertexEx(face, TopAbs_VERTEX); vertexEx.More(); vertexEx.Next())
{
    TopoDS_Vertex vertex = TopoDS::Vertex(vertexEx.Current());
    gp_Pnt currentPnt = BRep_Tool::Pnt(vertex);
}

Если вам нужно только одно местоположение, вы можете вычислить центр из полученных вами вершин (см. polygon">Вычислить центроид трехмерного плоского многоугольника)

Если это не то, что вы хотите, пожалуйста, уточните свой вопрос.

person jaba    schedule 28.02.2019