/*=========================================================================
Program: Visualization Toolkit
Module: vtkMultiThreshold.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.
=========================================================================*/
/*----------------------------------------------------------------------------
Copyright (c) Sandia Corporation
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
----------------------------------------------------------------------------*/
/**
* @class vtkMultiThreshold
* @brief Threshold cells within multiple intervals
*
* This filter can be substituted for a chain of several vtkThreshold filters
* and can also perform more sophisticated subsetting operations.
* It generates a vtkMultiBlockDataSet as its output.
* This multiblock dataset contains a vtkUnstructuredGrid for each thresholded
* subset you request.
* A thresholded subset can be a set defined by an interval over a
* point or cell attribute of the mesh; these subsets are called IntervalSets.
* A thresholded subset can also be a boolean combination of one or more IntervalSets;
* these subsets are called BooleanSets.
* BooleanSets allow complex logic since their output
* can depend on multiple intervals over multiple variables
* defined on the input mesh.
* This is useful because it eliminates the need for thresholding several
* times and then appending the results, as can be required with vtkThreshold
* when one wants to remove some range of values (e.g., a notch filter).
* Cells are not repeated when they belong to more than one interval unless
* those intervals have different output grids.
*
* Another advantage this filter provides over vtkThreshold is the ability
* to threshold on non-scalar (i.e., vector, tensor, etc.) attributes without
* first computing an array containing some norm of the desired attribute.
* vtkMultiThreshold provides \f$L_1\f$, \f$L_2\f$, and \f$L_{\infty}\f$ norms.
*
* This filter makes a distinction between intermediate subsets and
* subsets that will be output to a grid.
* Each intermediate subset you create with AddIntervalSet or
* AddBooleanSet is given a unique integer identifier (via the return
* values of these member functions).
* If you wish for a given set to be output, you must call
* OutputSet and pass it one of these identifiers.
* The return of OutputSet is the integer index of the output set
* in the multiblock dataset created by this filter.
*
* For example, if an input mesh defined three attributes T, P, and s, one might
* wish to find cells that satisfy "T < 320 [K] && ( P > 101 [kPa] || s < 0.1 [kJ/kg/K] )".
* To accomplish this with a vtkMultiThreshold filter,
*
* vtkMultiThreshold* thr;
* int intervalSets[3];
*
* intervalSets[0] = thr->AddIntervalSet( vtkMath::NegInf(), 320., vtkMultiThreshold::CLOSED,
* vtkMultiThreshold::OPEN, vtkDataObject::FIELD_ASSOCIATION_POINTS, "T", 0, 1 ); intervalSets[1] =
* thr->AddIntervalSet( 101., vtkMath::Inf(), vtkMultiThreshold::OPEN, vtkMultiThreshold::CLOSED,
* vtkDataObject::FIELD_ASSOCIATION_CELLS, "P", 0, 1 );
* intervalSets[2] = thr->AddIntervalSet( vtkMath::NegInf(), 0.1, vtkMultiThreshold::CLOSED,
* vtkMultiThreshold::OPEN, vtkDataObject::FIELD_ASSOCIATION_POINTS, "s", 0, 1 );
*
* int intermediate = thr->AddBooleanSet( vtkMultiThreshold::OR, 2, &intervalSets[1] );
*
* int intersection[2];
* intersection[0] = intervalSets[0];
* intersection[1] = intermediate;
* int outputSet = thr->AddBooleanSet( vtkMultiThreshold::AND, 2, intersection );
*
* int outputGridIndex = thr->OutputSet( outputSet );
* thr->Update();
*
* The result of this filter will be a multiblock dataset that contains a single child with the
* desired cells. If we had also called thr->OutputSet( intervalSets[0] );
, there would
* be two child meshes and one would contain all cells with T < 320 [K]. In that case, the output
* can be represented by this graph
*
* \dot
* digraph MultiThreshold {
* set0 [shape=rect,style=filled,label="point T(0) in [-Inf,320["]
* set1 [shape=rect,label="cell P(0) in ]101,Inf]"]
* set2 [shape=rect,label="point s(0) in [-Inf,0.1["]
* set3 [shape=rect,label="OR"]
* set4 [shape=rect,style=filled,label="AND"]
* set0 -> set4
* set1 -> set3
* set2 -> set3
* set3 -> set4
* }
* \enddot
*
* The filled rectangles represent sets that are output.
*/
#ifndef vtkMultiThreshold_h
#define vtkMultiThreshold_h
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkMath.h" // for Inf() and NegInf()
#include "vtkMultiBlockDataSetAlgorithm.h"
#include