判断上颌下颌的stl模型坐标轴是否正常

文章目录

  • 研究方向:如何判断?又如何纠正?
    • 如何判断?
    • Demo实现:
      • 先判断一个
      • 遍历相关文件夹下的所有病例
    • 如何纠正?
    • Demo
  • 相关知识点

研究方向:如何判断?又如何纠正?

如何判断?

判断上颌下颌的stl模型坐标轴是否正常_第1张图片
当然,我们不能以坐标的正负来判断
我们看到这个Bounding Box里面有stl模型的xyz三轴方向的最大值与最小值,如果是像左图那样,最明显的就是z轴的最大值是负数,他的范围是[-21.277,-3.4129],
然后,他的y轴范围是:[-21.0321,27.4901],
正常情况下,y轴的{max-min}的绝对值应该是 也就是说:正常情况下,y轴的长度短于z轴的长度.(这个才是我们用来判断的标准)
判断上颌下颌的stl模型坐标轴是否正常_第2张图片


Demo实现:

我们可以遍历某个文件的所有上颌的stl文件,按照上面的逻辑进行判断

先判断一个

const char* stlFilePath = "./upper.stl";
// 创建STL文件读取器
vtkSmartPointer<vtkSTLReader> reader =
vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(stlFilePath);
reader->Update();

// 获取STL数据
vtkSmartPointer<vtkPolyData> inputPolyData = reader->GetOutput();

// Compute the bounding box
double bounds[6];
inputPolyData->GetBounds(bounds);

// Bounds are in the form [xmin, xmax, ymin, ymax, zmin, zmax]
double xmin = bounds[0];
double xmax = bounds[1];
double ymin = bounds[2];
double ymax = bounds[3];
double zmin = bounds[4];
double zmax = bounds[5];

// Calculate the corner points
double corners[8][3] = {
   
    {
   xmin, ymin, zmin},
    {
   xmax, ymin, zmin},
    {
   xmin, ymax, zmin},
    {
   xmax, ymax, zmin},
    {
   xmin, ymin, zmax},
    {
   xmax, ymin, zmax},
    {
   xmin, ymax, zmax},
    {
   xmax, ymax, zmax}
};
cout << "xmin:" << xmin << ",max:" << xmax <<
    ",ymin:" << ymin << ",ymax:" << ymax <<
    ",zmin:" << zmin << ",zmax" << zmax << endl;
//y轴长度
double Ylen = ymax - ymin;
    //z轴长度
double Zlen = zmax - zmin;
if (Ylen > Zlen) {
   
    //异常;
    cout << "此病例坐标轴异常" << endl;
}

// 创建Mapper和Actor
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(inputPolyData);

vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);

// 创建渲染器和窗口
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);

vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);

vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renderWindow);

//调整相机位置,调整显示范围
renderer->ResetCamera();


//鼠标移动方式
vtkNew<vtkInteractorStyleTrackballCamera> style;
interactor->SetInteractorStyle(style);

//设置坐标轴
vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor

你可能感兴趣的:(vtk,c++,开发语言,vtk)