]> Creatis software - creaVtk.git/blobdiff - lib/creaVtk/vtkHausdorffDistancePointSetFilter.h
#3458 box HausdorffDistancePointSetFilter
[creaVtk.git] / lib / creaVtk / vtkHausdorffDistancePointSetFilter.h
diff --git a/lib/creaVtk/vtkHausdorffDistancePointSetFilter.h b/lib/creaVtk/vtkHausdorffDistancePointSetFilter.h
new file mode 100644 (file)
index 0000000..ddff5cf
--- /dev/null
@@ -0,0 +1,145 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    vtkHausdorffDistancePointSetFilter.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) 2011 LTSI INSERM U642
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+//     * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation and/or
+// other materials provided with the distribution.
+//     * Neither name of LTSI, INSERM nor the names
+// of any contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/** @class vtkHausdorffDistancePointSetFilter
+ *  @brief Compute Hausdorff distance between two point sets
+ *
+ * This class computes the relative and hausdorff distances from two point
+ * sets (input port 0 and input port 1). If no topology is specified (ie.
+ * vtkPointSet or vtkPolyData without vtkPolys), the distances are
+ * computed between point location. If polys exist (ie triangulation),
+ * the TargetDistanceMethod allows for an interpolation of the cells to
+ * ensure a better minimal distance exploration.
+ *
+ * The outputs (port 0 and 1) have the same geometry and topology as its
+ * respective input port. Two FieldData arrays are added : HausdorffDistance
+ * and RelativeDistance. The former is equal on both outputs whereas the
+ * latter may differ. A PointData containing the specific point minimal
+ * distance is also added to both outputs.
+ *
+ * @author Frederic Commandeur
+ * @author Jerome Velut
+ * @author LTSI
+ *
+ * @see https://www.vtkjournal.org/browse/publication/839
+ */
+
+#ifndef vtkHausdorffDistancePointSetFilter_h
+#define vtkHausdorffDistancePointSetFilter_h
+
+#include "vtkFiltersModelingModule.h" // For export macro
+#include "vtkPointSetAlgorithm.h"
+
+class VTKFILTERSMODELING_EXPORT vtkHausdorffDistancePointSetFilter : public vtkPointSetAlgorithm
+{
+public:
+  ///@{
+  /**
+   * Standard methods for construction, type and printing.
+   */
+  static vtkHausdorffDistancePointSetFilter* New();
+  vtkTypeMacro(vtkHausdorffDistancePointSetFilter, vtkPointSetAlgorithm);
+  void PrintSelf(ostream& os, vtkIndent indent) override;
+  ///@}
+
+  ///@{
+  /**
+   * Get the Relative Distance from A to B and B to A.
+   */
+  vtkGetVector2Macro(RelativeDistance, double);
+  ///@}
+
+  ///@{
+  /**
+   * Get the Hausdorff Distance.
+   */
+  vtkGetMacro(HausdorffDistance, double);
+  ///@}
+
+  enum DistanceMethod
+  {
+    POINT_TO_POINT,
+    POINT_TO_CELL
+  };
+
+  ///@{
+  /**
+   * Specify the strategy for computing the distance. If no topology is specified (ie.
+   * vtkPointSet or vtkPolyData without vtkPolys), the distances are
+   * computed between point location. If polys exist (i.e. triangulation),
+   * the TargetDistanceMethod allows for an interpolation of the cells to
+   * ensure a better minimal distance exploration.
+   *
+   */
+  vtkSetMacro(TargetDistanceMethod, int);
+  vtkGetMacro(TargetDistanceMethod, int);
+  void SetTargetDistanceMethodToPointToPoint() { this->SetTargetDistanceMethod(POINT_TO_POINT); }
+  void SetTargetDistanceMethodToPointToCell() { this->SetTargetDistanceMethod(POINT_TO_CELL); }
+  const char* GetTargetDistanceMethodAsString();
+  ///@}
+
+protected:
+  vtkHausdorffDistancePointSetFilter();
+  ~vtkHausdorffDistancePointSetFilter() override;
+
+  int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
+  int FillInputPortInformation(int port, vtkInformation* info) override;
+
+  int TargetDistanceMethod;   //!< point-to-point if 0, point-to-cell if 1
+  double RelativeDistance[2]; //!< relative distance between inputs
+  double HausdorffDistance;   //!< hausdorff distance (max(relative distance))
+
+private:
+  vtkHausdorffDistancePointSetFilter(const vtkHausdorffDistancePointSetFilter&) = delete;
+  void operator=(const vtkHausdorffDistancePointSetFilter&) = delete;
+};
+inline const char* vtkHausdorffDistancePointSetFilter::GetTargetDistanceMethodAsString()
+{
+  if (this->TargetDistanceMethod == POINT_TO_POINT)
+  {
+    return "PointToPoint";
+  }
+  else
+  {
+    return "PointToCell";
+  }
+}
+#endif
+