⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 box_d.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2004  Max-Planck-Institute Saarbruecken (Germany).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Box_intersection_d/include/CGAL/Box_intersection_d/Box_d.h $// $Id: Box_d.h 33370 2006-08-17 09:05:15Z afabri $// //// Author(s)     : Lutz Kettner  <kettner@mpi-sb.mpg.de>//                 Andreas Meyer <ameyer@mpi-sb.mpg.de>#ifndef CGAL_BOX_INTERSECTION_D_BOX_D_H#define CGAL_BOX_INTERSECTION_D_BOX_D_H#include <CGAL/basic.h>#include <CGAL/Bbox_2.h>#include <CGAL/Bbox_3.h>#include <CGAL/Box_intersection_d/box_limits.h>#include <algorithm>CGAL_BEGIN_NAMESPACEnamespace Box_intersection_d {// Pseudo template class to skip the need for a C file for the static countertemplate <class Dummy>struct Unique_numbers {    typedef std::size_t ID;    Unique_numbers() : i(n++) {}    std::size_t id() const { return i; }private:    static std::size_t n;    std::size_t i;};template <class Dummy>std::size_t Unique_numbers<Dummy>::n = 0;// Policies for id-number of boxesstruct ID_NONE {};struct ID_EXPLICIT {};struct ID_FROM_BOX_ADDRESS {};struct ID_FROM_HANDLE {};// Generic template signature of boxes, specialized for policiestemplate<class NT_, int N, class IdPolicy = ID_EXPLICIT> class Box_d;// ID_NONE is used as base class and cannot be used directly in the algorithmstemplate<class NT_, int N>class Box_d< NT_, N, ID_NONE> {protected:    NT_ lo[N];    NT_ hi[N];public:    typedef NT_         NT;    typedef std::size_t ID;    Box_d() {}    Box_d(bool complete) { init(complete); }    Box_d(NT l[N], NT h[N]) {        std::copy( l, l + N, lo );        std::copy( h, h + N, hi );    }    void init (bool complete = false) {        NT inf = box_limits<NT>::inf();        NT sup = box_limits<NT>::sup();        if(!complete)            std::swap(inf,sup);        std::fill( lo, lo+N, inf );        std::fill( hi, hi+N, sup );    }    void extend(NT p[N]) {        for( int dim = 0; dim < N; ++dim ) {            lo[dim] = (std::min)( lo[dim], p[dim] );            hi[dim] = (std::max)( hi[dim], p[dim] );        }    }    void extend(std::pair<NT,NT> p[N]) {        for( int dim = 0; dim < N; ++dim ) {            lo[dim] = (std::min)( lo[dim], p[dim].first );            hi[dim] = (std::max)( hi[dim], p[dim].second );        }    }    static int dimension() { return N; }    NT min_coord(int dim) const { return lo[dim]; }    NT max_coord(int dim) const { return hi[dim]; }};// Specialization for Bbox_2, i.e. double and dim 2.template<>class Box_d< double, 2, ID_NONE> {protected:    Bbox_2 bbx;public:    typedef double      NT;    typedef std::size_t ID;    Box_d() {}    Box_d(bool complete) { init(complete); }    Box_d(NT l[2], NT h[2]) : bbx(l[0], l[1], h[0], h[1]) {}    Box_d( const Bbox_2& b) : bbx( b) {}    const Bbox_2& bbox() const { return bbx; }    void init () {        NT inf = box_limits<NT>::inf();        NT sup = box_limits<NT>::sup();        bbx = Bbox_2( sup, sup, inf, inf);    }    void init (bool complete) {        NT inf = box_limits<NT>::inf();        NT sup = box_limits<NT>::sup();        if ( complete)            bbx = Bbox_2( inf, inf, sup, sup);        else            bbx = Bbox_2( sup, sup, inf, inf);    }    void extend(NT p[2]) {        bbx = Bbox_2(            (std::min)( bbx.xmin(), p[0]),            (std::min)( bbx.ymin(), p[1]),            (std::max)( bbx.xmax(), p[0]),            (std::max)( bbx.ymax(), p[1]));    }    void extend(std::pair<NT,NT> p[2]) {        bbx = Bbox_2(	    (std::min)( bbx.xmin(), p[0].first),	    (std::min)( bbx.ymin(), p[1].first),	    (std::max)( bbx.xmax(), p[0].second),	    (std::max)( bbx.ymax(), p[1].second));    }    static int dimension() { return 2; }    NT min_coord(int dim) const { return (dim==0) ? bbx.xmin() : bbx.ymin();}    NT max_coord(int dim) const { return (dim==0) ? bbx.xmax() : bbx.ymax();}};// Specialization for Bbox_3, i.e. double and dim 3.template<>class Box_d< double, 3, ID_NONE> {protected:    Bbox_3 bbx;public:    typedef double      NT;    typedef std::size_t ID;    Box_d() {}    Box_d(bool complete) { init(complete); }    Box_d(NT l[3], NT h[3]) : bbx(l[0], l[1], l[2], h[0], h[1], h[2]) {}    Box_d( const Bbox_3& b) : bbx( b) {}    const Bbox_3& bbox() const { return bbx; }    void init () {        NT inf = box_limits<NT>::inf();        NT sup = box_limits<NT>::sup();        bbx = Bbox_3( sup, sup, sup, inf, inf, inf);    }    void init (bool complete) {        NT inf = box_limits<NT>::inf();        NT sup = box_limits<NT>::sup();        if ( complete)            bbx = Bbox_3( inf, inf, inf, sup, sup, sup);        else            bbx = Bbox_3( sup, sup, sup, inf, inf, inf);    }    void extend(NT p[3]) {        bbx = Bbox_3(            (std::min)( bbx.xmin(), p[0]),            (std::min)( bbx.ymin(), p[1]),            (std::min)( bbx.zmin(), p[2]),            (std::max)( bbx.xmax(), p[0]),            (std::max)( bbx.ymax(), p[1]),            (std::max)( bbx.zmax(), p[2]));    }    void extend(std::pair<NT,NT> p[3]) {        bbx = Bbox_3(	    (std::min)( bbx.xmin(), p[0].first),	    (std::min)( bbx.ymin(), p[1].first),	    (std::min)( bbx.zmin(), p[2].first),	    (std::max)( bbx.xmax(), p[0].second),	    (std::max)( bbx.ymax(), p[1].second),	    (std::max)( bbx.zmax(), p[2].second));    }    static int dimension() { return 3; }    NT min_coord(int dim) const {         return (dim==0) ? bbx.xmin() : ((dim==1) ? bbx.ymin() : bbx.zmin());    }    NT max_coord(int dim) const {        return (dim==0) ? bbx.xmax() : ((dim==1) ? bbx.ymax() : bbx.zmax());    }};// ID_EXPLICITtemplate<class NT_, int N>class Box_d< NT_, N, ID_EXPLICIT> : public Box_d< NT_, N, ID_NONE>,                                    public Unique_numbers<int> {public:    typedef Box_d< NT_, N, ID_NONE> Base;    typedef NT_                     NT;    typedef typename Unique_numbers<int>::ID ID;    Box_d() {}    Box_d(bool complete) : Base(complete) {}    Box_d(NT l[N], NT h[N]) : Base( l, h) {}    Box_d( const Bbox_2& b) : Base( b) {}    Box_d( const Bbox_3& b) : Base( b) {}};// ID_FROM_BOX_ADDRESStemplate<class NT_, int N>class Box_d< NT_, N, ID_FROM_BOX_ADDRESS> : public Box_d< NT_, N, ID_NONE> {public:    typedef Box_d< NT_, N, ID_NONE> Base;    typedef NT_                     NT;    typedef std::size_t             ID;    Box_d() {}    Box_d(bool complete) : Base(complete) {}    Box_d(NT l[N], NT h[N]) : Base( l, h) {}    Box_d( const Bbox_2& b) : Base( b) {}    Box_d( const Bbox_3& b) : Base( b) {}    ID  id() const { return reinterpret_cast<ID>(this); }};} // end namespace Box_intersection_dCGAL_END_NAMESPACE#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -