# MeshQuality

VTKExamples/Java/PolyData/MeshQuality

### Description

This example uses one of many selectable methods to determine the quality of a mesh. In this case, we have selected to use the area of the triangles. We show how to retrieve the quality metric computed on each triangle after the process is completed.

Other Languages

See (Cxx)

### Code

MeshQuality.java

    import vtk.vtkActor;
    import vtk.vtkNamedColors;
    import vtk.vtkSphereSource;
    import vtk.vtkTriangleFilter;
    import vtk.vtkNativeLibrary;
    import vtk.vtkPolyData;
    import vtk.vtkMeshQuality;
    import vtk.vtkPolyDataMapper;
    import vtk.vtkRenderWindow;
    import vtk.vtkRenderWindowInteractor;
    import vtk.vtkRenderer;
    import vtk.vtkDoubleArray;

    public class MeshQuality
    {
      // -----------------------------------------------------------------
      // Load VTK library and print which library was not properly loaded
      static
      {
        if (!vtkNativeLibrary.LoadAllNativeLibraries())
        {
          for (vtkNativeLibrary lib : vtkNativeLibrary.values())
          {
            if (!lib.IsLoaded())
            {
              System.out.println(lib.GetLibraryName() + " not loaded");
            }
          }
        }
        vtkNativeLibrary.DisableOutputWindow(null);
      }
      // -----------------------------------------------------------------

      public static void main(String s[])
      {
        vtkNamedColors Color = new vtkNamedColors();

        //Renderer Background Color
        double BgColor[] = new double[4];

        //Change Color Name to Use your own Color for Renderer Background
        Color.GetColor("NavajoWhite",BgColor);

        //Create a Sphere
        vtkSphereSource Sphere = new vtkSphereSource();
        //Sphere.SetCenter(0.0,0.0,0.0);
        phere.SetRadius(5.0);
        Sphere.Update();

        //Change Phi and Theta Value for Smooth Surface
        Sphere.SetPhiResolution(12);
        Sphere.SetThetaResolution(14);

        vtkTriangleFilter triangleFilter = new vtkTriangleFilter();
        triangleFilter.SetInputConnection(Sphere.GetOutputPort());
        triangleFilter.Update();

        vtkPolyData Mesh = triangleFilter.GetOutput();
        System.out.println("There are" + " " +  Mesh.GetNumberOfCells() +" "  + "Cells");

        vtkMeshQuality QualityFilter = new vtkMeshQuality();
        QualityFilter.SetInputData(Mesh);
        QualityFilter.SetTriangleQualityMeasureToArea();
        QualityFilter.Update();

        vtkDoubleArray QualityArray = new vtkDoubleArray().FastDownCast(QualityFilter.GetOutput().GetCellData().GetArray("Quality"));
        System.out.println("There are" + QualityArray.GetNumberOfTuples() + "values");

        for(int i=0;i<QualityArray.GetNumberOfTuples();i++)
        {
          double val = QualityArray.GetValue(i);
          System.out.println("Value" + " "+i + " " + val);

        }

        vtkPolyData PolyData = new vtkPolyData();
        PolyData.ShallowCopy(QualityFilter.GetOutput());

        //Create a Mapper and Actor for Sphere
        vtkPolyDataMapper Mapper = new vtkPolyDataMapper();
        Mapper.SetInputData(PolyData);

        vtkActor Actor = new vtkActor();
        Actor.SetMapper(Mapper);

        // Create the renderer, render window and interactor.
        vtkRenderer ren = new vtkRenderer();
        vtkRenderWindow renWin = new vtkRenderWindow();
        renWin.AddRenderer(ren);
        vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor();
        iren.SetRenderWindow(renWin);

        // Visualise the arrow
        ren.AddActor(Actor);
        ren.SetBackground(BgColor);
        ren.ResetCamera();

        renWin.SetSize(300,300);
        renWin.Render();

        iren.Initialize();
        iren.Start();

      }
    }