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.
227 lines
7.2 KiB
C++
227 lines
7.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkParallelCoordinatesActor.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 vtkParallelCoordinatesActor
|
|
* @brief create parallel coordinate display from input field
|
|
*
|
|
* vtkParallelCoordinatesActor generates a parallel coordinates plot from an
|
|
* input field (i.e., vtkDataObject). Parallel coordinates represent
|
|
* N-dimensional data by using a set of N parallel axes (not orthogonal like
|
|
* the usual x-y-z Cartesian axes). Each N-dimensional point is plotted as a
|
|
* polyline, were each of the N components of the point lie on one of the
|
|
* N axes, and the components are connected by straight lines.
|
|
*
|
|
* To use this class, you must specify an input data object. You'll probably
|
|
* also want to specify the position of the plot be setting the Position and
|
|
* Position2 instance variables, which define a rectangle in which the plot
|
|
* lies. Another important parameter is the IndependentVariables ivar, which
|
|
* tells the instance how to interpret the field data (independent variables
|
|
* as the rows or columns of the field). There are also many other instance
|
|
* variables that control the look of the plot includes its title,
|
|
* attributes, number of ticks on the axes, etc.
|
|
*
|
|
* Set the text property/attributes of the title and the labels through the
|
|
* vtkTextProperty objects associated to this actor.
|
|
*
|
|
* @warning
|
|
* Field data is not necessarily "rectangular" in shape. In these cases, some
|
|
* of the data may not be plotted.
|
|
*
|
|
* @warning
|
|
* Field data can contain non-numeric arrays (i.e. arrays not subclasses of
|
|
* vtkDataArray). Such arrays are skipped.
|
|
*
|
|
* @warning
|
|
* The early implementation lacks many features that could be added in the
|
|
* future. This includes the ability to "brush" data (choose regions along an
|
|
* axis and highlight any points/lines passing through the region);
|
|
* efficiency is really bad; more control over the properties of the plot
|
|
* (separate properties for each axes,title,etc.; and using the labels found
|
|
* in the field to label each of the axes.
|
|
*
|
|
* @sa
|
|
* vtkAxisActor3D can be used to create axes in world coordinate space.
|
|
* vtkActor2D vtkTextMapper vtkPolyDataMapper2D vtkScalarBarActor
|
|
* vtkCoordinate vtkTextProperty
|
|
*/
|
|
|
|
#ifndef vtkParallelCoordinatesActor_h
|
|
#define vtkParallelCoordinatesActor_h
|
|
|
|
#include "vtkActor2D.h"
|
|
#include "vtkRenderingAnnotationModule.h" // For export macro
|
|
|
|
class vtkAlgorithmOutput;
|
|
class vtkAxisActor2D;
|
|
class vtkDataObject;
|
|
class vtkPolyData;
|
|
class vtkPolyDataMapper2D;
|
|
class vtkTextMapper;
|
|
class vtkTextProperty;
|
|
class vtkParallelCoordinatesActorConnection;
|
|
|
|
#define VTK_IV_COLUMN 0
|
|
#define VTK_IV_ROW 1
|
|
|
|
class VTKRENDERINGANNOTATION_EXPORT vtkParallelCoordinatesActor : public vtkActor2D
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkParallelCoordinatesActor, vtkActor2D);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Instantiate object with autorange computation;
|
|
* the number of labels set to 5 for the x and y axes;
|
|
* a label format of "%-#6.3g"; and x coordinates computed from point
|
|
* ids.
|
|
*/
|
|
static vtkParallelCoordinatesActor* New();
|
|
|
|
//@{
|
|
/**
|
|
* Specify whether to use the rows or columns as independent variables.
|
|
* If columns, then each row represents a separate point. If rows, then
|
|
* each column represents a separate point.
|
|
*/
|
|
vtkSetClampMacro(IndependentVariables, int, VTK_IV_COLUMN, VTK_IV_ROW);
|
|
vtkGetMacro(IndependentVariables, int);
|
|
void SetIndependentVariablesToColumns() { this->SetIndependentVariables(VTK_IV_COLUMN); }
|
|
void SetIndependentVariablesToRows() { this->SetIndependentVariables(VTK_IV_ROW); }
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the title of the parallel coordinates plot.
|
|
*/
|
|
vtkSetStringMacro(Title);
|
|
vtkGetStringMacro(Title);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the number of annotation labels to show along each axis.
|
|
* This values is a suggestion: the number of labels may vary depending
|
|
* on the particulars of the data.
|
|
*/
|
|
vtkSetClampMacro(NumberOfLabels, int, 0, 50);
|
|
vtkGetMacro(NumberOfLabels, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the format with which to print the labels on the axes.
|
|
*/
|
|
vtkSetStringMacro(LabelFormat);
|
|
vtkGetStringMacro(LabelFormat);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the title text property.
|
|
*/
|
|
virtual void SetTitleTextProperty(vtkTextProperty* p);
|
|
vtkGetObjectMacro(TitleTextProperty, vtkTextProperty);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/Get the labels text property.
|
|
*/
|
|
virtual void SetLabelTextProperty(vtkTextProperty* p);
|
|
vtkGetObjectMacro(LabelTextProperty, vtkTextProperty);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Draw the parallel coordinates plot.
|
|
*/
|
|
int RenderOpaqueGeometry(vtkViewport*) override;
|
|
int RenderOverlay(vtkViewport*) override;
|
|
int RenderTranslucentPolygonalGeometry(vtkViewport*) override { return 0; }
|
|
//@}
|
|
|
|
/**
|
|
* Does this prop have some translucent polygonal geometry?
|
|
*/
|
|
vtkTypeBool HasTranslucentPolygonalGeometry() override;
|
|
|
|
/**
|
|
* Set the input to the parallel coordinates actor. Creates
|
|
* a pipeline connection.
|
|
*/
|
|
virtual void SetInputConnection(vtkAlgorithmOutput*);
|
|
|
|
/**
|
|
* Set the input to the parallel coordinates actor. Does not
|
|
* create a pipeline connection.
|
|
*/
|
|
virtual void SetInputData(vtkDataObject*);
|
|
|
|
/**
|
|
* Remove a dataset from the list of data to append.
|
|
*/
|
|
vtkDataObject* GetInput();
|
|
|
|
/**
|
|
* Release any graphics resources that are being consumed by this actor.
|
|
* The parameter window could be used to determine which graphic
|
|
* resources to release.
|
|
*/
|
|
void ReleaseGraphicsResources(vtkWindow*) override;
|
|
|
|
protected:
|
|
vtkParallelCoordinatesActor();
|
|
~vtkParallelCoordinatesActor() override;
|
|
|
|
private:
|
|
vtkParallelCoordinatesActorConnection* ConnectionHolder;
|
|
|
|
int IndependentVariables; // Use column or row
|
|
vtkIdType N; // The number of independent variables
|
|
double* Mins; // Minimum data value along this row/column
|
|
double* Maxs; // Maximum data value along this row/column
|
|
int* Xs; // Axes x-values (in viewport coordinates)
|
|
int YMin; // Axes y-min-value (in viewport coordinates)
|
|
int YMax; // Axes y-max-value (in viewport coordinates)
|
|
int NumberOfLabels; // Along each axis
|
|
char* LabelFormat;
|
|
char* Title;
|
|
|
|
vtkAxisActor2D** Axes;
|
|
vtkTextMapper* TitleMapper;
|
|
vtkActor2D* TitleActor;
|
|
|
|
vtkTextProperty* TitleTextProperty;
|
|
vtkTextProperty* LabelTextProperty;
|
|
|
|
vtkPolyData* PlotData; // The lines drawn within the axes
|
|
vtkPolyDataMapper2D* PlotMapper;
|
|
vtkActor2D* PlotActor;
|
|
|
|
vtkTimeStamp BuildTime;
|
|
|
|
int LastPosition[2];
|
|
int LastPosition2[2];
|
|
|
|
void Initialize();
|
|
int PlaceAxes(vtkViewport* viewport, const int* size);
|
|
|
|
private:
|
|
vtkParallelCoordinatesActor(const vtkParallelCoordinatesActor&) = delete;
|
|
void operator=(const vtkParallelCoordinatesActor&) = delete;
|
|
};
|
|
|
|
#endif
|