VectorField
VTKExamples/Java/Visualization/VectorField
Code
VectorField.java
package eu.mihosoft.vtk;
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 {
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.SetInput(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.SetInputConnection(image.GetProducerPort());
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("PATH/TO/FILE.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();
}
});
}
}