diff --git a/vcg/space/plane3.h b/vcg/space/plane3.h new file mode 100644 index 00000000..d1bb5953 --- /dev/null +++ b/vcg/space/plane3.h @@ -0,0 +1,140 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program 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 General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ + +****************************************************************************/ + + + +#ifndef VCG_PLANE3_H +#define VCG_PLANE3_H + +#include + +namespace vcg { + +/** \addtogroup space */ +/*@{*/ +/** +Templated class for 2D planes in 3D spaces. + This is the class for infinite planes in 3D space. A Plane is stored just as a Point3 and a scalar: + a direction (not necessarily normalized), and a distance from the origin + @param T (template parameter) Specifies the type of scalar used to represent coords. + @param NORM: if on, the direction is always Normalized +*/ +template class Plane3 { +public: + typedef T ScalarType; + typedef Point3 PointType; + +private: + /// Distance + ScalarType _offset; + ///Direction (not necessarily normalized unless NORM is true) + PointType _dir; + +public: + //@{ + /** @name Constructors + **/ + /// The empty constructor + Plane3() {} + /// The (distance, direction) constructor + Plane3(const ScalarType &dist, const PointType &dir) { Set(dist, dir); } + +//@{ + /** @name Members to access the distance or direction + Direction() cannot be assigned directly. + Use SetDirection() or Set() instead. + **/ + const ScalarType &Offset() const { return _offset; } + ScalarType &Offset() { return _offset; } + /// sets the origin + void SetOffset( const ScalarType &o ) { _offset=o; } + + const PointType &Direction() const { return _dir; } + /// sets the direction + void SetDirection( const PointType & dir) { + _dir=dir; + if (NORM) _dir.Normalize(); + } + /// sets origin and direction. + void Set( const ScalarType & off, const PointType & dir ) { + SetOrigin(off); + SetDirection(dir); + } + + /// Operator to compare two lines + bool operator==(Plane3 const &p) const { + return _offset == p._offset && _dir == p._dir; + } + /// Operator to dispare two lines + bool operator!=(Plane3 const &p) const { + return _offset != p._offset || _dir != p._dir; + } + + ///Project a point on the plane + PointType Projection(PointType &p) const { + ScalarType k = p * _dir - _offset; + return p - _dir * k; + } + + /// Function to normalize direction + void Normalize() { + _dir.Normalize(); + } + + /// Calculates the plane passing through three points (Rename this method) + void Init(const PointType &p0, const PointType &p1, const PointType &p2) { + _dir = (p2 - p0) ^ (p1 - p0); + _offset = p0 * _dist; + if(NORM) Normalize(); + } + + /// Calculates the plane passing through a point and the normal (Rename this method + inline void Init(const PointType &p0, const PointType &norm) { + _dir = norm; + _dist = p0 * _dir; + } +}; // end class Plane3 + +typedef Plane3 Plane3f; +typedef Plane3 Plane3d; + +///Distance plane - point (Move this function to somewhere else) +template T Distance(const Plane3 &plane, const Point3 &point) { + return plane.Direction() * point - plane.Offset; +} + + ///Distance point-plane (Move this function to somewhere else) +template T Distance(const Point3 &po, const Plane3 &plane) { + return plane.Direction() * point - plane.Offset; +} + +} // end namespace + + +#endif \ No newline at end of file