AxisAlignedBox3.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:4k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     Linear Algebra / Math library
  3.     Copyright (C) 2003-2009, Marek Olsak (maraeo@gmail.com), All Rights Reserved.
  4.     Copyright (C) 2003-2005, Tomas Pastorek (tomas@tomaspastorek.cz), All Rights Reserved.
  5.     This program is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU General Public License
  7.     as published by the Free Software Foundation; either version 2
  8.     of the License, or (at your option) any later version.
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.     You should have received a copy of the GNU General Public License
  14.     along with this program; if not, write to the Free Software
  15.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  16. */
  17. #include "../All.h"
  18. namespace Rune
  19. {
  20.     /**
  21.         Vraci vsechny rohy AABB
  22.     **************************************************************************************************/
  23.     template<typename T>
  24.     RUNEMATH_API void AxisAlignedBox3<T>::GetVertices(Vec3<T> *vertices) const
  25.     {
  26.         vertices[0] = min;
  27.         vertices[1].Set(max.x, min.y, min.z);
  28.         vertices[2].Set(min.x, max.y, min.z);
  29.         vertices[3].Set(min.x, min.y, max.z);
  30.         vertices[4].Set(max.x, max.y, min.z);
  31.         vertices[5].Set(min.x, max.y, max.z);
  32.         vertices[6].Set(max.x, min.y, max.z);
  33.         vertices[7] = max;
  34.     }
  35.     template RUNEMATH_API void AxisAlignedBox3<float>::GetVertices(Vec3<float> *vertices) const;
  36.     template RUNEMATH_API void AxisAlignedBox3<double>::GetVertices(Vec3<double> *vertices) const;
  37.     /**
  38.         Spocita AABB ze stredu a vektoru od stredu
  39.     **************************************************************************************************/
  40.     template<typename T>
  41.     RUNEMATH_API void AxisAlignedBox3<T>::SetCenterAndExtents(const Vec3<T> &center, const Vec3<T> &extents)
  42.     {
  43.         min = center - extents;
  44.         max = center + extents;
  45.     }
  46.     template RUNEMATH_API void AxisAlignedBox3<float>::SetCenterAndExtents(const Vec3<float> &center, const Vec3<float> &extents);
  47.     template RUNEMATH_API void AxisAlignedBox3<double>::SetCenterAndExtents(const Vec3<double> &center, const Vec3<double> &extents);
  48.     /**
  49.         Spocita AABB z vertexu
  50.     **************************************************************************************************/
  51.     template<typename T>
  52.     RUNEMATH_API void AxisAlignedBox3<T>::Approximate(const Vec3<T> *vertices, int count)
  53.     {
  54.         assert(count);
  55.         min = *vertices;
  56.         max = *vertices;
  57.         const Vec3<T> *it, *last = vertices+count;
  58.         for (it = vertices+1; it != last; ++it)
  59.         {
  60.             if (it->x < min.x)      min.x = it->x;
  61.             else if (it->x > max.x) max.x = it->x;
  62.             if (it->y < min.y)      min.y = it->y;
  63.             else if (it->y > max.y) max.y = it->y;
  64.             if (it->z < min.z)      min.z = it->z;
  65.             else if (it->z > max.z) max.z = it->z;
  66.         }
  67.     }
  68.     template RUNEMATH_API void AxisAlignedBox3<float>::Approximate(const Vec3<float> *vertices, int count);
  69.     template RUNEMATH_API void AxisAlignedBox3<double>::Approximate(const Vec3<double> *vertices, int count);
  70.     /**
  71.         Spocita AABB z nekolika AABB
  72.     **************************************************************************************************/
  73.     template<typename T>
  74.     RUNEMATH_API void AxisAlignedBox3<T>::Approximate(const AxisAlignedBox3<T> *boxes, int count)
  75.     {
  76.         min = boxes->min;
  77.         max = boxes->max;
  78.         const AxisAlignedBox3<T> *it, *last = boxes+count;
  79.         for (it = boxes+1; it != last; ++it)
  80.         {
  81.             if (it->min.x < min.x)      min.x = it->min.x;
  82.             else if (it->max.x > max.x) max.x = it->max.x;
  83.             if (it->min.y < min.y)      min.y = it->min.y;
  84.             else if (it->max.y > max.y) max.y = it->max.y;
  85.             if (it->min.z < min.z)      min.z = it->min.z;
  86.             else if (it->max.z > max.z) max.z = it->max.z;
  87.         }
  88.     }
  89.     template RUNEMATH_API void AxisAlignedBox3<float>::Approximate(const AxisAlignedBox3<float> *boxes, int count);
  90.     template RUNEMATH_API void AxisAlignedBox3<double>::Approximate(const AxisAlignedBox3<double> *boxes, int count);
  91. }