From c4570a4b86fdc1827333ee558c74d9f3119ebf9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Wed, 16 Nov 2011 09:27:12 +0000 Subject: [PATCH] Added normal cone type to OpenMesh git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@458 fdac6126-5c0c-442c-9429-916003d36597 --- src/OpenMesh/Core/Geometry/NormalConeT.cc | 153 ++++++++++++++++++++++ src/OpenMesh/Core/Geometry/NormalConeT.hh | 124 ++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 src/OpenMesh/Core/Geometry/NormalConeT.cc create mode 100644 src/OpenMesh/Core/Geometry/NormalConeT.hh diff --git a/src/OpenMesh/Core/Geometry/NormalConeT.cc b/src/OpenMesh/Core/Geometry/NormalConeT.cc new file mode 100644 index 00000000..b1ccdeaa --- /dev/null +++ b/src/OpenMesh/Core/Geometry/NormalConeT.cc @@ -0,0 +1,153 @@ +/*===========================================================================*\ + * * + * OpenMesh * + * Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + * * + * OpenMesh 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. * + * * + * OpenMesh 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 OpenMesh. If not, * + * see . * + * * +\*===========================================================================*/ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + + + +//============================================================================= +// +// CLASS NormalConeT - IMPLEMENTATION +// +//============================================================================= + +#define OPENMESH_NORMALCONE_C + +//== INCLUDES ================================================================= + +#include +#include "NormalConeT.hh" + +#ifdef max +# undef max +#endif + +#ifdef min +# undef min +#endif + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== IMPLEMENTATION ========================================================== + +template +NormalConeT:: +NormalConeT(const Vec3& _center_normal, Scalar _angle) + : center_normal_(_center_normal), angle_(_angle) +{ +} + + +//---------------------------------------------------------------------------- + + +template +Scalar +NormalConeT:: +max_angle(const Vec3& _norm) const +{ + Scalar dotp = (center_normal_ | _norm); + return (dotp >= 1.0 ? 0.0 : (dotp <= -1.0 ? M_PI : acos(dotp))) + + angle_; +} + + +//---------------------------------------------------------------------------- + + +template +Scalar +NormalConeT:: +max_angle(const NormalConeT& _cone) const +{ + Scalar dotp = (center_normal_ | _cone.center_normal_); + Scalar centerAngle = dotp >= 1.0 ? 0.0 : (dotp <= -1.0 ? M_PI : acos(dotp)); + Scalar sideAngle0 = std::max(angle_-centerAngle, _cone.angle_); + Scalar sideAngle1 = std::max(_cone.angle_-centerAngle, angle_); + + return centerAngle + sideAngle0 + sideAngle1; +} + + +//---------------------------------------------------------------------------- + + +template +void +NormalConeT:: +merge(const NormalConeT& _cone) +{ + Scalar dotp = (center_normal_ | _cone.center_normal_); + + if (fabs(dotp) < 0.99999) + { + // new angle + Scalar centerAngle = acos(dotp); + Scalar minAngle = std::min(-angle(), centerAngle - _cone.angle()); + Scalar maxAngle = std::max( angle(), centerAngle + _cone.angle()); + angle_ = 0.5 * (maxAngle - minAngle); + + // axis by SLERP + Scalar axisAngle = 0.5*(minAngle + maxAngle); + center_normal_ = ((center_normal_ * sin(centerAngle-axisAngle) + + _cone.center_normal_ * sin(axisAngle)) + / sin(centerAngle)); + } + else + { + // axes point in same direction + if (dotp > 0.0) + angle_ = std::max(angle_, _cone.angle_); + + // axes point in opposite directions + else + angle_ = 2*M_PI; + } +} + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= diff --git a/src/OpenMesh/Core/Geometry/NormalConeT.hh b/src/OpenMesh/Core/Geometry/NormalConeT.hh new file mode 100644 index 00000000..b20afb1e --- /dev/null +++ b/src/OpenMesh/Core/Geometry/NormalConeT.hh @@ -0,0 +1,124 @@ +/*===========================================================================*\ + * * + * OpenMesh * + * Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen * + * www.openmesh.org * + * * + *---------------------------------------------------------------------------* + * This file is part of OpenMesh. * + * * + * OpenMesh 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. * + * * + * OpenMesh 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 OpenMesh. If not, * + * see . * + * * +\*===========================================================================*/ + +/*===========================================================================*\ + * * + * $Revision$ * + * $Date$ * + * * +\*===========================================================================*/ + + + + +//============================================================================= +// +// CLASS NormalCone +// +//============================================================================= + + +#ifndef OPENMESH_NORMALCONE_HH +#define OPENMESH_NORMALCONE_HH + + +//== INCLUDES ================================================================= + + +#include + + +//== NAMESPACES =============================================================== + + +namespace OpenMesh { + + +//== CLASS DEFINITION ========================================================= + + +/** /class NormalCone NormalCone.hh + + NormalCone that can be merged with other normal cones. Provides + the center normal and the opening angle. +**/ + +template +class NormalConeT +{ +public: + + // typedefs + typedef VectorT Vec3; + + + //! default constructor (not initialized) + NormalConeT() {} + + //! Initialize cone with center (unit vector) and angle (radius in radians) + NormalConeT(const Vec3& _center_normal, Scalar _angle=0.0); + + //! return max. distance (radians) unit vector to cone (distant side) + Scalar max_angle(const Vec3&) const; + + //! return max. distance (radians) cone to cone (distant sides) + Scalar max_angle(const NormalConeT&) const; + + //! merge _cone; this instance will then enclose both former cones + void merge(const NormalConeT&); + + //! returns center normal + const Vec3& center_normal() const { return center_normal_; } + + //! returns size of cone (radius in radians) + Scalar angle() const { return angle_; } + +private: + + Vec3 center_normal_; + Scalar angle_; +}; + + +//============================================================================= +} // namespace OpenMesh +//============================================================================= +#if defined(INCLUDE_TEMPLATES) && !defined(OPENMESH_NORMALCONE_C) +#define OPENMESH_NORMALCONE_TEMPLATES +#include "NormalConeT.cc" +#endif +//============================================================================= +#endif // OPENMESH_NORMALCONE_HH defined +//============================================================================= +