ModHausdorffT.hh 6.48 KB
Newer Older
Jan Möbius's avatar
Jan Möbius committed
1
/* ========================================================================= *
Jan Möbius's avatar
Jan Möbius committed
2
3
 *                                                                           *
 *                               OpenMesh                                    *
Jan Möbius's avatar
Jan Möbius committed
4
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
Jan Möbius's avatar
Typo  
Jan Möbius committed
5
 *           Department of Computer Graphics and Multimedia                  *
Jan Möbius's avatar
Jan Möbius committed
6
7
 *                          All rights reserved.                             *
 *                            www.openmesh.org                               *
Jan Möbius's avatar
Jan Möbius committed
8
9
 *                                                                           *
 *---------------------------------------------------------------------------*
Jan Möbius's avatar
Jan Möbius committed
10
11
 * This file is part of OpenMesh.                                            *
 *---------------------------------------------------------------------------*
Jan Möbius's avatar
Jan Möbius committed
12
 *                                                                           *
Jan Möbius's avatar
Jan Möbius committed
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. 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.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    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 COPYRIGHT HOLDER *
 * 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.              *
Jan Möbius's avatar
Jan Möbius committed
39
40
 *                                                                           *
 * ========================================================================= */
Jan Möbius's avatar
Jan Möbius committed
41
42
43
44
45
46
47
48
49
50
51


/** \file ModHausdorffT.hh
 */

//=============================================================================
//
//  CLASS ModHausdorffT
//
//=============================================================================

52
53
#ifndef OPENMESH_DECIMATER_MODHAUSDORFFT_HH
#define OPENMESH_DECIMATER_MODHAUSDORFFT_HH
Jan Möbius's avatar
Jan Möbius committed
54
55
56
57
58
59

//== INCLUDES =================================================================

#include <OpenMesh/Tools/Decimater/ModBaseT.hh>
#include <OpenMesh/Core/Utils/Property.hh>
#include <vector>
60
#include <cfloat>
Jan Möbius's avatar
Jan Möbius committed
61
62
63

//== NAMESPACES ===============================================================

64
namespace OpenMesh {
Jan Möbius's avatar
Jan Möbius committed
65
66
67
68
namespace Decimater {

//== CLASS DEFINITION =========================================================

69
70
71
72
73
74
75
76
77
/** \brief Use Hausdorff distance to control decimation
 *
 * This module computes the aspect ratio.
 *
 * In binary mode, the collapse is legal if:
 *  - The distance after the collapse is lower than the given tolerance
 *
 * No continuous mode
 */
78
79
template<class MeshT>
class ModHausdorffT: public ModBaseT<MeshT> {
80
  public:
Jan Möbius's avatar
Jan Möbius committed
81

Matthias Möller's avatar
Matthias Möller committed
82
    DECIMATING_MODULE( ModHausdorffT, MeshT, Hausdorff );
Jan Möbius's avatar
Jan Möbius committed
83

84
85
86
87
    typedef typename Mesh::Scalar Scalar;
    typedef typename Mesh::Point Point;
    typedef typename Mesh::FaceHandle FaceHandle;
    typedef std::vector<Point> Points;
Jan Möbius's avatar
Jan Möbius committed
88

89
    /// Constructor
90
91
    ModHausdorffT(MeshT& _mesh, Scalar _error_tolerance = FLT_MAX) :
        Base(_mesh, true), mesh_(Base::mesh()), tolerance_(_error_tolerance) {
92
93
      mesh_.add_property(points_);
    }
Jan Möbius's avatar
Jan Möbius committed
94

95
96
97
98
    /// Destructor
    ~ModHausdorffT() {
      mesh_.remove_property(points_);
    }
Jan Möbius's avatar
Jan Möbius committed
99

100
101
102
103
    /// get max error tolerance
    Scalar tolerance() const {
      return tolerance_;
    }
Jan Möbius's avatar
Jan Möbius committed
104

105
106
107
108
    /// set max error tolerance
    void set_tolerance(Scalar _e) {
      tolerance_ = _e;
    }
Jan Möbius's avatar
Jan Möbius committed
109

110
111
    /// reset per-face point lists
    virtual void initialize();
Jan Möbius's avatar
Jan Möbius committed
112

113
114
115
116
117
118
119
120
121
    /** \brief compute Hausdorff error for one-ring
     *
     * This mod only allows collapses if the Hausdorff distance
     * after a collapse is lower than the given tolerance.
     *
     *
     * @param _ci Collapse info data
     * @return Binary return, if collapse is legal or illegal
     */
Jan Möbius's avatar
Jan Möbius committed
122

123
    virtual float collapse_priority(const CollapseInfo& _ci);
Jan Möbius's avatar
Jan Möbius committed
124

125
126
    /// re-distribute points
    virtual void postprocess_collapse(const CollapseInfo& _ci);
Jan Möbius's avatar
Jan Möbius committed
127

128
129
130
    /// set the percentage of tolerance
    void set_error_tolerance_factor(double _factor);

131
  private:
Jan Möbius's avatar
Jan Möbius committed
132

133
    /// squared distance from point _p to triangle (_v0, _v1, _v2)
Jan Möbius's avatar
Jan Möbius committed
134
    Scalar distPointTriangleSquared(const Point& _p, const Point& _v0, const Point& _v1, const Point& _v2);
Jan Möbius's avatar
Jan Möbius committed
135

136
137
    /// compute max error for face _fh w.r.t. its point list and _p
    Scalar compute_sqr_error(FaceHandle _fh, const Point& _p) const;
Jan Möbius's avatar
Jan Möbius committed
138

139
  private:
Jan Möbius's avatar
Jan Möbius committed
140

141
142
143
144
    /// Temporary point storage
    Points tmp_points_;

    Mesh&  mesh_;
145
    Scalar tolerance_;
Jan Möbius's avatar
Jan Möbius committed
146

147
    OpenMesh::FPropHandleT<Points> points_;
Jan Möbius's avatar
Jan Möbius committed
148
149
150
};

//=============================================================================
151
}// END_NS_DECIMATER
Jan Möbius's avatar
Jan Möbius committed
152
153
} // END_NS_OPENMESH
//=============================================================================
154
#if defined(OM_INCLUDE_TEMPLATES) && !defined(OPENMESH_DECIMATER_MODHAUSDORFFT_C)
155
#define OPENMESH_DECIMATER_MODHAUSDORFFT_TEMPLATES
156
#include "ModHausdorffT_impl.hh"
Jan Möbius's avatar
Jan Möbius committed
157
158
#endif
//=============================================================================
159
#endif // OPENMESH_DECIMATER_MODHAUSDORFFT_HH defined
Jan Möbius's avatar
Jan Möbius committed
160
161
//=============================================================================