# VectorFieldExample

VTKExamples/Java/Visualization/VectorFieldExample

### Description

The code bellow shows how to load a vector field from a vtu file, where some data is stored and we are only interrested in the vector field.

'''Note:''' Please make sure that you adapt the code below to your system properties, like e.g. paths to natives vtk libraries.

### Code

VectorFieldExample.java

    import java.awt.BorderLayout;
    import java.io.File;
    import java.io.IOException;
    import java.io.Serializable;
    import java.util.concurrent.TimeUnit;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import vtk.vtkActor;
    import vtk.vtkArrowSource;
    import vtk.vtkCubeSource;
    import vtk.vtkGlyph3D;
    import vtk.vtkObject;
    import vtk.vtkPanel;
    import vtk.vtkPolyData;
    import vtk.vtkPolyDataMapper;
    import vtk.vtkThresholdPoints;
    import vtk.vtkUnstructuredGrid;
    import vtk.vtkXMLUnstructuredGridReader;

    public class VectorFieldExample implements Serializable {

      static
      {
        System.loadLibrary("vtkCommonCoreJava");
        System.loadLibrary("vtkFiltersCoreJava");
        System.loadLibrary("vtkFiltersSourcesJava");
        System.loadLibrary("vtkIOXMLJava");
        System.loadLibrary("vtkRenderingCoreJava");
        System.loadLibrary("vtkRenderingOpenGL2Java");
      }
        private static final long serialVersionUID = 1L;

        public static vtkPanel showVectorField(
                File file,
                int elementInFile,
                double threshold,
                double scaleFactor) {

            vtkXMLUnstructuredGridReader reader = new vtkXMLUnstructuredGridReader();

            reader.SetFileName(file.getAbsolutePath());
            reader.Update();
            vtkUnstructuredGrid image = reader.GetOutput();
            image.GetPointData().SetVectors(image.GetPointData().GetArray(elementInFile));

            vtkThresholdPoints thresholdVector = new vtkThresholdPoints();
            thresholdVector.SetInputData(image);
            thresholdVector.SetInputArrayToProcess(
                    elementInFile,
                    image.GetInformation());

            thresholdVector.ThresholdByUpper(threshold);
            thresholdVector.Update();

            // represent vector field
            vtkGlyph3D vectorGlyph = new vtkGlyph3D();
            vtkArrowSource arrowSource = new vtkArrowSource();
            vtkPolyDataMapper vectorGlyphMapper = new vtkPolyDataMapper();

            int n = image.GetPointData().GetNumberOfArrays();
            for (int i = 0; i < n; i++) {
                System.out.println("name of array[" + i + "]: " + image.GetPointData().GetArrayName(i));
            }

            vtkPolyData tmp = thresholdVector.GetOutput();
            System.out.println("number of thresholded points: " + tmp.GetNumberOfPoints());

            vectorGlyph.SetInputData(image);
            vectorGlyph.SetSourceConnection(arrowSource.GetOutputPort());
            vectorGlyph.SetScaleModeToScaleByVector();
            vectorGlyph.SetVectorModeToUseVector();
            vectorGlyph.ScalingOn();
            vectorGlyph.OrientOn();
            vectorGlyph.SetInputArrayToProcess(
                    elementInFile,
                    image.GetInformation());

            vectorGlyph.SetScaleFactor(scaleFactor);

            vectorGlyph.Update();

            vectorGlyphMapper.SetInputConnection(vectorGlyph.GetOutputPort());
            vectorGlyphMapper.Update();

            vtkActor vectorActor = new vtkActor();
            vectorActor.SetMapper(vectorGlyphMapper);

            vtkPanel vis = new vtkPanel();
            vis.GetRenderer().AddActor(vectorActor);

            return vis;
        }

        public static void main(String s[]) throws IOException {

            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {

                    JFrame frame = new JFrame("VTKJPanel Demo");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                    File file = new File("../src/Testing/Data/tetra.vtu"); // needs to be replaced

                    vtkPanel panel = showVectorField(file, 2, 0.001, 0.05); // values need to be replaced

                    frame.add(panel, BorderLayout.CENTER);
                    frame.setSize(600, 600);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);

                    panel.repaint();

                }
            });
        }
    }