Main Page | Namespace List | Class List | File List | Namespace Members | Class Members

rotbox_funcs.h

00001 // rotbox_funcs.h (line rotbox implementation) 00002 // 00003 // The WorldForge Project 00004 // Copyright (C) 2000, 2001 The WorldForge Project 00005 // 00006 // This program is free software; you can redistribute it and/or modify 00007 // it under the terms of the GNU General Public License as published by 00008 // the Free Software Foundation; either version 2 of the License, or 00009 // (at your option) any later version. 00010 // 00011 // This program is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 // 00016 // You should have received a copy of the GNU General Public License 00017 // along with this program; if not, write to the Free Software 00018 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 // 00020 // For information about WorldForge and its authors, please contact 00021 // the Worldforge Web Site at http://www.worldforge.org. 00022 // 00023 00024 // Author: Ron Steinke 00025 00026 #ifndef WFMATH_ROT_BOX_FUNCS_H 00027 #define WFMATH_ROT_BOX_FUNCS_H 00028 00029 #include <wfmath/const.h> 00030 #include <wfmath/vector.h> 00031 #include <wfmath/point.h> 00032 #include <wfmath/axisbox.h> 00033 #include <wfmath/ball.h> 00034 #include <wfmath/rotbox.h> 00035 00036 namespace WFMath { 00037 00038 template<const int dim> 00039 inline RotBox<dim>& RotBox<dim>::operator=(const RotBox<dim>& a) 00040 { 00041 m_corner0 = a.m_corner0; 00042 m_size = a.m_size; 00043 m_orient = a.m_orient; 00044 00045 return *this; 00046 } 00047 00048 template<const int dim> 00049 inline bool RotBox<dim>::isEqualTo(const RotBox<dim>& b, double epsilon) const 00050 { 00051 return Equal(m_corner0, b.m_corner0, epsilon) 00052 && Equal(m_size, b.m_size, epsilon) 00053 && Equal(m_orient, b.m_orient, epsilon); 00054 } 00055 00056 template<const int dim> 00057 inline Point<dim> RotBox<dim>::getCorner(int i) const 00058 { 00059 assert(i >= 0 && i < (1 << dim)); 00060 00061 Vector<dim> dist; 00062 00063 if(i == 0) 00064 return m_corner0; 00065 00066 for(int j = 0; j < dim; ++j) 00067 dist[j] = (i & (1 << j)) ? m_size[j] : 0; 00068 00069 dist.setValid(m_size.isValid()); 00070 00071 return m_corner0 + Prod(dist, m_orient); 00072 } 00073 00074 template<const int dim> 00075 AxisBox<dim> RotBox<dim>::boundingBox() const 00076 { 00077 Point<dim> min = m_corner0, max = m_corner0; 00078 00079 // for(int i = 0; i < dim; ++i) { 00080 // Vector<dim> edge; 00081 // edge.zero(); 00082 // edge[i] = m_size[i]; 00083 // edge = Prod(edge, m_orient); 00084 // // Edge now represents the i'th edge 00085 // // pointing away from m_corner0 00086 // for(int j = 0; j < dim; ++j) { 00087 // if(edge[j] < 0) 00088 // min[j] += edge[j]; 00089 // else 00090 // max[j] += edge[j]; 00091 // } 00092 // } 00093 00094 // The following is equivalent to the above. The above is easier to understand, 00095 // so leave it in as a comment. 00096 00097 for(int i = 0; i < dim; ++i) { 00098 for(int j = 0; j < dim; ++j) { 00099 CoordType value = m_orient.elem(j, i) * m_size[j]; 00100 if(value < 0) 00101 min[i] += value; 00102 else 00103 max[i] += value; 00104 } 00105 } 00106 00107 bool valid = isValid(); 00108 00109 min.setValid(valid); 00110 max.setValid(valid); 00111 00112 return AxisBox<dim>(min, max, true); 00113 } 00114 00115 // This is here, instead of defined in the class, to 00116 // avoid include order problems 00117 00118 template<const int dim> 00119 Point<dim> Point<dim>::toParentCoords(const RotBox<dim>& coords) const 00120 { 00121 return coords.corner0() + (*this - Point().setToOrigin()) * coords.orientation(); 00122 } 00123 00124 template<const int dim> 00125 Point<dim> Point<dim>::toLocalCoords(const RotBox<dim>& coords) const 00126 { 00127 return Point().setToOrigin() + coords.orientation() * (*this - coords.corner0()); 00128 } 00129 00130 } // namespace WFMath 00131 00132 #endif // WFMATH_ROT_BOX_FUNCS_H

Generated on Thu Jul 29 07:09:56 2004 for WFMath by doxygen 1.3.7