如何获取TopoDS_Face的质心坐标?
How to get the coordinates of the center of mass of a 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);
}
你需要从面上获取一个顶点,因为一张面没有一个坐标。
你所做的看起来很好,我只是添加了我的代码片段,因为你的代码不是独立的。
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)
如果这不是您想要的,请说明您的问题。
计算 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();
这应该会给出正确的结果。如果面不受凸多边形的约束,其中面的顶点是多边形点,此代码应该仍然有效,但多边形方法可能会失败。
与 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);
}
你需要从面上获取一个顶点,因为一张面没有一个坐标。 你所做的看起来很好,我只是添加了我的代码片段,因为你的代码不是独立的。
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)
如果这不是您想要的,请说明您的问题。
计算 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();
这应该会给出正确的结果。如果面不受凸多边形的约束,其中面的顶点是多边形点,此代码应该仍然有效,但多边形方法可能会失败。