/**************************************************************************** * 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 $ Revision 1.2 2004/04/28 11:19:52 turini Changed : in Init(p0, norm) _dist = p0 * _dir; in _offset = p0 * _dir; Changed : in Init(p0, p1, p2) _offset = p0 * _dist; in _offset = p0 * _dir; Revision 1.1 2004/03/31 22:19:24 ponchio Untested first draft. ****************************************************************************/ #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 * _dir; 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; _offset = 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