WFMath  1.0.2
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/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