/*===========================================================================*\ * * * 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 . * * * \*===========================================================================*/ /*===========================================================================*\ * * * $Revision$ * * $Author$ * * $Date$ * * * \*===========================================================================*/ //============================================================================= // // IMPLEMENTATION // //============================================================================= #define GEOMETRYFUNCTIONS_C //== INCLUDES ================================================================= #include "GeometryFunctions.hh" #include #include #include //== 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 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 //=============================================================================