【问题标题】:How to get the coordinates of the center of mass of a TopoDS_Face?如何获得 TopoDS_Face 的质心坐标?
【发布时间】:2019-02-27 09:00:32
【问题描述】:

除了 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);
}

【问题讨论】:

  • 下次发帖前请至少考虑一下问题的标题。

标签: c++ vtk opencascade


【解决方案1】:

计算 TopoDS_Face 质心的 Open CASCADE 方法是

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();

这应该会给出正确的结果。如果面不受凸多边形约束,其中面的顶点是多边形点,则此代码应该仍然有效,但多边形方法可能会失败。

【讨论】:

  • 太棒了!它真的做到了我想要的!
【解决方案2】:

您需要从面中获取顶点,因为面没有一个坐标。 你所做的看起来很好,我只是添加了我的 sn-p 因为你的代码不是独立的。

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);
}

如果您只想要一个位置,您可以根据收到的顶点计算中心(请参阅Compute the Centroid of a 3D Planar Polygon

如果这不是您想要的,请说明您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2013-09-29
    • 2016-02-04
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多