WFMath
1.0.2
|
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/rotbox.h> 00030 00031 #include <wfmath/vector.h> 00032 #include <wfmath/point.h> 00033 #include <wfmath/axisbox.h> 00034 #include <wfmath/ball.h> 00035 00036 #include <cassert> 00037 00038 namespace WFMath { 00039 00040 template<int dim> 00041 inline Point<dim> RotBox<dim>::getCorner(size_t i) const 00042 { 00043 assert(i >= 0 && i < (1 << dim)); 00044 00045 Vector<dim> dist; 00046 00047 if(i == 0) 00048 return m_corner0; 00049 00050 for(int j = 0; j < dim; ++j) 00051 dist[j] = (i & (1 << j)) ? m_size[j] : 0; 00052 00053 dist.setValid(m_size.isValid()); 00054 00055 return m_corner0 + Prod(dist, m_orient); 00056 } 00057 00058 template<int dim> 00059 AxisBox<dim> RotBox<dim>::boundingBox() const 00060 { 00061 Point<dim> min = m_corner0, max = m_corner0; 00062 00063 // for(int i = 0; i < dim; ++i) { 00064 // Vector<dim> edge; 00065 // edge.zero(); 00066 // edge[i] = m_size[i]; 00067 // edge = Prod(edge, m_orient); 00068 // // Edge now represents the i'th edge 00069 // // pointing away from m_corner0 00070 // for(int j = 0; j < dim; ++j) { 00071 // if(edge[j] < 0) 00072 // min[j] += edge[j]; 00073 // else 00074 // max[j] += edge[j]; 00075 // } 00076 // } 00077 00078 // The following is equivalent to the above. The above is easier to understand, 00079 // so leave it in as a comment. 00080 00081 for(int i = 0; i < dim; ++i) { 00082 for(int j = 0; j < dim; ++j) { 00083 CoordType value = m_orient.elem(j, i) * m_size[j]; 00084 if(value < 0) 00085 min[i] += value; 00086 else 00087 max[i] += value; 00088 } 00089 } 00090 00091 bool valid = isValid(); 00092 00093 min.setValid(valid); 00094 max.setValid(valid); 00095 00096 return AxisBox<dim>(min, max, true); 00097 } 00098 00099 // This is here, instead of defined in the class, to 00100 // avoid include order problems 00101 00102 template<int dim> 00103 Point<dim> Point<dim>::toParentCoords(const RotBox<dim>& coords) const 00104 { 00105 return coords.corner0() + (*this - Point().setToOrigin()) * coords.orientation(); 00106 } 00107 00108 template<int dim> 00109 Point<dim> Point<dim>::toLocalCoords(const RotBox<dim>& coords) const 00110 { 00111 return Point().setToOrigin() + coords.orientation() * (*this - coords.corner0()); 00112 } 00113 00114 } // namespace WFMath 00115 00116 #endif // WFMATH_ROT_BOX_FUNCS_H