Commit 3365edc3 authored by Jan Möbius's avatar Jan Möbius
Browse files

Added Geometry algorithms for angles

git-svn-id: http://www.openflipper.org/svnrepo/OpenFlipper/branches/Free@9333 383ad7c9-94d9-4d36-a494-682f7c89f535
parent 03e99535
......@@ -799,6 +799,30 @@ circumRadiusSquared( const VectorT<Scalar,3>& _v0,
denom );
}
//-----------------------------------------------------------------------------
template<class VectorT>
int isObtuse(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;
}
}
}
//-----------------------------------------------------------------------------
......
......@@ -394,6 +394,18 @@ circumRadius( const VectorT<Scalar,3>& _v0,
return sqrt(circumRadiusSquared(_v0, _v1, _v2));
}
/**
* 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 isObtuse(const VectorT& _p0,
const VectorT& _p1,
const VectorT& _p2 );
/** @} */
//===========================================================================
......
/*===========================================================================*\
* *
* 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 ALGORITHMSANGLE_C
//== INCLUDES =================================================================
#include "AlgorithmsAngleT.hh"
// #include <OpenMesh/Core/Geometry/MathDefs.hh>
#include <math.h>
#include <iostream>
//== NAMESPACES ===============================================================
namespace ACG {
namespace Geometry {
//== IMPLEMENTATION ==========================================================
/// Return false if x is not a number
inline bool isNan(double x) {
return (x != x);
}
template < typename VectorT , typename ValueT >
ValueT
getFullangle( 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
angleDist( const ValueT& angle0 , const ValueT& angle1 ) {
ValueT dist = fabs( angle1 - angle0 );
return ( std::min( dist , 2 * M_PI - dist) );
}
template < typename ValueT >
inline
ValueT
getAngle( 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
radToDeg( const ValueT& _angle ) {
return ( _angle / M_PI * 180);
}
template < typename ValueT >
inline
ValueT
degToRad( const ValueT& _angle ) {
return ( _angle / 180 * M_PI );
}
//=============================================================================
} // 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 ALGORITHMSANGLE_HH
#define ALGORITHMSANGLE_HH
/*! \file AlgorithmsAngleT.hh
\brief Functions for geometric operations related to angles
General file with template functions handling angles
*/
//== INCLUDES =================================================================
//== FORWARDDECLARATIONS ======================================================
//== NAMESPACES ===============================================================
/// Namespace providing different geometric functions concerning angles
namespace ACG {
namespace Geometry {
//== 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
getFullangle( VectorT _vector1,
VectorT _vector2,
const VectorT& _normal,
bool& skip );
/** Calculate the difference between two angles ( minimum distance )
@param _angle0 angle1
@param _angle1 angle2
@return The difference between the angles (0..PI)
*/
template < typename ValueT >
inline
ValueT
angleDist( 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
getAngle( 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
radToDeg( const ValueT& _angle );
/** Convert angle from degree to radians
@param _angle in degree
@return angle in radians
*/
template < typename ValueT >
inline
ValueT
degToRad( const ValueT& _angle );
//=============================================================================
} // Geometry Namespace
} // ACG Namespace
//=============================================================================
#if defined(INCLUDE_TEMPLATES) && !defined(ALGORITHMSANGLE_C)
#define ALGORITHMSANGLE_TEMPLATES
#include "AlgorithmsAngleT.hh"
#endif
//=============================================================================
#endif // ALGORITHMSANGLE_HH defined
//=============================================================================
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