Commit 91c235e9 authored by Jan Möbius's avatar Jan Möbius

Moved Remaining geometryFunctions to ACG::Geometry Angle stuff

git-svn-id: http://www.openflipper.org/svnrepo/OpenFlipper/branches/Free@9334 383ad7c9-94d9-4d36-a494-682f7c89f535
parent 3365edc3
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
* *
* OpenFlipper is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* OpenFlipper is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU LesserGeneral Public *
* License along with OpenFlipper. If not, *
* see <http://www.gnu.org/licenses/>. *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision$ *
* $Author$ *
* $Date$ *
* *
\*===========================================================================*/
//=============================================================================
//
// IMPLEMENTATION
//
//=============================================================================
#define GEOMETRYFUNCTIONS_C
//== INCLUDES =================================================================
#include "GeometryFunctions.hh"
#include <OpenMesh/Core/Geometry/MathDefs.hh>
#include <math.h>
#include <iostream>
//== NAMESPACES ===============================================================
namespace GeometryFunctions {
//== IMPLEMENTATION ==========================================================
/// Return false if x is not a number
inline bool isNan(double x) {
return (x != x);
}
template < typename VectorT , typename ValueT >
ValueT
get_fullangle( VectorT _vector1 , VectorT _vector2 , const VectorT& _normal , bool& skip )
{
//Project vectors into tangent plane defined by _normal
_vector1 = _vector1 - _normal * ( _vector1 | _normal );
_vector2 = _vector2 - _normal * ( _vector2 | _normal );
_vector1.normalize();
_vector2.normalize();
//calculate projection onto right Vector (used to decide if vector2 is left or right of vector1
const double right = ( ( _normal % _vector1 ) | _vector2 ) ;
double sp = ( _vector1 | _vector2 );
//Catch some errors with scalar product and the following acos
if (sp < -1.0) {
sp = -1.0;
}
if (sp > 1.0) {
sp = 1.0;
}
double angle = acos(sp);
// catch some possible nans
skip = ( isNan(right) || isNan(angle) ) ;
if ( right < 0 ) {
angle = 2 * M_PI - angle;
}
return angle;
}
template < typename ValueT >
inline
ValueT
angle_dist( const ValueT& angle0 , const ValueT& angle1 ) {
ValueT dist = fabs( angle1 - angle0 );
return ( std::min( dist , 2 * M_PI - dist) );
}
template < typename ValueT >
inline
ValueT
get_angle( const ValueT& _cos ,
const ValueT& _sin )
{
const double angle_asin = asin( OpenMesh::sane_aarg(_sin) );
const double angle_acos = acos( OpenMesh::sane_aarg(_cos) );
if ( angle_asin >= 0 ) { //Quadrant 1,2
if ( angle_acos >= 0 ) { // Quadrant 1
return angle_asin;
} else { //Quadrant 2
return (M_PI - angle_asin);
}
} else { //Quadrant 3,4
if ( angle_acos >= 0 ) { // Quadrant 4
return (2 * M_PI + angle_asin);
} else { //Quadrant 3
return (M_PI - angle_asin);
}
}
}
template < typename ValueT >
inline
ValueT
rad_to_deg( const ValueT& _angle ) {
return ( _angle / M_PI * 180);
}
template < typename ValueT >
inline
ValueT
deg_to_rad( const ValueT& _angle ) {
return ( _angle / 180 * M_PI );
}
template<class VectorT>
int is_obtuse(const VectorT& _p0,
const VectorT& _p1,
const VectorT& _p2 )
{
const double a0 = ((_p1-_p0)|(_p2-_p0));
if ( a0<0.0) return 1;
else
{
const double a1 = ((_p0-_p1)|(_p2-_p1));
if (a1 < 0.0 ) return 2;
else
{
const double a2 = ((_p0-_p2)|(_p1-_p2));
if (a2 < 0.0 ) return 3;
else return 0;
}
}
}
//=============================================================================
} // GeometryFunctions Namespace
//=============================================================================
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
* *
* OpenFlipper is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* OpenFlipper is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU LesserGeneral Public *
* License along with OpenFlipper. If not, *
* see <http://www.gnu.org/licenses/>. *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision$ *
* $Author$ *
* $Date$ *
* *
\*===========================================================================*/
//=============================================================================
//
//
//=============================================================================
#ifndef GEOMETRYFUNCTIONS_HH
#define GEOMETRYFUNCTIONS_HH
/*! \file GeometryFunctions.hh
\brief Functions for geometric operations
General file with template functions doing for example
projections,...
*/
//== INCLUDES =================================================================
//== FORWARDDECLARATIONS ======================================================
//== NAMESPACES ===============================================================
/// Namespace providing different geometric functions
namespace GeometryFunctions {
//== CLASS DEFINITION =========================================================
/** Return a fully parametrized angle
@param _vector1 vector pointing away from center, angle = 0
@param _vector2 vector for which the angle should be calculated
@param _normal the normal used to compute if vector2 is left or right of vecor1
@param _skip Flag to catch nan. If true nan occured and value should not be used
@return the angle (0 .. 2 * PI)
*/
template < typename VectorT , typename ValueT >
ValueT
get_fullangle( VectorT _vector1,
VectorT _vector2,
const VectorT& _normal,
bool& skip );
/** Calculate the difference between two angles
@param _angle0 angle1
@param _angle1 angle2
@return The difference between the angles (0..PI)
*/
template < typename ValueT >
inline
ValueT
angle_dist( const ValueT& angle0 ,
const ValueT& angle1 );
/** Calculate the correct 2D angle if cos and sin of the angle are given
This function calculates based on the signs of the acos and asin of the
given angles, in which quadrant the angle is and returns the full angle
in radians
@param _cos cos of angle
@param _sin sin of angle
@return angle
*/
template < typename ValueT >
inline
ValueT
get_angle( const ValueT& _cos ,
const ValueT& _sin );
/** Convert angle from radians to degree
@param _angle in radians
@return angle in degree
*/
template < typename ValueT >
inline
ValueT
rad_to_deg( const ValueT& _angle );
/** Convert angle from degree to radians
@param _angle in degree
@return angle in radians
*/
template < typename ValueT >
inline
ValueT
deg_to_rad( const ValueT& _angle );
/**
* test angles in triangle
* return 0 if all smaller than 90�
* return 1 if angle at _p0 ist greater than 90�
* return 2 if angle at _p1 ist greater than 90�
* return 3 if angle at _p2 ist greater than 90�
*/
template<class VectorT>
int is_obtuse(const VectorT& _p0,
const VectorT& _p1,
const VectorT& _p2 );
//=============================================================================
} // GeometryFunctions Namespace
//=============================================================================
#if defined(INCLUDE_TEMPLATES) && !defined(GEOMETRYFUNCTIONS_C)
#define GEOMETRYFUNCTIONS_TEMPLATES
#include "GeometryFunctions.cc"
#endif
//=============================================================================
#endif // GEOMETRYFUNCTIONS_HH defined
//=============================================================================
......@@ -53,12 +53,8 @@
//== INCLUDES =================================================================
// #include "MeshFunctions.hh"
// #include <ACG/Geometry/Algorithms.hh>
// #include "Math_Tools/GeometryFunctions.hh"
#include "Math_Tools/Math_Tools.hh"
#include "Math_Tools/GeometryFunctions.hh"
#include <iostream>
#include <OpenMesh/Core/Geometry/MathDefs.hh>
......@@ -149,7 +145,7 @@ void discrete_mean_curv_op( const MeshT& _m,
#endif
// calculate area
const int obt = GeometryFunctions::is_obtuse(p0,p1,p2);
const int obt = ACG::Geometry::isObtuse(p0,p1,p2);
if(obt == 0)
{
REALT gamma = acos( OpenMesh::sane_aarg((p0-p1).normalize() | (p2-p1).normalize()) );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment