You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
9.4 KiB
C++
261 lines
9.4 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkTensorGlyph.h
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/**
|
|
* @class vtkTensorGlyph
|
|
* @brief scale and orient glyph(s) according to eigenvalues and eigenvectors of symmetrical part
|
|
* of tensor
|
|
*
|
|
* vtkTensorGlyph is a filter that copies a geometric representation
|
|
* (specified as polygonal data) to every input point. The geometric
|
|
* representation, or glyph, can be scaled and/or rotated according to
|
|
* the tensor at the input point. Scaling and rotation is controlled
|
|
* by the eigenvalues/eigenvectors of the symmetrical part of the tensor
|
|
* as follows:
|
|
* For each tensor, the eigenvalues (and associated eigenvectors) are sorted
|
|
* to determine the major, medium, and minor eigenvalues/eigenvectors.
|
|
* The eigenvalue decomposition only makes sense for symmetric tensors,
|
|
* hence the need to only consider the symmetric part of the tensor, which is
|
|
* 1/2 (T + T.transposed()).
|
|
*
|
|
* If the boolean variable ThreeGlyphs is not set the major eigenvalue
|
|
* scales the glyph in the x-direction, the medium in the y-direction,
|
|
* and the minor in the z-direction. Then, the glyph is rotated so
|
|
* that the glyph's local x-axis lies along the major eigenvector,
|
|
* y-axis along the medium eigenvector, and z-axis along the minor.
|
|
*
|
|
* If the boolean variable ThreeGlyphs is set three glyphs are produced,
|
|
* each of them oriented along an eigenvector and scaled according to the
|
|
* corresponding eigenvector.
|
|
*
|
|
* If the boolean variable Symmetric is set each glyph is mirrored (2 or 6
|
|
* glyphs will be produced)
|
|
*
|
|
* The x-axis of the source glyph will correspond to the eigenvector
|
|
* on output. Point (0,0,0) in the source will be placed in the data point.
|
|
* Variable Length will normally correspond to the distance from the
|
|
* origin to the tip of the source glyph along the x-axis,
|
|
* but can be changed to produce other results when Symmetric is on,
|
|
* e.g. glyphs that do not touch or that overlap.
|
|
*
|
|
* Please note that when Symmetric is false it will generally be better
|
|
* to place the source glyph from (-0.5,0,0) to (0.5,0,0), i.e. centred
|
|
* at the origin. When symmetric is true the placement from (0,0,0) to
|
|
* (1,0,0) will generally be more convenient.
|
|
*
|
|
* A scale factor is provided to control the amount of scaling. Also, you
|
|
* can turn off scaling completely if desired. The boolean variable
|
|
* ClampScaling controls the maximum scaling (in conjunction with
|
|
* MaxScaleFactor.) This is useful in certain applications where
|
|
* singularities or large order of magnitude differences exist in
|
|
* the eigenvalues.
|
|
*
|
|
* If the boolean variable ColorGlyphs is set to true the glyphs are
|
|
* colored. The glyphs can be colored using the input scalars
|
|
* (SetColorModeToScalars), which is the default, or colored using the
|
|
* eigenvalues (SetColorModeToEigenvalues).
|
|
*
|
|
* Another instance variable, ExtractEigenvalues, has been provided to
|
|
* control extraction of eigenvalues/eigenvectors. If this boolean is
|
|
* false, then eigenvalues/eigenvectors are not extracted, and the
|
|
* columns of the tensor are taken as the eigenvectors (the norm of
|
|
* column, always positive, is the eigenvalue). This allows
|
|
* additional capability over the vtkGlyph3D object. That is, the
|
|
* glyph can be oriented in three directions instead of one.
|
|
*
|
|
* @par Thanks:
|
|
* Thanks to Jose Paulo Moitinho de Almeida for enhancements.
|
|
*
|
|
* @sa
|
|
* vtkGlyph3D vtkPointLoad vtkHyperStreamline
|
|
*/
|
|
|
|
#ifndef vtkTensorGlyph_h
|
|
#define vtkTensorGlyph_h
|
|
|
|
#include "vtkFiltersCoreModule.h" // For export macro
|
|
#include "vtkPolyDataAlgorithm.h"
|
|
|
|
class VTKFILTERSCORE_EXPORT vtkTensorGlyph : public vtkPolyDataAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkTensorGlyph, vtkPolyDataAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Construct object with scaling on and scale factor 1.0. Eigenvalues are
|
|
* extracted, glyphs are colored with input scalar data, and logarithmic
|
|
* scaling is turned off.
|
|
*/
|
|
static vtkTensorGlyph* New();
|
|
|
|
//@{
|
|
/**
|
|
* Specify the geometry to copy to each point.
|
|
* Note that this method does not connect the pipeline. The algorithm will
|
|
* work on the input data as it is without updating the producer of the data.
|
|
* See SetSourceConnection for connecting the pipeline.
|
|
*/
|
|
void SetSourceData(vtkPolyData* source);
|
|
vtkPolyData* GetSource();
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify a source object at a specified table location. New style.
|
|
* Source connection is stored in port 1. This method is equivalent
|
|
* to SetInputConnection(1, id, outputPort).
|
|
*/
|
|
void SetSourceConnection(int id, vtkAlgorithmOutput* algOutput);
|
|
void SetSourceConnection(vtkAlgorithmOutput* algOutput)
|
|
{
|
|
this->SetSourceConnection(0, algOutput);
|
|
}
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off scaling of glyph with eigenvalues.
|
|
*/
|
|
vtkSetMacro(Scaling, vtkTypeBool);
|
|
vtkGetMacro(Scaling, vtkTypeBool);
|
|
vtkBooleanMacro(Scaling, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Specify scale factor to scale object by. (Scale factor always affects
|
|
* output even if scaling is off.)
|
|
*/
|
|
vtkSetMacro(ScaleFactor, double);
|
|
vtkGetMacro(ScaleFactor, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off drawing three glyphs
|
|
*/
|
|
vtkSetMacro(ThreeGlyphs, vtkTypeBool);
|
|
vtkGetMacro(ThreeGlyphs, vtkTypeBool);
|
|
vtkBooleanMacro(ThreeGlyphs, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off drawing a mirror of each glyph
|
|
*/
|
|
vtkSetMacro(Symmetric, vtkTypeBool);
|
|
vtkGetMacro(Symmetric, vtkTypeBool);
|
|
vtkBooleanMacro(Symmetric, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the distance, along x, from the origin to the end of the
|
|
* source glyph. It is used to draw the symmetric glyphs.
|
|
*/
|
|
vtkSetMacro(Length, double);
|
|
vtkGetMacro(Length, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off extraction of eigenvalues from tensor.
|
|
*/
|
|
vtkSetMacro(ExtractEigenvalues, vtkTypeBool);
|
|
vtkBooleanMacro(ExtractEigenvalues, vtkTypeBool);
|
|
vtkGetMacro(ExtractEigenvalues, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off coloring of glyph with input scalar data or
|
|
* eigenvalues. If false, or input scalar data not present, then the
|
|
* scalars from the source object are passed through the filter.
|
|
*/
|
|
vtkSetMacro(ColorGlyphs, vtkTypeBool);
|
|
vtkGetMacro(ColorGlyphs, vtkTypeBool);
|
|
vtkBooleanMacro(ColorGlyphs, vtkTypeBool);
|
|
//@}
|
|
|
|
enum
|
|
{
|
|
COLOR_BY_SCALARS,
|
|
COLOR_BY_EIGENVALUES
|
|
};
|
|
|
|
//@{
|
|
/**
|
|
* Set the color mode to be used for the glyphs. This can be set to
|
|
* use the input scalars (default) or to use the eigenvalues at the
|
|
* point. If ThreeGlyphs is set and the eigenvalues are chosen for
|
|
* coloring then each glyph is colored by the corresponding
|
|
* eigenvalue and if not set the color corresponding to the largest
|
|
* eigenvalue is chosen. The recognized values are:
|
|
* COLOR_BY_SCALARS = 0 (default)
|
|
* COLOR_BY_EIGENVALUES = 1
|
|
*/
|
|
vtkSetClampMacro(ColorMode, int, COLOR_BY_SCALARS, COLOR_BY_EIGENVALUES);
|
|
vtkGetMacro(ColorMode, int);
|
|
void SetColorModeToScalars() { this->SetColorMode(COLOR_BY_SCALARS); }
|
|
void SetColorModeToEigenvalues() { this->SetColorMode(COLOR_BY_EIGENVALUES); }
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Turn on/off scalar clamping. If scalar clamping is on, the ivar
|
|
* MaxScaleFactor is used to control the maximum scale factor. (This is
|
|
* useful to prevent uncontrolled scaling near singularities.)
|
|
*/
|
|
vtkSetMacro(ClampScaling, vtkTypeBool);
|
|
vtkGetMacro(ClampScaling, vtkTypeBool);
|
|
vtkBooleanMacro(ClampScaling, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the maximum allowable scale factor. This value is compared to the
|
|
* combination of the scale factor times the eigenvalue. If less, the scale
|
|
* factor is reset to the MaxScaleFactor. The boolean ClampScaling has to
|
|
* be "on" for this to work.
|
|
*/
|
|
vtkSetMacro(MaxScaleFactor, double);
|
|
vtkGetMacro(MaxScaleFactor, double);
|
|
//@}
|
|
|
|
protected:
|
|
vtkTensorGlyph();
|
|
~vtkTensorGlyph() override;
|
|
|
|
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
|
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
|
|
|
vtkTypeBool Scaling; // Determine whether scaling of geometry is performed
|
|
double ScaleFactor; // Scale factor to use to scale geometry
|
|
vtkTypeBool ExtractEigenvalues; // Boolean controls eigenfunction extraction
|
|
vtkTypeBool ColorGlyphs; // Boolean controls coloring with input scalar data
|
|
int ColorMode; // The coloring mode to use for the glyphs.
|
|
vtkTypeBool ClampScaling; // Boolean controls whether scaling is clamped.
|
|
double MaxScaleFactor; // Maximum scale factor (ScaleFactor*eigenvalue)
|
|
vtkTypeBool ThreeGlyphs; // Boolean controls drawing 1 or 3 glyphs
|
|
vtkTypeBool Symmetric; // Boolean controls drawing a "mirror" of each glyph
|
|
double Length; // Distance, in x, from the origin to the end of the glyph
|
|
private:
|
|
vtkTensorGlyph(const vtkTensorGlyph&) = delete;
|
|
void operator=(const vtkTensorGlyph&) = delete;
|
|
};
|
|
|
|
#endif
|