diff --git a/EBGeometry.hpp b/EBGeometry.hpp index da0c3817..24cde274 100644 --- a/EBGeometry.hpp +++ b/EBGeometry.hpp @@ -12,3 +12,9 @@ #include "Source/EBGeometry_Union.hpp" #include "Source/EBGeometry_UnionBVH.hpp" +/*! + @brief Name space for all of EBGeometry +*/ +namespace EBGeometry { + +} diff --git a/Examples/Union/main.cpp b/Examples/Union/main.cpp index d4d89279..b9f9fc05 100644 --- a/Examples/Union/main.cpp +++ b/Examples/Union/main.cpp @@ -104,9 +104,9 @@ int main() { for (int j = 0; j < Ny; j++){ for (int k = 0; k < Nz; k++){ - const T x = i * (2 * radius); - const T y = j * (2 * radius); - const T z = k * (2 * radius); + const T x = i * (3 * radius); + const T y = j * (3 * radius); + const T z = k * (3 * radius); const Vec3 center(x,y,z); diff --git a/README.md b/README.md index 51120969..5176410b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Users can also embed entire objects (e.g., analytic functions) in the BVHs, e.g. BVHs can also be nested so that the BVH accelerator is used to embed objects that are themselves described by a BVH. For example, a scene consisting of many objects described by surface grids can be embedded as a BVH-of-BVH type of scene. - + In addition, EBGeometry provides standard operators for signed distance fields like rotations, translations, and scalings. Multi-object scenes can be constructed with conventional unions, or with BVH-enabled unions (which can be orders of magnitudes faster). diff --git a/Source/EBGeometry_AnalyticDistanceFunctions.hpp b/Source/EBGeometry_AnalyticDistanceFunctions.hpp index ea26233a..1519544c 100644 --- a/Source/EBGeometry_AnalyticDistanceFunctions.hpp +++ b/Source/EBGeometry_AnalyticDistanceFunctions.hpp @@ -87,16 +87,13 @@ class SphereSDF : public SignedDistanceFunction { } /*! - @brief Signed distance function + @brief Signed distance function for sphere. + @param[in] a_point Position. */ virtual T signedDistance(const Vec3T& a_point) const noexcept override { const T sign = m_flipInside ? -1.0 : 1.0; - return sign * (m_radius - (a_point-m_center).length()); - } - - virtual T unsignedDistance2(const Vec3T& a_point) const noexcept override { - return std::abs((a_point - m_center).length2() - m_radius*m_radius); + return sign * ((a_point - m_center).length() - m_radius); } protected: diff --git a/Source/EBGeometry_BVH.hpp b/Source/EBGeometry_BVH.hpp index 3afc8745..632c32a9 100644 --- a/Source/EBGeometry_BVH.hpp +++ b/Source/EBGeometry_BVH.hpp @@ -175,9 +175,9 @@ namespace BVH { /*! @brief Function for using top-down construction of the bounding volume hierarchy. - @param[in] a_stopFunc Termination function which tells us when to stop the recursion. - @param[in] a_partFunc Partitioning function. This is a polymorphic function which divides a set of primitives into two lists. - @param[in] a_bvFunc Polymorphic function which builds a bounding volume from a set of primitives. + @param[in] a_bvConstructor Polymorphic function which builds a bounding volume from a set of primitives. + @param[in] a_partitioner Partitioning function. This is a polymorphic function which divides a set of primitives into two lists. + @param[in] a_stopCrit Termination function which tells us when to stop the recursion. @details The rules for terminating the hierarchy construction, how to partition sets of primitives, and how to enclose them by bounding volumes are given in the input arguments (a_stopFunc, a_partFunc, a_bvFunc) */ @@ -209,8 +209,8 @@ namespace BVH { /*! @brief Function which computes the signed distance - @param[in] a_point 3D point in space - @param[in] a_whichPruning Pruning algorithm + @param[in] a_point 3D point in space + @param[in] a_pruning Pruning algorithm @return Signed distance to the input point @details This will select amongs the various implementations. */ @@ -490,7 +490,7 @@ namespace BVH { /*! @brief Set the bounding volume - @param[in] a_bv Bounding volume for this node. + @param[in] a_boundingVolume Bounding volume for this node. */ inline void setBoundingVolume(const BV& a_boundingVolume) noexcept; @@ -651,7 +651,8 @@ namespace BVH { /*! @brief Function which computes the signed distance - @param[in] a_point 3D point in space + @param[in] a_point 3D point in space + @param[in] a_pruning Pruning algorithm. */ inline T signedDistance(const Vec3& a_point, const Prune a_pruning = Prune::Ordered2) const noexcept; diff --git a/Source/EBGeometry_BVHImplem.hpp b/Source/EBGeometry_BVHImplem.hpp index 5aa8a135..5c1be5a4 100644 --- a/Source/EBGeometry_BVHImplem.hpp +++ b/Source/EBGeometry_BVHImplem.hpp @@ -53,7 +53,7 @@ namespace BVH { template inline - NodeT::NodeT(const PrimitiveList& a_primitives) : NodeT() { + NodeT::NodeT(const std::vector >& a_primitives) : NodeT() { m_primitives = a_primitives; m_nodeType = NodeType::Leaf; diff --git a/Source/EBGeometry_BoundingVolumes.hpp b/Source/EBGeometry_BoundingVolumes.hpp index f99507a4..e6be3a48 100644 --- a/Source/EBGeometry_BoundingVolumes.hpp +++ b/Source/EBGeometry_BoundingVolumes.hpp @@ -4,7 +4,7 @@ */ /*! - @file EBGeometry_BoundingVolumes.H + @file EBGeometry_BoundingVolumes.hpp @brief Declaration of a various bounding volumes used for bounding volume hierarchy. @author Robert Marskar */ @@ -58,7 +58,7 @@ namespace BoundingVolumes { /*! @brief Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres - @param[in] a_others Other bounding spheres. + @param[in] a_otherSpheres Other bounding spheres. */ BoundingSphereT(const std::vector >& a_otherSpheres); @@ -91,7 +91,7 @@ namespace BoundingVolumes { */ template inline - void define(const std::vector >& a_points, const BoundingVolumeAlgorithm& a_algorithm) noexcept; + void define(const std::vector >& a_points, const BoundingVolumeAlgorithm& a_alg) noexcept; /*! @brief Check if this bounding sphere intersect another bounding sphere @@ -219,7 +219,7 @@ namespace BoundingVolumes { @brief Constructor which creates an AABB which encloses a set of other AABBs. @param[in] a_others Other bounding boxes */ - AABBT(const std::vector& a_others); + AABBT(const std::vector >& a_others); /*! @brief Destructor (does nothing) diff --git a/Source/EBGeometry_DcelFace.hpp b/Source/EBGeometry_DcelFace.hpp index a9447b9f..8df3f53f 100644 --- a/Source/EBGeometry_DcelFace.hpp +++ b/Source/EBGeometry_DcelFace.hpp @@ -4,7 +4,7 @@ */ /*! - @file EBGeometry_DcelFace.H + @file EBGeometry_DcelFace.hpp @brief Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations. @author Robert Marskar */ diff --git a/Source/EBGeometry_DcelMesh.hpp b/Source/EBGeometry_DcelMesh.hpp index c2d811e3..8af724d7 100644 --- a/Source/EBGeometry_DcelMesh.hpp +++ b/Source/EBGeometry_DcelMesh.hpp @@ -4,7 +4,7 @@ */ /*! - @file EBGeometry__DcelMesh.hpp + @file EBGeometry_DcelMesh.hpp @brief Declaration of a mesh class which stores a DCEL mesh (with signed distance functions) @author Robert Marskar */ diff --git a/Source/EBGeometry_DcelParser.hpp b/Source/EBGeometry_DcelParser.hpp index 4c8dae26..4d79c023 100644 --- a/Source/EBGeometry_DcelParser.hpp +++ b/Source/EBGeometry_DcelParser.hpp @@ -79,8 +79,6 @@ namespace Dcel { inline static void readASCII(Mesh& a_mesh, const std::string a_filename); - - protected: /*! @@ -109,9 +107,11 @@ namespace Dcel { /*! @brief Read ASCII faces and create mesh connectivity. - @param[out] a_faces DCEL faces. Constructured in this routine. - @param[out] a_edges DCEL edges. Constructured in this routine. - @param[out] a_vertices DCEL edges. Constructured in readVerticesASCII. + @param[out] a_faces DCEL faces. Constructured in this routine. + @param[out] a_edges DCEL edges. Constructured in this routine. + @param[out] a_vertices DCEL edges. Constructured in readVerticesASCII. + @param[in] a_numFaces Total number of faces in mesh. + @param[inout] a_inputStream Input stream @note The next getline() from inputStream must read the first face, i.e. we assume that read_ascii_vertices was called IMMEDIATELY before this function. That function will center the fstream on the correct line in the input file. */ diff --git a/Source/EBGeometry_NamespaceFooter.hpp b/Source/EBGeometry_NamespaceFooter.hpp index 5c34318c..3b24bd4c 100644 --- a/Source/EBGeometry_NamespaceFooter.hpp +++ b/Source/EBGeometry_NamespaceFooter.hpp @@ -1 +1,12 @@ +/* EBGeometry + * Copyright © 2022 Robert Marskar + * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory. + */ + +/*! + @file EBGeometry_NamespaceFooter.hpp + @brief Name space footer. + @author Robert Marskar +*/ + } diff --git a/Source/EBGeometry_NamespaceHeader.hpp b/Source/EBGeometry_NamespaceHeader.hpp index c058d713..05619e3d 100644 --- a/Source/EBGeometry_NamespaceHeader.hpp +++ b/Source/EBGeometry_NamespaceHeader.hpp @@ -1 +1,12 @@ +/* EBGeometry + * Copyright © 2022 Robert Marskar + * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory. + */ + +/*! + @file EBGeometry_NamespaceHeader.hpp + @brief Name space header. + @author Robert Marskar +*/ + namespace EBGeometry { diff --git a/Source/EBGeometry_SignedDistanceFunction.hpp b/Source/EBGeometry_SignedDistanceFunction.hpp index 63470d8a..afa0b94a 100644 --- a/Source/EBGeometry_SignedDistanceFunction.hpp +++ b/Source/EBGeometry_SignedDistanceFunction.hpp @@ -53,7 +53,7 @@ class SignedDistanceFunction { /*! @brief Scale signed distance function. - @param[in] a_Scaling factor. + @param[in] a_scale Scaling factor. */ inline void scale(const Vec3T& a_scale) noexcept; diff --git a/Source/EBGeometry_TransformOps.hpp b/Source/EBGeometry_TransformOps.hpp index d1148fec..9a415b09 100644 --- a/Source/EBGeometry_TransformOps.hpp +++ b/Source/EBGeometry_TransformOps.hpp @@ -16,7 +16,9 @@ #include "EBGeometry_Vec.hpp" #include "EBGeometry_NamespaceHeader.hpp" -// Parent class for transformation operator. +/*! + @brief Base class for transformation operators. +*/ template class TransformOp { public: @@ -33,6 +35,8 @@ class TransformOp { /*! @brief Transform input coordinate + @param[in] a_inputPoint Input point + @return Returns transformed point. */ virtual Vec3T transform(const Vec3T& a_inputPoint) const noexcept = 0; }; diff --git a/Source/EBGeometry_Vec.hpp b/Source/EBGeometry_Vec.hpp index e13acfb2..60a6d947 100644 --- a/Source/EBGeometry_Vec.hpp +++ b/Source/EBGeometry_Vec.hpp @@ -31,7 +31,7 @@ class Vec2T { /*! @brief Copy constructor - @param[in] a_u Other vector + @param[in] u Other vector @details Sets *this = u */ Vec2T(const Vec2T& u); @@ -72,19 +72,19 @@ class Vec2T { static constexpr Vec2T one() noexcept; /*! - @brief Return a vector with components x = y= -std::numeric_limits::max() + @brief Return minimum possible representative vector. */ inline static constexpr Vec2T min() noexcept; /*! - @brief Return a vector with components x = y= std::numeric_limits::max() + @brief Return maximum possible representative vector. */ inline static constexpr Vec2T max() noexcept; /*! - @brief Return a vector with components x = y= std::numeric_limits::infinity() + @brief Return a vector with inf components. */ inline static constexpr Vec2T infinity() noexcept; @@ -190,7 +190,7 @@ class Vec2T { }; /*! - @brief Multiplication operator in the form s*Vec2T. + @brief Multiplication operator in the form s*Vec2T @param[in] s Multiplication factor @param[in] a_other Other vector @return Returns a new vector with components x = s*a_other.x (and same for y) @@ -200,7 +200,7 @@ inline Vec2T operator*(const T& s, const Vec2T& a_other) noexcept; /*! - @brief Division operator in the form s*Vec2T. + @brief Division operator in the form s*Vec2T. @param[in] s Division factor @param[in] a_other Other vector @return Returns a new vector with components x = (1/s)*a_other.x (and same for y) @@ -259,33 +259,33 @@ class Vec3T { static constexpr Vec3T one() noexcept; /*! - @brief Return a vector with components x = y = z = -std::numeric_limits::max() + @brief Return a vector with minimum representable components. */ inline static constexpr Vec3T min() noexcept; /*! - @brief Return a vector with components x = y = z = std::numeric_limits::max() + @brief Return a vector with maximum representable components. */ inline static constexpr Vec3T max() noexcept; /*! - @brief Return a vector with components x = y = z = std::numeric_limits::infinity() + @brief Return a vector with inf components. */ inline static constexpr Vec3T infinity() noexcept; /*! @brief Return component in vector. (i=0 => x and so on) - @param[in] a_i Index. Must be < 3 + @param[in] i Index. Must be < 3 */ inline T& operator[](int i) noexcept; /*! @brief Return non-modifiable component in vector. (i=0 => x and so on) - @param[in] a_i Index. Must be < 3 + @param[in] i Index. Must be < 3 */ inline const T& operator[](int i) const noexcept; @@ -422,8 +422,6 @@ class Vec3T { inline Vec3T& operator/=(const T& s) noexcept; - - /*! @brief Vector minimum function. Returns a new vector with componentwise minimums. @param[in] u Other vector diff --git a/Source/EBGeometry_VecImplem.hpp b/Source/EBGeometry_VecImplem.hpp index c5d27a90..12cac191 100644 --- a/Source/EBGeometry_VecImplem.hpp +++ b/Source/EBGeometry_VecImplem.hpp @@ -436,12 +436,6 @@ Vec3T operator*(const T& s, const Vec3T& a_other) noexcept { return a_other*s; } -template -inline -Vec3T operator*(const Vec3T& u, const Vec3T& v) noexcept { - return u * v; -} - template inline Vec3T operator/(const T& s, const Vec3T& a_other) noexcept { diff --git a/Sphinx/Makefile b/Sphinx/Makefile new file mode 100644 index 00000000..d0c3cbf1 --- /dev/null +++ b/Sphinx/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/Sphinx/make.bat b/Sphinx/make.bat new file mode 100644 index 00000000..6247f7e2 --- /dev/null +++ b/Sphinx/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/Sphinx/source/BVH.rst b/Sphinx/source/BVH.rst new file mode 100644 index 00000000..1445ab83 --- /dev/null +++ b/Sphinx/source/BVH.rst @@ -0,0 +1,93 @@ +.. _Chap:BVH: + +Bounding volume hierarchies +=========================== + +Basic concept +------------- + +Bounding Volume Hierarchies (BVHs) are comparatively simple data structures that can accelerate closest-point searches by orders of magnitude. +BVHs are tree structures where the regular nodes are bounding volumes that enclose all geometric primitives (e.g. polygon faces) further down in the hierarchy. +There are two types of nodes in a BVH: + +* *Regular nodes*, which do not contain any of the primitives/objects, but stores references to child nodes. +* *Leaf nodes*, which contain a subset of the primitives. + +Both types of nodes contain a *bounding volume* which closes all geometric primitives in the subtree below the node. + +:numref:`Fig:TrianglesBVH` shows a concept of BVH partitioning of a set of triangles. +Here, :math:`P` is a regular node whose bounding volume encloses all geometric primitives in it's subtree. + +.. _Fig:TrianglesBVH: +.. figure:: /_static/TrianglesBVH.png + :width: 480px + :align: center + + Example of BVH partitioning for enclosing triangles. The regular node :math:`P` contains two leaf nodes :math:`L` and :math:`R` which contain the primitives (triangles). + +There is no fundamental limitation to what type of primitives/objects can be enclosed in BVHs, which makes BVHs useful beyond triangulated data sets. +For example, analytic signed distance functions can also be embedded in BVHs, provided that we can construct a bounding volume that encloses the object. + +.. note:: + + BVHs are not limited to binary trees. + EBGeometry supports :math:`k` -ary trees where each regular node has :math:`k` children nodes. + +Construction +------------ + +BVHs have extremely flexible rules regarding their construction. +Since they are hierarchical structures, the only requirement when dividing a leaf node is that each child node gets at least one primitive. + +Although the rules for BVH construction are flexible, performant BVHs are completely reliant on having balanced trees with the following heuristic properties: + +* Bounding volumes should enclose primitives as tightly as possible. +* There should be a minimal overlap between the bounding volumes. +* The BVH trees should be approximately *balanced*. + +Construction of a BVH is usually done recursively, from top to bottom (so-called top-down construction). +Alternative construction methods also exist, but are not used in EBGeometry. +In this case one can represent the BVH construction of a :math:`k` -ary tree is done through a single function: + +.. math:: + + \textrm{Partition}\left(\vec{O}\right): \vec{O} \rightarrow \left(\vec{O}_1, \vec{O}_2, \ldots, \vec{O}_k\right), + +where :math:`\vec{O}` is an input a list of objects/primitives, which is *partitioned* into :math:`k` new list of primitives. +Note that the lists :math:`\vec{O}_i` do not contain duplicates. +Top-down construction can thus be illustrated as a recursive procedure: + +.. code-block:: text + + topDownConstruction(Objects): + partitionedObjects = Partition(Objects) + + forall p in partitionedObjects: + child = insertChildNode(newObjects) + + if(enoughPrimitives(child)): + child.topDownConstruction(child.objects) + +In practice, the above procedure is supplemented by more sophisticated criteria for terminating the recursion, as well as routines for creating the bounding volumes around the newly inserted nodes. + + + +Signed distance function +------------------------ + +When computing the signed distance function to objects embedded in a BVH, one takes advantage of the hierarcical embedding of the primitives. +Consider the case in :numref:`Fig:TreePruning`, where the goal of the BVH traversal is to minimize the number of branches and nodes that are visited. +We consider the following steps: + +* When descending from node :math:`P` we determine that we first investigate the left subtree (node :math:`A`) since its bounding volume is closer than the bounding volumes for the other subtree. + The other subtree will be investigated later. +* Since :math:`A` is a leaf node, we find the signed distance from :math:`\mathbf{x}` to the primitives in :math:`A`. +* When moving back to :math:`P`, we find that the distance to the primitives in :math:`A` is shorter than the distance from :math:`\mathbf{x}` to the bounding volume that encloses nodes :math:`B` and :math:`C`. + Consequently, the entire subtree containing :math:`B` and :math:`C` can be pruned. + +.. _Fig:TreePruning: +.. figure:: /_static/TreePruning.png + :width: 480px + :align: center + + Example of BVH tree pruning. diff --git a/Sphinx/source/Concepts.rst b/Sphinx/source/Concepts.rst new file mode 100644 index 00000000..9a1fdba2 --- /dev/null +++ b/Sphinx/source/Concepts.rst @@ -0,0 +1,75 @@ +.. _Chap:Concepts: + +Basic concepts +============== + +Signed distance fields +---------------------- + +The signed distance function is defined as a function :math:`S: \mathbb{R}^3 \rightarrow \mathbb{R}`, and returns the *signed distance* to the object. +The signed distance function has the additional property: + +.. math:: + :label: Eikonal + + \left|\nabla S(\mathbf{x})\right| = 1 \quad\textrm{everywhere}. + +In EBGeometry we use the following convention: + +.. math:: + + S(\mathbf{x}) = + \begin{cases} + > 0, & \textrm{for points outside the object}, \\ + < 0, & \textrm{for points inside the object}. + \end{cases} + +Signed distance functions are also *implicit functions* (but the reverse statement is not true). +For example, the signed distance function for a sphere with center :math:`\mathbf{x}_0` and radius :math:`R` can be written + +.. math:: + + S_{\textrm{sph}}\left(\mathbf{x}\right) = \left|\mathbf{x} - \mathbf{x}_0\right| - R. + +An example of an implicit function for the same sphere is + +.. math:: + + I_{\textrm{sph}}\left(\mathbf{x}\right) = \left|\mathbf{x} - \mathbf{x}_0\right|^2 - R^2. + +An important difference between these is the Eikonal property in :eq:`Eikonal`, ensuring that the signed distance function always returns the exact distance to the object. + +.. important:: + + For 2D applications, it is possible to slice the signed distance function through a plane. + The resulting function is *an implicit function* rather than a signed distance function. + + +Transformations +--------------- + +Signed distance functions retain the Eikonal property for the following set of group transformations: + +* Rotations. +* Translations. +* Scaling. + +Unions +------ + +Unions of signed distance fields are also signed distance fields *provided that the objects do not intersect or touch*. +For overlapping objects the signed distance function is not well-defined (since the interior and exterior are not well-defined). + + + +For non-overlapping objects represented as signed distance fields :math:`\left(S_1\left(\mathbf{x}\right), S_2\left(\mathbf{x}\right), \ldots\right)`, the composite signed distance field is + +.. math:: + + S\left(\mathbf{x}\right) = S_k\left(\mathbf{x}\right), + +where :math:`k` is index of the closest object (which is found by evaluating :math:`\left|S_i\left(\mathbf{x}\right)\right|`. + +.. important:: + + diff --git a/Sphinx/source/DCEL.rst b/Sphinx/source/DCEL.rst new file mode 100644 index 00000000..a841dbc2 --- /dev/null +++ b/Sphinx/source/DCEL.rst @@ -0,0 +1,101 @@ +.. _Chap:DCEL: + +DCEL mesh structure +=================== + +Basic concept +------------- + +EBGeometry uses a doubly-connected edge list (DCEL) structure for storing surface meshes. +The DCEL structures consist of the following objects: + +* Planar polygons (facets) +* Half-edges +* Vertices + +As shown in :numref:`Fig:DCEL`, the half-edge is the most important data structure. +Half-edges circulate the inside of the facet, with pointer-access to the previous and next half-edge. +A half-edge also stores a reference to it's starting vertex, as well as a reference to it's pair-edge. +From the DCEL structure we can easily obtain all edges or vertices belonging to a single facet, and also "jump" to a neighboring facet by fetching the pair edge. + +.. _Fig:DCEL: +.. figure:: /_static/DCEL.png + :width: 480px + :align: center + + DCEL mesh structure. Each half-edge stores references to previous/next half-edges, the pair edge, and the starting vertex. + Vertices store a coordinate as well as a reference to one of the outgoing half-edges. + +In EBGeometry the half-edge data structure is implemented in it's own namespace ``EBGeometry::Dcel``. +This is a comparatively standard implementation of the DCEL structure, supplemented by functions that permit signed distance computations to various features on such a mesh. + +.. important:: + + A signed distance field requires a *watertight and orientable* surface mesh. + If the surface mesh consists of holes or flipped facets, the signed distance function does not exist. + +Signed distance +--------------- + +When computing the signed distance function, the closest point on the surface mesh can be one of the vertices, (half-) edges, or faces, see :numref:`Fig:PolygonProjection`. + +.. _Fig:PolygonProjection: +.. figure:: /_static/PolygonProjection.png + :width: 240px + :align: center + + Possible closest-feature cases after projecting a point :math:`\mathbf{x}` to the plane of a polygon face. + +It is therefore necessary to distinguish between three cases: + +#. **Facet/Polygon face**. + + When computing the distance from a point :math:`\mathbf{x}` to the polygon face we first determine if the projection of :math:`\mathbf{x}` to the face's plane lies inside or outside the face. + This is more involved than one might think, and it is done by first computing the two-dimensional projection of the polygon face, ignoring one of the coordinates. + Next, we determine, using 2D algorithms, if the projected point lies inside the embedded 2D representation of the polygon face. + Various algorithms for this are available, such as computing the winding number, the crossing number, or the subtended angle between the point and the 2D polygon. + + .. note:: + + EBGeometry uses the crossing number algorithm by default. + + If the point projects to the inside of the face, the signed distance is just :math:`d = \mathbf{n}_f\cdot\left(\mathbf{x} - \mathbf{x}_f\right)` where :math:`\mathbf{n}_f` is the face normal and :math:`\mathbf{x}_f` is a point on the face plane (e.g., a vertex). + If the point projects to *outside* the polygon face, the closest feature is either an edge or a vertex. + +#. **Edge**. + + When computing the signed distance to an edge, the edge is parametrized as :math:`\mathbf{e}(t) = \mathbf{x}_0 + \left(\mathbf{x}_1 - \mathbf{x}_0\right)t`, where :math:`\mathbf{x}_0` and :math:`\mathbf{x}_1` are the starting and ending vertex coordinates. + The point :math:`\mathbf{x}` is projected to this line, and if the projection yields :math:`t^\prime \in [0,1]` then the edge is the closest point. + In that case the signed distance is the projected distance and the sign is given by the sign of :math:`\mathbf{n}_e\cdot\left(\mathbf{x} - \mathbf{x}_0\right)` where :math:`\mathbf{n}_e` is the pseudonormal vector of the edge. + Otherwise, the closest point is one of the vertices. + +#. **Vertex**. + + If the closest point is a vertex then the signed distance is simply :math:`\mathbf{n}_v\cdot\left(\mathbf{x}-\mathbf{x}_v\right)` where :math:`\mathbf{n}_v` is the vertex pseudonormal and :math:`\mathbf{x}_v` is the vertex position. + +Normal vectors +-------------- + +The normal vectors for edges (:math:`\mathbf{n}_e`) and vertices (:math:`\mathbf{n}_v`) are not uniquely defined. +For both edges and vertices we use the pseudonormals from :cite:`1407857`: + +.. math:: + + \mathbf{n}_{e} = \frac{1}{2}\left(\mathbf{n}_{f} + \mathbf{n}_{f^\prime}\right). + +where :math:`f` and :math:`f^\prime` are the two faces connecting the edge. +The vertex pseudonormal are given by + +.. math:: + + \mathbf{n}_{v} = \frac{\sum_i\alpha_i\mathbf{n}_{f_i}}{\left|\sum_i\alpha_i\right|}, + +where the sum runs over all faces which share :math:`v` as a vertex, and where :math:`\alpha_i` is the subtended angle of the face :math:`f_i`, see :numref:`Fig:Pseudonormal`. + +.. _Fig:Pseudonormal: +.. figure:: /_static/Pseudonormal.png + :width: 240px + :align: center + + Edge and vertex pseudonormals. + diff --git a/Sphinx/source/Implementation.rst b/Sphinx/source/Implementation.rst new file mode 100644 index 00000000..e873f358 --- /dev/null +++ b/Sphinx/source/Implementation.rst @@ -0,0 +1,175 @@ +.. _Chap:Implementation: + +Implementation +============== + +Here, we consider the basic EBGeometry API. +EBGeometry is a header-only library, implemented under it's own namespace ``EBGeometry``. +Various major components, like BVHs and DCEL, are implemented under namespaces ``EBGeometry::BVH`` and ``EBGeometry::Dcel``. +Below, we consider a brief introduction to the API and implementation details of EBGeometry. + +Vector types +------------ + +EBGeometry runs it's own vector types ``Vec2T`` and ``Vec3T``. + +``Vec2T`` is a two-dimensional Cartesian vector. +It is templated as + +.. code-block:: c++ + + namespace EBGeometry { + template + class Vec2T { + public: + T x; // First component. + T y; // Second component. + }; + } + +Most of EBGeometry is written as three-dimensional code, but ``Vec2T`` is needed for DCEL functionality when determining if a point projects onto the interior or exterior of a planar polygon, see :ref:`Chap:DCEL`. +``Vec2T`` has "most" common arithmetic operators like the dot product, length, multiplication operators and so on. + +``Vec3T`` is a three-dimensional vector type with precision ``T``. +It is templated as + +.. code-block:: c++ + + namespace EBGeometry { + template + class Vec3T { + public: + T[3] x; + }; + } + +Like ``Vec2T``, ``Vec3T`` has numerous routines for performing most vector-related operations like addition, subtraction, dot products and so on. + +Bounding volume hierarchy +------------------------- + +Bounding volumes +________________ + +Construction +____________ + +Full representation +___________________ + +Compact representation +______________________ + +DCEL +---- + +The DCEL functionality exists under the namespace ``EBGeometry::Dcel`` and contains the following functionality: + +#. Fundamental data types like vertices, half-edges, polygons, and entire surface grids. +#. Signed distance functionality for the above types. +#. File parsers for reading files into DCEL structures. +#. Partitioners for putting DCEL grids into bounding volume hierarchies. + +Classes +_______ + + +File parsers +____________ + + +BVH integration +_______________ + + +Signed distance function +------------------------ + +In EBGeometry we have encapsulated the concept of a signed distance function in an abstract class + +.. code-block:: c++ + + template + class SignedDistanceFunction : { + public: + + void scale(const Vec3T& a_scale) noexcept; + void translate(const Vec3T& a_translation) noexcept; + void rotate(const T a_angle, const int a_axis) noexcept; + + T signedDistance(const Vec3T& a_point) const noexcept = 0; + + protected: + + Vec3T transformPoint(const Vec3T& a_point) const noexcept; + }; + +We point out that the BVH and DCEL functionalities are fundamentally also signed distance functions. +The ``SignedDistanceFunction`` class exists so that we have a common entry point for performing distance field manipulations like rotations, scalings, and translations. +When implementing the ``signedDistance`` function, one can transform the input point by first calling ``transformPoint``. + +For example, in order to rotate a DCEL mesh (without using the BVH accelerator) we can implement the following signed distance function: + +.. code-block:: c++ + + template + class MySignedDistanceFunction : public SignedDistanceFunction { + public: + T signedDistance(const Vec3T& a_point) const noexcept override { + return m_mesh->signedDistance(this->transformPoint(a_point)); + } + + protected: + // DCEL mesh object, must be constructed externally and supplied to MyDistanceFunction (e.g. through the constructor). + std::shared_ptr > m_mesh; + }; + +Alternatively, using a BVH structure: + +.. code-block:: c++ + + template + class MySignedDistanceFunction : public SignedDistanceFunction { + public: + T signedDistance(const Vec3T& a_point) const noexcept override { + return m_bvh->signedDistance(this->transformPoint(a_point)); + } + + protected: + // BVH object, must be constructed externally and supplied to MyDistanceFunction (e.g. through the constructor). + std::shared_ptr > m_bvh; + }; + +Transformations +_______________ + +The following transformations are possible: + +* Scaling, which defines the operation :math:`\mathbf{x}^\prime = \mathbf{x}\mathbf{s}` where :math:`\mathbf{s}` is an anisotropic scaling factor. +* Translation, which defines the operation :math:`\mathbf{x}^\prime = \mathbf{x} - \mathbf{t}` where :math:`\mathbf{t}` is a translation vector. +* Rotation, which defines the operation :math:`\mathbf{x}^\prime = R\left(\mathbf{x}, \theta, a\right)` where :math:`\mathbf{x}` is rotated an angle :math:`\theta` around the coordinate axis :math:`a`. + +Transformations are applied sequentially. +E.g. the following code will first translate, then 90 degrees about the :math:`x`-axis. + +.. code-block:: + + MySignedDistanceFunction sdf; + + sdf.translate({1,0,0}); + sdf.rotate(90, 0); + +Analytic functions +__________________ + +Above, we have shown how users can supply a DCEL or BVH structure to implement ``SignedDistanceFunction``. +In addition, the file :file:`Source/EBGeometry_AnalyticSignedDistanceFunctions.hpp` defines various other analytic shapes (e.g, a sphere). + +Unions +------ + +Standard union +______________ + +Accelerated union +_________________ diff --git a/Sphinx/source/Introduction.rst b/Sphinx/source/Introduction.rst new file mode 100644 index 00000000..464bdeda --- /dev/null +++ b/Sphinx/source/Introduction.rst @@ -0,0 +1,43 @@ +.. _Chap:Introduction: + +Introduction +============ + +EBGeometry is a comparatively compact code for computing signed distance functions to watertight and orientable surface grids. +Originally, it was written to be used used with embedded-boundary (EB) codes like Chombo or AMReX. + +Requirements +------------ + +* A C++ compiler which supports C++14. + +Quickstart +---------- + +To obtained EBGeometry, clone the the code from `github `_ + +.. code-block:: bash + + git clone git@github.com:rmrsk/EBGeometry.git + +EBGeometry is a header-only library and is simple to use. +To use it, make :file:`EBGeometry.hpp` (stored at the top level) visible to your code and include it. + +To compile the examples, navigate to the examples folder. +The following two examples show two usages of EBGeometry: + +#. :file:`Examples/Basic` shows how to construct signed distance fields from surface grids, and how to perform signed distance calculations. +#. :file:`Examples/Union` shows how to create multi-object scenes and embed them in bounding volume hierarchies. + +Features +-------- + +The basic features of EBGeometry are as follows: + +* Representation of water-tight surface grids as signed distance fields. + EBGeometry uses a doubly-connected edge list (DCEL) representation of the mesh. +* Straightforward implementations of bounding volume hierarchies (BVHs) for use as acceleration structures. + The BVHs can be represented in full or compact (i.e., linearized) forms. +* Support for rudimentary signed distance calculations and transformations (rotations, translations, and scaling). +* Examples of how to couple EBGeometry to AMReX and Chombo. +* Heavy use of metaprogramming, which exists e.g. in order to permit higher-order trees and flexibility in BVH partitioning. diff --git a/Sphinx/source/ZZReferences.rst b/Sphinx/source/ZZReferences.rst new file mode 100644 index 00000000..c66a675c --- /dev/null +++ b/Sphinx/source/ZZReferences.rst @@ -0,0 +1,5 @@ +References +---------- + +.. bibliography:: references.bib + :style: plain diff --git a/Sphinx/source/_static/DCEL.png b/Sphinx/source/_static/DCEL.png new file mode 100644 index 00000000..e19ee411 Binary files /dev/null and b/Sphinx/source/_static/DCEL.png differ diff --git a/Sphinx/source/_static/PolygonProjection.png b/Sphinx/source/_static/PolygonProjection.png new file mode 100644 index 00000000..7843300f Binary files /dev/null and b/Sphinx/source/_static/PolygonProjection.png differ diff --git a/Sphinx/source/_static/Pseudonormal.png b/Sphinx/source/_static/Pseudonormal.png new file mode 100644 index 00000000..85950a11 Binary files /dev/null and b/Sphinx/source/_static/Pseudonormal.png differ diff --git a/Sphinx/source/_static/TreePruning.png b/Sphinx/source/_static/TreePruning.png new file mode 100644 index 00000000..2cc562fe Binary files /dev/null and b/Sphinx/source/_static/TreePruning.png differ diff --git a/Sphinx/source/_static/TrianglesBVH.png b/Sphinx/source/_static/TrianglesBVH.png new file mode 100644 index 00000000..f8dfbfc2 Binary files /dev/null and b/Sphinx/source/_static/TrianglesBVH.png differ diff --git a/Sphinx/source/_static/my_theme.css b/Sphinx/source/_static/my_theme.css new file mode 100644 index 00000000..26805732 --- /dev/null +++ b/Sphinx/source/_static/my_theme.css @@ -0,0 +1,21 @@ +.wy-nav-content { + max-width: 960px !important; +} + + + +/* BEGIN Fix the sphinx_rtd misplaced equation label */ +.eqno { + margin-left: 5px; + float: right; +} +.math .headerlink { + display: none; + visibility: hidden; +} +.math:hover .headerlink { + display: inline-block; + visibility: visible; + margin-right: -0.7em; +} +/* END Fix the sphinx_rtd misplaced equation label */ diff --git a/Sphinx/source/conf.py b/Sphinx/source/conf.py new file mode 100644 index 00000000..935dd8e7 --- /dev/null +++ b/Sphinx/source/conf.py @@ -0,0 +1,68 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'EBGeometry' +copyright = '2022, Robert Marskar' +author = 'Robert Marskar' + +# The full version, including alpha/beta/rc tags +release = '1.0' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.mathjax', + 'sphinxcontrib.bibtex' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# Bib file +bibtex_bibfiles = ['references.bib'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add CSS that fixes the sphinx_rtd_theme with equation number appearing above the equation. +def setup(app): + app.add_css_file('my_theme.css') + +numfig = True +math_numfig = True +math_eqref_format = "Eq. {number}" diff --git a/Sphinx/source/index.rst b/Sphinx/source/index.rst new file mode 100644 index 00000000..4d58241c --- /dev/null +++ b/Sphinx/source/index.rst @@ -0,0 +1,25 @@ +.. EBGeometry documentation master file, created by + sphinx-quickstart on Mon Mar 7 22:24:17 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to EBGeometry's documentation! +====================================== + +This is the developer documentation for EBGeometry. +EBGeometry is a small C++ package for computing signed distance fields from surface tesselations. +Although it is a self-contained package, it is was originally written for usage with embedded boundary (EB) codes. + +This documentation is the user documentation for EBGeometry. +A separate Doxygen-generated API of EBGeometry is found `here `_. + +.. toctree:: + :maxdepth: 3 + :caption: Contents + + Introduction.rst + Concepts.rst + DCEL.rst + BVH.rst + Implementation.rst + ZZReferences.rst diff --git a/Sphinx/source/references.bib b/Sphinx/source/references.bib new file mode 100644 index 00000000..2302cc8a --- /dev/null +++ b/Sphinx/source/references.bib @@ -0,0 +1,10 @@ +@article{1407857, +author={Baerentzen, J.A. and Aanaes, H.}, +journal={IEEE Transactions on Visualization and Computer Graphics}, +title={Signed distance computation using the angle weighted pseudonormal}, +year={2005}, +volume={11}, +number={3}, +pages={243-253}, +doi={10.1109/TVCG.2005.49} +} diff --git a/docs/.buildinfo b/docs/.buildinfo new file mode 100644 index 00000000..9d69e547 --- /dev/null +++ b/docs/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 8deed2bab0d72e58e2816d885c452ff7 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/BVH.doctree b/docs/.doctrees/BVH.doctree new file mode 100644 index 00000000..654c5a94 Binary files /dev/null and b/docs/.doctrees/BVH.doctree differ diff --git a/docs/.doctrees/Concepts.doctree b/docs/.doctrees/Concepts.doctree new file mode 100644 index 00000000..392abd50 Binary files /dev/null and b/docs/.doctrees/Concepts.doctree differ diff --git a/docs/.doctrees/DCEL.doctree b/docs/.doctrees/DCEL.doctree new file mode 100644 index 00000000..7e4bcbd6 Binary files /dev/null and b/docs/.doctrees/DCEL.doctree differ diff --git a/docs/.doctrees/Implementation.doctree b/docs/.doctrees/Implementation.doctree new file mode 100644 index 00000000..cf394ff5 Binary files /dev/null and b/docs/.doctrees/Implementation.doctree differ diff --git a/docs/.doctrees/Introduction.doctree b/docs/.doctrees/Introduction.doctree new file mode 100644 index 00000000..32fac50a Binary files /dev/null and b/docs/.doctrees/Introduction.doctree differ diff --git a/docs/.doctrees/ZZReferences.doctree b/docs/.doctrees/ZZReferences.doctree new file mode 100644 index 00000000..e886d091 Binary files /dev/null and b/docs/.doctrees/ZZReferences.doctree differ diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle new file mode 100644 index 00000000..81b657e7 Binary files /dev/null and b/docs/.doctrees/environment.pickle differ diff --git a/docs/.doctrees/index.doctree b/docs/.doctrees/index.doctree new file mode 100644 index 00000000..fa242d6a Binary files /dev/null and b/docs/.doctrees/index.doctree differ diff --git a/docs/BVH.html b/docs/BVH.html new file mode 100644 index 00000000..fc70a7da --- /dev/null +++ b/docs/BVH.html @@ -0,0 +1,286 @@ + + + + + + + + + + + Bounding volume hierarchies — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Bounding volume hierarchies

+
+

Basic concept

+

Bounding Volume Hierarchies (BVHs) are comparatively simple data structures that can accelerate closest-point searches by orders of magnitude. +BVHs are tree structures where the regular nodes are bounding volumes that enclose all geometric primitives (e.g. polygon faces) further down in the hierarchy. +There are two types of nodes in a BVH:

+
    +
  • Regular nodes, which do not contain any of the primitives/objects, but stores references to child nodes.

  • +
  • Leaf nodes, which contain a subset of the primitives.

  • +
+

Both types of nodes contain a bounding volume which closes all geometric primitives in the subtree below the node.

+

Fig. 4 shows a concept of BVH partitioning of a set of triangles. +Here, \(P\) is a regular node whose bounding volume encloses all geometric primitives in it’s subtree.

+
+_images/TrianglesBVH.png +

Fig. 4 Example of BVH partitioning for enclosing triangles. The regular node \(P\) contains two leaf nodes \(L\) and \(R\) which contain the primitives (triangles).

+
+

There is no fundamental limitation to what type of primitives/objects can be enclosed in BVHs, which makes BVHs useful beyond triangulated data sets. +For example, analytic signed distance functions can also be embedded in BVHs, provided that we can construct a bounding volume that encloses the object.

+
+

Note

+

BVHs are not limited to binary trees. +EBGeometry supports \(k\) -ary trees where each regular node has \(k\) children nodes.

+
+
+
+

Construction

+

BVHs have extremely flexible rules regarding their construction. +Since they are hierarchical structures, the only requirement when dividing a leaf node is that each child node gets at least one primitive.

+

Although the rules for BVH construction are flexible, performant BVHs are completely reliant on having balanced trees with the following heuristic properties:

+
    +
  • Bounding volumes should enclose primitives as tightly as possible.

  • +
  • There should be a minimal overlap between the bounding volumes.

  • +
  • The BVH trees should be approximately balanced.

  • +
+

Construction of a BVH is usually done recursively, from top to bottom (so-called top-down construction). +Alternative construction methods also exist, but are not used in EBGeometry. +In this case one can represent the BVH construction of a \(k\) -ary tree is done through a single function:

+
+\[\textrm{Partition}\left(\vec{O}\right): \vec{O} \rightarrow \left(\vec{O}_1, \vec{O}_2, \ldots, \vec{O}_k\right),\]
+

where \(\vec{O}\) is an input a list of objects/primitives, which is partitioned into \(k\) new list of primitives. +Note that the lists \(\vec{O}_i\) do not contain duplicates. +Top-down construction can thus be illustrated as a recursive procedure:

+
topDownConstruction(Objects):
+   partitionedObjects = Partition(Objects)
+
+   forall p in partitionedObjects:
+      child = insertChildNode(newObjects)
+
+      if(enoughPrimitives(child)):
+         child.topDownConstruction(child.objects)
+
+
+

In practice, the above procedure is supplemented by more sophisticated criteria for terminating the recursion, as well as routines for creating the bounding volumes around the newly inserted nodes.

+
+
+

Signed distance function

+

When computing the signed distance function to objects embedded in a BVH, one takes advantage of the hierarcical embedding of the primitives. +Consider the case in Fig. 5, where the goal of the BVH traversal is to minimize the number of branches and nodes that are visited. +We consider the following steps:

+
    +
  • When descending from node \(P\) we determine that we first investigate the left subtree (node \(A\)) since its bounding volume is closer than the bounding volumes for the other subtree. +The other subtree will be investigated later.

  • +
  • Since \(A\) is a leaf node, we find the signed distance from \(\mathbf{x}\) to the primitives in \(A\).

  • +
  • When moving back to \(P\), we find that the distance to the primitives in \(A\) is shorter than the distance from \(\mathbf{x}\) to the bounding volume that encloses nodes \(B\) and \(C\). +Consequently, the entire subtree containing \(B\) and \(C\) can be pruned.

  • +
+
+_images/TreePruning.png +

Fig. 5 Example of BVH tree pruning.

+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Concepts.html b/docs/Concepts.html new file mode 100644 index 00000000..3d582ea1 --- /dev/null +++ b/docs/Concepts.html @@ -0,0 +1,259 @@ + + + + + + + + + + + Basic concepts — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Basic concepts

+
+

Signed distance fields

+

The signed distance function is defined as a function \(S: \mathbb{R}^3 \rightarrow \mathbb{R}\), and returns the signed distance to the object. +The signed distance function has the additional property:

+
+(1)\[\left|\nabla S(\mathbf{x})\right| = 1 \quad\textrm{everywhere}.\]
+

In EBGeometry we use the following convention:

+
+\[\begin{split}S(\mathbf{x}) = +\begin{cases} +> 0, & \textrm{for points outside the object}, \\ +< 0, & \textrm{for points inside the object}. +\end{cases}\end{split}\]
+

Signed distance functions are also implicit functions (but the reverse statement is not true). +For example, the signed distance function for a sphere with center \(\mathbf{x}_0\) and radius \(R\) can be written

+
+\[S_{\textrm{sph}}\left(\mathbf{x}\right) = \left|\mathbf{x} - \mathbf{x}_0\right| - R.\]
+

An example of an implicit function for the same sphere is

+
+\[I_{\textrm{sph}}\left(\mathbf{x}\right) = \left|\mathbf{x} - \mathbf{x}_0\right|^2 - R^2.\]
+

An important difference between these is the Eikonal property in Eq. 1, ensuring that the signed distance function always returns the exact distance to the object.

+
+

Important

+

For 2D applications, it is possible to slice the signed distance function through a plane. +The resulting function is an implicit function rather than a signed distance function.

+
+
+
+

Transformations

+

Signed distance functions retain the Eikonal property for the following set of group transformations:

+
    +
  • Rotations.

  • +
  • Translations.

  • +
  • Scaling.

  • +
+
+
+

Unions

+

Unions of signed distance fields are also signed distance fields provided that the objects do not intersect or touch. +For overlapping objects the signed distance function is not well-defined (since the interior and exterior are not well-defined).

+

For non-overlapping objects represented as signed distance fields \(\left(S_1\left(\mathbf{x}\right), S_2\left(\mathbf{x}\right), \ldots\right)\), the composite signed distance field is

+
+\[S\left(\mathbf{x}\right) = S_k\left(\mathbf{x}\right),\]
+

where \(k\) is index of the closest object (which is found by evaluating \(\left|S_i\left(\mathbf{x}\right)\right|\).

+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/DCEL.html b/docs/DCEL.html new file mode 100644 index 00000000..ccf0de65 --- /dev/null +++ b/docs/DCEL.html @@ -0,0 +1,288 @@ + + + + + + + + + + + DCEL mesh structure — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

DCEL mesh structure

+
+

Basic concept

+

EBGeometry uses a doubly-connected edge list (DCEL) structure for storing surface meshes. +The DCEL structures consist of the following objects:

+
    +
  • Planar polygons (facets)

  • +
  • Half-edges

  • +
  • Vertices

  • +
+

As shown in Fig. 1, the half-edge is the most important data structure. +Half-edges circulate the inside of the facet, with pointer-access to the previous and next half-edge. +A half-edge also stores a reference to it’s starting vertex, as well as a reference to it’s pair-edge. +From the DCEL structure we can easily obtain all edges or vertices belonging to a single facet, and also “jump” to a neighboring facet by fetching the pair edge.

+
+_images/DCEL.png +

Fig. 1 DCEL mesh structure. Each half-edge stores references to previous/next half-edges, the pair edge, and the starting vertex. +Vertices store a coordinate as well as a reference to one of the outgoing half-edges.

+
+

In EBGeometry the half-edge data structure is implemented in it’s own namespace EBGeometry::Dcel. +This is a comparatively standard implementation of the DCEL structure, supplemented by functions that permit signed distance computations to various features on such a mesh.

+
+

Important

+

A signed distance field requires a watertight and orientable surface mesh. +If the surface mesh consists of holes or flipped facets, the signed distance function does not exist.

+
+
+
+

Signed distance

+

When computing the signed distance function, the closest point on the surface mesh can be one of the vertices, (half-) edges, or faces, see Fig. 2.

+
+_images/PolygonProjection.png +

Fig. 2 Possible closest-feature cases after projecting a point \(\mathbf{x}\) to the plane of a polygon face.

+
+

It is therefore necessary to distinguish between three cases:

+
    +
  1. Facet/Polygon face.

    +

    When computing the distance from a point \(\mathbf{x}\) to the polygon face we first determine if the projection of \(\mathbf{x}\) to the face’s plane lies inside or outside the face. +This is more involved than one might think, and it is done by first computing the two-dimensional projection of the polygon face, ignoring one of the coordinates. +Next, we determine, using 2D algorithms, if the projected point lies inside the embedded 2D representation of the polygon face. +Various algorithms for this are available, such as computing the winding number, the crossing number, or the subtended angle between the point and the 2D polygon.

    +
    +

    Note

    +

    EBGeometry uses the crossing number algorithm by default.

    +
    +

    If the point projects to the inside of the face, the signed distance is just \(d = \mathbf{n}_f\cdot\left(\mathbf{x} - \mathbf{x}_f\right)\) where \(\mathbf{n}_f\) is the face normal and \(\mathbf{x}_f\) is a point on the face plane (e.g., a vertex). +If the point projects to outside the polygon face, the closest feature is either an edge or a vertex.

    +
  2. +
  3. Edge.

    +

    When computing the signed distance to an edge, the edge is parametrized as \(\mathbf{e}(t) = \mathbf{x}_0 + \left(\mathbf{x}_1 - \mathbf{x}_0\right)t\), where \(\mathbf{x}_0\) and \(\mathbf{x}_1\) are the starting and ending vertex coordinates. +The point \(\mathbf{x}\) is projected to this line, and if the projection yields \(t^\prime \in [0,1]\) then the edge is the closest point. +In that case the signed distance is the projected distance and the sign is given by the sign of \(\mathbf{n}_e\cdot\left(\mathbf{x} - \mathbf{x}_0\right)\) where \(\mathbf{n}_e\) is the pseudonormal vector of the edge. +Otherwise, the closest point is one of the vertices.

    +
  4. +
  5. Vertex.

    +

    If the closest point is a vertex then the signed distance is simply \(\mathbf{n}_v\cdot\left(\mathbf{x}-\mathbf{x}_v\right)\) where \(\mathbf{n}_v\) is the vertex pseudonormal and \(\mathbf{x}_v\) is the vertex position.

    +
  6. +
+
+
+

Normal vectors

+

The normal vectors for edges (\(\mathbf{n}_e\)) and vertices (\(\mathbf{n}_v\)) are not uniquely defined. +For both edges and vertices we use the pseudonormals from [1]:

+
+\[\mathbf{n}_{e} = \frac{1}{2}\left(\mathbf{n}_{f} + \mathbf{n}_{f^\prime}\right).\]
+

where \(f\) and \(f^\prime\) are the two faces connecting the edge. +The vertex pseudonormal are given by

+
+\[\mathbf{n}_{v} = \frac{\sum_i\alpha_i\mathbf{n}_{f_i}}{\left|\sum_i\alpha_i\right|},\]
+

where the sum runs over all faces which share \(v\) as a vertex, and where \(\alpha_i\) is the subtended angle of the face \(f_i\), see Fig. 3.

+
+_images/Pseudonormal.png +

Fig. 3 Edge and vertex pseudonormals.

+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Implementation.html b/docs/Implementation.html new file mode 100644 index 00000000..d5f39449 --- /dev/null +++ b/docs/Implementation.html @@ -0,0 +1,386 @@ + + + + + + + + + + + Implementation — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Implementation

+

Here, we consider the basic EBGeometry API. +EBGeometry is a header-only library, implemented under it’s own namespace EBGeometry. +Various major components, like BVHs and DCEL, are implemented under namespaces EBGeometry::BVH and EBGeometry::Dcel. +Below, we consider a brief introduction to the API and implementation details of EBGeometry.

+
+

Vector types

+

EBGeometry runs it’s own vector types Vec2T and Vec3T.

+

Vec2T is a two-dimensional Cartesian vector. +It is templated as

+
namespace EBGeometry {
+   template<class T>
+   class Vec2T {
+   public:
+      T x; // First component.
+      T y; // Second component.
+   };
+}
+
+
+

Most of EBGeometry is written as three-dimensional code, but Vec2T is needed for DCEL functionality when determining if a point projects onto the interior or exterior of a planar polygon, see DCEL mesh structure. +Vec2T has “most” common arithmetic operators like the dot product, length, multiplication operators and so on.

+

Vec3T is a three-dimensional vector type with precision T. +It is templated as

+
namespace EBGeometry {
+   template<class T>
+   class Vec3T {
+   public:
+      T[3] x;
+   };
+}
+
+
+

Like Vec2T, Vec3T has numerous routines for performing most vector-related operations like addition, subtraction, dot products and so on.

+
+
+

Bounding volume hierarchy

+
+

Bounding volumes

+
+
+

Construction

+
+
+

Full representation

+
+
+

Compact representation

+
+
+
+

DCEL

+

The DCEL functionality exists under the namespace EBGeometry::Dcel and contains the following functionality:

+
    +
  1. Fundamental data types like vertices, half-edges, polygons, and entire surface grids.

  2. +
  3. Signed distance functionality for the above types.

  4. +
  5. File parsers for reading files into DCEL structures.

  6. +
  7. Partitioners for putting DCEL grids into bounding volume hierarchies.

  8. +
+
+

Classes

+
+
+

File parsers

+
+
+

BVH integration

+
+
+
+

Signed distance function

+

In EBGeometry we have encapsulated the concept of a signed distance function in an abstract class

+
template <class T>
+class SignedDistanceFunction : {
+public:
+
+   void scale(const Vec3T<T>& a_scale) noexcept;
+   void translate(const Vec3T<T>& a_translation) noexcept;
+   void rotate(const T a_angle, const int a_axis) noexcept;
+
+   T signedDistance(const Vec3T<T>& a_point) const noexcept = 0;
+
+protected:
+
+   Vec3T<T> transformPoint(const Vec3T<T>& a_point) const noexcept;
+};
+
+
+

We point out that the BVH and DCEL functionalities are fundamentally also signed distance functions. +The SignedDistanceFunction class exists so that we have a common entry point for performing distance field manipulations like rotations, scalings, and translations. +When implementing the signedDistance function, one can transform the input point by first calling transformPoint.

+

For example, in order to rotate a DCEL mesh (without using the BVH accelerator) we can implement the following signed distance function:

+
template <class T>
+class MySignedDistanceFunction : public SignedDistanceFunction<T> {
+public:
+   T signedDistance(const Vec3T<T>& a_point) const noexcept override {
+      return m_mesh->signedDistance(this->transformPoint(a_point));
+   }
+
+protected:
+   // DCEL mesh object, must be constructed externally and supplied to MyDistanceFunction (e.g. through the constructor).
+   std::shared_ptr<EBGeometry::Dcel::MeshT<T> > m_mesh;
+};
+
+
+

Alternatively, using a BVH structure:

+
template <class T, class P, class BV, int K>
+class MySignedDistanceFunction : public SignedDistanceFunction<T> {
+public:
+   T signedDistance(const Vec3T<T>& a_point) const noexcept override {
+      return m_bvh->signedDistance(this->transformPoint(a_point));
+   }
+
+protected:
+   // BVH object, must be constructed externally and supplied to MyDistanceFunction (e.g. through the constructor).
+   std::shared_ptr<EBGeometry::BVH::LinearBVH<T, P, BV, K> > m_bvh;
+};
+
+
+
+

Transformations

+

The following transformations are possible:

+
    +
  • Scaling, which defines the operation \(\mathbf{x}^\prime = \mathbf{x}\mathbf{s}\) where \(\mathbf{s}\) is an anisotropic scaling factor.

  • +
  • Translation, which defines the operation \(\mathbf{x}^\prime = \mathbf{x} - \mathbf{t}\) where \(\mathbf{t}\) is a translation vector.

  • +
  • Rotation, which defines the operation \(\mathbf{x}^\prime = R\left(\mathbf{x}, \theta, a\right)\) where \(\mathbf{x}\) is rotated an angle \(\theta\) around the coordinate axis \(a\).

  • +
+

Transformations are applied sequentially. +E.g. the following code will first translate, then 90 degrees about the \(x\)-axis.

+
MySignedDistanceFunction<float> sdf;
+
+sdf.translate({1,0,0});
+sdf.rotate(90, 0);
+
+
+
+
+

Analytic functions

+

Above, we have shown how users can supply a DCEL or BVH structure to implement SignedDistanceFunction. +In addition, the file Source/EBGeometry_AnalyticSignedDistanceFunctions.hpp defines various other analytic shapes (e.g, a sphere).

+
+
+
+

Unions

+
+

Standard union

+
+
+

Accelerated union

+
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/Introduction.html b/docs/Introduction.html new file mode 100644 index 00000000..51f5c3c0 --- /dev/null +++ b/docs/Introduction.html @@ -0,0 +1,250 @@ + + + + + + + + + + + Introduction — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Introduction

+

EBGeometry is a comparatively compact code for computing signed distance functions to watertight and orientable surface grids. +Originally, it was written to be used used with embedded-boundary (EB) codes like Chombo or AMReX.

+
+

Requirements

+
    +
  • A C++ compiler which supports C++14.

  • +
+
+
+

Quickstart

+

To obtained EBGeometry, clone the the code from github

+
git clone git@github.com:rmrsk/EBGeometry.git
+
+
+

EBGeometry is a header-only library and is simple to use. +To use it, make EBGeometry.hpp (stored at the top level) visible to your code and include it.

+

To compile the examples, navigate to the examples folder. +The following two examples show two usages of EBGeometry:

+
    +
  1. Examples/Basic shows how to construct signed distance fields from surface grids, and how to perform signed distance calculations.

  2. +
  3. Examples/Union shows how to create multi-object scenes and embed them in bounding volume hierarchies.

  4. +
+
+
+

Features

+

The basic features of EBGeometry are as follows:

+
    +
  • Representation of water-tight surface grids as signed distance fields. +EBGeometry uses a doubly-connected edge list (DCEL) representation of the mesh.

  • +
  • Straightforward implementations of bounding volume hierarchies (BVHs) for use as acceleration structures. +The BVHs can be represented in full or compact (i.e., linearized) forms.

  • +
  • Support for rudimentary signed distance calculations and transformations (rotations, translations, and scaling).

  • +
  • Examples of how to couple EBGeometry to AMReX and Chombo.

  • +
  • Heavy use of metaprogramming, which exists e.g. in order to permit higher-order trees and flexibility in BVH partitioning.

  • +
+
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ZZReferences.html b/docs/ZZReferences.html new file mode 100644 index 00000000..c1f13955 --- /dev/null +++ b/docs/ZZReferences.html @@ -0,0 +1,212 @@ + + + + + + + + + + + References — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

References

+

+
1
+

J.A. Baerentzen and H. Aanaes. Signed distance computation using the angle weighted pseudonormal. IEEE Transactions on Visualization and Computer Graphics, 11(3):243–253, 2005. doi:10.1109/TVCG.2005.49.

+
+
+

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_images/DCEL.png b/docs/_images/DCEL.png new file mode 100644 index 00000000..e19ee411 Binary files /dev/null and b/docs/_images/DCEL.png differ diff --git a/docs/_images/PolygonProjection.png b/docs/_images/PolygonProjection.png new file mode 100644 index 00000000..7843300f Binary files /dev/null and b/docs/_images/PolygonProjection.png differ diff --git a/docs/_images/Pseudonormal.png b/docs/_images/Pseudonormal.png new file mode 100644 index 00000000..85950a11 Binary files /dev/null and b/docs/_images/Pseudonormal.png differ diff --git a/docs/_images/TreePruning.png b/docs/_images/TreePruning.png new file mode 100644 index 00000000..2cc562fe Binary files /dev/null and b/docs/_images/TreePruning.png differ diff --git a/docs/_images/TrianglesBVH.png b/docs/_images/TrianglesBVH.png new file mode 100644 index 00000000..f8dfbfc2 Binary files /dev/null and b/docs/_images/TrianglesBVH.png differ diff --git a/docs/_sources/BVH.rst.txt b/docs/_sources/BVH.rst.txt new file mode 100644 index 00000000..1445ab83 --- /dev/null +++ b/docs/_sources/BVH.rst.txt @@ -0,0 +1,93 @@ +.. _Chap:BVH: + +Bounding volume hierarchies +=========================== + +Basic concept +------------- + +Bounding Volume Hierarchies (BVHs) are comparatively simple data structures that can accelerate closest-point searches by orders of magnitude. +BVHs are tree structures where the regular nodes are bounding volumes that enclose all geometric primitives (e.g. polygon faces) further down in the hierarchy. +There are two types of nodes in a BVH: + +* *Regular nodes*, which do not contain any of the primitives/objects, but stores references to child nodes. +* *Leaf nodes*, which contain a subset of the primitives. + +Both types of nodes contain a *bounding volume* which closes all geometric primitives in the subtree below the node. + +:numref:`Fig:TrianglesBVH` shows a concept of BVH partitioning of a set of triangles. +Here, :math:`P` is a regular node whose bounding volume encloses all geometric primitives in it's subtree. + +.. _Fig:TrianglesBVH: +.. figure:: /_static/TrianglesBVH.png + :width: 480px + :align: center + + Example of BVH partitioning for enclosing triangles. The regular node :math:`P` contains two leaf nodes :math:`L` and :math:`R` which contain the primitives (triangles). + +There is no fundamental limitation to what type of primitives/objects can be enclosed in BVHs, which makes BVHs useful beyond triangulated data sets. +For example, analytic signed distance functions can also be embedded in BVHs, provided that we can construct a bounding volume that encloses the object. + +.. note:: + + BVHs are not limited to binary trees. + EBGeometry supports :math:`k` -ary trees where each regular node has :math:`k` children nodes. + +Construction +------------ + +BVHs have extremely flexible rules regarding their construction. +Since they are hierarchical structures, the only requirement when dividing a leaf node is that each child node gets at least one primitive. + +Although the rules for BVH construction are flexible, performant BVHs are completely reliant on having balanced trees with the following heuristic properties: + +* Bounding volumes should enclose primitives as tightly as possible. +* There should be a minimal overlap between the bounding volumes. +* The BVH trees should be approximately *balanced*. + +Construction of a BVH is usually done recursively, from top to bottom (so-called top-down construction). +Alternative construction methods also exist, but are not used in EBGeometry. +In this case one can represent the BVH construction of a :math:`k` -ary tree is done through a single function: + +.. math:: + + \textrm{Partition}\left(\vec{O}\right): \vec{O} \rightarrow \left(\vec{O}_1, \vec{O}_2, \ldots, \vec{O}_k\right), + +where :math:`\vec{O}` is an input a list of objects/primitives, which is *partitioned* into :math:`k` new list of primitives. +Note that the lists :math:`\vec{O}_i` do not contain duplicates. +Top-down construction can thus be illustrated as a recursive procedure: + +.. code-block:: text + + topDownConstruction(Objects): + partitionedObjects = Partition(Objects) + + forall p in partitionedObjects: + child = insertChildNode(newObjects) + + if(enoughPrimitives(child)): + child.topDownConstruction(child.objects) + +In practice, the above procedure is supplemented by more sophisticated criteria for terminating the recursion, as well as routines for creating the bounding volumes around the newly inserted nodes. + + + +Signed distance function +------------------------ + +When computing the signed distance function to objects embedded in a BVH, one takes advantage of the hierarcical embedding of the primitives. +Consider the case in :numref:`Fig:TreePruning`, where the goal of the BVH traversal is to minimize the number of branches and nodes that are visited. +We consider the following steps: + +* When descending from node :math:`P` we determine that we first investigate the left subtree (node :math:`A`) since its bounding volume is closer than the bounding volumes for the other subtree. + The other subtree will be investigated later. +* Since :math:`A` is a leaf node, we find the signed distance from :math:`\mathbf{x}` to the primitives in :math:`A`. +* When moving back to :math:`P`, we find that the distance to the primitives in :math:`A` is shorter than the distance from :math:`\mathbf{x}` to the bounding volume that encloses nodes :math:`B` and :math:`C`. + Consequently, the entire subtree containing :math:`B` and :math:`C` can be pruned. + +.. _Fig:TreePruning: +.. figure:: /_static/TreePruning.png + :width: 480px + :align: center + + Example of BVH tree pruning. diff --git a/docs/_sources/Concepts.rst.txt b/docs/_sources/Concepts.rst.txt new file mode 100644 index 00000000..9a1fdba2 --- /dev/null +++ b/docs/_sources/Concepts.rst.txt @@ -0,0 +1,75 @@ +.. _Chap:Concepts: + +Basic concepts +============== + +Signed distance fields +---------------------- + +The signed distance function is defined as a function :math:`S: \mathbb{R}^3 \rightarrow \mathbb{R}`, and returns the *signed distance* to the object. +The signed distance function has the additional property: + +.. math:: + :label: Eikonal + + \left|\nabla S(\mathbf{x})\right| = 1 \quad\textrm{everywhere}. + +In EBGeometry we use the following convention: + +.. math:: + + S(\mathbf{x}) = + \begin{cases} + > 0, & \textrm{for points outside the object}, \\ + < 0, & \textrm{for points inside the object}. + \end{cases} + +Signed distance functions are also *implicit functions* (but the reverse statement is not true). +For example, the signed distance function for a sphere with center :math:`\mathbf{x}_0` and radius :math:`R` can be written + +.. math:: + + S_{\textrm{sph}}\left(\mathbf{x}\right) = \left|\mathbf{x} - \mathbf{x}_0\right| - R. + +An example of an implicit function for the same sphere is + +.. math:: + + I_{\textrm{sph}}\left(\mathbf{x}\right) = \left|\mathbf{x} - \mathbf{x}_0\right|^2 - R^2. + +An important difference between these is the Eikonal property in :eq:`Eikonal`, ensuring that the signed distance function always returns the exact distance to the object. + +.. important:: + + For 2D applications, it is possible to slice the signed distance function through a plane. + The resulting function is *an implicit function* rather than a signed distance function. + + +Transformations +--------------- + +Signed distance functions retain the Eikonal property for the following set of group transformations: + +* Rotations. +* Translations. +* Scaling. + +Unions +------ + +Unions of signed distance fields are also signed distance fields *provided that the objects do not intersect or touch*. +For overlapping objects the signed distance function is not well-defined (since the interior and exterior are not well-defined). + + + +For non-overlapping objects represented as signed distance fields :math:`\left(S_1\left(\mathbf{x}\right), S_2\left(\mathbf{x}\right), \ldots\right)`, the composite signed distance field is + +.. math:: + + S\left(\mathbf{x}\right) = S_k\left(\mathbf{x}\right), + +where :math:`k` is index of the closest object (which is found by evaluating :math:`\left|S_i\left(\mathbf{x}\right)\right|`. + +.. important:: + + diff --git a/docs/_sources/DCEL.rst.txt b/docs/_sources/DCEL.rst.txt new file mode 100644 index 00000000..a841dbc2 --- /dev/null +++ b/docs/_sources/DCEL.rst.txt @@ -0,0 +1,101 @@ +.. _Chap:DCEL: + +DCEL mesh structure +=================== + +Basic concept +------------- + +EBGeometry uses a doubly-connected edge list (DCEL) structure for storing surface meshes. +The DCEL structures consist of the following objects: + +* Planar polygons (facets) +* Half-edges +* Vertices + +As shown in :numref:`Fig:DCEL`, the half-edge is the most important data structure. +Half-edges circulate the inside of the facet, with pointer-access to the previous and next half-edge. +A half-edge also stores a reference to it's starting vertex, as well as a reference to it's pair-edge. +From the DCEL structure we can easily obtain all edges or vertices belonging to a single facet, and also "jump" to a neighboring facet by fetching the pair edge. + +.. _Fig:DCEL: +.. figure:: /_static/DCEL.png + :width: 480px + :align: center + + DCEL mesh structure. Each half-edge stores references to previous/next half-edges, the pair edge, and the starting vertex. + Vertices store a coordinate as well as a reference to one of the outgoing half-edges. + +In EBGeometry the half-edge data structure is implemented in it's own namespace ``EBGeometry::Dcel``. +This is a comparatively standard implementation of the DCEL structure, supplemented by functions that permit signed distance computations to various features on such a mesh. + +.. important:: + + A signed distance field requires a *watertight and orientable* surface mesh. + If the surface mesh consists of holes or flipped facets, the signed distance function does not exist. + +Signed distance +--------------- + +When computing the signed distance function, the closest point on the surface mesh can be one of the vertices, (half-) edges, or faces, see :numref:`Fig:PolygonProjection`. + +.. _Fig:PolygonProjection: +.. figure:: /_static/PolygonProjection.png + :width: 240px + :align: center + + Possible closest-feature cases after projecting a point :math:`\mathbf{x}` to the plane of a polygon face. + +It is therefore necessary to distinguish between three cases: + +#. **Facet/Polygon face**. + + When computing the distance from a point :math:`\mathbf{x}` to the polygon face we first determine if the projection of :math:`\mathbf{x}` to the face's plane lies inside or outside the face. + This is more involved than one might think, and it is done by first computing the two-dimensional projection of the polygon face, ignoring one of the coordinates. + Next, we determine, using 2D algorithms, if the projected point lies inside the embedded 2D representation of the polygon face. + Various algorithms for this are available, such as computing the winding number, the crossing number, or the subtended angle between the point and the 2D polygon. + + .. note:: + + EBGeometry uses the crossing number algorithm by default. + + If the point projects to the inside of the face, the signed distance is just :math:`d = \mathbf{n}_f\cdot\left(\mathbf{x} - \mathbf{x}_f\right)` where :math:`\mathbf{n}_f` is the face normal and :math:`\mathbf{x}_f` is a point on the face plane (e.g., a vertex). + If the point projects to *outside* the polygon face, the closest feature is either an edge or a vertex. + +#. **Edge**. + + When computing the signed distance to an edge, the edge is parametrized as :math:`\mathbf{e}(t) = \mathbf{x}_0 + \left(\mathbf{x}_1 - \mathbf{x}_0\right)t`, where :math:`\mathbf{x}_0` and :math:`\mathbf{x}_1` are the starting and ending vertex coordinates. + The point :math:`\mathbf{x}` is projected to this line, and if the projection yields :math:`t^\prime \in [0,1]` then the edge is the closest point. + In that case the signed distance is the projected distance and the sign is given by the sign of :math:`\mathbf{n}_e\cdot\left(\mathbf{x} - \mathbf{x}_0\right)` where :math:`\mathbf{n}_e` is the pseudonormal vector of the edge. + Otherwise, the closest point is one of the vertices. + +#. **Vertex**. + + If the closest point is a vertex then the signed distance is simply :math:`\mathbf{n}_v\cdot\left(\mathbf{x}-\mathbf{x}_v\right)` where :math:`\mathbf{n}_v` is the vertex pseudonormal and :math:`\mathbf{x}_v` is the vertex position. + +Normal vectors +-------------- + +The normal vectors for edges (:math:`\mathbf{n}_e`) and vertices (:math:`\mathbf{n}_v`) are not uniquely defined. +For both edges and vertices we use the pseudonormals from :cite:`1407857`: + +.. math:: + + \mathbf{n}_{e} = \frac{1}{2}\left(\mathbf{n}_{f} + \mathbf{n}_{f^\prime}\right). + +where :math:`f` and :math:`f^\prime` are the two faces connecting the edge. +The vertex pseudonormal are given by + +.. math:: + + \mathbf{n}_{v} = \frac{\sum_i\alpha_i\mathbf{n}_{f_i}}{\left|\sum_i\alpha_i\right|}, + +where the sum runs over all faces which share :math:`v` as a vertex, and where :math:`\alpha_i` is the subtended angle of the face :math:`f_i`, see :numref:`Fig:Pseudonormal`. + +.. _Fig:Pseudonormal: +.. figure:: /_static/Pseudonormal.png + :width: 240px + :align: center + + Edge and vertex pseudonormals. + diff --git a/docs/_sources/Implementation.rst.txt b/docs/_sources/Implementation.rst.txt new file mode 100644 index 00000000..e873f358 --- /dev/null +++ b/docs/_sources/Implementation.rst.txt @@ -0,0 +1,175 @@ +.. _Chap:Implementation: + +Implementation +============== + +Here, we consider the basic EBGeometry API. +EBGeometry is a header-only library, implemented under it's own namespace ``EBGeometry``. +Various major components, like BVHs and DCEL, are implemented under namespaces ``EBGeometry::BVH`` and ``EBGeometry::Dcel``. +Below, we consider a brief introduction to the API and implementation details of EBGeometry. + +Vector types +------------ + +EBGeometry runs it's own vector types ``Vec2T`` and ``Vec3T``. + +``Vec2T`` is a two-dimensional Cartesian vector. +It is templated as + +.. code-block:: c++ + + namespace EBGeometry { + template + class Vec2T { + public: + T x; // First component. + T y; // Second component. + }; + } + +Most of EBGeometry is written as three-dimensional code, but ``Vec2T`` is needed for DCEL functionality when determining if a point projects onto the interior or exterior of a planar polygon, see :ref:`Chap:DCEL`. +``Vec2T`` has "most" common arithmetic operators like the dot product, length, multiplication operators and so on. + +``Vec3T`` is a three-dimensional vector type with precision ``T``. +It is templated as + +.. code-block:: c++ + + namespace EBGeometry { + template + class Vec3T { + public: + T[3] x; + }; + } + +Like ``Vec2T``, ``Vec3T`` has numerous routines for performing most vector-related operations like addition, subtraction, dot products and so on. + +Bounding volume hierarchy +------------------------- + +Bounding volumes +________________ + +Construction +____________ + +Full representation +___________________ + +Compact representation +______________________ + +DCEL +---- + +The DCEL functionality exists under the namespace ``EBGeometry::Dcel`` and contains the following functionality: + +#. Fundamental data types like vertices, half-edges, polygons, and entire surface grids. +#. Signed distance functionality for the above types. +#. File parsers for reading files into DCEL structures. +#. Partitioners for putting DCEL grids into bounding volume hierarchies. + +Classes +_______ + + +File parsers +____________ + + +BVH integration +_______________ + + +Signed distance function +------------------------ + +In EBGeometry we have encapsulated the concept of a signed distance function in an abstract class + +.. code-block:: c++ + + template + class SignedDistanceFunction : { + public: + + void scale(const Vec3T& a_scale) noexcept; + void translate(const Vec3T& a_translation) noexcept; + void rotate(const T a_angle, const int a_axis) noexcept; + + T signedDistance(const Vec3T& a_point) const noexcept = 0; + + protected: + + Vec3T transformPoint(const Vec3T& a_point) const noexcept; + }; + +We point out that the BVH and DCEL functionalities are fundamentally also signed distance functions. +The ``SignedDistanceFunction`` class exists so that we have a common entry point for performing distance field manipulations like rotations, scalings, and translations. +When implementing the ``signedDistance`` function, one can transform the input point by first calling ``transformPoint``. + +For example, in order to rotate a DCEL mesh (without using the BVH accelerator) we can implement the following signed distance function: + +.. code-block:: c++ + + template + class MySignedDistanceFunction : public SignedDistanceFunction { + public: + T signedDistance(const Vec3T& a_point) const noexcept override { + return m_mesh->signedDistance(this->transformPoint(a_point)); + } + + protected: + // DCEL mesh object, must be constructed externally and supplied to MyDistanceFunction (e.g. through the constructor). + std::shared_ptr > m_mesh; + }; + +Alternatively, using a BVH structure: + +.. code-block:: c++ + + template + class MySignedDistanceFunction : public SignedDistanceFunction { + public: + T signedDistance(const Vec3T& a_point) const noexcept override { + return m_bvh->signedDistance(this->transformPoint(a_point)); + } + + protected: + // BVH object, must be constructed externally and supplied to MyDistanceFunction (e.g. through the constructor). + std::shared_ptr > m_bvh; + }; + +Transformations +_______________ + +The following transformations are possible: + +* Scaling, which defines the operation :math:`\mathbf{x}^\prime = \mathbf{x}\mathbf{s}` where :math:`\mathbf{s}` is an anisotropic scaling factor. +* Translation, which defines the operation :math:`\mathbf{x}^\prime = \mathbf{x} - \mathbf{t}` where :math:`\mathbf{t}` is a translation vector. +* Rotation, which defines the operation :math:`\mathbf{x}^\prime = R\left(\mathbf{x}, \theta, a\right)` where :math:`\mathbf{x}` is rotated an angle :math:`\theta` around the coordinate axis :math:`a`. + +Transformations are applied sequentially. +E.g. the following code will first translate, then 90 degrees about the :math:`x`-axis. + +.. code-block:: + + MySignedDistanceFunction sdf; + + sdf.translate({1,0,0}); + sdf.rotate(90, 0); + +Analytic functions +__________________ + +Above, we have shown how users can supply a DCEL or BVH structure to implement ``SignedDistanceFunction``. +In addition, the file :file:`Source/EBGeometry_AnalyticSignedDistanceFunctions.hpp` defines various other analytic shapes (e.g, a sphere). + +Unions +------ + +Standard union +______________ + +Accelerated union +_________________ diff --git a/docs/_sources/Introduction.rst.txt b/docs/_sources/Introduction.rst.txt new file mode 100644 index 00000000..464bdeda --- /dev/null +++ b/docs/_sources/Introduction.rst.txt @@ -0,0 +1,43 @@ +.. _Chap:Introduction: + +Introduction +============ + +EBGeometry is a comparatively compact code for computing signed distance functions to watertight and orientable surface grids. +Originally, it was written to be used used with embedded-boundary (EB) codes like Chombo or AMReX. + +Requirements +------------ + +* A C++ compiler which supports C++14. + +Quickstart +---------- + +To obtained EBGeometry, clone the the code from `github `_ + +.. code-block:: bash + + git clone git@github.com:rmrsk/EBGeometry.git + +EBGeometry is a header-only library and is simple to use. +To use it, make :file:`EBGeometry.hpp` (stored at the top level) visible to your code and include it. + +To compile the examples, navigate to the examples folder. +The following two examples show two usages of EBGeometry: + +#. :file:`Examples/Basic` shows how to construct signed distance fields from surface grids, and how to perform signed distance calculations. +#. :file:`Examples/Union` shows how to create multi-object scenes and embed them in bounding volume hierarchies. + +Features +-------- + +The basic features of EBGeometry are as follows: + +* Representation of water-tight surface grids as signed distance fields. + EBGeometry uses a doubly-connected edge list (DCEL) representation of the mesh. +* Straightforward implementations of bounding volume hierarchies (BVHs) for use as acceleration structures. + The BVHs can be represented in full or compact (i.e., linearized) forms. +* Support for rudimentary signed distance calculations and transformations (rotations, translations, and scaling). +* Examples of how to couple EBGeometry to AMReX and Chombo. +* Heavy use of metaprogramming, which exists e.g. in order to permit higher-order trees and flexibility in BVH partitioning. diff --git a/docs/_sources/ZZReferences.rst.txt b/docs/_sources/ZZReferences.rst.txt new file mode 100644 index 00000000..c66a675c --- /dev/null +++ b/docs/_sources/ZZReferences.rst.txt @@ -0,0 +1,5 @@ +References +---------- + +.. bibliography:: references.bib + :style: plain diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt new file mode 100644 index 00000000..4d58241c --- /dev/null +++ b/docs/_sources/index.rst.txt @@ -0,0 +1,25 @@ +.. EBGeometry documentation master file, created by + sphinx-quickstart on Mon Mar 7 22:24:17 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to EBGeometry's documentation! +====================================== + +This is the developer documentation for EBGeometry. +EBGeometry is a small C++ package for computing signed distance fields from surface tesselations. +Although it is a self-contained package, it is was originally written for usage with embedded boundary (EB) codes. + +This documentation is the user documentation for EBGeometry. +A separate Doxygen-generated API of EBGeometry is found `here `_. + +.. toctree:: + :maxdepth: 3 + :caption: Contents + + Introduction.rst + Concepts.rst + DCEL.rst + BVH.rst + Implementation.rst + ZZReferences.rst diff --git a/docs/_static/DCEL.png b/docs/_static/DCEL.png new file mode 100644 index 00000000..e19ee411 Binary files /dev/null and b/docs/_static/DCEL.png differ diff --git a/docs/_static/PolygonProjection.png b/docs/_static/PolygonProjection.png new file mode 100644 index 00000000..7843300f Binary files /dev/null and b/docs/_static/PolygonProjection.png differ diff --git a/docs/_static/Pseudonormal.png b/docs/_static/Pseudonormal.png new file mode 100644 index 00000000..85950a11 Binary files /dev/null and b/docs/_static/Pseudonormal.png differ diff --git a/docs/_static/TreePruning.png b/docs/_static/TreePruning.png new file mode 100644 index 00000000..2cc562fe Binary files /dev/null and b/docs/_static/TreePruning.png differ diff --git a/docs/_static/TrianglesBVH.png b/docs/_static/TrianglesBVH.png new file mode 100644 index 00000000..f8dfbfc2 Binary files /dev/null and b/docs/_static/TrianglesBVH.png differ diff --git a/docs/_static/alabaster.css b/docs/_static/alabaster.css new file mode 100644 index 00000000..0eddaeb0 --- /dev/null +++ b/docs/_static/alabaster.css @@ -0,0 +1,701 @@ +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: Georgia, serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: Georgia, serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: Georgia, serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +div.sphinxsidebar .badge { + border-bottom: none; +} + +div.sphinxsidebar .badge:hover { + border-bottom: none; +} + +/* To address an issue with donation coming after search */ +div.sphinxsidebar h3.donation { + margin-top: 10px; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: Georgia, serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: Georgia, serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + + +/* relbar */ + +.related { + line-height: 30px; + width: 100%; + font-size: 0.9rem; +} + +.related.top { + border-bottom: 1px solid #EEE; + margin-bottom: 20px; +} + +.related.bottom { + border-top: 1px solid #EEE; +} + +.related ul { + padding: 0; + margin: 0; + list-style: none; +} + +.related li { + display: inline; +} + +nav#rellinks { + float: right; +} + +nav#rellinks li+li:before { + content: "|"; +} + +nav#breadcrumbs li+li:before { + content: "\00BB"; +} + +/* Hide certain items when printing */ +@media print { + div.related { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/basic.css b/docs/_static/basic.css new file mode 100644 index 00000000..24a49f09 --- /dev/null +++ b/docs/_static/basic.css @@ -0,0 +1,856 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0.5em; + content: ":"; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/css/badge_only.css b/docs/_static/css/badge_only.css new file mode 100644 index 00000000..3c33cef5 --- /dev/null +++ b/docs/_static/css/badge_only.css @@ -0,0 +1 @@ +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} diff --git a/docs/_static/css/theme.css b/docs/_static/css/theme.css new file mode 100644 index 00000000..aed8cef0 --- /dev/null +++ b/docs/_static/css/theme.css @@ -0,0 +1,6 @@ +/* sphinx_rtd_theme version 0.4.3 | MIT license */ +/* Built 20190212 16:02 */ +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 00000000..2a924f1d --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js new file mode 100644 index 00000000..7d88f807 --- /dev/null +++ b/docs/_static/doctools.js @@ -0,0 +1,316 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { + this.initOnKeyListeners(); + } + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keydown(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js new file mode 100644 index 00000000..07966ec6 --- /dev/null +++ b/docs/_static/documentation_options.js @@ -0,0 +1,12 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1.0', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false +}; \ No newline at end of file diff --git a/docs/_static/file.png b/docs/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/_static/file.png differ diff --git a/docs/_static/fonts/Inconsolata-Bold.ttf b/docs/_static/fonts/Inconsolata-Bold.ttf new file mode 100644 index 00000000..809c1f58 Binary files /dev/null and b/docs/_static/fonts/Inconsolata-Bold.ttf differ diff --git a/docs/_static/fonts/Inconsolata-Regular.ttf b/docs/_static/fonts/Inconsolata-Regular.ttf new file mode 100644 index 00000000..fc981ce7 Binary files /dev/null and b/docs/_static/fonts/Inconsolata-Regular.ttf differ diff --git a/docs/_static/fonts/Inconsolata.ttf b/docs/_static/fonts/Inconsolata.ttf new file mode 100644 index 00000000..4b8a36d2 Binary files /dev/null and b/docs/_static/fonts/Inconsolata.ttf differ diff --git a/docs/_static/fonts/Lato-Bold.ttf b/docs/_static/fonts/Lato-Bold.ttf new file mode 100644 index 00000000..1d23c706 Binary files /dev/null and b/docs/_static/fonts/Lato-Bold.ttf differ diff --git a/docs/_static/fonts/Lato-Regular.ttf b/docs/_static/fonts/Lato-Regular.ttf new file mode 100644 index 00000000..0f3d0f83 Binary files /dev/null and b/docs/_static/fonts/Lato-Regular.ttf differ diff --git a/docs/_static/fonts/Lato/lato-bold.eot b/docs/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 00000000..3361183a Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/_static/fonts/Lato/lato-bold.ttf b/docs/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 00000000..29f691d5 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/_static/fonts/Lato/lato-bold.woff b/docs/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/_static/fonts/Lato/lato-bold.woff2 b/docs/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/_static/fonts/Lato/lato-bolditalic.eot b/docs/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 00000000..3d415493 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 00000000..f402040b Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/_static/fonts/Lato/lato-bolditalic.woff b/docs/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/_static/fonts/Lato/lato-italic.eot b/docs/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 00000000..3f826421 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/_static/fonts/Lato/lato-italic.ttf b/docs/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 00000000..b4bfc9b2 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/_static/fonts/Lato/lato-italic.woff b/docs/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/_static/fonts/Lato/lato-italic.woff2 b/docs/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/_static/fonts/Lato/lato-regular.eot b/docs/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 00000000..11e3f2a5 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/_static/fonts/Lato/lato-regular.ttf b/docs/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 00000000..74decd9e Binary files /dev/null and b/docs/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/_static/fonts/Lato/lato-regular.woff b/docs/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/_static/fonts/Lato/lato-regular.woff2 b/docs/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/_static/fonts/RobotoSlab-Bold.ttf b/docs/_static/fonts/RobotoSlab-Bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab-Bold.ttf differ diff --git a/docs/_static/fonts/RobotoSlab-Regular.ttf b/docs/_static/fonts/RobotoSlab-Regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab-Regular.ttf differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 00000000..79dc8efe Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 00000000..2f7ca78a Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/_static/fonts/fontawesome-webfont.eot b/docs/_static/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/_static/fonts/fontawesome-webfont.eot differ diff --git a/docs/_static/fonts/fontawesome-webfont.svg b/docs/_static/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/_static/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_static/fonts/fontawesome-webfont.ttf b/docs/_static/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/_static/fonts/fontawesome-webfont.ttf differ diff --git a/docs/_static/fonts/fontawesome-webfont.woff b/docs/_static/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/_static/fonts/fontawesome-webfont.woff differ diff --git a/docs/_static/fonts/fontawesome-webfont.woff2 b/docs/_static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/_static/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/_static/graphviz.css b/docs/_static/graphviz.css new file mode 100644 index 00000000..8ab69e01 --- /dev/null +++ b/docs/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/_static/jquery-3.5.1.js b/docs/_static/jquery-3.5.1.js new file mode 100644 index 00000000..50937333 --- /dev/null +++ b/docs/_static/jquery-3.5.1.js @@ -0,0 +1,10872 @@ +/*! + * jQuery JavaScript Library v3.5.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2020-05-04T22:49Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.5.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.5 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2020-03-14 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem.namespaceURI, + docElem = ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
EBGeometry.hpp
+
+
+
14 
18 namespace EBGeometry {
19 
20 }
Declaration of utilities for passing data into DCEL structures.
+
Declaration of a bounding volume hierarchy (BVH) class.
+
Declaration of a various bounding volumes used for bounding volume hierarchy.
+
Declaration of a mesh class which stores a DCEL mesh (with signed distance functions) ...
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
Declaration of iterators for DCEL surface Tesselations.
+
Name space for all of EBGeometry.
Definition: EBGeometry.hpp:18
+
Declaration of a union operator for creating multi-object scenes.
+
Abstract base class for representing a signed distance function.
+
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+
File which contains partitioners and lambdas for enclosing dcel_face in bounding volume heirarchies...
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
Declaration of various analytic distance functions.
+
Declaration of a union operator for creating multi-object scenes.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp.html b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp.html new file mode 100644 index 00000000..4fffcdb6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp.html @@ -0,0 +1,122 @@ + + + + + + + +EBGeometry: Source/EBGeometry_AnalyticDistanceFunctions.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_AnalyticDistanceFunctions.hpp File Reference
+
+
+ +

Declaration of various analytic distance functions. +More...

+
+Include dependency graph for EBGeometry_AnalyticDistanceFunctions.hpp:
+
+
+ + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  SphereSDF< T >
 Signed distance field for sphere. More...
 
+

Detailed Description

+

Declaration of various analytic distance functions.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.map new file mode 100644 index 00000000..c241130c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.md5 new file mode 100644 index 00000000..f52d6b3f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +c0fc451c2806ddaaf725b30a46c0f1a8 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.png new file mode 100644 index 00000000..0d6002b6 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.map b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.map new file mode 100644 index 00000000..18077ff5 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.md5 new file mode 100644 index 00000000..6de342d4 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.md5 @@ -0,0 +1 @@ +976ebaac9ff78e1accfb25823ece3efb \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.png b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.png new file mode 100644 index 00000000..e2fe3a55 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp_source.html b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp_source.html new file mode 100644 index 00000000..1c681aaa --- /dev/null +++ b/docs/doxygen/html/EBGeometry__AnalyticDistanceFunctions_8hpp_source.html @@ -0,0 +1,99 @@ + + + + + + + +EBGeometry: Source/EBGeometry_AnalyticDistanceFunctions.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_AnalyticDistanceFunctions.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_AnalyticDistanceFunctions
13 #define EBGeometry_AnalyticDistanceFunctions
14 
17 
21 template <class T>
22 class SphereSDF : public SignedDistanceFunction<T> {
23 public:
24 
29  this->m_center = Vec3T<T>::zero();
30  this->m_radius = T(0.0);
31  this->m_flipInside = false;
32  }
33 
40  SphereSDF(const Vec3T<T>& a_center, const T& a_radius, const bool a_flipInside) {
41  this->m_center = a_center;
42  this->m_radius = a_radius;
43  this->m_flipInside = a_flipInside;
44  }
45 
49  SphereSDF(const SphereSDF& a_other) {
50  this->m_center = a_other.m_center;
51  this->m_radius = a_other.m_radius;
52  this->m_flipInside = a_other.m_flipInside;
53  this->m_transformOps = a_other.m_transformOps;
54  }
55 
59  virtual ~SphereSDF() = default;
60 
64  const Vec3T<T>& getCenter() const noexcept {
65  return m_center;
66  }
67 
71  Vec3T<T>& getCenter() noexcept {
72  return m_center;
73  }
74 
78  const T& getRadius() const noexcept {
79  return m_radius;
80  }
81 
85  T& getRadius() noexcept {
86  return m_radius;
87  }
88 
93  virtual T signedDistance(const Vec3T<T>& a_point) const noexcept override {
94  const T sign = m_flipInside ? -1.0 : 1.0;
95 
96  return sign * ((a_point - m_center).length() - m_radius);
97  }
98 
99 protected:
100 
105 
110 
115 };
116 
118 
120 
121 #endif
T & getRadius() noexcept
Get radius.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:85
+
std::deque< std::shared_ptr< TransformOp< T > > > m_transformOps
List of transformation operators for the signed distance field.
Definition: EBGeometry_SignedDistanceFunction.hpp:81
+
virtual T signedDistance(const Vec3T< T > &a_point) const noexcept override
Signed distance function for sphere.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:93
+
static constexpr Vec3T< T > zero() noexcept
Return av vector with x = y = z = 0.
Definition: EBGeometry_VecImplem.hpp:205
+
virtual ~SphereSDF()=default
Destructor.
+
bool m_flipInside
For flipping sign.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:114
+
Signed distance field for sphere.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:22
+
const Vec3T< T > & getCenter() const noexcept
Get center.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:64
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Vec3T< T > m_center
Sphere center.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:104
+
Abstract base class for representing a signed distance function.
+
Abstract representation of a signed distance function.
Definition: EBGeometry_SignedDistanceFunction.hpp:29
+
T m_radius
Sphere radius.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:109
+
const T & getRadius() const noexcept
Get radius.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:78
+
Vec3T< T > & getCenter() noexcept
Get center.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:71
+ +
SphereSDF(const Vec3T< T > &a_center, const T &a_radius, const bool a_flipInside)
Default constructor.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:40
+
Declaration of various analytic distance functions.
+
SphereSDF(const SphereSDF &a_other)
Copy constructor.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:49
+
SphereSDF()
Disallowed weak construction. Use one of the full constructors.
Definition: EBGeometry_AnalyticDistanceFunctions.hpp:28
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp.html b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp.html new file mode 100644 index 00000000..bb6ecc60 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp.html @@ -0,0 +1,120 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BVHImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_BVHImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_BVH.hpp. +More...

+
+Include dependency graph for EBGeometry_BVHImplem.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 BVH
 Namespace for various bounding volume heirarchy (BVH) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_BVH.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..17e7b80c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..edbf99ae --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +d13d7a2f7b1abab6da176a5fde7750dd \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..8140268d Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.map new file mode 100644 index 00000000..5ef0e63a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.md5 new file mode 100644 index 00000000..ab224fbb --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +2c22fc6c5ca87ee2fab7e84a2985ae09 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.png new file mode 100644 index 00000000..84f8d563 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BVHImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp_source.html new file mode 100644 index 00000000..7b3ec1d4 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVHImplem_8hpp_source.html @@ -0,0 +1,142 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BVHImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_BVHImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_BVHImplem
13 #define EBGeometry_BVHImplem
14 
15 #include "EBGeometry_BVH.hpp"
17 
18 namespace BVH {
19 
20  template <class T, class P, class BV, int K>
21  inline
23  m_parent = nullptr;
24 
25  for (auto& c : m_children){
26  c = nullptr;
27  }
28 
29  m_primitives.resize(0);
30 
31  m_depth = 0;
32  m_nodeType = NodeType::Regular;
33  }
34 
35  template <class T, class P, class BV, int K>
36  inline
37  NodeT<T, P, BV, K>::NodeT(const NodePtr& a_parent) : NodeT<T, P, BV, K>() {
38  m_parent = a_parent;
39  m_depth = a_parent.m_depth + 1;
40  m_nodeType = NodeType::Leaf;
41  }
42 
43  template <class T, class P, class BV, int K>
44  inline
45  NodeT<T, P, BV, K>::NodeT(const std::vector<std::shared_ptr<P> >& a_primitives) : NodeT<T, P, BV, K>() {
46  for (const auto& p : a_primitives){
47  m_primitives.emplace_back(p);
48  }
49 
50  m_nodeType = NodeType::Leaf;
51  m_depth = 0;
52  }
53 
54  template <class T, class P, class BV, int K>
55  inline
56  NodeT<T, P, BV, K>::NodeT(const std::vector<std::shared_ptr<const P> >& a_primitives) : NodeT<T, P, BV, K>() {
57  m_primitives = a_primitives;
58 
59  m_nodeType = NodeType::Leaf;
60  m_depth = 0;
61  }
62 
63  template <class T, class P, class BV, int K>
64  inline
66  }
67 
68  template <class T, class P, class BV, int K>
69  inline
70  void NodeT<T, P, BV, K>::setParent(const NodePtr& a_parent) noexcept {
71  m_parent = a_parent;
72  }
73 
74  template <class T, class P, class BV, int K>
75  inline
76  void NodeT<T, P, BV, K>::setNodeType(const NodeType a_nodeType) noexcept {
77  m_nodeType = a_nodeType;
78  }
79 
80  template <class T, class P, class BV, int K>
81  inline
82  void NodeT<T, P, BV, K>::setDepth(const int a_depth) noexcept {
83  m_depth = a_depth;
84  }
85 
86  template <class T, class P, class BV, int K>
87  inline
88  void NodeT<T, P, BV, K>::setPrimitives(const PrimitiveList& a_primitives) noexcept {
89  m_primitives = a_primitives;
90  }
91 
92  template <class T, class P, class BV, int K>
93  inline
95  m_nodeType = NodeType::Regular;
96  m_primitives.resize(0);
97  }
98 
99  template <class T, class P, class BV, int K>
100  inline
102  return m_nodeType;
103  }
104 
105  template <class T, class P, class BV, int K>
106  inline
107  int NodeT<T, P, BV, K>::getDepth() const noexcept {
108  return m_depth;
109  }
110 
111  template <class T, class P, class BV, int K>
112  inline
114  return (m_primitives);
115  }
116 
117  template <class T, class P, class BV, int K>
118  inline
119  const BV& NodeT<T, P, BV, K>::getBoundingVolume() const noexcept {
120  return (m_boundingVolume);
121  }
122 
123  template <class T, class P, class BV, int K>
124  inline
126  return (m_primitives);
127  }
128 
129  template <class T, class P, class BV, int K>
130  inline
132  const Partitioner& a_partitioner,
133  const StopFunction& a_stopCrit) noexcept {
134 
135 
136  // Compute the bounding volume for this node.
137  std::vector<BV> boundingVolumes;
138  for (const auto& p : m_primitives){
139  boundingVolumes.emplace_back(a_bvConstructor(p));
140  }
141 
142  m_boundingVolume = BV(boundingVolumes);
143 
144  // Check if we can split this node into sub-bounding volumes.
145  const bool stopRecursiveSplitting = a_stopCrit(*this);
146  const bool hasEnoughPrimitives = m_primitives.size() >= K;
147 
148  if(!stopRecursiveSplitting && hasEnoughPrimitives){
149 
150  // Divide primitives into new partitions
151  const auto& newPartitions = a_partitioner(m_primitives); // Divide this node's primitives into K new sub-volume primitives
152  this->insertNodes(newPartitions); // Insert the K new nodes into the tree.
153  this->setToRegularNode(); // This node is no longer a leaf node!
154 
155  // Partition children nodes further
156  for (auto& c : m_children){
157  c->topDownSortAndPartitionPrimitives(a_bvConstructor, a_partitioner, a_stopCrit);
158  }
159  }
160  }
161 
162  template <class T, class P, class BV, int K>
163  inline
164  void NodeT<T, P, BV, K>::insertNode(NodePtr& a_node, const PrimitiveList& a_primitives) noexcept {
165  a_node = std::make_shared<NodeT<T, P, BV, K> >();
166 
167  a_node->setPrimitives(a_primitives);
168  a_node->setParent(std::make_shared<NodeT<T, P, BV, K> >(*this));
169  a_node->setNodeType(NodeType::Leaf);
170  a_node->setDepth(m_depth+1);
171  }
172 
173  template <class T, class P, class BV, int K>
174  inline
175  void NodeT<T, P, BV, K>::insertNodes(const std::array<PrimitiveList, K>& a_primitives) noexcept {
176  for (int l = 0; l < K; l++){
177  m_children[l] = std::make_shared<NodeT<T, P, BV, K> >();
178 
179  m_children[l]->setPrimitives(a_primitives[l]);
180  m_children[l]->setParent(std::make_shared<NodeT<T, P, BV, K> >(*this));
181  m_children[l]->setNodeType(NodeType::Leaf);
182  m_children[l]->setDepth(m_depth+1);
183  }
184  }
185 
186  template <class T, class P, class BV, int K>
187  inline
188  T NodeT<T, P, BV, K>::getDistanceToBoundingVolume(const Vec3& a_point) const noexcept{
189  return m_boundingVolume.getDistance(a_point);
190  }
191 
192  template <class T, class P, class BV, int K>
193  inline
194  T NodeT<T, P, BV, K>::getDistanceToBoundingVolume2(const Vec3& a_point) const noexcept{
195  return m_boundingVolume.getDistance2(a_point);
196  }
197 
198  template <class T, class P, class BV, int K>
199  inline
200  T NodeT<T, P, BV, K>::getDistanceToPrimitives(const Vec3& a_point) const noexcept {
201  T minDist = std::numeric_limits<T>::max();
202 
203  for (const auto& p : m_primitives){
204  const auto curDist = p->signedDistance(a_point);
205 
206  if(curDist*curDist < minDist*minDist){
207  minDist = curDist;
208  }
209  }
210 
211  return minDist;
212  }
213 
214  template <class T, class P, class BV, int K>
215  inline
216  T NodeT<T, P, BV, K>::signedDistance(const Vec3& a_point, const Prune a_pruning) const noexcept {
217  T ret = std::numeric_limits<T>::infinity();
218 
219  switch(a_pruning){
220  case Prune::Ordered:
221  {
222  ret = this->pruneOrdered(a_point);
223 
224  break;
225  }
226  case Prune::Ordered2:
227  {
228  ret = this->pruneOrdered2(a_point);
229 
230  break;
231  }
232  case Prune::Unordered:
233  {
234  ret = this->pruneUnordered(a_point);
235 
236  break;
237  }
238  case Prune::Unordered2:
239  {
240  ret = this->pruneUnordered2(a_point);
241 
242  break;
243  }
244  default:
245  std::cerr << "In file EBGeometry_BVHImplem.hpp function NodeT<T, P, BV, K>::signedDistance(Vec3, Prune) -- bad input enum for 'Prune'\n";
246  };
247 
248  return ret;
249  }
250 
251  template <class T, class P, class BV, int K>
252  inline
253  T NodeT<T, P, BV, K>::pruneOrdered(const Vec3& a_point) const noexcept {
254 
255  // TLDR: This routine does a an ordered search through the tree, using the signed distance for pruning branches.
256 
257  T signedDistance = std::numeric_limits<T>::infinity();
258 
259  this->pruneOrdered(signedDistance, a_point);
260 
261  return signedDistance;
262  }
263 
264  template <class T, class P, class BV, int K>
265  inline
266  void NodeT<T, P, BV, K>::pruneOrdered(T& a_shortestDistanceSoFar, const Vec3& a_point) const noexcept {
267 
268  // TLDR: Beginning at some node, this routine descends the branches in the tree. It always descends the branch with the shortest distance
269  // to the bounding volume first. The other branch is investigated only after the full sub-tree beneath the first branch has completed. Since the shortest
270  // distance to primitives is updated underway, there is a decent chance that the secondary subtree can be pruned. Hence why this routine is more efficient
271  // than prunedUnordered.
272  switch(m_nodeType){
273  case NodeType::Leaf:
274  {
275  // Compute the shortest signed distance to the primitives in this leaf node. If this is shorter than a_shortestDistanceSoFar, update it. Recall
276  // that the comparison requires the absolute value since we're doing the SIGNED distance.
277  const T primDist = this->getDistanceToPrimitives(a_point);
278 
279  if(std::abs(primDist) < std::abs(a_shortestDistanceSoFar)){
280  a_shortestDistanceSoFar = primDist;
281  }
282  break;
283  }
284  case NodeType::Regular:
285  {
286  // In this case we need to decide which subtree to move down. First, sort the children nodes by the distance between
287  // a_point and the children node's bounding volume. Shortest distance goes first.
288  std::array<std::pair<T, NodePtr>, K> distancesAndNodes;
289  for (int i = 0; i < K; i++){
290  distancesAndNodes[i] = std::make_pair(m_children[i]->getDistanceToBoundingVolume(a_point), m_children[i]);
291  }
292 
293  // Comparator for sorting -- puts the node with the shortest distance to the bounding volume at the front of the vector.
294  auto comparator = [](const std::pair<T, NodePtr>& a_node1, const std::pair<T, NodePtr>& a_node2) -> bool{
295  return std::abs(a_node1.first) < std::abs(a_node2.first);
296  };
297 
298  std::sort(distancesAndNodes.begin(), distancesAndNodes.end(), comparator);
299 
300  // Go through the children nodes -- closest node goes first. We prune branches
301  // if the distance to the node's bounding volume is longer than the shortest distance we've found so far.
302  for (int i = 0; i < K; i++){
303  const std::pair<T, NodePtr>& curChildNode = distancesAndNodes[i];
304 
305  // a_shortestDistanceSoFar is the SIGNED distance, so we need the absolute value here.
306  if(std::abs(curChildNode.first) <= std::abs(a_shortestDistanceSoFar)){
307  curChildNode.second->pruneOrdered(a_shortestDistanceSoFar, a_point);
308  }
309  else{ // Prune the rest of the children nodes.
310  break;
311  }
312  }
313  break;
314  }
315  }
316  }
317 
318  template <class T, class P, class BV, int K>
319  inline
320  T NodeT<T, P, BV, K>::pruneOrdered2(const Vec3& a_point) const noexcept {
321 
322  // TLDR: This routine does an ordered search through the tree, using the squared distance for pruning branches. This is slightly
323  // more efficient than using the signed distance.
324 
325  T shortestSquareDistance = std::numeric_limits<T>::infinity(); // Our starting guess for the distance between a_point and the primitives.
326  std::shared_ptr<const P> closestPrimitive = nullptr; // This will be a reference to the closest primitive. We only take the signed distance at the end.
327 
328  // Move down the tree, pruning as we go along. This routine does all the comparison tests using the
329  // unsigned square distance. When it terminates, closestPrimitive is the primitive which has the shortest
330  // unsigned squared distance between itself and the point x.
331  this->pruneOrdered2(shortestSquareDistance, closestPrimitive, a_point);
332 
333  // We have found the closest primitive -- return the signed distance
334  return closestPrimitive->signedDistance(a_point);
335  }
336 
337  template <class T, class P, class BV, int K>
338  inline
339  void NodeT<T, P, BV, K>::pruneOrdered2(T& a_shortestSquareDistanceSoFar2, std::shared_ptr<const P>& a_closestPrimitiveSoFar, const Vec3& a_point) const noexcept {
340  // TLDR: Beginning at some node, this routine descends branches in the tree. It always descends the branch with the shortest distance
341  // to the bounding volume first. The other branches are investigated only after the full sub-tree beneath the first branch has completed. Since the shortest
342  // distance to primitives is updated underway, there is a decent chance that the other subtrees can be pruned. Hence why this routine is more efficient
343  // than prunedUnordered.
344 
345  switch(m_nodeType){
346  case NodeType::Leaf:
347  {
348  // If we are at a leaf ndoe, compute the shortest unsigned square distance to the primitives in the node. If this is shorter
349  // than a_shortestSquareDistanceSoFar, update the shortest distance and the closest primitive.
350  for (const auto& curPrimitive : m_primitives){
351  const auto curDist2 = curPrimitive->unsignedDistance2(a_point);
352 
353  if(curDist2 < a_shortestSquareDistanceSoFar2){
354  a_shortestSquareDistanceSoFar2 = curDist2;
355  a_closestPrimitiveSoFar = curPrimitive;
356  }
357  }
358  break;
359  }
360  case NodeType::Regular:
361  {
362  // In this case we are at a regular node, and we need to decide which subtree to move down. First, we sort
363  // the children nodes by the distance between a_point and the children node's bounding volume. Shortest
364  // distance goes first.
365  std::array<std::pair<T, NodePtr>, K> distancesAndNodes;
366  for (int i = 0; i < K; i++){
367  distancesAndNodes[i] = std::make_pair(m_children[i]->getDistanceToBoundingVolume2(a_point), m_children[i]);
368  }
369 
370  // Sorting criterion. Closest node goes first.
371  auto comparator = [](const std::pair<T, NodePtr>& a_node1, const std::pair<T, NodePtr>& a_node2) -> bool{
372  return std::abs(a_node1.first) < std::abs(a_node2.first);
373  };
374 
375  std::sort(distancesAndNodes.begin(), distancesAndNodes.end(), comparator);
376 
377  // Next, we go through the children nodes -- closest node goes first. We prune branches
378  // if the distance to the node's bounding volume is longer than the shortest distance we've found so far.
379  for (int i = 0; i < K; i++){
380  const std::pair<T, NodePtr>& node = distancesAndNodes[i];
381 
382  if(node.first <= a_shortestSquareDistanceSoFar2){
383  node.second->pruneOrdered2(a_shortestSquareDistanceSoFar2, a_closestPrimitiveSoFar, a_point);
384  }
385  else{ // Prune the other subtrees.
386  break;
387  }
388  }
389  break;
390  }
391  }
392  }
393 
394  template <class T, class P, class BV, int K>
395  inline
396  T NodeT<T, P, BV, K>::pruneUnordered(const Vec3& a_point) const noexcept {
397  // TLDR: This routine does an unordered search through the BVH. It visits nodes in the order in which they were created. This is
398  // way slower than an ordered search. This routine computes the signed distance and uses that in order to prune branches.
399 
400  T signedDistance = std::numeric_limits<T>::infinity();
401 
402  this->pruneUnordered(signedDistance, a_point);
403 
404  return signedDistance;
405  }
406 
407  template <class T, class P, class BV, int K>
408  inline
409  void NodeT<T, P, BV, K>::pruneUnordered(T& a_shortestDistanceSoFar, const Vec3& a_point) const noexcept {
410 
411  switch(m_nodeType){
412  case NodeType::Leaf:
413  {
414  // Check if the distance to the primitives in this leaf is shorter than a_shortestDistanceSoFar. If it is, update the
415  // shortest distance.
416  const T curSignedDistance = this->getDistanceToPrimitives(a_point);
417 
418  if(std::abs(curSignedDistance) < std::abs(a_shortestDistanceSoFar)){
419  a_shortestDistanceSoFar = curSignedDistance;
420  }
421  break;
422  }
423  case NodeType::Regular:
424  {
425  // Investigate subtrees. Prune subtrees if the distance to their bounding volumes are longer than the shortest distance
426  // we've found so far.
427  for (const auto& child : m_children){
428  const T distanceToChildBoundingVolume = child->getDistanceToBoundingVolume(a_point);
429 
430  if(std::abs(distanceToChildBoundingVolume) < std::abs(a_shortestDistanceSoFar)){
431  child->pruneUnordered(a_shortestDistanceSoFar, a_point);
432  }
433  }
434  break;
435  }
436  }
437  }
438 
439  template <class T, class P, class BV, int K>
440  inline
441  T NodeT<T, P, BV, K>::pruneUnordered2(const Vec3& a_point) const noexcept {
442 
443  // TLDR: This routine does an unordered search through the BVH. It visits nodes in the order in which they were created. This is
444  // way slower than an ordered search. This routine computes the unsigned square distance and uses that in order to prune branches.
445 
446  T shortestSquareDistance = std::numeric_limits<T>::infinity(); // Our initial guess for the shortest distance so far.
447  std::shared_ptr<const P> closestPrimitive = nullptr; // After pruneUnordered2 below, this will be the closest primitive.
448 
449  // Move down the tree, pruning as we go along. This routine does all the comparison tests using the
450  // unsigned square distance. When it terminates, closestPrimitive is the primitive which has the shortest
451  // unsigned squared distance between itself and the point x.
452  this->pruneUnordered2(shortestSquareDistance, closestPrimitive, a_point);
453 
454  // We now have the closest primitive -- return the signed distance to it.
455  return closestPrimitive->signedDistance(a_point);
456  }
457 
458  template <class T, class P, class BV, int K>
459  inline
460  void NodeT<T, P, BV, K>::pruneUnordered2(T& a_shortestUnsignedSquareDistanceSoFar, std::shared_ptr<const P>& a_closestPrimitiveSoFar, const Vec3& a_point) const noexcept {
461 
462  switch(m_nodeType){
463  case NodeType::Leaf:
464  {
465  // Check if the squared distance to the primitives in this leaf is shorter than a_shortestUnsignedSquareDistanceSoFar. If it is, update the
466  // shortest distance and primitive.
467  for (const auto& curPrim : m_primitives){
468  const auto curUnsignedSquareDistance = curPrim->unsignedDistance2(a_point);
469 
470  if(curUnsignedSquareDistance < a_shortestUnsignedSquareDistanceSoFar){
471  a_shortestUnsignedSquareDistanceSoFar = curUnsignedSquareDistance;
472  a_closestPrimitiveSoFar = curPrim;
473  }
474  }
475  break;
476  }
477  case NodeType::Regular:
478  {
479  // Investigate subtrees. Prune subtrees if the distance to their bounding volumes are longer than the shortest distance
480  // we've found so far.
481  for (const auto& child : m_children){
482  const T squaredDistanceToChildBoundingVolume = child->getDistanceToBoundingVolume2(a_point);
483 
484  if(squaredDistanceToChildBoundingVolume < a_shortestUnsignedSquareDistanceSoFar){
485  child->pruneUnordered2(a_shortestUnsignedSquareDistanceSoFar, a_closestPrimitiveSoFar, a_point);
486  }
487  }
488  break;
489  }
490  }
491  }
492 
493  template <class T, class P, class BV, int K>
494  inline
495  std::shared_ptr<LinearBVH<T, P, BV, K> > NodeT<T, P, BV, K>::flattenTree() {
496 
497  // Create a list of sorted primitives and nodes.
498  std::vector<std::shared_ptr<const P> > sortedPrimitives;
499  std::vector<LinearNodeT<T, P, BV, K> > linearNodes;
500 
501  // Track the offset into the linearized node array.
502  unsigned long offset = 0;
503 
504  // Flatten recursively.
505  this->flattenTree(linearNodes, sortedPrimitives, offset);
506 
507  // Return the root node.
508  return std::make_shared<LinearBVH<T, P, BV, K> >(linearNodes, sortedPrimitives);
509  }
510 
511  template <class T, class P, class BV, int K>
512  inline
513  unsigned long NodeT<T, P, BV, K>::flattenTree(std::vector<LinearNodeT<T, P, BV, K> >& a_linearNodes,
514  std::vector<std::shared_ptr<const P> >& a_sortedPrimitives,
515  unsigned long& a_offset) const noexcept {
516 
517  // TLDR: This is the main routine for flattening the hierarchy beneath the current node. When this is called we insert
518  // this node into a_linearNodes and associate the array offsets so that we can find the children in the linearized array.
519 
520  // Current node we are dealing with.
521  const auto curNode = a_offset;
522 
523  // Insert a new node corresponding to this node and provide it with the current bounding volume.
524  a_linearNodes.emplace_back(LinearNodeT<T, P, BV, K>());
525  a_linearNodes[curNode].setBoundingVolume(m_boundingVolume);
526 
527  a_offset++;
528 
529  switch(m_nodeType){
530  case NodeType::Leaf:
531  {
532  // Insert primitives and offsets.
533  a_linearNodes[curNode].setNumPrimitives (m_primitives. size());
534  a_linearNodes[curNode].setPrimitivesOffset(a_sortedPrimitives.size());
535 
536  a_sortedPrimitives.insert(a_sortedPrimitives.end(), m_primitives.begin(), m_primitives.end());
537 
538  break;
539  }
540  case NodeType::Regular:
541  {
542  a_linearNodes[curNode].setNumPrimitives (0 );
543  a_linearNodes[curNode].setPrimitivesOffset(0UL);
544 
545  // Go through the children nodes and
546  for (int k = 0; k < K; k++){
547  const int offset = m_children[k]->flattenTree(a_linearNodes, a_sortedPrimitives, a_offset);
548 
549  a_linearNodes[curNode].setChildOffset(offset, k);
550  }
551 
552  break;
553  }
554  }
555 
556  return curNode;
557  }
558 
559  template <class T, class P, class BV, int K>
560  inline
562 
563  // Initialize everything.
564  m_boundingVolume = BV();
565  m_primitivesOffset = 0UL;
566  m_numPrimitives = 0;
567 
568  for (auto& offset : m_childOffsets){
569  offset = 0UL;
570  }
571  }
572 
573  template <class T, class P, class BV, int K>
574  inline
576  }
577 
578  template <class T, class P, class BV, int K>
579  inline
580  void LinearNodeT<T, P, BV, K>::setBoundingVolume(const BV& a_boundingVolume) noexcept {
581  m_boundingVolume = a_boundingVolume;
582  }
583 
584  template <class T, class P, class BV, int K>
585  inline
586  void LinearNodeT<T, P, BV, K>::setPrimitivesOffset(const unsigned long a_primitivesOffset) noexcept {
587  m_primitivesOffset = a_primitivesOffset;
588  }
589 
590  template <class T, class P, class BV, int K>
591  inline
592  void LinearNodeT<T, P, BV, K>::setNumPrimitives(const int a_numPrimitives) noexcept {
593  m_numPrimitives = a_numPrimitives;
594  }
595 
596  template <class T, class P, class BV, int K>
597  inline
598  void LinearNodeT<T, P, BV, K>::setChildOffset(const unsigned long a_childOffset, const int a_whichChild) noexcept {
599  m_childOffsets[a_whichChild] = a_childOffset;
600  }
601 
602  template <class T, class P, class BV, int K>
603  inline
604  const BV& LinearNodeT<T, P, BV, K>::getBoundingVolume() const noexcept {
605  return m_boundingVolume;
606  }
607 
608  template <class T, class P, class BV, int K>
609  inline
610  const unsigned long& LinearNodeT<T, P, BV, K>::getPrimitivesOffset() const noexcept {
611  return m_primitivesOffset;
612  }
613 
614  template <class T, class P, class BV, int K>
615  inline
616  const unsigned long& LinearNodeT<T, P, BV, K>::getNumPrimitives() const noexcept {
617  return m_numPrimitives;
618  }
619 
620  template <class T, class P, class BV, int K>
621  inline
622  const std::array<unsigned long, K>& LinearNodeT<T, P, BV, K>::getChildOffsets() const noexcept {
623  return m_childOffsets;
624  }
625 
626  template <class T, class P, class BV, int K>
627  inline
628  bool LinearNodeT<T, P, BV, K>::isLeaf() const noexcept {
629  return m_numPrimitives > 0;
630  }
631 
632  template <class T, class P, class BV, int K>
633  inline
635  return m_boundingVolume.getDistance(a_point);
636  }
637 
638  template <class T, class P, class BV, int K>
639  inline
641  return m_boundingVolume.getDistance2(a_point);
642  }
643 
644  template <class T, class P, class BV, int K>
645  inline
646  T LinearNodeT<T, P, BV, K>::getDistanceToPrimitives(const Vec3T<T>& a_point, const std::vector<std::shared_ptr<const P> >& a_primitives) const noexcept {
647  T minDist = std::numeric_limits<T>::infinity();
648 
649  for (unsigned int i = 0; i < m_numPrimitives; i++){
650  const T curDist = a_primitives[m_primitivesOffset + i]->signedDistance(a_point);
651 
652  if(std::abs(curDist) < std::abs(minDist)){
653  minDist = curDist;
654  }
655  }
656 
657  return minDist;
658  }
659 
660  template <class T, class P, class BV, int K>
661  inline
662  void LinearNodeT<T, P, BV, K>::pruneOrdered2(T& a_shortestSquareDistanceSoFar,
663  unsigned long& a_closestPrimitiveSoFar,
664  const Vec3& a_point,
665  const std::vector<LinearNodeT<T, P, BV, K> >& a_linearNodes,
666  const std::vector<std::shared_ptr<const P> >& a_primitives) const noexcept {
667 
668  // If this is a leaf node, see if one of the primitives in this node is closer than the closest distance this far. If it is,
669  // update the closest primitive.
670 
671  if(m_numPrimitives > 0){
672 
673  // See if this node has primitives that are closer than the closest one we've found so far.
674  for (unsigned int i = 0; i < m_numPrimitives; i++){
675  const std::shared_ptr<const P>& curPrim = a_primitives[m_primitivesOffset + i];
676 
677  const T curDist2 = curPrim->unsignedDistance2(a_point);
678 
679  if(curDist2 < a_shortestSquareDistanceSoFar){
680  a_shortestSquareDistanceSoFar = curDist2;
681  a_closestPrimitiveSoFar = m_primitivesOffset + i;
682  }
683  }
684  }
685  else{
686  // In this case we are at a regular node and we need to determine which branch to descend first. One we've selected a branch we won't visit
687  // the other branch until we've drilled all the way down into the bottom of the tree, so this choice is critical. We assume that the closest
688  // bounding volume is more likely to also contain the closest primitive, so we sort the distance to the bounding volumes and take the closest
689  // bounding volume first.
690 
691  // Compute the distance to the child node bounding volumes.
692  std::array<std::pair<T, unsigned long>, K > distancesAndNodes;
693  for (int k = 0; k < K; k++){
694  const unsigned long& childOffset = m_childOffsets[k];
695  const LinearNodeT<T, P, BV, K>& childNode = a_linearNodes[childOffset];
696 
697  distancesAndNodes[k] = std::make_pair(childNode.getDistanceToBoundingVolume2(a_point), childOffset);
698  }
699 
700  // Sort, closest node goes first.
701  std::sort(distancesAndNodes.begin(),
702  distancesAndNodes.end(),
703  [](const std::pair<T, unsigned long>& node1, const std::pair<T, unsigned long>& node2){
704  return node1.first < node2.first;
705  });
706 
707 
708  // Go through the child nodes and call this function again.
709  for (int k = 0; k < K; k++){
710  const unsigned long& childOffset = distancesAndNodes[k].second;
711  const LinearNodeT<T, P, BV, K>& childNode = a_linearNodes[childOffset];
712 
713  if(distancesAndNodes[k].first < a_shortestSquareDistanceSoFar){
714  childNode.pruneOrdered2(a_shortestSquareDistanceSoFar, a_closestPrimitiveSoFar, a_point, a_linearNodes, a_primitives);
715  }
716  else{ // Prune the other subtree.
717  break;
718  }
719  }
720  }
721  }
722 
723  template <class T, class P, class BV, int K>
724  inline
725  LinearBVH<T, P, BV, K>::LinearBVH(const std::vector<LinearNode>& a_linearNodes,
726  const PrimitiveList& a_primitives) {
727  m_linearNodes = a_linearNodes;
728  m_primitives = a_primitives ;
729  }
730 
731  template <class T, class P, class BV, int K>
732  inline
734 
735  }
736 
737  template <class T, class P, class BV, int K>
738  T LinearBVH<T, P, BV, K>::signedDistance(const Vec3& a_point, const Prune a_pruning) const noexcept {
739  T minDist = std::numeric_limits<T>::infinity();
740 
741  switch(a_pruning){
742  case Prune::Ordered2:
743  {
744  unsigned long closestPrimitiveSoFar = 0UL;
745 
746  m_linearNodes[0].pruneOrdered2(minDist, closestPrimitiveSoFar, a_point, m_linearNodes, m_primitives);
747 
748  minDist = m_primitives[closestPrimitiveSoFar]->signedDistance(a_point);
749 
750  break;
751  }
752  default:
753  std::cerr << "In file EBGeometry_BVHImplem.hpp function LinearBVH<T, P, BV, K>::signedDistance(Vec3, Prune) -- bad input enum for 'Prune'\n";
754  };
755 
756  return minDist;
757  }
758 
759 
760 }
761 
763 
764 #endif
T getDistanceToBoundingVolume(const Vec3 &a_point) const noexcept
Get the distance from a 3D point to the bounding volume.
Definition: EBGeometry_BVHImplem.hpp:634
+
virtual ~LinearBVH()
Destructor. Does nothing.
Definition: EBGeometry_BVHImplem.hpp:733
+
const unsigned long & getNumPrimitives() const noexcept
Get the number of primitives.
Definition: EBGeometry_BVHImplem.hpp:616
+
int m_depth
Node depth.
Definition: EBGeometry_BVH.hpp:296
+
LinearBVH()=delete
Disallowed. Use the full constructor please.
+
void setToRegularNode() noexcept
Set to regular node.
Definition: EBGeometry_BVHImplem.hpp:94
+
NodeT()
Default constructor which sets a regular node without any data (no parent/children and no depth) ...
Definition: EBGeometry_BVHImplem.hpp:22
+
T pruneUnordered(const Vec3 &a_point) const noexcept
Function which computes the signed distance using unordered pruning along the BVH branches...
Definition: EBGeometry_BVHImplem.hpp:396
+
T signedDistance(const Vec3 &a_point, const Prune a_pruning=Prune::Ordered2) const noexcept
Function which computes the signed distance.
Definition: EBGeometry_BVHImplem.hpp:216
+
Forward declare the BVH node since it is needed for the polymorphic lambdas.
Definition: EBGeometry_BVH.hpp:35
+
NodeType m_nodeType
Node type (leaf or regular)
Definition: EBGeometry_BVH.hpp:291
+
const unsigned long & getPrimitivesOffset() const noexcept
Get the primitives offset.
Definition: EBGeometry_BVHImplem.hpp:610
+
T signedDistance(const Vec3 &a_point, const Prune a_pruning=Prune::Ordered2) const noexcept
Function which computes the signed distance.
Definition: EBGeometry_BVHImplem.hpp:738
+
std::vector< std::shared_ptr< const P > > PrimitiveList
List of primitives.
Definition: EBGeometry_BVH.hpp:630
+
Forward declare linear node class.
Definition: EBGeometry_BVH.hpp:41
+
void setBoundingVolume(const BV &a_boundingVolume) noexcept
Set the bounding volume.
Definition: EBGeometry_BVHImplem.hpp:580
+
bool isLeaf() const noexcept
Is leaf or not.
Definition: EBGeometry_BVHImplem.hpp:628
+
void insertNodes(const std::array< PrimitiveList, K > &a_primitives) noexcept
Insert nodes with primitives.
Definition: EBGeometry_BVHImplem.hpp:175
+
Namespace for various bounding volume heirarchy (BVH) functionality.
Definition: EBGeometry_BVH.hpp:28
+
Declaration of a bounding volume hierarchy (BVH) class.
+
T getDistanceToBoundingVolume2(const Vec3 &a_point) const noexcept
Get the unsigned square from a 3D point to the bounding volume.
Definition: EBGeometry_BVHImplem.hpp:194
+
T pruneOrdered(const Vec3 &a_point) const noexcept
Function which computes the signed distance using ordered pruning along the BVH branches.
Definition: EBGeometry_BVHImplem.hpp:253
+
void topDownSortAndPartitionPrimitives(const BVConstructor &a_bvConstructor, const Partitioner &a_partitioner, const StopFunction &a_stopCrit) noexcept
Function for using top-down construction of the bounding volume hierarchy.
Definition: EBGeometry_BVHImplem.hpp:131
+
LinearNodeT()
Constructor.
Definition: EBGeometry_BVHImplem.hpp:561
+
void insertNode(NodePtr &a_node, const PrimitiveList &a_primitives) noexcept
Insert a new node in the tree.
Definition: EBGeometry_BVHImplem.hpp:164
+
void setNumPrimitives(const int a_numPrimitives) noexcept
Set number of primitives.
Definition: EBGeometry_BVHImplem.hpp:592
+
BVConstructorT< P, BV > BVConstructor
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:141
+
std::shared_ptr< Node > NodePtr
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:126
+
void setDepth(const int a_depth) noexcept
Set node depth.
Definition: EBGeometry_BVHImplem.hpp:82
+
T getDistanceToPrimitives(const Vec3 &a_point) const noexcept
Compute the shortest distance to the primitives in this node.
Definition: EBGeometry_BVHImplem.hpp:200
+
PrimitiveListT< P > PrimitiveList
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:110
+
int getDepth() const noexcept
Get the depth of the current node.
Definition: EBGeometry_BVHImplem.hpp:107
+
void setPrimitives(const PrimitiveList &a_primitives) noexcept
Set primitives in this node.
Definition: EBGeometry_BVHImplem.hpp:88
+
NodeType
Enum for determining if a BVH node is a leaf or a regular node (only leaf nodes contain data) ...
Definition: EBGeometry_BVH.hpp:82
+
NodeType getNodeType() const noexcept
Get the node type.
Definition: EBGeometry_BVHImplem.hpp:101
+ +
T pruneOrdered2(const Vec3 &a_point) const noexcept
Function which computes the signed distance using ordered pruning along the BVH branches.
Definition: EBGeometry_BVHImplem.hpp:320
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
std::vector< std::shared_ptr< const P > > PrimitiveListT
Alias to cut down on typing.
Definition: EBGeometry_BVH.hpp:53
+
void setPrimitivesOffset(const unsigned long a_primitivesOffset) noexcept
Set the offset into the primitives array.
Definition: EBGeometry_BVHImplem.hpp:586
+
void pruneOrdered2(T &a_shortestSquareDistanceSoFar, unsigned long &a_closestPrimitiveSoFar, const Vec3 &a_point, const std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, const std::vector< std::shared_ptr< const P > > &a_primitives) const noexcept
Pruning algorithm. This is the same algorithm as NodeT::pruneOrdered2, except that the nodes and prim...
Definition: EBGeometry_BVHImplem.hpp:662
+
void setChildOffset(const unsigned long a_childOffset, const int a_whichChild) noexcept
Set the child offsets.
Definition: EBGeometry_BVHImplem.hpp:598
+
~NodeT()
Destructor (does nothing)
Definition: EBGeometry_BVHImplem.hpp:65
+
virtual ~LinearNodeT()
Destructor.
Definition: EBGeometry_BVHImplem.hpp:575
+
const std::array< unsigned long, K > & getChildOffsets() const noexcept
Get the child offsets.
Definition: EBGeometry_BVHImplem.hpp:622
+
std::array< NodePtr, K > m_children
Children nodes.
Definition: EBGeometry_BVH.hpp:306
+
BV m_boundingVolume
Bounding volume object.
Definition: EBGeometry_BVH.hpp:286
+
void setParent(const NodePtr &a_parent) noexcept
Set parent node.
Definition: EBGeometry_BVHImplem.hpp:70
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+
PrimitiveList m_primitives
Primitives list. This will be empty for regular nodes.
Definition: EBGeometry_BVH.hpp:301
+
Prune
Typename for identifying algorithms used in subtree pruning.
Definition: EBGeometry_BVH.hpp:90
+ +
const BV & getBoundingVolume() const noexcept
Get the node bounding volume. return m_boundingVolume.
Definition: EBGeometry_BVHImplem.hpp:604
+
std::shared_ptr< LinearBVH< T, P, BV, K > > flattenTree()
Flatten everything beneath this node into a depth-first sorted BVH hierarchy.
Definition: EBGeometry_BVHImplem.hpp:495
+
NodePtr m_parent
Pointer to parent node.
Definition: EBGeometry_BVH.hpp:311
+
StopFunctionT< T, P, BV, K > StopFunction
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:131
+
const PrimitiveList & getPrimitives() const noexcept
Get the primitives stored in this node.
Definition: EBGeometry_BVHImplem.hpp:125
+
void setNodeType(const NodeType a_nodeType) noexcept
Set node type to leaf or regular.
Definition: EBGeometry_BVHImplem.hpp:76
+
T pruneUnordered2(const Vec3 &a_point) const noexcept
Function which computes the signed distance using unordered pruning along the BVH branches...
Definition: EBGeometry_BVHImplem.hpp:441
+
T getDistanceToPrimitives(const Vec3 &a_point, const std::vector< std::shared_ptr< const P > > &a_primitives) const noexcept
Compute signed distance to primitives.
Definition: EBGeometry_BVHImplem.hpp:646
+
PartitionerT< P, K > Partitioner
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:136
+
const BV & getBoundingVolume() const noexcept
Get bounding volume.
Definition: EBGeometry_BVHImplem.hpp:119
+
T getDistanceToBoundingVolume(const Vec3 &a_point) const noexcept
Get the distance from a 3D point to the bounding volume.
Definition: EBGeometry_BVHImplem.hpp:188
+
T getDistanceToBoundingVolume2(const Vec3 &a_point) const noexcept
Get the unsigned square from a 3D point to the bounding volume.
Definition: EBGeometry_BVHImplem.hpp:640
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp.html b/docs/doxygen/html/EBGeometry__BVH_8hpp.html new file mode 100644 index 00000000..82583343 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVH_8hpp.html @@ -0,0 +1,184 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BVH.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_BVH.hpp File Reference
+
+
+ +

Declaration of a bounding volume hierarchy (BVH) class. +More...

+
#include <memory>
+#include <vector>
+#include <functional>
+#include <queue>
+#include "EBGeometry_Vec.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_BVHImplem.hpp"
+
+Include dependency graph for EBGeometry_BVH.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + +

+Classes

class  BVH::NodeT< T, P, BV, K >
 Forward declare the BVH node since it is needed for the polymorphic lambdas. More...
 
class  BVH::LinearNodeT< T, P, BV, K >
 Forward declare linear node class. More...
 
class  BVH::LinearBVH< T, P, BV, K >
 Forward declare linear BVH class. More...
 
class  BVH::NodeT< T, P, BV, K >
 Forward declare the BVH node since it is needed for the polymorphic lambdas. More...
 
class  BVH::LinearNodeT< T, P, BV, K >
 Forward declare linear node class. More...
 
class  BVH::LinearBVH< T, P, BV, K >
 Forward declare linear BVH class. More...
 
+ + + + +

+Namespaces

 BVH
 Namespace for various bounding volume heirarchy (BVH) functionality.
 
+ + + + + + + + + + + + + + + + + +

+Typedefs

+template<class P >
using BVH::PrimitiveListT = std::vector< std::shared_ptr< const P > >
 Alias to cut down on typing.
 
template<class T , class P , class BV , int K>
using BVH::StopFunctionT = std::function< bool(const NodeT< T, P, BV, K > &a_node)>
 Stop function for deciding when a BVH node can't be divided into sub-volumes. More...
 
template<class P , int K>
using BVH::PartitionerT = std::function< std::array< PrimitiveListT< P >, K >(const PrimitiveListT< P > &a_primitives)>
 Polymorphic partitioner for splitting a list of primitives into K new lists of primitives. More...
 
template<class P , class BV >
using BVH::BVConstructorT = std::function< BV(const std::shared_ptr< const P > &a_primitive)>
 Constructor method for creating bounding volumes from a list of primitives. More...
 
+ + + + + + + +

+Enumerations

enum  BVH::NodeType : bool { Regular, +Leaf + }
 Enum for determining if a BVH node is a leaf or a regular node (only leaf nodes contain data)
 
enum  BVH::Prune { Ordered, +Ordered2, +Unordered, +Unordered2 + }
 Typename for identifying algorithms used in subtree pruning.
 
+

Detailed Description

+

Declaration of a bounding volume hierarchy (BVH) class.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.map new file mode 100644 index 00000000..b6153461 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.md5 new file mode 100644 index 00000000..06ec26b2 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +b6df1d91d1f361a954eaac80e55c0bcd \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.png new file mode 100644 index 00000000..66caec6d Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BVH_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.map b/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.map new file mode 100644 index 00000000..4d79f6f6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.md5 new file mode 100644 index 00000000..e02e82d1 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.md5 @@ -0,0 +1 @@ +fcf973f15b48bc5a53b95868ca771613 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.png b/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.png new file mode 100644 index 00000000..66b80e3f Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BVH_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BVH_8hpp_source.html b/docs/doxygen/html/EBGeometry__BVH_8hpp_source.html new file mode 100644 index 00000000..e44182de --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BVH_8hpp_source.html @@ -0,0 +1,100 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BVH.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_BVH.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_BVH
13 #define EBGeometry_BVH
14 
15 // Std includes
16 #include <memory>
17 #include <vector>
18 #include <functional>
19 #include <queue>
20 
21 // Our includes
22 #include "EBGeometry_Vec.hpp"
24 
28 namespace BVH {
29 
34  template <class T, class P, class BV, int K>
35  class NodeT;
36 
40  template <class T, class P, class BV, int K>
41  class LinearNodeT;
42 
46  template <class T, class P, class BV, int K>
47  class LinearBVH;
48 
52  template <class P>
53  using PrimitiveListT = std::vector<std::shared_ptr<const P> >;
54 
60  template <class T, class P, class BV, int K>
61  using StopFunctionT = std::function<bool(const NodeT<T, P, BV, K>& a_node)>;
62 
68  template <class P, int K>
69  using PartitionerT = std::function<std::array<PrimitiveListT<P>, K>(const PrimitiveListT<P>& a_primitives)>;
70 
76  template <class P, class BV>
77  using BVConstructorT = std::function<BV(const std::shared_ptr<const P>& a_primitive)>;
78 
82  enum class NodeType : bool {
83  Regular,
84  Leaf,
85  };
86 
90  enum class Prune {
91  Ordered,
92  Ordered2,
93  Unordered,
94  Unordered2,
95  };
96 
103  template <class T, class P, class BV, int K>
104  class NodeT {
105  public:
106 
111 
115  using Vec3 = Vec3T<T>;
116 
122 
126  using NodePtr = std::shared_ptr<Node>;
127 
132 
137 
142 
146  NodeT();
147 
154  NodeT(const NodePtr& a_parent);
155 
162  NodeT(const std::vector<std::shared_ptr<P> >& a_primitives);
163 
169  NodeT(const std::vector<std::shared_ptr<const P> >& a_primitives);
170 
174  ~NodeT();
175 
184  inline
185  void topDownSortAndPartitionPrimitives(const BVConstructor& a_bvConstructor,
186  const Partitioner& a_partitioner,
187  const StopFunction& a_stopCrit) noexcept;
188 
189 
194  inline
195  int getDepth() const noexcept;
196 
201  inline
202  const PrimitiveList& getPrimitives() const noexcept;
203 
207  inline
208  const BV& getBoundingVolume() const noexcept;
209 
217  inline
218  T signedDistance(const Vec3& a_point, const Prune a_pruning = Prune::Ordered2) const noexcept;
219 
228  inline
229  T pruneOrdered(const Vec3& a_point) const noexcept;
230 
242  inline
243  T pruneOrdered2(const Vec3& a_point) const noexcept;
244 
256  inline
257  T pruneUnordered(const Vec3& a_point) const noexcept;
258 
271  inline
272  T pruneUnordered2(const Vec3& a_point) const noexcept;
273 
278  inline
279  std::shared_ptr<LinearBVH<T, P, BV, K> > flattenTree();
280 
281  protected:
282 
286  BV m_boundingVolume;
287 
291  NodeType m_nodeType;
292 
296  int m_depth;
297 
301  PrimitiveList m_primitives;
302 
306  std::array<NodePtr, K> m_children;
307 
311  NodePtr m_parent;
312 
317  inline
318  void setNodeType(const NodeType a_nodeType) noexcept;
319 
324  inline
325  void setDepth(const int a_depth) noexcept;
326 
332  inline
333  void insertNode(NodePtr& a_node, const PrimitiveList& a_primitives) noexcept;
334 
338  inline
339  void insertNodes(const std::array<PrimitiveList, K>& a_primitives) noexcept;
340 
345  inline
346  void setToRegularNode() noexcept;
347 
352  inline
353  void setPrimitives(const PrimitiveList& a_primitives) noexcept;
354 
360  inline
361  T getDistanceToBoundingVolume(const Vec3& a_point) const noexcept;
362 
368  inline
369  T getDistanceToBoundingVolume2(const Vec3& a_point) const noexcept;
370 
376  inline
377  T getDistanceToPrimitives(const Vec3& a_point) const noexcept;
378 
383  inline
384  NodeType getNodeType() const noexcept;
385 
390  inline
391  PrimitiveList& getPrimitives() noexcept;
392 
397  inline
398  void setParent(const NodePtr& a_parent) noexcept;
399 
405  inline
406  void pruneOrdered(T& a_closest, const Vec3& a_point) const noexcept;
407 
414  inline
415  void pruneOrdered2(T& a_minDist2, std::shared_ptr<const P>& a_closest, const Vec3& a_point) const noexcept;
416 
422  inline
423  void pruneUnordered(T& a_closest, const Vec3& a_point) const noexcept;
424 
431  inline
432  void pruneUnordered2(T& a_minDist2, std::shared_ptr<const P>& a_closest, const Vec3& a_point) const noexcept;
433 
443  inline
444  unsigned long flattenTree(std::vector<LinearNodeT<T, P, BV, K> >& a_linearNodes,
445  std::vector<std::shared_ptr<const P> >& a_sortedPrimitives,
446  unsigned long& a_offset) const noexcept;
447  };
448 
470  template <class T, class P, class BV, int K>
471  class LinearNodeT {
472  public:
473 
477  using Vec3 = Vec3T<T>;
478 
482  inline
483  LinearNodeT();
484 
488  inline
489  virtual ~LinearNodeT();
490 
495  inline
496  void setBoundingVolume(const BV& a_boundingVolume) noexcept;
497 
501  inline
502  void setPrimitivesOffset(const unsigned long a_primitivesOffset) noexcept;
503 
508  inline
509  void setNumPrimitives(const int a_numPrimitives) noexcept;
510 
516  inline
517  void setChildOffset(const unsigned long a_childOffset, const int a_whichChild) noexcept;
518 
523  inline
524  const BV& getBoundingVolume() const noexcept;
525 
530  inline
531  const unsigned long& getPrimitivesOffset() const noexcept;
532 
537  inline
538  const unsigned long& getNumPrimitives() const noexcept;
539 
544  inline
545  const std::array<unsigned long, K>& getChildOffsets() const noexcept;
546 
550  inline
551  bool isLeaf() const noexcept;
552 
558  inline
559  T getDistanceToBoundingVolume(const Vec3& a_point) const noexcept;
560 
566  inline
567  T getDistanceToBoundingVolume2(const Vec3& a_point) const noexcept;
568 
573  inline
574  T getDistanceToPrimitives(const Vec3& a_point, const std::vector<std::shared_ptr<const P> >& a_primitives) const noexcept;
575 
580  inline
581  void pruneOrdered2(T& a_shortestSquareDistanceSoFar,
582  unsigned long& a_closestPrimitiveSoFar,
583  const Vec3& a_point,
584  const std::vector<LinearNodeT<T, P, BV, K> >& a_linearNodes,
585  const std::vector<std::shared_ptr<const P> >& a_primitives) const noexcept;
586 
587  protected:
588 
592  BV m_boundingVolume;
593 
597  unsigned long m_primitivesOffset;
598 
602  int m_numPrimitives;
603 
607  std::array<unsigned long, K> m_childOffsets;
608  };
609 
613  template<class T, class P, class BV, int K>
614  class LinearBVH {
615  public:
616 
620  using Vec3 = Vec3T<T>;
621 
626 
630  using PrimitiveList = std::vector<std::shared_ptr<const P> >;
631 
635  LinearBVH() = delete;
636 
642  inline
643  LinearBVH(const std::vector<LinearNode>& a_linearNodes,
644  const PrimitiveList& a_primitives);
645 
649  inline
650  virtual ~LinearBVH();
651 
657  inline
658  T signedDistance(const Vec3& a_point, const Prune a_pruning = Prune::Ordered2) const noexcept;
659 
660  protected:
661 
665  std::vector<LinearNodeT<T, P, BV, K> > m_linearNodes;
666 
670  PrimitiveList m_primitives;
671  };
672 }
673 
675 
676 #include "EBGeometry_BVHImplem.hpp"
677 
678 #endif
Forward declare the BVH node since it is needed for the polymorphic lambdas.
Definition: EBGeometry_BVH.hpp:35
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
Forward declare linear node class.
Definition: EBGeometry_BVH.hpp:41
+
Namespace for various bounding volume heirarchy (BVH) functionality.
Definition: EBGeometry_BVH.hpp:28
+
Forward declare linear BVH class.
Definition: EBGeometry_BVH.hpp:47
+
BVConstructorT< P, BV > BVConstructor
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:141
+
std::shared_ptr< Node > NodePtr
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:126
+
PrimitiveListT< P > PrimitiveList
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:110
+
NodeType
Enum for determining if a BVH node is a leaf or a regular node (only leaf nodes contain data) ...
Definition: EBGeometry_BVH.hpp:82
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
std::vector< std::shared_ptr< const P > > PrimitiveListT
Alias to cut down on typing.
Definition: EBGeometry_BVH.hpp:53
+
std::vector< LinearNodeT< T, P, BV, K > > m_linearNodes
List of linearly stored nodes.
Definition: EBGeometry_BVH.hpp:665
+
Implementation of EBGeometry_BVH.hpp.
+
Prune
Typename for identifying algorithms used in subtree pruning.
Definition: EBGeometry_BVH.hpp:90
+ +
PrimitiveList m_primitives
Global list of primitives. Note that this is ALL primitives, sorted so that LinearNodeT can interface...
Definition: EBGeometry_BVH.hpp:670
+
StopFunctionT< T, P, BV, K > StopFunction
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:131
+
std::function< std::array< PrimitiveListT< P >, K >(const PrimitiveListT< P > &a_primitives)> PartitionerT
Polymorphic partitioner for splitting a list of primitives into K new lists of primitives.
Definition: EBGeometry_BVH.hpp:69
+
PartitionerT< P, K > Partitioner
Alias for cutting down on typing.
Definition: EBGeometry_BVH.hpp:136
+
std::function< BV(const std::shared_ptr< const P > &a_primitive)> BVConstructorT
Constructor method for creating bounding volumes from a list of primitives.
Definition: EBGeometry_BVH.hpp:77
+
std::function< bool(const NodeT< T, P, BV, K > &a_node)> StopFunctionT
Stop function for deciding when a BVH node can&#39;t be divided into sub-volumes.
Definition: EBGeometry_BVH.hpp:61
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp.html b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp.html new file mode 100644 index 00000000..89ad85b4 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp.html @@ -0,0 +1,140 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BoundingVolumesImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_BoundingVolumesImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_BoundingVolumes.hpp. +More...

+
#include <iostream>
+#include "EBGeometry_BoundingVolumes.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+
+Include dependency graph for EBGeometry_BoundingVolumesImplem.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 BoundingVolumes
 Namespace for encapsulating various bounding volumes for usage with BVHs.
 
+ + + + + + + + + + + + + + + + + +

+Functions

template<class T >
bool BoundingVolumes::intersects (const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
 Intersection method for testing if two bounding spheres overlap. More...
 
template<class T >
bool BoundingVolumes::intersects (const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept
 Intersection method for testing if two bounding boxes overlap. More...
 
template<class T >
BoundingVolumes::getOverlappingVolume (const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
 Compute the overlapping volume between two bounding spheres. More...
 
template<class T >
BoundingVolumes::getOverlappingVolume (const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept
 Compute the overlapping volume between two bounding boxes. More...
 
+

Detailed Description

+

Implementation of EBGeometry_BoundingVolumes.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..1ca9769f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..699eb02a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +184abf2d733090a02fa7a47133c87a6d \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..c342c49c Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.map new file mode 100644 index 00000000..f0ab3ddd --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.md5 new file mode 100644 index 00000000..9abbfc0b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +fe93105b5e99b9032b82c7c17ebb7d03 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.png new file mode 100644 index 00000000..192d441f Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp_source.html new file mode 100644 index 00000000..a9ceeb19 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumesImplem_8hpp_source.html @@ -0,0 +1,121 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BoundingVolumesImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_BoundingVolumesImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_BoundingVolumesImplem
13 #define EBGeometry_BoundingVolumesImplem
14 
15 // Std includes
16 #include <iostream>
17 
18 //Our includes
21 
22 namespace BoundingVolumes {
23 
24  template <class T>
25  inline
27  m_radius = 0.0;
28  m_center = Vec3::zero();
29  }
30 
31  template <class T>
32  inline
33  BoundingSphereT<T>::BoundingSphereT(const Vec3T<T>& a_center, const T& a_radius){
34  m_center = a_center;
35  m_radius = a_radius;
36  }
37 
38  template <class T>
40  m_radius = a_other.m_radius;
41  m_center = a_other.m_center;
42  }
43 
44  template <class T>
45  BoundingSphereT<T>::BoundingSphereT(const std::vector<BoundingSphereT<T> >& a_otherSpheres) {
46 
47  // TLDR: Spheres enclosing other spheres is a difficult problem, but a sphere enclosing a set of points is simpler. For each
48  // input sphere we create a set of points representing the lo/hicorners of an axis-aligned bounding box that encloses the sphere.
49  // We then compute the bounding sphere from this set of points.
50  std::vector<Vec3T<T> > points;
51  for (const auto& sphere : a_otherSpheres){
52  const T& radius = sphere.getRadius();
53  const Vec3T<T>& center = sphere.getCentroid();
54 
55  points.emplace_back(center + radius*Vec3T<T>::one());
56  points.emplace_back(center - radius*Vec3T<T>::one());
57  }
58 
60  }
61 
62  template <class T>
63  template <class P>
64  BoundingSphereT<T>::BoundingSphereT(const std::vector<Vec3T<P> >& a_points, const BoundingVolumeAlgorithm& a_algorithm){
65  this->define(a_points, a_algorithm);
66  }
67 
68  template <class T>
70 
71  }
72 
73  template <class T>
74  template <class P>
75  inline
76  void BoundingSphereT<T>::define(const std::vector<Vec3T<P> >& a_points, const BoundingVolumeAlgorithm& a_algorithm) noexcept {
77  switch(a_algorithm) {
78  case BoundingVolumeAlgorithm::Ritter:
79  this->buildRitter(a_points);
80  break;
81  default:
82  std::cerr << "BoundingSphereT::define - unsupported algorithm requested\n";
83  }
84  }
85 
86  template <class T>
87  inline
88  bool BoundingSphereT<T>::intersects(const BoundingSphereT& a_other) const noexcept {
89  const Vec3 deltaV = m_center - a_other.getCentroid();
90  const T sumR = m_radius + a_other.getRadius();
91 
92  return deltaV.dot(deltaV) < sumR*sumR;
93  }
94 
95  template <class T>
96  inline
98  return (m_radius);
99  }
100 
101  template <class T>
102  inline
103  const T& BoundingSphereT<T>::getRadius() const noexcept {
104  return (m_radius);
105  }
106 
107  template <class T>
108  inline
110  return (m_center);
111  }
112 
113  template <class T>
114  inline
115  const Vec3T<T>& BoundingSphereT<T>::getCentroid() const noexcept {
116  return (m_center);
117  }
118 
119  template <class T>
120  template <class P>
121  inline
122  void BoundingSphereT<T>::buildRitter(const std::vector<Vec3T<P> >& a_points) noexcept {
123  m_radius = 0.0;
124  m_center = Vec3::zero();
125 
126  constexpr T half = 0.5;
127 
128  constexpr int DIM = 3;
129 
130  // INITIAL PASS
131  std::vector<Vec3> min_coord(DIM, a_points[0]); // [0] = Minimum x, [1] = Minimum y, [2] = Minimum z
132  std::vector<Vec3> max_coord(DIM, a_points[0]);
133 
134  for (int i = 1; i < a_points.size(); i++){
135  for (int dir = 0; dir < DIM; dir++){
136  Vec3& min = min_coord[dir];
137  Vec3& max = max_coord[dir];
138 
139  if(a_points[i][dir] < min[dir]){
140  min = a_points[i];
141  }
142  if(a_points[i][dir] > max[dir]){
143  max = a_points[i];
144  }
145  }
146  }
147 
148  T dist = -1;
149  Vec3 p1,p2;
150  for (int dir = 0; dir < DIM; dir++){
151  const T len = (max_coord[dir]-min_coord[dir]).length();
152  if(len > dist ){
153  dist = len;
154  p1 = min_coord[dir];
155  p2 = max_coord[dir];
156  }
157  }
158 
159  // m_center = half*(p1+p2);
160  m_center = (p1+p2)*half;
161  m_radius = half*(p2-p1).length();
162 
163 
164  // SECOND PASS
165  for (int i = 0; i < a_points.size(); i++){
166  const T dist = (a_points[i]-m_center).length() - m_radius;
167  if(dist > 0){ // Point lies outside
168  const Vec3 v = a_points[i] - m_center;
169  const Vec3 p1 = a_points[i];
170  const Vec3 p2 = m_center - m_radius*v/v.length();
171 
172  m_center = half*(p2+p1);
173  m_radius = half*(p2-p1).length();
174  }
175  }
176 
177  // Ritter algorithm is very coarse and does not give an exact result anyways. Grow the dimension for safety.
178  m_radius *= (1.0 + 1E-2);
179  }
180 
181  template <class T>
182  inline
184  constexpr T zero = 0.0;
185 
186  T retval = zero;
187 
188  if(this->intersects(a_other)){
189  const auto& r1 = m_radius;
190  const auto& r2 = a_other.getRadius();
191 
192  const auto d = (m_center-a_other.getCentroid()).length();
193 
194  retval = M_PI/(12.*d) * (r1+r2-d)*(r1+r2-d) * (d*d + 2*d*(r1+r2) - 3*(r1-r2)*(r1-r2));
195  }
196 
197  return retval;
198  }
199 
200  template <class T>
201  inline
202  T BoundingSphereT<T>::getDistance(const Vec3& a_x0) const noexcept {
203  constexpr T zero = 0.0;
204 
205  return std::max(zero, (a_x0-m_center).length() - m_radius);
206  }
207 
208  template <class T>
209  inline
210  T BoundingSphereT<T>::getDistance2(const Vec3& a_x0) const noexcept {
211  const T d = this->getDistance(a_x0);
212 
213  return d*d;
214  }
215 
216  template <class T>
217  inline
218  T BoundingSphereT<T>::getVolume() const noexcept {
219  return 4.*M_PI*m_radius*m_radius*m_radius/3.0;
220  }
221 
222  template <class T>
223  inline
224  T BoundingSphereT<T>::getArea() const noexcept {
225  return T(4.*M_PI*m_radius*m_radius);
226  }
227 
228  template <class T>
230  m_loCorner = Vec3::zero();
231  m_hiCorner = Vec3::zero();
232  }
233 
234  template <class T>
235  AABBT<T>::AABBT(const Vec3T<T>& a_lo, const Vec3T<T>& a_hi){
236  m_loCorner = a_lo;
237  m_hiCorner = a_hi;
238  }
239 
240  template <class T>
241  AABBT<T>::AABBT(const AABBT<T>& a_other){
242  m_loCorner = a_other.m_loCorner;
243  m_hiCorner = a_other.m_hiCorner;
244  }
245 
246  template <class T>
247  AABBT<T>::AABBT(const std::vector<AABBT<T> >& a_others) {
248  m_loCorner = a_others.front().getLowCorner();
249  m_hiCorner = a_others.front().getHighCorner();
250 
251  for (const auto& other : a_others){
252  m_loCorner = min(m_loCorner, other.getLowCorner());
253  m_hiCorner = max(m_hiCorner, other.getHighCorner());
254  }
255  }
256 
257  template <class T>
258  template <class P>
259  AABBT<T>::AABBT(const std::vector<Vec3T<P> >& a_points){
260  this->define(a_points);
261  }
262 
263  template <class T>
265 
266  }
267 
268  template <class T>
269  template <class P>
270  inline
271  void AABBT<T>::define(const std::vector<Vec3T<P> >& a_points) noexcept {
272  m_loCorner = a_points.front();
273  m_hiCorner = a_points.front();
274 
275  for (const auto& p : a_points){
276  m_loCorner = min(m_loCorner, p);
277  m_hiCorner = max(m_hiCorner, p);
278  }
279  }
280 
281  template <class T>
282  inline
283  bool AABBT<T>::intersects(const AABBT& a_other) const noexcept {
284  const Vec3& otherLo = a_other.getLowCorner();
285  const Vec3& otherHi = a_other.getHighCorner();
286 
287  return (m_loCorner[0] < otherHi[0] && m_hiCorner[0] > otherLo[0]) &&
288  (m_loCorner[1] < otherHi[1] && m_hiCorner[1] > otherLo[1]) &&
289  (m_loCorner[2] < otherHi[2] && m_hiCorner[2] > otherLo[2]);
290  }
291 
292  template <class T>
293  inline
295  return (m_loCorner);
296  }
297 
298  template <class T>
299  inline
300  const Vec3T<T>& AABBT<T>::getLowCorner() const noexcept {
301  return (m_loCorner);
302  }
303 
304  template <class T>
305  inline
307  return (m_hiCorner);
308  }
309 
310  template <class T>
311  inline
312  const Vec3T<T>& AABBT<T>::getHighCorner() const noexcept {
313  return (m_hiCorner);
314  }
315 
316  template <class T>
317  inline
318  Vec3T<T> AABBT<T>::getCentroid() const noexcept {
319  constexpr T half = T(0.5);
320 
321  return half * (m_loCorner + m_hiCorner);
322  }
323 
324  template <class T>
325  inline
326  T AABBT<T>::getOverlappingVolume(const AABBT<T>& a_other) const noexcept {
327  constexpr T zero = 0.0;
328 
329  T ret = 1.0;
330 
331  for (int dir = 0; dir < 3; dir++){
332  const auto xL = m_loCorner[dir];
333  const auto xH = m_hiCorner[dir];
334 
335  const auto yL = a_other.m_loCorner[dir];
336  const auto yH = a_other.m_hiCorner[dir];
337 
338  const auto delta = std::max(zero, std::min(xH, yH) - std::max(xL, yL));
339 
340  ret *= delta;
341  }
342 
343  return ret;
344  }
345 
346  template <class T>
347  inline
348  T AABBT<T>::getDistance(const Vec3& a_point) const noexcept {
349  constexpr T zero = 0.0;
350 
351  const Vec3 delta = Vec3(std::max(m_loCorner[0] - a_point[0], a_point[0] - m_hiCorner[0]),
352  std::max(m_loCorner[1] - a_point[1], a_point[1] - m_hiCorner[1]),
353  std::max(m_loCorner[2] - a_point[2], a_point[2] - m_hiCorner[2]));
354 
355  const T retval = std::max(zero, max(Vec3::zero(), delta).length());
356 
357  return retval;
358  }
359 
360  template <class T>
361  inline
362  T AABBT<T>::getDistance2(const Vec3& a_point) const noexcept {
363  const Vec3 u = Vec3(std::max(m_loCorner[0] - a_point[0], a_point[0] - m_hiCorner[0]),
364  std::max(m_loCorner[1] - a_point[1], a_point[1] - m_hiCorner[1]),
365  std::max(m_loCorner[2] - a_point[2], a_point[2] - m_hiCorner[2]));
366 
367  const Vec3 v = max(Vec3::zero(), u);
368 
369  return v.length2();
370  }
371 
372  template <class T>
373  inline
374  T AABBT<T>::getVolume() const noexcept {
375  const auto delta = m_hiCorner-m_loCorner;
376 
377  T ret = 1.0;
378  for (int dir = 0; dir < 3; dir++){
379  ret *= delta[dir];
380  }
381 
382  return ret;
383  }
384 
385  template <class T>
386  inline
387  T AABBT<T>::getArea() const noexcept {
388  constexpr int DIM = 3;
389 
390  T ret = 0.0;
391 
392  const auto delta = m_hiCorner - m_loCorner;
393 
394  for (int dir = 0; dir < DIM; dir++){
395  const int otherDir1 = (dir+1)%DIM;
396  const int otherDir2 = (dir+2)%DIM;
397 
398  ret += 2.0*delta[otherDir1]*delta[otherDir2];
399  }
400 
401  return ret;
402  }
403 
404  template <class T>
405  bool intersects(const BoundingSphereT<T>& u, const BoundingSphereT<T>& v) noexcept {
406  return u.intersects(v);
407  }
408 
409  template <class T>
410  bool intersects(const AABBT<T>& u, const AABBT<T>& v) noexcept {
411  return u.intersects(v);
412  }
413 
414  template <class T>
416  return u.getOverlappingVolume(v);
417  }
418 
419  template <class T>
420  T getOverlappingVolume(const AABBT<T>& u, const AABBT<T>& v) noexcept {
421  return u.getOverlappingVolume(v);
422  }
423 }
424 
426 
427 #endif
Vec3 getCentroid() const noexcept
Get bounding volume centroid.
Definition: EBGeometry_BoundingVolumesImplem.hpp:318
+
T getDistance2(const Vec3 &a_x0) const noexcept
Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) ...
Definition: EBGeometry_BoundingVolumesImplem.hpp:210
+
Class which encloses a set of points using a bounding sphere.
Definition: EBGeometry_BoundingVolumes.hpp:32
+
bool intersects(const AABBT &a_other) const noexcept
Check if this AABB intersects another AABB.
Definition: EBGeometry_BoundingVolumesImplem.hpp:283
+
Vec3 m_hiCorner
Upper-right corner of bounding box.
Definition: EBGeometry_BoundingVolumes.hpp:329
+
T & getRadius() noexcept
Get modifiable radius for this sphere.
Definition: EBGeometry_BoundingVolumesImplem.hpp:97
+
T getVolume() const noexcept
Compute the bounding box volume.
Definition: EBGeometry_BoundingVolumesImplem.hpp:374
+
Vec3T< T > & getHighCorner() noexcept
Get the modifiable upper-right corner of the AABB.
Definition: EBGeometry_BoundingVolumesImplem.hpp:306
+
AABBT()
Default constructor (does nothing)
Definition: EBGeometry_BoundingVolumesImplem.hpp:229
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
Declaration of a various bounding volumes used for bounding volume hierarchy.
+
Axis-aligned bounding box as bounding volume.
Definition: EBGeometry_BoundingVolumes.hpp:192
+
BoundingSphereT()
Default constructor. Leaves object in undefined state.
Definition: EBGeometry_BoundingVolumesImplem.hpp:26
+
Vec3 & getCentroid() noexcept
Get modifiable center for this sphere.
Definition: EBGeometry_BoundingVolumesImplem.hpp:109
+
T getDistance(const Vec3 &a_x0) const noexcept
Get the distance to this AABB (points inside the bounding box have a zero distance) ...
Definition: EBGeometry_BoundingVolumesImplem.hpp:348
+
T getArea() const noexcept
Compute the bounding box area.
Definition: EBGeometry_BoundingVolumesImplem.hpp:387
+
virtual ~AABBT()
Destructor (does nothing)
Definition: EBGeometry_BoundingVolumesImplem.hpp:264
+
Vec3T< T > & getLowCorner() noexcept
Get the modifiable lower-left corner of the AABB.
Definition: EBGeometry_BoundingVolumesImplem.hpp:294
+
bool intersects(const BoundingSphereT &a_other) const noexcept
Check if this bounding sphere intersect another bounding sphere.
Definition: EBGeometry_BoundingVolumesImplem.hpp:88
+
T dot(const Vec3T< T > &u) const noexcept
Vector dot product.
Definition: EBGeometry_VecImplem.hpp:417
+
BoundingVolumeAlgorithm
Typename for possible algorithms that support the computation of a bounding sphere for a set of 3D po...
Definition: EBGeometry_BoundingVolumes.hpp:38
+
T m_radius
Sphere radius.
Definition: EBGeometry_BoundingVolumes.hpp:171
+
T getDistance2(const Vec3 &a_x0) const noexcept
Get the squared distance to this bounding box (points inside the bounding box have a zero distance) ...
Definition: EBGeometry_BoundingVolumesImplem.hpp:362
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Namespace for encapsulating various bounding volumes for usage with BVHs.
Definition: EBGeometry_BoundingVolumes.hpp:25
+
void buildRitter(const std::vector< Vec3T< P > > &a_points) noexcept
Template function which computes the bounding sphere for a set of points (mixed precision allowed) us...
Definition: EBGeometry_BoundingVolumesImplem.hpp:122
+
void define(const std::vector< Vec3T< P > > &a_points) noexcept
Define function (since mixed precision allowed) which sets this AABB such that it encloses a set of 3...
Definition: EBGeometry_BoundingVolumesImplem.hpp:271
+
T getOverlappingVolume(const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
Compute the overlapping volume between two bounding spheres.
Definition: EBGeometry_BoundingVolumesImplem.hpp:415
+
T getVolume() const noexcept
Get the sphere volume.
Definition: EBGeometry_BoundingVolumesImplem.hpp:218
+
T getOverlappingVolume(const BoundingSphereT< T > &a_other) const noexcept
Compute the overlapping volume between this bounding sphere and another.
Definition: EBGeometry_BoundingVolumesImplem.hpp:183
+
virtual ~BoundingSphereT()
Destructor (does nothing).
Definition: EBGeometry_BoundingVolumesImplem.hpp:69
+
T length() const noexcept
Compute vector length.
Definition: EBGeometry_VecImplem.hpp:423
+
void define(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg) noexcept
Template define function which takes a set of 3D points (mixed precision allowed).
Definition: EBGeometry_BoundingVolumesImplem.hpp:76
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+
T getArea() const noexcept
Get the sphere area.
Definition: EBGeometry_BoundingVolumesImplem.hpp:224
+ +
Vec3 m_center
Sphere center.
Definition: EBGeometry_BoundingVolumes.hpp:176
+
T getDistance(const Vec3 &a_x0) const noexcept
Get the distance to this bounding sphere (points inside the sphere have a zero distance) ...
Definition: EBGeometry_BoundingVolumesImplem.hpp:202
+
T getOverlappingVolume(const AABBT< T > &a_other) const noexcept
Compute the overlapping volume between this AABB and another AABB.
Definition: EBGeometry_BoundingVolumesImplem.hpp:326
+
bool intersects(const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
Intersection method for testing if two bounding spheres overlap.
Definition: EBGeometry_BoundingVolumesImplem.hpp:405
+
T length2() const noexcept
Compute vector length squared.
Definition: EBGeometry_VecImplem.hpp:429
+
Vec3 m_loCorner
Lower-left corner of bounding box.
Definition: EBGeometry_BoundingVolumes.hpp:324
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp.html b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp.html new file mode 100644 index 00000000..38d26ce1 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp.html @@ -0,0 +1,151 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BoundingVolumes.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_BoundingVolumes.hpp File Reference
+
+
+ +

Declaration of a various bounding volumes used for bounding volume hierarchy. +More...

+
+Include dependency graph for EBGeometry_BoundingVolumes.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + + + + +

+Classes

class  BoundingVolumes::BoundingSphereT< T >
 Class which encloses a set of points using a bounding sphere. More...
 
class  BoundingVolumes::AABBT< T >
 Axis-aligned bounding box as bounding volume. More...
 
+ + + + +

+Namespaces

 BoundingVolumes
 Namespace for encapsulating various bounding volumes for usage with BVHs.
 
+ + + + + + + + + + + + + + + + + +

+Functions

template<class T >
bool BoundingVolumes::intersects (const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
 Intersection method for testing if two bounding spheres overlap. More...
 
template<class T >
bool BoundingVolumes::intersects (const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept
 Intersection method for testing if two bounding boxes overlap. More...
 
template<class T >
BoundingVolumes::getOverlappingVolume (const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
 Compute the overlapping volume between two bounding spheres. More...
 
template<class T >
BoundingVolumes::getOverlappingVolume (const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept
 Compute the overlapping volume between two bounding boxes. More...
 
+

Detailed Description

+

Declaration of a various bounding volumes used for bounding volume hierarchy.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.map new file mode 100644 index 00000000..3656e89a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.md5 new file mode 100644 index 00000000..4f2dd9ae --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +397fe9179bab7d11cf52bff0accedded \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.png new file mode 100644 index 00000000..59951958 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.map b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.map new file mode 100644 index 00000000..0b440ef2 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.md5 new file mode 100644 index 00000000..1e968b4a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.md5 @@ -0,0 +1 @@ +5e2a037a2f3c61338c7c91070fe20034 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.png b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.png new file mode 100644 index 00000000..a00c1d53 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp_source.html b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp_source.html new file mode 100644 index 00000000..88407237 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__BoundingVolumes_8hpp_source.html @@ -0,0 +1,100 @@ + + + + + + + +EBGeometry: Source/EBGeometry_BoundingVolumes.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_BoundingVolumes.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_BoundingVolumes_H
13 #define EBGeometry_BoundingVolumes_H
14 
15 // Std includes
16 #include <vector>
17 
18 // Our includes
19 #include "EBGeometry_Vec.hpp"
21 
25 namespace BoundingVolumes {
26 
31  template <class T>
33  public:
34 
39  Ritter,
40  };
41 
45  using Vec3 = Vec3T<T>;
46 
51 
57  BoundingSphereT(const Vec3T<T>& a_center, const T& a_radius);
58 
63  BoundingSphereT(const std::vector<BoundingSphereT<T> >& a_otherSpheres);
64 
69  BoundingSphereT(const BoundingSphereT& a_other);
70 
74  virtual ~BoundingSphereT();
75 
83  template <class P>
84  BoundingSphereT(const std::vector<Vec3T<P> >& a_points, const BoundingVolumeAlgorithm& a_alg = BoundingVolumeAlgorithm::Ritter);
85 
92  template <class P>
93  inline
94  void define(const std::vector<Vec3T<P> >& a_points, const BoundingVolumeAlgorithm& a_alg) noexcept;
95 
101  inline
102  bool intersects(const BoundingSphereT& a_other) const noexcept;
103 
107  inline
108  T& getRadius() noexcept;
109 
113  inline
114  const T& getRadius() const noexcept;
115 
119  inline
120  Vec3& getCentroid() noexcept;
121 
125  inline
126  const Vec3& getCentroid() const noexcept;
127 
133  inline
134  T getOverlappingVolume(const BoundingSphereT<T>& a_other) const noexcept;
135 
141  inline
142  T getDistance(const Vec3& a_x0) const noexcept;
143 
149  inline
150  T getDistance2(const Vec3& a_x0) const noexcept;
151 
156  inline
157  T getVolume() const noexcept;
158 
163  inline
164  T getArea() const noexcept;
165 
166  protected:
167 
172 
177 
181  template <class P>
182  inline
183  void buildRitter(const std::vector<Vec3T<P> >& a_points) noexcept;
184  };
185 
191  template <class T>
192  class AABBT {
193  public:
194 
198  using Vec3 = Vec3T<T>;
199 
203  AABBT();
204 
210  AABBT(const Vec3T<T>& a_lo, const Vec3T<T>& a_hi);
211 
216  AABBT(const AABBT& a_other);
217 
222  AABBT(const std::vector<AABBT<T> >& a_others);
223 
227  virtual ~AABBT();
228 
234  template <class P>
235  AABBT(const std::vector<Vec3T<P> >& a_points);
236 
241  template <class P>
242  inline
243  void define(const std::vector<Vec3T<P> >& a_points) noexcept;
244 
250  inline
251  bool intersects(const AABBT& a_other) const noexcept;
252 
256  inline
257  Vec3T<T>& getLowCorner() noexcept;
258 
262  inline
263  const Vec3T<T>& getLowCorner() const noexcept;
264 
268  inline
269  Vec3T<T>& getHighCorner() noexcept;
270 
274  inline
275  const Vec3T<T>& getHighCorner() const noexcept;
276 
280  inline
281  Vec3 getCentroid() const noexcept;
282 
288  inline
289  T getOverlappingVolume(const AABBT<T>& a_other) const noexcept;
290 
296  inline
297  T getDistance(const Vec3& a_x0) const noexcept;
298 
304  inline
305  T getDistance2(const Vec3& a_x0) const noexcept;
306 
310  inline
311  T getVolume() const noexcept;
312 
316  inline
317  T getArea() const noexcept;
318 
319  protected:
320 
324  Vec3 m_loCorner;
325 
329  Vec3 m_hiCorner;
330  };
331 
337  template <class T>
338  bool intersects(const BoundingSphereT<T>& a_u, const BoundingSphereT<T>& a_v) noexcept;
339 
345  template <class T>
346  bool intersects(const AABBT<T>& a_u, const AABBT<T>& a_v) noexcept;
347 
353  template <class T>
354  T getOverlappingVolume(const BoundingSphereT<T>& a_u, const BoundingSphereT<T>& a_v) noexcept;
355 
361  template <class T>
362  T getOverlappingVolume(const AABBT<T>& a_u, const AABBT<T>& a_v) noexcept;
363 }
364 
365 #include "EBGeometry_NamespaceFooter.hpp"
366 
368 
369 #endif
T getDistance2(const Vec3 &a_x0) const noexcept
Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) ...
Definition: EBGeometry_BoundingVolumesImplem.hpp:210
+
Class which encloses a set of points using a bounding sphere.
Definition: EBGeometry_BoundingVolumes.hpp:32
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
T & getRadius() noexcept
Get modifiable radius for this sphere.
Definition: EBGeometry_BoundingVolumesImplem.hpp:97
+
Axis-aligned bounding box as bounding volume.
Definition: EBGeometry_BoundingVolumes.hpp:192
+
BoundingSphereT()
Default constructor. Leaves object in undefined state.
Definition: EBGeometry_BoundingVolumesImplem.hpp:26
+
Vec3 & getCentroid() noexcept
Get modifiable center for this sphere.
Definition: EBGeometry_BoundingVolumesImplem.hpp:109
+
Implementation of EBGeometry_BoundingVolumes.hpp.
+
bool intersects(const BoundingSphereT &a_other) const noexcept
Check if this bounding sphere intersect another bounding sphere.
Definition: EBGeometry_BoundingVolumesImplem.hpp:88
+
BoundingVolumeAlgorithm
Typename for possible algorithms that support the computation of a bounding sphere for a set of 3D po...
Definition: EBGeometry_BoundingVolumes.hpp:38
+
T m_radius
Sphere radius.
Definition: EBGeometry_BoundingVolumes.hpp:171
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Namespace for encapsulating various bounding volumes for usage with BVHs.
Definition: EBGeometry_BoundingVolumes.hpp:25
+
void buildRitter(const std::vector< Vec3T< P > > &a_points) noexcept
Template function which computes the bounding sphere for a set of points (mixed precision allowed) us...
Definition: EBGeometry_BoundingVolumesImplem.hpp:122
+
T getVolume() const noexcept
Get the sphere volume.
Definition: EBGeometry_BoundingVolumesImplem.hpp:218
+
T getOverlappingVolume(const BoundingSphereT< T > &a_other) const noexcept
Compute the overlapping volume between this bounding sphere and another.
Definition: EBGeometry_BoundingVolumesImplem.hpp:183
+
virtual ~BoundingSphereT()
Destructor (does nothing).
Definition: EBGeometry_BoundingVolumesImplem.hpp:69
+
void define(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg) noexcept
Template define function which takes a set of 3D points (mixed precision allowed).
Definition: EBGeometry_BoundingVolumesImplem.hpp:76
+
T getArea() const noexcept
Get the sphere area.
Definition: EBGeometry_BoundingVolumesImplem.hpp:224
+ +
Vec3 m_center
Sphere center.
Definition: EBGeometry_BoundingVolumes.hpp:176
+
T getDistance(const Vec3 &a_x0) const noexcept
Get the distance to this bounding sphere (points inside the sphere have a zero distance) ...
Definition: EBGeometry_BoundingVolumesImplem.hpp:202
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp.html b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp.html new file mode 100644 index 00000000..d39a752b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp.html @@ -0,0 +1,164 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelBVH.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelBVH.hpp File Reference
+
+
+ +

File which contains partitioners and lambdas for enclosing dcel_face in bounding volume heirarchies. +More...

+
+Include dependency graph for EBGeometry_DcelBVH.hpp:
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+ + + + + +

+Typedefs

+template<class T >
using Dcel::PrimitiveList = std::vector< std::shared_ptr< const Dcel::FaceT< T > > >
 Alias for which primitives are used in the BVH. For DCEL meshes the primitive is a polygon face.
 
+ + + + + + + + + + + + + + + + + + + + +

+Variables

+constexpr int Dcel::primitivesPerLeafNode = 1
 This is the lowest number of a primitives that a BVH node is allowed to enclose.
 
template<class T , class BV >
BVH::BVConstructorT< FaceT< T >, BV > Dcel::defaultBVConstructor
 Bounding volume constructor for a DCEL face. More...
 
template<class T , class BV , int K>
BVH::StopFunctionT< T, FaceT< T >, BV, K > Dcel::defaultStopFunction
 Default stop function. This function terminates the division process if a BVH node has only one primitive. More...
 
template<class T , int K>
BVH::PartitionerT< FaceT< T >, K > Dcel::spatialSplitPartitioner
 Default partitioner function for subdividing into K sub-volumes. More...
 
template<class T , int K>
BVH::PartitionerT< FaceT< T >, K > Dcel::spatialSplitBinaryPartitioner
 Binary partitioner based on spatial splits. More...
 
+

Detailed Description

+

File which contains partitioners and lambdas for enclosing dcel_face in bounding volume heirarchies.

+

This file contains various useful "default" routines for determining how a DCEL mesh should be partitioned in a bounding volume hierarchy. This includes the required functions for 1) Constructing bounding volumes (defaultBVConstructor). 2) Stopping the sub-division process (defaultStopFunction) 3) Partitioning one bounding volume into subvolumes. These are the functions a) defaultPartitionFunction(...). This partitions the primitives into two half-spaces based on where the primitive centroids are located. b) partitionMinimumOverlap(...). This splist the primitive list down the middle (ignoring centroids and element size) and selects the splitting direction where the sub-bounding volumes have the smallest overlap. 3) partitionSAH(...). This implements the common "surface area heuristic" rule for constructing bounding volumes.

Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.map new file mode 100644 index 00000000..15269f2e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.md5 new file mode 100644 index 00000000..5c6c53bf --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +31aa5dad2fedd81cc5679b00afdf3262 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.png new file mode 100644 index 00000000..a45ae24c Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.map new file mode 100644 index 00000000..b7f4df9d --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.map @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.md5 new file mode 100644 index 00000000..e080f565 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.md5 @@ -0,0 +1 @@ +5d57bb296e734616f03475219260ea5e \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.png new file mode 100644 index 00000000..7f57b6bb Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelBVH_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp_source.html new file mode 100644 index 00000000..64d30ff7 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelBVH_8hpp_source.html @@ -0,0 +1,97 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelBVH.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelBVH.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
21 #ifndef EBGeometry_DcelBVH
22 #define EBGeometry_DcelBVH
23 
24 // Our includes
25 #include "EBGeometry_BVH.hpp"
26 #include "EBGeometry_DcelFace.hpp"
28 
29 namespace Dcel {
30 
34  constexpr int primitivesPerLeafNode = 1;
35 
39  template <class T>
40  using PrimitiveList = std::vector<std::shared_ptr<const Dcel::FaceT<T> > >;
41 
49  template <class T, class BV>
50  BVH::BVConstructorT<FaceT<T>, BV> defaultBVConstructor = [](const std::shared_ptr<const FaceT<T> >& a_primitive){
51  return BV(a_primitive->getAllVertexCoordinates());
52  };
53 
61  template <class T, class BV, int K>
63  const auto& primitives = a_node.getPrimitives();
64  const int numPrims = primitives.size();
65 
66  return numPrims <= primitivesPerLeafNode || numPrims < K;
67  };
68 
74  template <class T, int K>
76 
77  const int numPrimitives = a_primitives.size();
78 
79  if(numPrimitives < K){
80  std::cerr << "In file EBGeometry_DcelBVH.H function BVH::PartitionerT<FaceT<T>, K>::spatialSplitPartitioner -- not enough primitives to subdivide into subvolumes\n";
81  }
82 
83  // Compute the coordinate direction with the longest extent. This will be our splitting direction.
84  auto lo = Vec3T<T>::max();
85  auto hi = Vec3T<T>::min();
86  for (const auto& p : a_primitives){
87  lo = min(lo, p->getCentroid());
88  hi = max(hi, p->getCentroid());
89  }
90  const auto delta = (hi-lo);
91  const int splitDir = delta.maxDir(true);
92 
93  // Sort the primitives along the above coordinate direction.
94  PrimitiveList<T> sortedPrimitives(a_primitives);
95 
96  std::sort(sortedPrimitives.begin(), sortedPrimitives.end(),
97  [=](const std::shared_ptr<const FaceT<T> >& f1, const std::shared_ptr<const FaceT<T> >& f2) -> bool {
98  return f1->getCentroid(splitDir) < f2->getCentroid(splitDir);
99  });
100 
101 
102  // Figure out the indices in the vector where we do the splits.
103  const int almostEqualChunkSize = numPrimitives / K;
104  int remainder = numPrimitives % K;
105 
106  std::array<int, K> startIndices;
107  std::array<int, K> endIndices;
108 
109  startIndices[0] = 0;
110  endIndices [K-1] = numPrimitives;
111 
112  for (int i = 1; i < K; i++){
113  startIndices[i] = startIndices[i-1] + almostEqualChunkSize;
114 
115  if(remainder > 0){
116  startIndices[i]++;
117  remainder--;
118  }
119  }
120  for (int i = 0; i < K-1; i++){
121  endIndices[i] = startIndices[i+1];
122  }
123 
124 
125  // Put the primitives in separate lists and return them back to the BVH node.
126  std::array<PrimitiveList<T>, K> subVolumePrimitives;
127  for (int i = 0; i < K; i++){
128  typename PrimitiveList<T>::const_iterator first = sortedPrimitives.begin() + startIndices[i];
129  typename PrimitiveList<T>::const_iterator last = sortedPrimitives.begin() + endIndices [i];
130 
131  subVolumePrimitives[i] = PrimitiveList<T>(first, last);
132  }
133 
134  // Return as we must.
135  return subVolumePrimitives;
136  };
137 
143  template <class T, int K>
145  const int numPrimitives = a_primitives.size();
146 
147  if(numPrimitives < K){
148  std::cerr << "In file EBGeometry_DcelBVH.H function BVH::PartitionerT<FaceT<T>, K>::spatialSplitBinaryPartitioner -- not enough primitives to subdivide into subvolumes\n";
149  }
150 
151  // Error -- this is a binary partitioner!
152  constexpr bool isPowerOfTwo = (K > 0) && ((K & (K-1)) == 0);
153  if(!isPowerOfTwo){
154  std::cerr << "In file EBGeometry_DcelBVH.H function BVH::PartitionerT<FaceT<T>, K>::spatialSplitBinaryPartitioner -- template parameter K is not a factor of 2!!!";
155  }
156 
157  // Initialize the list of subvolumes.
158  std::vector<PrimitiveList<T> > subVolumeList(1);
159  subVolumeList[0] = a_primitives;
160 
161  int numSubVolumes = 1;
162  while (numSubVolumes < K){
163 
164  std::vector<PrimitiveList<T> > newSubVolumeList(0);
165  for (const auto& subVolume : subVolumeList){
166  const std::array<PrimitiveList<T>, 2>& binarySplit = spatialSplitPartitioner<T, 2>(subVolume);
167 
168  newSubVolumeList.push_back(binarySplit[0]);
169  newSubVolumeList.push_back(binarySplit[1]);
170  }
171 
172  subVolumeList = newSubVolumeList;
173 
174  numSubVolumes *= 2;
175  }
176 
177  // We have a vector but need an array:
178  std::array<PrimitiveList<T>, K> subVolumePrimitives;
179  for (int i = 0; i < K; i++){
180  subVolumePrimitives[i] = subVolumeList[i];
181  }
182 
183  return subVolumePrimitives;
184  };
185 
193  // template <class T, class BV>
194  // BVH::PartitionFunctionT<FaceT<T> > partitionMinimumOverlap = [](const PrimitiveList<T>& a_primitives){
195  // constexpr int DIM = 3;
196 
197  // // Always split the input primitives down the middle.
198  // const int splitIndex = (a_primitives.size() - 1)/2;
199 
200  // // This is the smallest volumetric overlap so far.
201  // T minOverlap = std::numeric_limits<T>::infinity();
202 
203  // // This is the return list.
204  // std::pair<PrimitiveList<T>, PrimitiveList<T> > ret;
205 
206  // // For each coordinate direction, sort the primitives along the coordinate and compute the bounding volumes
207  // for (int dir = 0; dir < DIM; dir++){
208 
209  // PrimitiveList<T> sortedPrims(a_primitives);
210  // std::sort(sortedPrims.begin(), sortedPrims.end(),
211  // [=](const std::shared_ptr<const FaceT<T> >& f1, const std::shared_ptr<const FaceT<T> >& f2){
212  // return f1->getCentroid(dir) < f2->getCentroid(dir);
213  // });
214 
215  // // Put the sorted primitives into separate lists
216  // PrimitiveList<T> lPrims(sortedPrims.begin(), sortedPrims.begin() + splitIndex+1);
217  // PrimitiveList<T> rPrims(sortedPrims.begin() + splitIndex + 1, sortedPrims.end());
218 
219  // // Compute the bounding volumes for the left and right subvolumes.
220  // const BV leftBV = defaultBVConstructor<T, BV>(lPrims);
221  // const BV rightBV = defaultBVConstructor<T, BV>(rPrims);
222 
223  // // Compute the overlapping volume between the left and right bounding volumes.
224  // const T curOverlap = getOverlappingVolume(leftBV, rightBV);
225 
226  // // Keep the one with the smallest volume.
227  // if (curOverlap < minOverlap){
228  // minOverlap = curOverlap;
229 
230  // ret = std::make_pair(lPrims, rPrims);
231  // }
232  // }
233 
234  // return ret;
235  // };
236 
237  // /*!
238  // @brief Surface area heuristic (SAH) partitioning function.
239  // @param[in] a_primitives List of primitives.
240  // @return Returns a pair of primitives. The first/second entry in the pair is the primitives contain in the left/right sub-bounding volumes
241  // */
242  // template <class T, class BV>
243  // BVH::PartitionFunctionT<FaceT<T> > partitionSAH = [](const PrimitiveList<T>& a_primitives){
244  // constexpr int DIM = 3;
245  // constexpr int nBins = 16;
246  // constexpr T invBins = 1./nBins;
247  // constexpr T Ct = 0.0;
248  // constexpr T Ci = 1.0;
249 
250  // const auto curBV = defaultBVConstructor<T, BV>(a_primitives);
251  // const auto curArea = curBV.getArea();
252 
253  // auto lo = Vec3T<T>::max();
254  // auto hi = Vec3T<T>::min();
255  // for (const auto& p : a_primitives){
256  // lo = min(lo, p->getCentroid());
257  // hi = max(hi, p->getCentroid());
258  // }
259  // const auto delta = (hi-lo)*invBins;
260 
261  // T minCost = std::numeric_limits<T>::max();
262 
263  // std::pair<PrimitiveList<T>, PrimitiveList<T> > ret;
264 
265  // for (int dir = 0; dir < DIM; dir++){
266 
267  // for (int ibin = 0; ibin <= nBins; ibin++){
268  // const Vec3T<T> pos = lo + T(1.0*ibin)*delta;
269 
270  // PrimitiveList<T> lPrims;
271  // PrimitiveList<T> rPrims;
272 
273  // for (const auto& p : a_primitives){
274  // if(p->getCentroid()[dir] <= pos[dir]){
275  // lPrims.emplace_back(p);
276  // }
277  // else{
278  // rPrims.emplace_back(p);
279  // }
280  // }
281 
282  // const auto numLeft = lPrims.size();
283  // const auto numRight = rPrims.size();
284 
285  // if(numLeft == 0 || numRight == 0) continue;
286 
287  // const BV bvLeft = defaultBVConstructor<T, BV>(lPrims);
288  // const BV bvRight = defaultBVConstructor<T, BV>(rPrims);
289 
290  // const T leftArea = bvLeft.getArea();
291  // const T rightArea = bvRight.getArea();
292 
293  // const T C = Ct + (leftArea/curArea)*Ci*numLeft + (rightArea/curArea)*Ci*numRight;
294 
295  // if(C < minCost){
296  // minCost = C;
297  // ret = std::make_pair(lPrims, rPrims);
298  // }
299  // }
300  // }
301 
302  // return ret;
303  // };
304 }
305 
307 
308 #endif
BVH::PartitionerT< FaceT< T >, K > spatialSplitPartitioner
Default partitioner function for subdividing into K sub-volumes.
Definition: EBGeometry_DcelBVH.hpp:75
+
Forward declare the BVH node since it is needed for the polymorphic lambdas.
Definition: EBGeometry_BVH.hpp:35
+
std::vector< std::shared_ptr< const Dcel::FaceT< T > > > PrimitiveList
Alias for which primitives are used in the BVH. For DCEL meshes the primitive is a polygon face...
Definition: EBGeometry_DcelBVH.hpp:40
+
static constexpr Vec3T< T > min() noexcept
Return a vector with minimum representable components.
Definition: EBGeometry_VecImplem.hpp:217
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
Declaration of a bounding volume hierarchy (BVH) class.
+
constexpr int primitivesPerLeafNode
This is the lowest number of a primitives that a BVH node is allowed to enclose.
Definition: EBGeometry_DcelBVH.hpp:34
+
static constexpr Vec3T< T > max() noexcept
Return a vector with maximum representable components.
Definition: EBGeometry_VecImplem.hpp:223
+
BVH::PartitionerT< FaceT< T >, K > spatialSplitBinaryPartitioner
Binary partitioner based on spatial splits.
Definition: EBGeometry_DcelBVH.hpp:144
+
BVH::StopFunctionT< T, FaceT< T >, BV, K > defaultStopFunction
Default stop function. This function terminates the division process if a BVH node has only one primi...
Definition: EBGeometry_DcelBVH.hpp:62
+
BVH::BVConstructorT< FaceT< T >, BV > defaultBVConstructor
Bounding volume constructor for a DCEL face.
Definition: EBGeometry_DcelBVH.hpp:50
+ +
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+ +
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
std::function< std::array< PrimitiveListT< P >, K >(const PrimitiveListT< P > &a_primitives)> PartitionerT
Polymorphic partitioner for splitting a list of primitives into K new lists of primitives.
Definition: EBGeometry_BVH.hpp:69
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
std::function< BV(const std::shared_ptr< const P > &a_primitive)> BVConstructorT
Constructor method for creating bounding volumes from a list of primitives.
Definition: EBGeometry_BVH.hpp:77
+
std::function< bool(const NodeT< T, P, BV, K > &a_node)> StopFunctionT
Stop function for deciding when a BVH node can&#39;t be divided into sub-volumes.
Definition: EBGeometry_BVH.hpp:61
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp.html new file mode 100644 index 00000000..84a2fe43 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp.html @@ -0,0 +1,143 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelEdgeImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelEdgeImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_DcelEdge.hpp. +More...

+
+Include dependency graph for EBGeometry_DcelEdgeImplem.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_DcelEdge.hpp.

+
Author
Robert Marskar
+
Todo:
Include m_face in constructors
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..d56624b7 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..353f0fbb --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +c19cc27a61c46759ee9fd92ed5d56e92 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..cacbf41c Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.map new file mode 100644 index 00000000..90f54356 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.md5 new file mode 100644 index 00000000..356601b1 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +9698d8ec654557433f738c66e5ebcceb \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.png new file mode 100644 index 00000000..bb95e67e Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp_source.html new file mode 100644 index 00000000..53ac263a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdgeImplem_8hpp_source.html @@ -0,0 +1,124 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelEdgeImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelEdgeImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
13 #ifndef CD_DcelEdgeImplem
14 #define CD_DcelEdgeImplem
15 
16 // Our includes
18 #include "EBGeometry_DcelEdge.hpp"
19 #include "EBGeometry_DcelFace.hpp"
22 
23 namespace Dcel {
24 
25  template <class T>
26  inline
28  m_face = nullptr;
29  m_vertex = nullptr;
30  m_pairEdge = nullptr;
31  m_nextEdge = nullptr;
32  m_previousEdge = nullptr;
33  m_normal = Vec3::zero();
34  m_x2x1 = Vec3::zero();
35  m_invLen2 = 0.0;
36  }
37 
38  template <class T>
39  inline
40  EdgeT<T>::EdgeT(const VertexPtr& a_vertex) : EdgeT<T>() {
41  m_vertex = a_vertex;
42  }
43 
44  template <class T>
45  inline
46  EdgeT<T>::EdgeT(const Edge& a_otherEdge) : EdgeT<T>() {
47  m_face = a_otherEdge.m_face;
48  m_vertex = a_otherEdge.m_vertex;
49  m_pairEdge = a_otherEdge.m_pairEdge;
50  m_nextEdge = a_otherEdge.m_nextEdge;
51  m_previousEdge = a_otherEdge.m_previousEdge;
52  m_normal = a_otherEdge.m_normal;
53  m_x2x1 = a_otherEdge.m_x2x1;
54  m_invLen2 = a_otherEdge.m_invLen2;
55  }
56 
57  template <class T>
58  inline
60  }
61 
62  template <class T>
63  inline
64  void EdgeT<T>::define(const VertexPtr& a_vertex,
65  const EdgePtr& a_pairEdge,
66  const EdgePtr& a_nextEdge,
67  const EdgePtr& a_previousEdge,
68  const Vec3 a_normal) noexcept {
69  m_vertex = a_vertex;
70  m_pairEdge = a_pairEdge;
71  m_nextEdge = a_nextEdge;
72  m_previousEdge = a_previousEdge;
73  m_normal = a_normal;
74  }
75 
76  template <class T>
77  inline
78  void EdgeT<T>::setVertex(const VertexPtr& a_vertex) noexcept {
79  m_vertex = a_vertex;
80  }
81 
82  template <class T>
83  inline
84  void EdgeT<T>::setPairEdge(const EdgePtr& a_pairEdge) noexcept {
85  m_pairEdge = a_pairEdge;
86  }
87 
88  template <class T>
89  inline
90  void EdgeT<T>::setNextEdge(const EdgePtr& a_nextEdge) noexcept {
91  m_nextEdge = a_nextEdge;
92  }
93 
94  template <class T>
95  inline
96  void EdgeT<T>::setPreviousEdge(const EdgePtr& a_previousEdge) noexcept {
97  m_previousEdge = a_previousEdge;
98  }
99 
100  template <class T>
101  inline
102  void EdgeT<T>::setFace(const FacePtr& a_face) noexcept {
103  m_face = a_face;
104  }
105 
106  template <class T>
107  inline
110  }
111 
112  template <class T>
113  inline
114  void EdgeT<T>::computeEdgeLength() noexcept {
115  const auto& x1 = this->getVertex()->getPosition();
116  const auto& x2 = this->getOtherVertex()->getPosition();
117 
118  m_x2x1 = x2-x1;
119 
120  const auto len2 = m_x2x1.dot(m_x2x1);
121 
122  m_invLen2 = 1./len2;
123  }
124 
125  template <class T>
126  inline
127  void EdgeT<T>::computeNormal() noexcept {
128 
129  m_normal = m_face->getNormal();
130 
131  if(m_pairEdge){
132  m_normal += m_pairEdge->getFace()->getNormal();
133  }
134 
135  this->normalizeNormalVector();
136  }
137 
138  template <class T>
139  inline
140  void EdgeT<T>::reconcile() noexcept {
141  this->computeNormal();
142  this->computeEdgeLength();
143  }
144 
145  template <class T>
146  inline
147  std::shared_ptr<VertexT<T> >& EdgeT<T>::getVertex() noexcept {
148  return (m_vertex);
149  }
150 
151  template <class T>
152  inline
153  const std::shared_ptr<VertexT<T> >& EdgeT<T>::getVertex() const noexcept {
154  return (m_vertex);
155  }
156 
157  template <class T>
158  inline
159  std::shared_ptr<VertexT<T> >& EdgeT<T>::getOtherVertex() noexcept {
160  return (m_nextEdge->getVertex());
161  }
162 
163  template <class T>
164  inline
165  const std::shared_ptr<VertexT<T> >& EdgeT<T>::getOtherVertex() const noexcept {
166  return (m_nextEdge->getVertex());
167  }
168 
169  template <class T>
170  inline
171  std::shared_ptr<EdgeT<T> >& EdgeT<T>::getPairEdge() noexcept {
172  return (m_pairEdge);
173  }
174 
175  template <class T>
176  inline
177  const std::shared_ptr<EdgeT<T> >& EdgeT<T>::getPairEdge() const noexcept {
178  return (m_pairEdge);
179  }
180 
181  template <class T>
182  inline
183  std::shared_ptr<EdgeT<T> >& EdgeT<T>::getPreviousEdge() noexcept {
184  return (m_previousEdge);
185  }
186 
187  template <class T>
188  inline
189  const std::shared_ptr<EdgeT<T> >& EdgeT<T>::getPreviousEdge() const noexcept {
190  return (m_previousEdge);
191  }
192 
193  template <class T>
194  inline
195  std::shared_ptr<EdgeT<T> >& EdgeT<T>::getNextEdge() noexcept {
196  return (m_nextEdge);
197  }
198 
199  template <class T>
200  inline
201  const std::shared_ptr<EdgeT<T> >& EdgeT<T>::getNextEdge() const noexcept {
202  return (m_nextEdge);
203  }
204 
205  template <class T>
206  inline
208  return (m_normal);
209  }
210 
211  template <class T>
212  inline
213  const Vec3T<T>& EdgeT<T>::getNormal() const noexcept {
214  return (m_normal);
215  }
216 
217  template <class T>
218  inline
219  std::shared_ptr<FaceT<T> >& EdgeT<T>::getFace() noexcept {
220  return (m_face);
221  }
222 
223  template <class T>
224  inline
225  const std::shared_ptr<FaceT<T> >& EdgeT<T>::getFace() const noexcept {
226  return (m_face);
227  }
228 
229  template <class T>
230  inline
231  T EdgeT<T>::projectPointToEdge(const Vec3& a_x0) const noexcept {
232  const auto p = a_x0 - m_vertex->getPosition();
233 
234  return p.dot(m_x2x1)*m_invLen2;
235  }
236 
237  template <class T>
238  inline
239  T EdgeT<T>::signedDistance(const Vec3& a_x0) const noexcept {
240  const T t = this->projectPointToEdge(a_x0);
241 
242  T retval;
243  if(t <= 0.0) { // Closest point is the starting vertex
244  retval = this->getVertex()->signedDistance(a_x0);
245  }
246  else if(t >= 1.0){ // Closest point is the end vertex
247  retval = this->getOtherVertex()->signedDistance(a_x0);
248  }
249  else{ // Closest point is the edge itself.
250  const Vec3 linePoint = m_vertex->getPosition() + t*m_x2x1;
251  const Vec3 delta = a_x0 - linePoint;
252  const T dot = m_normal.dot(delta);
253 
254  const int sgn = (dot > 0.0) ? 1 : -1;
255 
256  retval = sgn*delta.length();
257  }
258 
259  return retval;
260  }
261 
262  template <class T>
263  inline
264  T EdgeT<T>::unsignedDistance2(const Vec3& a_x0) const noexcept {
265  T t = this->projectPointToEdge(a_x0);
266 
267  constexpr T zero = 0.0;
268  constexpr T one = 1.0;
269 
270  t = std::min(std::max(zero,t), one); // Edge is on t=[0,1].
271 
272  const Vec3T<T> linePoint = m_vertex->getPosition() + t*m_x2x1;
273  const Vec3T<T> delta = a_x0 - linePoint;
274 
275  return delta.dot(delta);
276  }
277 }
278 
280 
281 #endif
Vec3 m_normal
Half-edge normal vector.
Definition: EBGeometry_DcelEdge.hpp:282
+
FacePtr m_face
Enclosing polygon face.
Definition: EBGeometry_DcelEdge.hpp:317
+
Vec3T< T > & getNormal() noexcept
Get modifiable half-edge normal vector.
Definition: EBGeometry_DcelEdgeImplem.hpp:207
+
~EdgeT()
Destructor (does nothing)
Definition: EBGeometry_DcelEdgeImplem.hpp:59
+
VertexPtr & getVertex() noexcept
Get modifiable starting vertex.
Definition: EBGeometry_DcelEdgeImplem.hpp:147
+
FacePtr & getFace() noexcept
Get modifiable half-edge face.
Definition: EBGeometry_DcelEdgeImplem.hpp:219
+
void setVertex(const VertexPtr &a_vertex) noexcept
Set the starting vertex.
Definition: EBGeometry_DcelEdgeImplem.hpp:78
+
EdgePtr & getPreviousEdge() noexcept
Get modifiable previous edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:183
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
void computeNormal() noexcept
Compute normal vector as average of face normals.
Definition: EBGeometry_DcelEdgeImplem.hpp:127
+
void computeEdgeLength() noexcept
Compute the edge length.
Definition: EBGeometry_DcelEdgeImplem.hpp:114
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
VertexPtr & getOtherVertex() noexcept
Get modifiable end vertex.
Definition: EBGeometry_DcelEdgeImplem.hpp:159
+
Declaration of iterators for DCEL surface Tesselations.
+
T dot(const Vec3T< T > &u) const noexcept
Vector dot product.
Definition: EBGeometry_VecImplem.hpp:417
+
T m_invLen2
Squared inverse edge length. Exists for performance reasons.
Definition: EBGeometry_DcelEdge.hpp:292
+
void define(const VertexPtr &a_vertex, const EdgePtr &a_pairEdge, const EdgePtr &a_nextEdge, const EdgePtr &a_previousEdge, const Vec3 a_normal) noexcept
Define function. Sets the starting vertex, edges, and normal vectors.
Definition: EBGeometry_DcelEdgeImplem.hpp:64
+
void setNextEdge(const EdgePtr &a_nextEdge) noexcept
Set the next edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:90
+
EdgePtr m_nextEdge
Next edge.
Definition: EBGeometry_DcelEdge.hpp:312
+
VertexPtr m_vertex
Starting vertex.
Definition: EBGeometry_DcelEdge.hpp:297
+
std::shared_ptr< Face > FacePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelEdge.hpp:80
+
void reconcile() noexcept
Compute edge normal and edge length (for performance reasons)
Definition: EBGeometry_DcelEdgeImplem.hpp:140
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
T signedDistance(const Vec3 &a_x0) const noexcept
Get the signed distance to this half edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:239
+
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+
void setPairEdge(const EdgePtr &a_pairEdge) noexcept
Set the pair edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:84
+
T length() const noexcept
Compute vector length.
Definition: EBGeometry_VecImplem.hpp:423
+
EdgePtr & getPairEdge() noexcept
Get modifiable pair edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:171
+
T unsignedDistance2(const Vec3 &a_x0) const noexcept
Get the signed distance to this half edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:264
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+ +
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on typing.
Definition: EBGeometry_DcelEdge.hpp:70
+
EdgePtr & getNextEdge() noexcept
Get modifiable next edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:195
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelEdge.hpp:75
+
T projectPointToEdge(const Vec3 &a_x0) const noexcept
Returns the "projection" of a point to an edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:231
+
void normalizeNormalVector() noexcept
Normalize the normal vector, ensuring it has length 1.
Definition: EBGeometry_DcelEdgeImplem.hpp:108
+
Vec3 m_x2x1
Vector from the starting vertex to the end vertex. Exists for performance reasons.
Definition: EBGeometry_DcelEdge.hpp:287
+
void setFace(const FacePtr &a_face) noexcept
Set the pointer to this half-edge&#39;s face.
Definition: EBGeometry_DcelEdgeImplem.hpp:102
+
void setPreviousEdge(const EdgePtr &a_previousEdge) noexcept
Set the previous edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:96
+
EdgePtr m_pairEdge
Pair edge.
Definition: EBGeometry_DcelEdge.hpp:302
+
EdgeT()
Default constructor. Sets all pointers to zero and vectors to zero vectors.
Definition: EBGeometry_DcelEdgeImplem.hpp:27
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
EdgePtr m_previousEdge
Previous edge.
Definition: EBGeometry_DcelEdge.hpp:307
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp.html b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp.html new file mode 100644 index 00000000..9f0ca12e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp.html @@ -0,0 +1,162 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelEdge.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelEdge.hpp File Reference
+
+
+ +

Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations. +More...

+
#include <vector>
+#include <memory>
+#include "EBGeometry_Vec.hpp"
+#include "EBGeometry_DcelFace.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_DcelEdgeImplem.hpp"
+
+Include dependency graph for EBGeometry_DcelEdge.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + +

+Classes

class  Dcel::VertexT< T >
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeT< T >
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
class  Dcel::FaceT< T >
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeIteratorT< T >
 Class which can iterate through edges and vertices around a DCEL polygon face. More...
 
class  Dcel::EdgeT< T >
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
+ + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.map new file mode 100644 index 00000000..aaeaa01b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.md5 new file mode 100644 index 00000000..5576a98c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +947efed2818f4bfbe84cc6dd2b817978 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.png new file mode 100644 index 00000000..128b39c2 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.map new file mode 100644 index 00000000..7420a201 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.md5 new file mode 100644 index 00000000..f2e54f35 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.md5 @@ -0,0 +1 @@ +c352d15db094b3ff8d365a4b97e8eb35 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.png new file mode 100644 index 00000000..339b1f2a Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelEdge_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp_source.html new file mode 100644 index 00000000..97f90475 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelEdge_8hpp_source.html @@ -0,0 +1,121 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelEdge.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelEdge.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelEdge
13 #define EBGeometry_DcelEdge
14 
15 // Std includes
16 #include <vector>
17 #include <memory>
18 
19 // Our includes
20 #include "EBGeometry_Vec.hpp"
21 #include "EBGeometry_DcelFace.hpp"
23 
24 namespace Dcel {
25 
26  // Forward declare classes.
27  template <class T> class VertexT;
28  template <class T> class EdgeT;
29  template <class T> class FaceT;
30  template <class T> class EdgeIteratorT;
31 
43  template<class T>
44  class EdgeT {
45  public:
46 
50  using Vec3 = Vec3T<T>;
51 
55  using Vertex = VertexT<T>;
56 
60  using Edge = EdgeT<T>;
61 
65  using Face = FaceT<T>;
66 
70  using VertexPtr = std::shared_ptr<Vertex>;
71 
75  using EdgePtr = std::shared_ptr<Edge>;
76 
80  using FacePtr = std::shared_ptr<Face>;
81 
86 
90  EdgeT();
91 
96  EdgeT(const Edge& a_otherEdge);
97 
102  EdgeT(const VertexPtr& a_vertex);
103 
107  ~EdgeT();
108 
117  inline
118  void define(const VertexPtr& a_vertex,
119  const EdgePtr& a_pairEdge,
120  const EdgePtr& a_nextEdge,
121  const EdgePtr& a_previousEdge,
122  const Vec3 a_normal) noexcept;
123 
128  inline
129  void setVertex(const VertexPtr& a_vertex) noexcept;
130 
135  inline
136  void setPairEdge(const EdgePtr& a_pairEdge) noexcept;
137 
142  inline
143  void setNextEdge(const EdgePtr& a_nextEdge) noexcept;
144 
149  inline
150  void setPreviousEdge(const EdgePtr& a_previousEdge) noexcept;
151 
155  inline
156  void setFace(const FacePtr& a_face) noexcept;
157 
161  inline
162  void reconcile() noexcept;
163 
168  inline
169  VertexPtr& getVertex() noexcept;
170 
175  inline
176  const VertexPtr& getVertex() const noexcept;
177 
182  inline
183  VertexPtr& getOtherVertex() noexcept;
184 
189  inline
190  const VertexPtr& getOtherVertex() const noexcept;
191 
196  inline
197  EdgePtr& getPairEdge() noexcept;
198 
203  inline
204  const EdgePtr& getPairEdge() const noexcept;
205 
210  inline
211  EdgePtr& getPreviousEdge() noexcept;
212 
217  inline
218  const EdgePtr& getPreviousEdge() const noexcept;
219 
224  inline
225  EdgePtr& getNextEdge() noexcept;
226 
231  inline
232  const EdgePtr& getNextEdge() const noexcept;
233 
237  inline
238  Vec3T<T>& getNormal() noexcept;
239 
243  inline
244  const Vec3T<T>& getNormal() const noexcept;
245 
249  inline
250  FacePtr& getFace() noexcept;
251 
255  inline
256  const FacePtr& getFace() const noexcept;
257 
264  inline
265  T signedDistance(const Vec3& a_x0) const noexcept;
266 
273  inline
274  T unsignedDistance2(const Vec3& a_x0) const noexcept;
275 
276  protected:
277 
283 
288 
293 
298 
303 
308 
313 
318 
324  inline
325  T projectPointToEdge(const Vec3& a_x0) const noexcept;
326 
330  inline
331  void normalizeNormalVector() noexcept;
332 
337  inline
338  void computeEdgeLength() noexcept;
339 
343  inline
344  void computeNormal() noexcept;
345  };
346 }
347 
348 #include "EBGeometry_NamespaceFooter.hpp"
349 
351 
352 #endif
Vec3 m_normal
Half-edge normal vector.
Definition: EBGeometry_DcelEdge.hpp:282
+
FacePtr m_face
Enclosing polygon face.
Definition: EBGeometry_DcelEdge.hpp:317
+
Vec3T< T > & getNormal() noexcept
Get modifiable half-edge normal vector.
Definition: EBGeometry_DcelEdgeImplem.hpp:207
+
~EdgeT()
Destructor (does nothing)
Definition: EBGeometry_DcelEdgeImplem.hpp:59
+
VertexPtr & getVertex() noexcept
Get modifiable starting vertex.
Definition: EBGeometry_DcelEdgeImplem.hpp:147
+
FacePtr & getFace() noexcept
Get modifiable half-edge face.
Definition: EBGeometry_DcelEdgeImplem.hpp:219
+
void setVertex(const VertexPtr &a_vertex) noexcept
Set the starting vertex.
Definition: EBGeometry_DcelEdgeImplem.hpp:78
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
EdgePtr & getPreviousEdge() noexcept
Get modifiable previous edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:183
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
void computeNormal() noexcept
Compute normal vector as average of face normals.
Definition: EBGeometry_DcelEdgeImplem.hpp:127
+
void computeEdgeLength() noexcept
Compute the edge length.
Definition: EBGeometry_DcelEdgeImplem.hpp:114
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
VertexPtr & getOtherVertex() noexcept
Get modifiable end vertex.
Definition: EBGeometry_DcelEdgeImplem.hpp:159
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
T m_invLen2
Squared inverse edge length. Exists for performance reasons.
Definition: EBGeometry_DcelEdge.hpp:292
+
void define(const VertexPtr &a_vertex, const EdgePtr &a_pairEdge, const EdgePtr &a_nextEdge, const EdgePtr &a_previousEdge, const Vec3 a_normal) noexcept
Define function. Sets the starting vertex, edges, and normal vectors.
Definition: EBGeometry_DcelEdgeImplem.hpp:64
+
void setNextEdge(const EdgePtr &a_nextEdge) noexcept
Set the next edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:90
+
EdgePtr m_nextEdge
Next edge.
Definition: EBGeometry_DcelEdge.hpp:312
+
VertexPtr m_vertex
Starting vertex.
Definition: EBGeometry_DcelEdge.hpp:297
+
std::shared_ptr< Face > FacePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelEdge.hpp:80
+
void reconcile() noexcept
Compute edge normal and edge length (for performance reasons)
Definition: EBGeometry_DcelEdgeImplem.hpp:140
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
T signedDistance(const Vec3 &a_x0) const noexcept
Get the signed distance to this half edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:239
+
void setPairEdge(const EdgePtr &a_pairEdge) noexcept
Set the pair edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:84
+
EdgePtr & getPairEdge() noexcept
Get modifiable pair edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:171
+
T unsignedDistance2(const Vec3 &a_x0) const noexcept
Get the signed distance to this half edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:264
+ +
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on typing.
Definition: EBGeometry_DcelEdge.hpp:70
+
EdgePtr & getNextEdge() noexcept
Get modifiable next edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:195
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelEdge.hpp:75
+
T projectPointToEdge(const Vec3 &a_x0) const noexcept
Returns the "projection" of a point to an edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:231
+
void normalizeNormalVector() noexcept
Normalize the normal vector, ensuring it has length 1.
Definition: EBGeometry_DcelEdgeImplem.hpp:108
+
Vec3 m_x2x1
Vector from the starting vertex to the end vertex. Exists for performance reasons.
Definition: EBGeometry_DcelEdge.hpp:287
+
void setFace(const FacePtr &a_face) noexcept
Set the pointer to this half-edge&#39;s face.
Definition: EBGeometry_DcelEdgeImplem.hpp:102
+
void setPreviousEdge(const EdgePtr &a_previousEdge) noexcept
Set the previous edge.
Definition: EBGeometry_DcelEdgeImplem.hpp:96
+
EdgePtr m_pairEdge
Pair edge.
Definition: EBGeometry_DcelEdge.hpp:302
+
EdgeT()
Default constructor. Sets all pointers to zero and vectors to zero vectors.
Definition: EBGeometry_DcelEdgeImplem.hpp:27
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
Implementation of EBGeometry_DcelEdge.hpp.
+
EdgePtr m_previousEdge
Previous edge.
Definition: EBGeometry_DcelEdge.hpp:307
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp.html new file mode 100644 index 00000000..73a0da2b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp.html @@ -0,0 +1,140 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelFaceImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelFaceImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_DcelFace.hpp. +More...

+
+Include dependency graph for EBGeometry_DcelFaceImplem.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_DcelFace.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..4c06222a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..efb9e5ff --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +8ffb154c7a52e1eab8fef55580140c52 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..e9aa8364 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.map new file mode 100644 index 00000000..9a8d9693 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.md5 new file mode 100644 index 00000000..24e70d7c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +71e0b1138046cea18244346aadb2bb16 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.png new file mode 100644 index 00000000..b0e3fe0a Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp_source.html new file mode 100644 index 00000000..d202b8bf --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFaceImplem_8hpp_source.html @@ -0,0 +1,126 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelFaceImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelFaceImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelFaceImplem
13 #define EBGeometry_DcelFaceImplem
14 
15 // Our includes
16 #include "EBGeometry_DcelFace.hpp"
19 
20 namespace Dcel {
21 
22  template <class T>
23  inline
25  m_halfEdge = nullptr;
26  m_normal = Vec3::zero();
28  }
29 
30  template <class T>
31  inline
32  FaceT<T>::FaceT(const EdgePtr& a_edge) : Face() {
33  m_halfEdge = a_edge;
34  }
35 
36  template <class T>
37  inline
38  FaceT<T>::FaceT(const Face& a_otherFace) : Face() {
39  m_normal = a_otherFace.getNormal();
40  m_halfEdge = a_otherFace.getHalfEdge();
41  }
42 
43  template <class T>
44  inline
46  }
47 
48  template <class T>
49  inline
50  void FaceT<T>::define(const Vec3& a_normal, const EdgePtr& a_edge) noexcept {
51  m_normal = a_normal;
52  m_halfEdge = a_edge;
53  }
54 
55  template <class T>
56  inline
57  void FaceT<T>::reconcile() noexcept {
58  this->computeNormal();
59  this->normalizeNormalVector();
60  this->computeCentroid();
61  this->computeArea();
62  this->computePolygon2D();
63  this->computeAndStoreEdges();
64  }
65 
66  template <class T>
67  inline
69  m_edges.resize(0);
70 
71  for (EdgeIterator edgeIt(*this); edgeIt.ok(); ++edgeIt){
72  m_edges.emplace_back(edgeIt());
73  }
74  }
75 
76  template <class T>
77  inline
78  void FaceT<T>::setHalfEdge(const EdgePtr& a_halfEdge) noexcept {
79  m_halfEdge = a_halfEdge;
80  }
81 
82  template <class T>
83  inline
86  }
87 
88  template <class T>
89  inline
91  m_poly2Algorithm = a_algorithm;
92  }
93 
94  template <class T>
95  inline
96  void FaceT<T>::computeArea() noexcept {
97  m_area = 0.0;
98 
99  // This computes the area of any N-side polygon.
100  const auto vertices = this->gatherVertices();
101 
102  for (unsigned int i = 0; i < vertices.size() - 1; i++){
103  const auto& v1 = vertices[i] ->getPosition();
104  const auto& v2 = vertices[i+1]->getPosition();
105  m_area += m_normal.dot(v2.cross(v1));
106  }
107 
108  m_area = 0.5*std::abs(m_area);
109  }
110 
111  template <class T>
112  inline
113  void FaceT<T>::computeCentroid() noexcept {
115 
116  const auto vertices = this->gatherVertices();
117 
118  for (const auto& v : vertices){
119  m_centroid += v->getPosition();
120  }
121 
122  m_centroid = m_centroid/vertices.size();
123  }
124 
125  template <class T>
126  inline
127  void FaceT<T>::computeNormal() noexcept {
128  const auto vertices = this->gatherVertices();
129 
130  const int N = vertices.size();
131 
132  // To compute the normal vector we find three vertices in this polygon face. They span a plane, and we just compute the
133  // normal vector of that plane.
134  for (int i = 0; i < N; i++){
135  const auto& x0 = vertices[i] ->getPosition();
136  const auto& x1 = vertices[(i+1)%N]->getPosition();
137  const auto& x2 = vertices[(i+2)%N]->getPosition();
138 
139  m_normal = (x2-x1).cross(x2-x0);
140 
141  if(m_normal.length() > 0.0) break; // Found one.
142  }
143 
144  this->normalizeNormalVector();
145  }
146 
147  template <class T>
148  inline
149  void FaceT<T>::computePolygon2D() noexcept{
150 
151  // See CD_DcelPoly.H to see how the 2D embedding operates.
152  m_poly2 = std::make_shared<Polygon2D<T> >(m_normal, this->getAllVertexCoordinates());
153  }
154 
155  template <class T>
156  inline
157  T& FaceT<T>::getCentroid(const int a_dir) noexcept {
158  return m_centroid[a_dir];
159  }
160 
161  template <class T>
162  inline
163  const T& FaceT<T>::getCentroid(const int a_dir) const noexcept {
164  return m_centroid[a_dir];
165  }
166 
167  template <class T>
168  inline
170  return (m_centroid);
171  }
172 
173  template <class T>
174  inline
175  const Vec3T<T>& FaceT<T>::getCentroid() const noexcept {
176  return (m_centroid);
177  }
178 
179  template <class T>
180  inline
182  return (m_normal);
183  }
184 
185  template <class T>
186  inline
187  const Vec3T<T>& FaceT<T>::getNormal() const noexcept {
188  return (m_normal);
189  }
190 
191  template <class T>
192  inline
193  T FaceT<T>::getArea() noexcept {
194  return (m_area);
195  }
196 
197  template <class T>
198  inline
199  T FaceT<T>::getArea() const noexcept {
200  return (m_area);
201  }
202 
203  template <class T>
204  inline
205  std::shared_ptr<EdgeT<T> >& FaceT<T>::getHalfEdge() noexcept {
206  return (m_halfEdge);
207  }
208 
209  template <class T>
210  inline
211  const std::shared_ptr<EdgeT<T> >& FaceT<T>::getHalfEdge() const noexcept {
212  return (m_halfEdge);
213  }
214 
215  template <class T>
216  inline
217  std::vector<std::shared_ptr<VertexT<T> > > FaceT<T>::gatherVertices() const noexcept {
218  std::vector<VertexPtr> vertices;
219 
220  for (EdgeIterator iter(*this); iter.ok(); ++iter){
221  EdgePtr& edge = iter();
222  vertices.emplace_back(edge->getVertex());
223  }
224 
225  return vertices;
226  }
227 
228  template <class T>
229  inline
230  std::vector<Vec3T<T> > FaceT<T>::getAllVertexCoordinates() const noexcept {
231  std::vector<Vec3> ret;
232 
233  for (EdgeIterator iter(*this); iter.ok(); ++iter){
234  EdgePtr& edge = iter();
235  ret.emplace_back(edge->getVertex()->getPosition());
236  }
237 
238  return ret;
239  }
240 
241  template <class T>
242  inline
244  const auto coords = this->getAllVertexCoordinates();
245 
246  auto minCoord = coords.front();
247 
248  for (const auto& c : coords){
249  minCoord = min(minCoord, c);
250  }
251 
252  return minCoord;
253  }
254 
255  template <class T>
256  inline
258  const auto coords = this->getAllVertexCoordinates();
259 
260  auto maxCoord = coords.front();
261 
262  for (const auto& c : coords){
263  maxCoord = max(maxCoord, c);
264  }
265 
266  return maxCoord;
267  }
268 
269  template <class T>
270  inline
271  Vec3T<T> FaceT<T>::projectPointIntoFacePlane(const Vec3& a_p) const noexcept {
272  return a_p - m_normal * (m_normal.dot(a_p-m_centroid));
273  }
274 
275  template <class T>
276  inline
277  bool FaceT<T>::isPointInsideFace(const Vec3& a_p) const noexcept {
278  const Vec3 p = this->projectPointIntoFacePlane(a_p);
279 
280  return m_poly2->isPointInside(p, m_poly2Algorithm);
281  }
282 
283  template <class T>
284  inline
285  T FaceT<T>::signedDistance(const Vec3& a_x0) const noexcept {
286  T retval = std::numeric_limits<T>::infinity();
287 
288  const bool inside = this->isPointInsideFace(a_x0);
289 
290  if(inside){ // Projects to inside so distance and sign are straightforward to compute.
291  retval = m_normal.dot(a_x0 - m_centroid);
292  }
293  else {
294  for (const auto& e : m_edges){ // Projects to outside so edge/vertex are closest. Check that distance.
295  const T curDist = e->signedDistance(a_x0);
296 
297  retval = (curDist*curDist < retval*retval) ? curDist : retval;
298  }
299  }
300 
301  return retval;
302  }
303 
304  template <class T>
305  inline
306  T FaceT<T>::unsignedDistance2(const Vec3& a_x0) const noexcept {
307  T retval = std::numeric_limits<T>::infinity();
308 
309  const bool inside = this->isPointInsideFace(a_x0);
310 
311  if(inside){ // Projects to inside the polygon face so distance is straightforward.
312  const T normDist = m_normal.dot(a_x0-m_centroid);
313 
314  retval = normDist*normDist;
315  }
316  else{
317  for (const auto& e : m_edges){ // Projects to outside so edge/vertex are closest.
318  const T curDist2 = e->unsignedDistance2(a_x0);
319 
320  retval = (curDist2 < retval) ? curDist2 : retval;
321  }
322  }
323 
324  return retval;
325  }
326 }
327 
329 
330 #endif
Vec3 m_centroid
Polygon face centroid position.
Definition: EBGeometry_DcelFace.hpp:259
+
std::shared_ptr< Polygon2D< T > > m_poly2
2D embedding of this polygon. This is the 2D view of the current object projected along its normal ve...
Definition: EBGeometry_DcelFace.hpp:264
+
T signedDistance(const Vec3 &a_x0) const noexcept
Compute the signed distance to a point.
Definition: EBGeometry_DcelFaceImplem.hpp:285
+
std::vector< Vec3T< T > > getAllVertexCoordinates() const noexcept
Return the coordinates of all the vertices on this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:230
+
Vec3T< T > & getCentroid() noexcept
Get modifiable centroid.
Definition: EBGeometry_DcelFaceImplem.hpp:169
+
static constexpr Vec3T< T > zero() noexcept
Return av vector with x = y = z = 0.
Definition: EBGeometry_VecImplem.hpp:205
+
bool ok() const noexcept
Function which checks if the iteration can be continued.
Definition: EBGeometry_DcelIteratorImplem.hpp:97
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
void computeAndStoreEdges() noexcept
Compute and store all the half-edges around this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:68
+
T m_area
Polygon face area.
Definition: EBGeometry_DcelFace.hpp:249
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
Vec3T< T > getHighestCoordinate() const noexcept
Get the upper-right-most coordinate of this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:257
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
void reconcile() noexcept
Reconcile face. This will compute the normal vector, area, centroid, and the 2D embedding of the poly...
Definition: EBGeometry_DcelFaceImplem.hpp:57
+
EdgePtr m_halfEdge
This polygon&#39;s half-edge. A valid face will always have != nullptr.
Definition: EBGeometry_DcelFace.hpp:239
+
std::vector< VertexPtr > gatherVertices() const noexcept
Return all the vertices on this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:217
+
std::vector< EdgePtr > m_edges
Pointers to all the half-edges of this face. Exists for performance reasons (in signedDistance(...))
Definition: EBGeometry_DcelFace.hpp:244
+
Vec3T< T > & getNormal() noexcept
Get modifiable normal vector.
Definition: EBGeometry_DcelFaceImplem.hpp:181
+
Declaration of iterators for DCEL surface Tesselations.
+
Vec3T< T > getSmallestCoordinate() const noexcept
Get the lower-left-most coordinate of this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:243
+
void computePolygon2D() noexcept
Compute the 2D embedding of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:149
+
void setInsideOutsideAlgorithm(typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm &a_algorithm) noexcept
Set the inside/outside algorithm when determining if a point projects to the inside or outside of the...
Definition: EBGeometry_DcelFaceImplem.hpp:90
+
T dot(const Vec3T< T > &u) const noexcept
Vector dot product.
Definition: EBGeometry_VecImplem.hpp:417
+
T unsignedDistance2(const Vec3 &a_x0) const noexcept
Compute the unsigned squared distance to a point.
Definition: EBGeometry_DcelFaceImplem.hpp:306
+
InsideOutsideAlgorithm
Supported algorithms for performing inside/outside tests when checking if a point projects to the ins...
Definition: EBGeometry_DcelPolygon2D.hpp:41
+
EdgePtr & getHalfEdge() noexcept
Get modifiable half-edge.
Definition: EBGeometry_DcelFaceImplem.hpp:205
+
Vec3 m_normal
Polygon face normal vector.
Definition: EBGeometry_DcelFace.hpp:254
+
void computeCentroid() noexcept
Compute the centroid position of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:113
+
Vec3T< T > projectPointIntoFacePlane(const Vec3 &a_p) const noexcept
Compute the projection of a point onto the polygon face plane.
Definition: EBGeometry_DcelFaceImplem.hpp:271
+
bool isPointInsideFace(const Vec3 &a_p) const noexcept
Check if a point projects to inside or outside the polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:277
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
~FaceT()
Destructor (does nothing)
Definition: EBGeometry_DcelFaceImplem.hpp:45
+
void define(const Vec3 &a_normal, const EdgePtr &a_edge) noexcept
Define function which sets the normal vector and half-edge.
Definition: EBGeometry_DcelFaceImplem.hpp:50
+
T length() const noexcept
Compute vector length.
Definition: EBGeometry_VecImplem.hpp:423
+
void computeNormal() noexcept
Compute the normal position of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:127
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+ +
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelFace.hpp:76
+
Polygon2D< T >::InsideOutsideAlgorithm m_poly2Algorithm
Algorithm for inside/outside tests.
Definition: EBGeometry_DcelFace.hpp:269
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
void computeArea() noexcept
Compute the area of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:96
+
Class for embedding a DCEL polygon face into 2D.
Definition: EBGeometry_DcelMesh.hpp:31
+
T getArea() noexcept
Get the area of this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:193
+
void normalizeNormalVector() noexcept
Normalize the normal vector, ensuring it has a length of 1.
Definition: EBGeometry_DcelFaceImplem.hpp:84
+
FaceT()
Default constructor. Sets the half-edge to zero and the inside/outside algorithm to crossing number a...
Definition: EBGeometry_DcelFaceImplem.hpp:24
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
void setHalfEdge(const EdgePtr &a_halfEdge) noexcept
Set the half edge.
Definition: EBGeometry_DcelFaceImplem.hpp:78
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp.html b/docs/doxygen/html/EBGeometry__DcelFace_8hpp.html new file mode 100644 index 00000000..05c59cfd --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFace_8hpp.html @@ -0,0 +1,164 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelFace.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelFace.hpp File Reference
+
+
+ +

Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations. +More...

+
#include <memory>
+#include <vector>
+#include "EBGeometry_Vec.hpp"
+#include "EBGeometry_DcelVertex.hpp"
+#include "EBGeometry_DcelEdge.hpp"
+#include "EBGeometry_DcelPolygon2D.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_DcelFaceImplem.hpp"
+
+Include dependency graph for EBGeometry_DcelFace.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + +

+Classes

class  Dcel::VertexT< T >
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeT< T >
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
class  Dcel::FaceT< T >
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeIteratorT< T >
 Class which can iterate through edges and vertices around a DCEL polygon face. More...
 
class  Dcel::FaceT< T >
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
+ + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.map new file mode 100644 index 00000000..7d54b9c5 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.md5 new file mode 100644 index 00000000..cb39b82f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +8ad977b232cf918acafa9cf05d180679 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.png new file mode 100644 index 00000000..fa895937 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.map new file mode 100644 index 00000000..159cfece --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.md5 new file mode 100644 index 00000000..77dbd43d --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.md5 @@ -0,0 +1 @@ +3c949bdecd757202fe11a77ba5cf9fff \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.png new file mode 100644 index 00000000..f5041f5e Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelFace_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelFace_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelFace_8hpp_source.html new file mode 100644 index 00000000..f1129438 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelFace_8hpp_source.html @@ -0,0 +1,125 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelFace.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelFace.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelFace
13 #define EBGeometry_DcelFace
14 
15 // Std includes
16 #include <memory>
17 #include <vector>
18 
19 // Our includes
20 #include "EBGeometry_Vec.hpp"
22 #include "EBGeometry_DcelEdge.hpp"
25 
26 namespace Dcel {
27 
28  // Forward declarations of other DCEL functionality.
29  template <class T> class VertexT;
30  template <class T> class EdgeT;
31  template <class T> class FaceT;
32  template <class T> class EdgeIteratorT;
33 
44  template <class T>
45  class FaceT {
46  public:
47 
51  using Vec3 = Vec3T<T>;
52 
56  using Vertex = VertexT<T>;
57 
61  using Edge = EdgeT<T>;
62 
66  using Face = FaceT<T>;
67 
71  using VertexPtr = std::shared_ptr<Vertex>;
72 
76  using EdgePtr = std::shared_ptr<Edge>;
77 
81  using FacePtr = std::shared_ptr<Face>;
82 
87 
91  FaceT();
92 
97  FaceT(const EdgePtr& a_edge);
98 
103  FaceT(const Face& a_otherFace);
104 
108  ~FaceT();
109 
115  inline
116  void define(const Vec3& a_normal, const EdgePtr& a_edge) noexcept;
117 
122  inline
123  void reconcile() noexcept;
124 
129  inline
130  void setHalfEdge(const EdgePtr& a_halfEdge) noexcept;
131 
137  inline
138  void setInsideOutsideAlgorithm(typename Dcel::Polygon2D<T>::InsideOutsideAlgorithm& a_algorithm) noexcept;
139 
143  inline
144  EdgePtr& getHalfEdge() noexcept;
145 
149  inline
150  const EdgePtr& getHalfEdge() const noexcept;
151 
155  inline
156  Vec3T<T>& getCentroid() noexcept;
157 
161  inline
162  const Vec3T<T>& getCentroid() const noexcept;
163 
168  inline
169  T& getCentroid(const int a_dir) noexcept;
170 
175  inline
176  const T& getCentroid(const int a_dir) const noexcept;
177 
181  inline
182  Vec3T<T>& getNormal() noexcept;
183 
187  inline
188  const Vec3T<T>& getNormal() const noexcept;
189 
196  inline
197  T signedDistance(const Vec3& a_x0) const noexcept;
198 
205  inline
206  T unsignedDistance2(const Vec3& a_x0) const noexcept;
207 
212  inline
213  std::vector<Vec3T<T> > getAllVertexCoordinates() const noexcept;
214 
219  inline
220  std::vector<VertexPtr> gatherVertices() const noexcept;
221 
225  inline
226  Vec3T<T> getSmallestCoordinate() const noexcept;
227 
231  inline
232  Vec3T<T> getHighestCoordinate() const noexcept;
233 
234  protected:
235 
240 
244  std::vector<EdgePtr > m_edges; // Exists because of performance reasons.
245 
250 
255 
260 
264  std::shared_ptr<Polygon2D<T> > m_poly2;
265 
269  typename Polygon2D<T>::InsideOutsideAlgorithm m_poly2Algorithm;
270 
274  inline
275  void computeArea() noexcept;
276 
280  inline
281  void computeCentroid() noexcept;
282 
286  inline
287  void computeNormal() noexcept;
288 
292  inline
293  void computePolygon2D() noexcept;
294 
298  inline
299  void normalizeNormalVector() noexcept;
300 
304  inline
305  T getArea() noexcept;
306 
310  inline
311  T getArea() const noexcept;
312 
316  inline
317  void computeAndStoreEdges() noexcept;
318 
323  inline
324  Vec3T<T> projectPointIntoFacePlane(const Vec3& a_p) const noexcept;
325 
331  inline
332  bool isPointInsideFace(const Vec3& a_p) const noexcept;
333  };
334 }
335 
336 #include "EBGeometry_NamespaceFooter.hpp"
337 
339 
340 #endif
Vec3 m_centroid
Polygon face centroid position.
Definition: EBGeometry_DcelFace.hpp:259
+
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on typing.
Definition: EBGeometry_DcelFace.hpp:71
+
Implementation of EBGeometry_DcelFace.hpp.
+
std::shared_ptr< Polygon2D< T > > m_poly2
2D embedding of this polygon. This is the 2D view of the current object projected along its normal ve...
Definition: EBGeometry_DcelFace.hpp:264
+
T signedDistance(const Vec3 &a_x0) const noexcept
Compute the signed distance to a point.
Definition: EBGeometry_DcelFaceImplem.hpp:285
+
std::vector< Vec3T< T > > getAllVertexCoordinates() const noexcept
Return the coordinates of all the vertices on this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:230
+
Vec3T< T > & getCentroid() noexcept
Get modifiable centroid.
Definition: EBGeometry_DcelFaceImplem.hpp:169
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
void computeAndStoreEdges() noexcept
Compute and store all the half-edges around this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:68
+
T m_area
Polygon face area.
Definition: EBGeometry_DcelFace.hpp:249
+
std::shared_ptr< Face > FacePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelFace.hpp:81
+
Vec3T< T > getHighestCoordinate() const noexcept
Get the upper-right-most coordinate of this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:257
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
void reconcile() noexcept
Reconcile face. This will compute the normal vector, area, centroid, and the 2D embedding of the poly...
Definition: EBGeometry_DcelFaceImplem.hpp:57
+
EdgePtr m_halfEdge
This polygon&#39;s half-edge. A valid face will always have != nullptr.
Definition: EBGeometry_DcelFace.hpp:239
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
std::vector< VertexPtr > gatherVertices() const noexcept
Return all the vertices on this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:217
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
Declaration of a two-dimensional polygon class for embedding 3D polygon faces.
+
std::vector< EdgePtr > m_edges
Pointers to all the half-edges of this face. Exists for performance reasons (in signedDistance(...))
Definition: EBGeometry_DcelFace.hpp:244
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
Vec3T< T > & getNormal() noexcept
Get modifiable normal vector.
Definition: EBGeometry_DcelFaceImplem.hpp:181
+
Vec3T< T > getSmallestCoordinate() const noexcept
Get the lower-left-most coordinate of this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:243
+
void computePolygon2D() noexcept
Compute the 2D embedding of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:149
+
void setInsideOutsideAlgorithm(typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm &a_algorithm) noexcept
Set the inside/outside algorithm when determining if a point projects to the inside or outside of the...
Definition: EBGeometry_DcelFaceImplem.hpp:90
+
T unsignedDistance2(const Vec3 &a_x0) const noexcept
Compute the unsigned squared distance to a point.
Definition: EBGeometry_DcelFaceImplem.hpp:306
+
EdgePtr & getHalfEdge() noexcept
Get modifiable half-edge.
Definition: EBGeometry_DcelFaceImplem.hpp:205
+
Vec3 m_normal
Polygon face normal vector.
Definition: EBGeometry_DcelFace.hpp:254
+
void computeCentroid() noexcept
Compute the centroid position of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:113
+
Vec3T< T > projectPointIntoFacePlane(const Vec3 &a_p) const noexcept
Compute the projection of a point onto the polygon face plane.
Definition: EBGeometry_DcelFaceImplem.hpp:271
+
bool isPointInsideFace(const Vec3 &a_p) const noexcept
Check if a point projects to inside or outside the polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:277
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
~FaceT()
Destructor (does nothing)
Definition: EBGeometry_DcelFaceImplem.hpp:45
+
void define(const Vec3 &a_normal, const EdgePtr &a_edge) noexcept
Define function which sets the normal vector and half-edge.
Definition: EBGeometry_DcelFaceImplem.hpp:50
+
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+
void computeNormal() noexcept
Compute the normal position of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:127
+ +
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelFace.hpp:76
+
Polygon2D< T >::InsideOutsideAlgorithm m_poly2Algorithm
Algorithm for inside/outside tests.
Definition: EBGeometry_DcelFace.hpp:269
+
void computeArea() noexcept
Compute the area of this polygon.
Definition: EBGeometry_DcelFaceImplem.hpp:96
+
Class for embedding a DCEL polygon face into 2D.
Definition: EBGeometry_DcelMesh.hpp:31
+
T getArea() noexcept
Get the area of this polygon face.
Definition: EBGeometry_DcelFaceImplem.hpp:193
+
void normalizeNormalVector() noexcept
Normalize the normal vector, ensuring it has a length of 1.
Definition: EBGeometry_DcelFaceImplem.hpp:84
+
FaceT()
Default constructor. Sets the half-edge to zero and the inside/outside algorithm to crossing number a...
Definition: EBGeometry_DcelFaceImplem.hpp:24
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
void setHalfEdge(const EdgePtr &a_halfEdge) noexcept
Set the half edge.
Definition: EBGeometry_DcelFaceImplem.hpp:78
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp.html new file mode 100644 index 00000000..0d6e0df6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp.html @@ -0,0 +1,142 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelIteratorImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelIteratorImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_DcelIterator.hpp. +More...

+
+Include dependency graph for EBGeometry_DcelIteratorImplem.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_DcelIterator.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..6e4045b3 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..7db7feef --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ffb51f06a9ec83a2ffceb43809e7f983 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..42ee3a80 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.map new file mode 100644 index 00000000..bc1003c8 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.md5 new file mode 100644 index 00000000..f64b72be --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +329708f7089e94d55f243af10519c283 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.png new file mode 100644 index 00000000..102774e2 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp_source.html new file mode 100644 index 00000000..84ef39bb --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIteratorImplem_8hpp_source.html @@ -0,0 +1,94 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelIteratorImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelIteratorImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelIteratorImplem
13 #define EBGeometry_DcelIteratorImplem
14 
15 // Our includes
17 #include "EBGeometry_DcelEdge.hpp"
18 #include "EBGeometry_DcelFace.hpp"
21 
22 namespace Dcel {
23 
24  template <class T>
25  inline
27  m_startEdge = a_face.getHalfEdge();
28  m_curEdge = m_startEdge;
29  m_fullLoop = false;
30  m_iterMode = IterationMode::Faces;
31  }
32 
33  template <class T>
34  inline
36  m_startEdge = a_face.getHalfEdge();
37  m_curEdge = m_startEdge;
38  m_fullLoop = false;
39  m_iterMode = IterationMode::Faces;
40  }
41 
42  template <class T>
43  inline
45  m_startEdge = a_vert.getOutgoingEdge();
46  m_curEdge = m_startEdge;
47  m_fullLoop = false;
48  m_iterMode = IterationMode::Vertices;
49  }
50 
51  template <class T>
52  inline
54  m_startEdge = a_vert.getOutgoingEdge();
55  m_curEdge = m_startEdge;
56  m_fullLoop = false;
57  m_iterMode = IterationMode::Vertices;
58  }
59 
60  template <class T>
61  inline
62  std::shared_ptr<EdgeT<T> >& EdgeIteratorT<T>::operator() () noexcept {
63  return (m_curEdge);
64  }
65 
66  template <class T>
67  inline
68  const std::shared_ptr<EdgeT<T> >& EdgeIteratorT<T>::operator() () const noexcept {
69  return (m_curEdge);
70  }
71 
72  template <class T>
73  inline
74  void EdgeIteratorT<T>::reset() noexcept {
75  m_curEdge = m_startEdge;
76  m_fullLoop = false;
77  }
78 
79  template <class T>
80  inline
81  void EdgeIteratorT<T>::operator++() noexcept {
82  switch(m_iterMode){
83  case IterationMode::Faces:
84  m_curEdge = m_curEdge->getNextEdge();
85  break;
86  case IterationMode::Vertices:
87  // For vertices, we want to compute the
88  m_curEdge = m_curEdge->getPreviousEdge()->getPairEdge();
89  break;
90  }
91 
92  m_fullLoop = (m_curEdge == m_startEdge);
93  }
94 
95  template <class T>
96  inline
97  bool EdgeIteratorT<T>::ok() const noexcept {
98  return !m_fullLoop && m_curEdge;
99  }
100 }
101 
103 
104 #endif
bool ok() const noexcept
Function which checks if the iteration can be continued.
Definition: EBGeometry_DcelIteratorImplem.hpp:97
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
EdgePtr & operator()() noexcept
Operator returning a pointer to the current half-edge.
Definition: EBGeometry_DcelIteratorImplem.hpp:62
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
Declaration of iterators for DCEL surface Tesselations.
+
void operator++() noexcept
Incrementation operator, bringing the iterator to the next half-edge.
Definition: EBGeometry_DcelIteratorImplem.hpp:81
+
EdgePtr & getHalfEdge() noexcept
Get modifiable half-edge.
Definition: EBGeometry_DcelFaceImplem.hpp:205
+
EdgeIteratorT()=delete
Default construction is not allowed. Use one of the full constructors.
+ +
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+
EdgePtr & getOutgoingEdge() noexcept
Return modifiable pointer to outgoing edge.
Definition: EBGeometry_DcelVertexImplem.hpp:224
+
void reset() noexcept
Reset function for the iterator. This resets the iterator so that it begins from the starting half-ed...
Definition: EBGeometry_DcelIteratorImplem.hpp:74
+ +
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp.html b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp.html new file mode 100644 index 00000000..112b0b89 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp.html @@ -0,0 +1,156 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelIterator.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelIterator.hpp File Reference
+
+
+ +

Declaration of iterators for DCEL surface Tesselations. +More...

+
+Include dependency graph for EBGeometry_DcelIterator.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + +

+Classes

class  Dcel::VertexT< T >
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeT< T >
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
class  Dcel::FaceT< T >
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeIteratorT< T >
 Class which can iterate through edges and vertices around a DCEL polygon face. More...
 
+ + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Declaration of iterators for DCEL surface Tesselations.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.map new file mode 100644 index 00000000..ce04528c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.md5 new file mode 100644 index 00000000..e05302b3 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +08c1cd9c3bf493abfaf499f258853418 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.png new file mode 100644 index 00000000..01b6ca2a Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.map new file mode 100644 index 00000000..02d84992 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.md5 new file mode 100644 index 00000000..00e3e123 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.md5 @@ -0,0 +1 @@ +3c2f875058e6e49e94616198888cca27 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.png new file mode 100644 index 00000000..905c4e84 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelIterator_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp_source.html new file mode 100644 index 00000000..0061710a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelIterator_8hpp_source.html @@ -0,0 +1,97 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelIterator.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelIterator.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelIterator
13 #define EBGeometry_DcelIterator
14 
15 // Std includes
16 #include <memory>
17 
18 // Our includes
20 
21 namespace Dcel {
22 
23  // Forward declare classes.
24  template <class T> class VertexT;
25  template <class T> class EdgeT;
26  template <class T> class FaceT;
27 
32  template <class T>
33  class EdgeIteratorT {
34  public:
35 
39  using Vertex = VertexT<T>;
40 
44  using Edge = EdgeT<T>;
45 
49  using Face = FaceT<T>;
50 
54  using VertexPtr = std::shared_ptr<Vertex>;
55 
59  using EdgePtr = std::shared_ptr<Edge>;
60 
64  using FacePtr = std::shared_ptr<Face>;
65 
69  EdgeIteratorT() = delete;
70 
76  EdgeIteratorT(Face& a_face);
77 
83  EdgeIteratorT(const Face& a_face);
84 
90  EdgeIteratorT(Vertex& a_vertex);
91 
97  EdgeIteratorT(const Vertex& a_vertex);
98 
102  inline
103  EdgePtr& operator() () noexcept;
104 
108  inline
109  const EdgePtr& operator() () const noexcept;
110 
114  inline
115  void reset() noexcept;
116 
120  inline
121  void operator++() noexcept;
122 
128  inline
129  bool ok() const noexcept;
130 
131  protected:
132 
136  enum class IterationMode {
137  Vertices,
138  Faces
139  };
140 
145 
150 
154  std::shared_ptr<Edge> m_startEdge;
155 
159  std::shared_ptr<Edge> m_curEdge;
160  };
161 }
162 
164 
166 
167 #endif
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelIterator.hpp:59
+
std::shared_ptr< Edge > m_curEdge
Current half-edge.
Definition: EBGeometry_DcelIterator.hpp:159
+
Implementation of EBGeometry_DcelIterator.hpp.
+
bool ok() const noexcept
Function which checks if the iteration can be continued.
Definition: EBGeometry_DcelIteratorImplem.hpp:97
+
IterationMode
Iteration mode, used to distinguish between the two constructors (face- or vertex-based iteration) ...
Definition: EBGeometry_DcelIterator.hpp:136
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
EdgePtr & operator()() noexcept
Operator returning a pointer to the current half-edge.
Definition: EBGeometry_DcelIteratorImplem.hpp:62
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
IterationMode m_iterMode
Iteration mode. Set in constructor.
Definition: EBGeometry_DcelIterator.hpp:149
+
EdgeIteratorT()=delete
Default construction is not allowed. Use one of the full constructors.
+ +
bool m_fullLoop
If true, a full loop has been made around the polygon face.
Definition: EBGeometry_DcelIterator.hpp:144
+
void reset() noexcept
Reset function for the iterator. This resets the iterator so that it begins from the starting half-ed...
Definition: EBGeometry_DcelIteratorImplem.hpp:74
+
std::shared_ptr< Face > FacePtr
Alias to cut down on typing.
Definition: EBGeometry_DcelIterator.hpp:64
+ +
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on typing.
Definition: EBGeometry_DcelIterator.hpp:54
+
std::shared_ptr< Edge > m_startEdge
Starting half-edge.
Definition: EBGeometry_DcelIterator.hpp:154
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp.html new file mode 100644 index 00000000..eac7f25a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp.html @@ -0,0 +1,136 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelMeshImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelMeshImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_DcelMesh.hpp. +More...

+
+Include dependency graph for EBGeometry_DcelMeshImplem.hpp:
+
+
+ + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_DcelMesh.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..9ae4cde1 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..759e65a6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +d645db245007ac49eeffa4ebb751ba3b \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..60107cc4 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.map new file mode 100644 index 00000000..96208ff7 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.md5 new file mode 100644 index 00000000..2412dd76 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +511ca74b54e9ee2ab8864d01665b1024 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.png new file mode 100644 index 00000000..9350f98b Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp_source.html new file mode 100644 index 00000000..2d8af332 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMeshImplem_8hpp_source.html @@ -0,0 +1,116 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelMeshImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelMeshImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelMeshImplem
13 #define EBGeometry_DcelMeshImplem
14 
15 // Our includes
16 #include "EBGeometry_DcelMesh.hpp"
19 #include "EBGeometry_DcelEdge.hpp"
20 #include "EBGeometry_DcelFace.hpp"
22 
23 namespace Dcel {
24 
25  template <class T>
26  inline
28  m_algorithm = SearchAlgorithm::Direct2;
29  }
30 
31  template <class T>
32  inline
33  MeshT<T>::MeshT(std::vector<FacePtr >& a_faces,
34  std::vector<EdgePtr >& a_edges,
35  std::vector<VertexPtr >& a_vertices) : MeshT() {
36  this->define(a_faces, a_edges, a_vertices);
37  }
38 
39  template <class T>
40  inline
42 
43  }
44 
45  template <class T>
46  inline
47  void MeshT<T>::define(std::vector<FacePtr >& a_faces,
48  std::vector<EdgePtr >& a_edges,
49  std::vector<VertexPtr >& a_vertices) noexcept{
50  m_faces = a_faces;
51  m_edges = a_edges;
52  m_vertices = a_vertices;
53  }
54 
55  template <class T>
56  inline
57  void MeshT<T>::incrementWarning(std::map<std::string, int>& a_warnings, const std::string& a_warn) const noexcept {
58  a_warnings.at(a_warn) += 1;
59  }
60 
61  template <class T>
62  inline
63  void MeshT<T>::printWarnings(const std::map<std::string, int>& a_warnings) const noexcept {
64  for (const auto& warn : a_warnings){
65  if(warn.second > 0){
66  std::cerr << "In file 'CD_DcelMeshImplem.H' function MeshT<T>::sanityCheck() - warnings about error '" << warn.first << "' = " << warn.second << "\n";
67  }
68  }
69  }
70 
71  template <class T>
72  inline
73  void MeshT<T>::sanityCheck() const noexcept {
74 
75  const std::string f_null = "nullptr face";
76  const std::string f_noEdge = "face with no edge";
77  const std::string f_degenerate = "degenerate face";
78 
79  const std::string e_null = "nullptr edges";
80  const std::string e_degenerate = "degenerate edge";
81  const std::string e_noPairEdge = "no pair edge (not watertight)";
82  const std::string e_noNextEdge = "no next edge (badly linked dcel)";
83  const std::string e_noPrevEdge = "no previous edge (badly linked dcel)";
84  const std::string e_noOrigVert = "no origin vertex found for half edge (badly linked dcel)";
85  const std::string e_noFace = "no face found for half edge (badly linked dcel)";
86  const std::string e_noPrevNext = "previous edge's next edge is not this edge (badly linked dcel)";
87  const std::string e_noNextPrev = "next edge's previous edge is not this edge (badly linked dcel)";
88 
89  const std::string v_null = "nullptr vertex";
90  const std::string v_noEdge = "no referenced edge for vertex (unreferenced vertex)";
91 
92  std::map<std::string, int> warnings = {
93  {f_null, 0},
94  {f_noEdge, 0},
95  {f_degenerate, 0},
96  {e_null, 0},
97  {e_degenerate, 0},
98  {e_noPairEdge, 0},
99  {e_noNextEdge, 0},
100  {e_noPrevEdge, 0},
101  {e_noOrigVert, 0},
102  {e_noFace, 0},
103  {e_noPrevNext, 0},
104  {e_noNextPrev, 0},
105  {v_null, 0},
106  {v_noEdge, 0}
107  };
108 
109  for (const auto& f : m_faces){
110  const auto& halfEdge = f->getHalfEdge();
111 
112  // Check for duplicate vertices
113  auto vertices = f->gatherVertices();
114  std::sort(vertices.begin(), vertices.end());
115  auto it = std::unique(vertices.begin(), vertices.end());
116  const bool noDuplicates = (it == vertices.end());
117 
118  if(f == nullptr){
119  incrementWarning(warnings, f_null);
120  }
121  else if(halfEdge == nullptr){
122  incrementWarning(warnings, f_noEdge);
123  }
124  if(!noDuplicates){
125  incrementWarning(warnings, f_degenerate);
126  }
127  }
128 
129  for (const auto& e : m_edges){
130  const auto& nextEdge = e->getNextEdge();
131  const auto& prevEdge = e->getPreviousEdge();
132  const auto& pairEdge = e->getPairEdge();
133  const auto& curVertex = e->getVertex();
134  const auto& curFace = e->getFace();
135 
136  // Check basic points for current edge.
137  if(e == nullptr) {
138  incrementWarning(warnings, e_null);
139  }
140  else if(e->getVertex() == e->getOtherVertex()){
141  incrementWarning(warnings, e_degenerate);
142  }
143  else if(pairEdge == nullptr){
144  incrementWarning(warnings, e_noPairEdge);
145  }
146  else if(nextEdge == nullptr){
147  incrementWarning(warnings, e_noNextEdge);
148  }
149  else if(prevEdge == nullptr){
150  incrementWarning(warnings, e_noPrevEdge);
151  }
152  else if(curVertex == nullptr){
153  incrementWarning(warnings, e_noOrigVert);
154  }
155  else if(curFace == nullptr){
156  incrementWarning(warnings, e_noFace);
157  }
158 
159  // Check that the next edge's previous edge is this edge.
160  if(prevEdge->getNextEdge() != e){
161  incrementWarning(warnings, e_noPrevNext);
162  }
163  else if(nextEdge->getPreviousEdge() != e){
164  incrementWarning(warnings, e_noNextPrev);
165  }
166  }
167 
168  // Vertex check
169  for (const auto& v : m_vertices){
170  if(v == nullptr){
171  incrementWarning(warnings, v_null);
172  }
173  else if(v->getOutgoingEdge() == nullptr){
174  incrementWarning(warnings, v_noEdge);
175  }
176  }
177 
178  this->printWarnings(warnings);
179  }
180 
181  template <class T>
182  inline
183  void MeshT<T>::setSearchAlgorithm(const SearchAlgorithm a_algorithm) noexcept {
184  m_algorithm = a_algorithm;
185  }
186 
187  template <class T>
188  inline
190  for (auto& f : m_faces){
191  f->setInsideOutsideAlgorithm(a_algorithm);
192  }
193  }
194 
195  template <class T>
196  inline
197  void MeshT<T>::reconcile(typename Dcel::MeshT<T>::VertexNormalWeight a_weight) noexcept {
198  this->reconcileFaces();
199  this->reconcileEdges();
200  this->reconcileVertices(a_weight);
201  }
202 
203  template <class T>
204  inline
205  void MeshT<T>::reconcileFaces() noexcept {
206  for (auto& f : m_faces){
207  f->reconcile();
208  }
209  }
210 
211  template <class T>
212  inline
213  void MeshT<T>::reconcileEdges() noexcept {
214  for (auto& e : m_edges){
215  e->reconcile();
216  }
217  }
218 
219  template <class T>
220  inline
222  for (auto& v : m_vertices){
223  switch(a_weight) {
224  case VertexNormalWeight::None:
225  v->computeVertexNormalAverage();
226  break;
227  case VertexNormalWeight::Angle:
228  v->computeVertexNormalAngleWeighted();
229  break;
230  default:
231  std::cerr << "In file 'CD_DcelMeshImplem.H' function Dcel::MeshT<T>::reconcileVertices(VertexNormalWeighting) - unsupported algorithm requested\n";
232  }
233  }
234  }
235 
236  template <class T>
237  inline
238  std::vector<std::shared_ptr<VertexT<T> > >& MeshT<T>::getVertices() noexcept {
239  return (m_vertices);
240  }
241 
242  template <class T>
243  inline
244  const std::vector<std::shared_ptr<VertexT<T> > >& MeshT<T>::getVertices() const noexcept {
245  return (m_vertices);
246  }
247 
248  template <class T>
249  inline
250  std::vector<std::shared_ptr<EdgeT<T> > >& MeshT<T>::getEdges() noexcept {
251  return (m_edges);
252  }
253 
254  template <class T>
255  inline
256  const std::vector<std::shared_ptr<EdgeT<T> > >& MeshT<T>::getEdges() const noexcept {
257  return (m_edges);
258  }
259 
260  template <class T>
261  inline
262  std::vector<std::shared_ptr<FaceT<T> > >& MeshT<T>::getFaces() noexcept {
263  return (m_faces);
264  }
265 
266  template <class T>
267  inline
268  const std::vector<std::shared_ptr<FaceT<T> > >& MeshT<T>::getFaces() const noexcept {
269  return (m_faces);
270  }
271 
272  template <class T>
273  inline
274  std::vector<Vec3T<T> > MeshT<T>::getAllVertexCoordinates() const noexcept {
275  std::vector<Vec3 > vertexCoordinates;
276  for (const auto& v : m_vertices){
277  vertexCoordinates.emplace_back(v->getPosition());
278  }
279 
280  return vertexCoordinates;
281  }
282 
283  template <class T>
284  inline
285  T MeshT<T>::signedDistance(const Vec3& a_point) const noexcept {
286  return this->signedDistance(a_point, m_algorithm);
287  }
288 
289  template <class T>
290  inline
291  T MeshT<T>::signedDistance(const Vec3& a_point, SearchAlgorithm a_algorithm) const noexcept {
292  T minDist = std::numeric_limits<T>::max();
293 
294  switch(a_algorithm){
295  case SearchAlgorithm::Direct:
296  minDist = this->DirectSignedDistance(a_point);
297  break;
298  case SearchAlgorithm::Direct2:
299  minDist = this->DirectSignedDistance2(a_point);
300  break;
301  default:
302  std::cerr << "Error in file 'CD_DcelMeshImplem.H' MeshT<T>::signedDistance unsupported algorithm requested\n";
303  break;
304  }
305 
306  return minDist;
307  }
308 
309  template <class T>
310  inline
311  T MeshT<T>::DirectSignedDistance(const Vec3& a_point) const noexcept {
312  T minDist = m_faces.front()->signedDistance(a_point);
313  T minDist2 = minDist*minDist;
314 
315  for (const auto& f : m_faces){
316  const T curDist = f->signedDistance(a_point);
317  const T curDist2 = curDist*curDist;
318 
319  if(curDist2 < minDist2){
320  minDist = curDist;
321  minDist2 = curDist2;
322  }
323  }
324 
325  return minDist;
326  }
327 
328  template <class T>
329  inline
330  T MeshT<T>::DirectSignedDistance2(const Vec3& a_point) const noexcept {
331  FacePtr closest = m_faces.front();
332  T minDist2 = closest->unsignedDistance2(a_point);
333 
334  for (const auto& f : m_faces){
335  const T curDist2 = f->unsignedDistance2(a_point);
336 
337  if(curDist2 < minDist2) {
338  closest = f;
339  minDist2 = curDist2;
340  }
341  }
342 
343  return closest->signedDistance(a_point);
344  }
345 }
346 
348 
349 #endif
std::vector< VertexPtr > & getVertices() noexcept
Get modifiable vertices in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:238
+
void reconcileEdges() noexcept
Function which computes internal things for the half-edges.
Definition: EBGeometry_DcelMeshImplem.hpp:213
+
MeshT()
Default constructor. Leaves unobject in an unusable state.
Definition: EBGeometry_DcelMeshImplem.hpp:27
+
void incrementWarning(std::map< std::string, int > &a_warnings, const std::string &a_warn) const noexcept
Increment a warning. This is used in sanityCheck() for locating holes or bad inputs in the mesh...
Definition: EBGeometry_DcelMeshImplem.hpp:57
+
T signedDistance(const Vec3 &a_x0) const noexcept
Compute the signed distance from a point to this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:285
+
std::vector< EdgePtr > m_edges
Mesh half-edges.
Definition: EBGeometry_DcelMesh.hpp:249
+
T DirectSignedDistance2(const Vec3 &a_point) const noexcept
Implementation of squared signed distance function which iterates through all faces.
Definition: EBGeometry_DcelMeshImplem.hpp:330
+
void reconcileFaces() noexcept
Function which computes internal things for the polygon faces.
Definition: EBGeometry_DcelMeshImplem.hpp:205
+
Declaration of a mesh class which stores a DCEL mesh (with signed distance functions) ...
+
~MeshT()
Destructor (does nothing)
Definition: EBGeometry_DcelMeshImplem.hpp:41
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
std::vector< FacePtr > & getFaces() noexcept
Get modifiable faces in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:262
+
void reconcileVertices(typename Dcel::MeshT< T >::VertexNormalWeight a_weight) noexcept
Function which computes internal things for the vertices.
Definition: EBGeometry_DcelMeshImplem.hpp:221
+
Mesh class which stores a full DCEL mesh (with signed distance functions)
Definition: EBGeometry_DcelMesh.hpp:43
+
VertexNormalWeight
How to weight vertex normal.
Definition: EBGeometry_DcelMesh.hpp:58
+
Declaration of iterators for DCEL surface Tesselations.
+
SearchAlgorithm
Possible search algorithms for Dcel::MeshT.
Definition: EBGeometry_DcelMesh.hpp:50
+
SearchAlgorithm m_algorithm
Search algorithm. Only used in signed distance functions.
Definition: EBGeometry_DcelMesh.hpp:239
+
std::vector< EdgePtr > & getEdges() noexcept
Get modifiable half-edges in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:250
+
InsideOutsideAlgorithm
Supported algorithms for performing inside/outside tests when checking if a point projects to the ins...
Definition: EBGeometry_DcelPolygon2D.hpp:41
+
void setSearchAlgorithm(const SearchAlgorithm a_algorithm) noexcept
Search algorithm for direct signed distance computations.
Definition: EBGeometry_DcelMeshImplem.hpp:183
+
std::vector< FacePtr > m_faces
Mesh faces.
Definition: EBGeometry_DcelMesh.hpp:254
+
void printWarnings(const std::map< std::string, int > &a_warnings) const noexcept
Print all warnings to std::cerr.
Definition: EBGeometry_DcelMeshImplem.hpp:63
+
T DirectSignedDistance(const Vec3 &a_point) const noexcept
Implementation of signed distance function which iterates through all faces.
Definition: EBGeometry_DcelMeshImplem.hpp:311
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
std::shared_ptr< Face > FacePtr
Alias to cut down on the typing.
Definition: EBGeometry_DcelMesh.hpp:96
+
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+ +
void setInsideOutsideAlgorithm(typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm a_algorithm) noexcept
Set the inside/outside algorithm to use when computing the signed distance to polygon faces...
Definition: EBGeometry_DcelMeshImplem.hpp:189
+
void reconcile(typename Dcel::MeshT< T >::VertexNormalWeight a_weight=VertexNormalWeight::Angle) noexcept
Reconcile function which computes the internal parameters in vertices, edges, and faces for use with ...
Definition: EBGeometry_DcelMeshImplem.hpp:197
+
std::vector< Vec3T< T > > getAllVertexCoordinates() const noexcept
Return all vertex coordinates in the mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:274
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
void sanityCheck() const noexcept
Perform a sanity check.
Definition: EBGeometry_DcelMeshImplem.hpp:73
+
void define(std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices) noexcept
Define function. Puts Mesh in usable state.
Definition: EBGeometry_DcelMeshImplem.hpp:47
+
std::vector< VertexPtr > m_vertices
Mesh vertices.
Definition: EBGeometry_DcelMesh.hpp:244
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp.html b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp.html new file mode 100644 index 00000000..577c6a9e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp.html @@ -0,0 +1,156 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelMesh.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelMesh.hpp File Reference
+
+
+ +

Declaration of a mesh class which stores a DCEL mesh (with signed distance functions) +More...

+
#include <vector>
+#include <memory>
+#include <functional>
+#include <map>
+#include "EBGeometry_DcelPolygon2D.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_DcelMeshImplem.hpp"
+
+Include dependency graph for EBGeometry_DcelMesh.hpp:
+
+
+ + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + +

+Classes

class  Dcel::VertexT< T >
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeT< T >
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
class  Dcel::FaceT< T >
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
class  Dcel::Polygon2D< T >
 Class for embedding a DCEL polygon face into 2D. More...
 
class  Dcel::MeshT< T >
 Mesh class which stores a full DCEL mesh (with signed distance functions) More...
 
+ + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Declaration of a mesh class which stores a DCEL mesh (with signed distance functions)

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.map new file mode 100644 index 00000000..7e27195f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.md5 new file mode 100644 index 00000000..1dc7970c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +e049adf16a6bd78d6dc2941082f82a12 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.png new file mode 100644 index 00000000..534f45e1 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.map new file mode 100644 index 00000000..d06c309b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.map @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.md5 new file mode 100644 index 00000000..9987f235 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.md5 @@ -0,0 +1 @@ +c5f0ebc0e1742a3d2540ec15a15ef921 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.png new file mode 100644 index 00000000..b5e744e3 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelMesh_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp_source.html new file mode 100644 index 00000000..f0d5a755 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelMesh_8hpp_source.html @@ -0,0 +1,116 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelMesh.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelMesh.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelMesh
13 #define EBGeometry_DcelMesh
14 
15 // Std includes
16 #include <vector>
17 #include <memory>
18 #include <functional>
19 #include <map>
20 
21 // Our includes
24 
25 namespace Dcel {
26 
27  // Forward declare classes.
28  template <class T> class VertexT;
29  template <class T> class EdgeT;
30  template <class T> class FaceT;
31  template <class T> class Polygon2D;
32 
42  template <class T>
43  class MeshT {
44  public:
45 
50  enum class SearchAlgorithm{
51  Direct,
52  Direct2,
53  };
54 
58  enum class VertexNormalWeight {
59  None,
60  Angle,
61  };
62 
66  using Vec3 = Vec3T<T>;
67 
71  using Vertex = VertexT<T>;
72 
76  using Edge = EdgeT<T>;
77 
81  using Face = FaceT<T>;
82 
86  using VertexPtr = std::shared_ptr<Vertex>;
87 
91  using EdgePtr = std::shared_ptr<Edge>;
92 
96  using FacePtr = std::shared_ptr<Face>;
97 
101  using Mesh = MeshT<T>;
102 
106  MeshT();
107 
112  MeshT(const Mesh& a_otherMesh) = delete;
113 
123  MeshT(std::vector<FacePtr >& a_faces,
124  std::vector<EdgePtr >& a_edges,
125  std::vector<VertexPtr >& a_vertices);
126 
130  ~MeshT();
131 
141  inline
142  void define(std::vector<FacePtr >& a_faces,
143  std::vector<EdgePtr >& a_edges,
144  std::vector<VertexPtr >& a_vertices) noexcept;
145 
151  inline
152  void sanityCheck() const noexcept;
153 
158  inline
159  void setSearchAlgorithm(const SearchAlgorithm a_algorithm) noexcept;
160 
167  inline
168  void setInsideOutsideAlgorithm(typename Dcel::Polygon2D<T>::InsideOutsideAlgorithm a_algorithm) noexcept;
169 
175  inline
176  void reconcile(typename Dcel::MeshT<T>::VertexNormalWeight a_weight = VertexNormalWeight::Angle) noexcept;
177 
181  inline
182  std::vector<VertexPtr>& getVertices() noexcept;
183 
187  inline
188  const std::vector<VertexPtr>& getVertices() const noexcept;
189 
193  inline
194  std::vector<EdgePtr>& getEdges() noexcept;
195 
199  inline
200  const std::vector<EdgePtr>& getEdges() const noexcept;
201 
205  inline
206  std::vector<FacePtr>& getFaces() noexcept;
207 
211  inline
212  const std::vector<FacePtr>& getFaces() const noexcept;
213 
221  inline
222  T signedDistance(const Vec3& a_x0) const noexcept;
223 
231  inline
232  T signedDistance(const Vec3& a_x0, SearchAlgorithm a_algorithm) const noexcept;
233 
234  protected:
235 
240 
244  std::vector<VertexPtr> m_vertices;
245 
249  std::vector<EdgePtr> m_edges;
250 
254  std::vector<FacePtr> m_faces;
255 
259  inline
260  std::vector<Vec3T<T> > getAllVertexCoordinates() const noexcept;
261 
266  inline
267  void reconcileFaces() noexcept;
268 
273  inline
274  void reconcileEdges() noexcept;
275 
281  inline
282  void reconcileVertices(typename Dcel::MeshT<T>::VertexNormalWeight a_weight) noexcept;
283 
288  inline
289  T DirectSignedDistance(const Vec3& a_point) const noexcept;
290 
296  inline
297  T DirectSignedDistance2(const Vec3& a_point) const noexcept;
298 
304  inline
305  void incrementWarning(std::map<std::string, int>& a_warnings, const std::string& a_warn) const noexcept;
306 
310  inline
311  void printWarnings(const std::map<std::string, int>& a_warnings) const noexcept;
312  };
313 }
314 
315 #include "EBGeometry_NamespaceFooter.hpp"
316 
318 
319 #endif
std::vector< VertexPtr > & getVertices() noexcept
Get modifiable vertices in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:238
+
void reconcileEdges() noexcept
Function which computes internal things for the half-edges.
Definition: EBGeometry_DcelMeshImplem.hpp:213
+
MeshT()
Default constructor. Leaves unobject in an unusable state.
Definition: EBGeometry_DcelMeshImplem.hpp:27
+
void incrementWarning(std::map< std::string, int > &a_warnings, const std::string &a_warn) const noexcept
Increment a warning. This is used in sanityCheck() for locating holes or bad inputs in the mesh...
Definition: EBGeometry_DcelMeshImplem.hpp:57
+
T signedDistance(const Vec3 &a_x0) const noexcept
Compute the signed distance from a point to this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:285
+
std::vector< EdgePtr > m_edges
Mesh half-edges.
Definition: EBGeometry_DcelMesh.hpp:249
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
T DirectSignedDistance2(const Vec3 &a_point) const noexcept
Implementation of squared signed distance function which iterates through all faces.
Definition: EBGeometry_DcelMeshImplem.hpp:330
+
void reconcileFaces() noexcept
Function which computes internal things for the polygon faces.
Definition: EBGeometry_DcelMeshImplem.hpp:205
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
~MeshT()
Destructor (does nothing)
Definition: EBGeometry_DcelMeshImplem.hpp:41
+
std::vector< FacePtr > & getFaces() noexcept
Get modifiable faces in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:262
+
Declaration of a two-dimensional polygon class for embedding 3D polygon faces.
+
void reconcileVertices(typename Dcel::MeshT< T >::VertexNormalWeight a_weight) noexcept
Function which computes internal things for the vertices.
Definition: EBGeometry_DcelMeshImplem.hpp:221
+
Mesh class which stores a full DCEL mesh (with signed distance functions)
Definition: EBGeometry_DcelMesh.hpp:43
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
VertexNormalWeight
How to weight vertex normal.
Definition: EBGeometry_DcelMesh.hpp:58
+
SearchAlgorithm
Possible search algorithms for Dcel::MeshT.
Definition: EBGeometry_DcelMesh.hpp:50
+
SearchAlgorithm m_algorithm
Search algorithm. Only used in signed distance functions.
Definition: EBGeometry_DcelMesh.hpp:239
+
std::vector< EdgePtr > & getEdges() noexcept
Get modifiable half-edges in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:250
+
void setSearchAlgorithm(const SearchAlgorithm a_algorithm) noexcept
Search algorithm for direct signed distance computations.
Definition: EBGeometry_DcelMeshImplem.hpp:183
+
std::vector< FacePtr > m_faces
Mesh faces.
Definition: EBGeometry_DcelMesh.hpp:254
+
void printWarnings(const std::map< std::string, int > &a_warnings) const noexcept
Print all warnings to std::cerr.
Definition: EBGeometry_DcelMeshImplem.hpp:63
+
Implementation of EBGeometry_DcelMesh.hpp.
+
T DirectSignedDistance(const Vec3 &a_point) const noexcept
Implementation of signed distance function which iterates through all faces.
Definition: EBGeometry_DcelMeshImplem.hpp:311
+
std::shared_ptr< Edge > EdgePtr
Alias to cut down on the typing.
Definition: EBGeometry_DcelMesh.hpp:91
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
std::shared_ptr< Face > FacePtr
Alias to cut down on the typing.
Definition: EBGeometry_DcelMesh.hpp:96
+ +
void setInsideOutsideAlgorithm(typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm a_algorithm) noexcept
Set the inside/outside algorithm to use when computing the signed distance to polygon faces...
Definition: EBGeometry_DcelMeshImplem.hpp:189
+
void reconcile(typename Dcel::MeshT< T >::VertexNormalWeight a_weight=VertexNormalWeight::Angle) noexcept
Reconcile function which computes the internal parameters in vertices, edges, and faces for use with ...
Definition: EBGeometry_DcelMeshImplem.hpp:197
+
std::vector< Vec3T< T > > getAllVertexCoordinates() const noexcept
Return all vertex coordinates in the mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:274
+
void sanityCheck() const noexcept
Perform a sanity check.
Definition: EBGeometry_DcelMeshImplem.hpp:73
+
Class for embedding a DCEL polygon face into 2D.
Definition: EBGeometry_DcelMesh.hpp:31
+
void define(std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices) noexcept
Define function. Puts Mesh in usable state.
Definition: EBGeometry_DcelMeshImplem.hpp:47
+
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on the typing.
Definition: EBGeometry_DcelMesh.hpp:86
+
std::vector< VertexPtr > m_vertices
Mesh vertices.
Definition: EBGeometry_DcelMesh.hpp:244
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp.html new file mode 100644 index 00000000..a8af858b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp.html @@ -0,0 +1,141 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelParserImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelParserImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_DcelParser.hpp. +More...

+
#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <sstream>
+#include "EBGeometry_DcelParser.hpp"
+#include "EBGeometry_DcelVertex.hpp"
+#include "EBGeometry_DcelEdge.hpp"
+#include "EBGeometry_DcelFace.hpp"
+#include "EBGeometry_DcelMesh.hpp"
+#include "EBGeometry_DcelIterator.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+
+Include dependency graph for EBGeometry_DcelParserImplem.hpp:
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_DcelParser.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..4597cb59 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..85d7a18f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +c69f46e938073ec939001fada5458866 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..3a00d09d Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.map new file mode 100644 index 00000000..99795115 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.map @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.md5 new file mode 100644 index 00000000..fdd9a66c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +888d8d819f35d6bde91f5e96cba3105f \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.png new file mode 100644 index 00000000..dbcd4255 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp_source.html new file mode 100644 index 00000000..20e58197 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParserImplem_8hpp_source.html @@ -0,0 +1,101 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelParserImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelParserImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelParserImplem
13 #define EBGeometry_DcelParserImplem
14 
15 // Std includes
16 #include <iostream>
17 #include <fstream>
18 #include <iterator>
19 #include <sstream>
20 
21 // Our includes
24 #include "EBGeometry_DcelEdge.hpp"
25 #include "EBGeometry_DcelFace.hpp"
26 #include "EBGeometry_DcelMesh.hpp"
29 
30 namespace Dcel {
31 
32  template <class T>
33  inline
34  std::shared_ptr<EBGeometry::Dcel::MeshT<T> > Parser::PLY<T>::readASCII(const std::string a_filename) {
35  auto mesh = std::make_shared<Mesh>();
36 
37  readASCII(*mesh, a_filename);
38 
39  return mesh;
40  }
41 
42  template <class T>
43  inline
44  void Parser::PLY<T>::readASCII(Mesh& a_mesh, const std::string a_filename) {
45  std::ifstream filestream(a_filename);
46 
47  if(filestream.is_open()){
48  std::vector<std::shared_ptr<Vertex> >& vertices = a_mesh.getVertices();
49  std::vector<std::shared_ptr<Edge> >& edges = a_mesh.getEdges();
50  std::vector<std::shared_ptr<Face> >& faces = a_mesh.getFaces();
51 
52  vertices.resize(0);
53  edges.resize(0);
54  faces.resize(0);
55 
56  int numVertices; // Number of vertices
57  int numFaces; // Number of faces
58 
59  Dcel::Parser::PLY<T>::readHeaderASCII(numVertices, numFaces, filestream);
60  Dcel::Parser::PLY<T>::readVerticesASCII(vertices, numVertices, filestream);
61  Dcel::Parser::PLY<T>::readFacesASCII(faces, edges, vertices, numFaces, filestream);
63 
64  a_mesh.sanityCheck();
65 
66  filestream.close();
67 
68  a_mesh.reconcile(EBGeometry::Dcel::MeshT<T>::VertexNormalWeight::Angle);
69  }
70  else{
71  const std::string error = "Dcel::Parser::PLY::readASCII - ERROR! Could not open file " + a_filename;
72  std::cerr << error + "\n";
73  }
74  }
75 
76  template <class T>
77  inline
78  void Parser::PLY<T>::readHeaderASCII(int& a_numVertices,
79  int& a_numFaces,
80  std::ifstream& a_inputStream) {
81 
82  std::string str1;
83  std::string str2;
84  std::string line;
85 
86  // Get number of vertices
87  a_inputStream.clear();
88  a_inputStream.seekg(0);
89  while (getline(a_inputStream, line)){
90  std::stringstream sstream(line);
91  sstream >> str1 >> str2 >> a_numVertices;
92  if(str1 == "element" && str2 == "vertex"){
93  break;
94  }
95  }
96 
97  // Get number of faces
98  a_inputStream.clear();
99  a_inputStream.seekg(0);
100  while (getline(a_inputStream, line)){
101  std::stringstream sstream(line);
102  sstream >> str1 >> str2 >> a_numFaces;
103  if(str1 == "element" && str2 == "face"){
104  break;
105  }
106  }
107 
108  // Find the line # containing "end_header" halt the input stream there
109  a_inputStream.clear();
110  a_inputStream.seekg(0);
111  while (getline(a_inputStream, line)){
112  std::stringstream sstream(line);
113  sstream >> str1;
114  if(str1 == "end_header"){
115  break;
116  }
117  }
118  }
119 
120  template <class T>
121  inline
122  void Parser::PLY<T>::readVerticesASCII(std::vector<std::shared_ptr<Vertex> >& a_vertices,
123  const int a_numVertices,
124  std::ifstream& a_inputStream) {
125 
126  Vec3T<T> pos;
127  T& x = pos[0];
128  T& y = pos[1];
129  T& z = pos[2];
130 
131  Vec3T<T> norm;
132  T& nx = norm[0];
133  T& ny = norm[1];
134  T& nz = norm[2];
135 
136  int num = 0;
137 
138  std::string line;
139  while(std::getline(a_inputStream, line)){
140  std::stringstream sstream(line);
141  sstream >> x >> y >> z >> nx >> ny >> nz;
142 
143  a_vertices.emplace_back(std::make_shared<Vertex>(pos, norm));
144 
145  // We have read all the vertices we should read. Exit now -- after this the inputStream will begin reading faces.
146  num++;
147  if(num == a_numVertices) break;
148  }
149  }
150 
151  template <class T>
152  inline
153  void Dcel::Parser::PLY<T>::readFacesASCII(std::vector<std::shared_ptr<Face> >& a_faces,
154  std::vector<std::shared_ptr<Edge> >& a_edges,
155  const std::vector<std::shared_ptr<Vertex> >& a_vertices,
156  const int a_numFaces,
157  std::ifstream& a_inputStream) {
158  int numVertices;
159  std::vector<int> vertexIndices;
160 
161  std::string line;
162  int counter = 0;
163  while(std::getline(a_inputStream, line)){
164  counter++;
165 
166  std::stringstream sstream(line);
167 
168  sstream >> numVertices;
169  vertexIndices.resize(numVertices);
170  for (int i = 0; i < numVertices; i++){
171  sstream >> vertexIndices[i];
172  }
173 
174  if(numVertices < 3) std::cerr << "Dcel::Parser::PLY::readFacesASCII - a face must have at least three vertices!\n";
175 
176  // Get the vertices that make up this face.
177  std::vector<std::shared_ptr<Vertex> > curVertices;
178  for (int i = 0; i < numVertices; i++){
179  const int vertexIndex = vertexIndices[i];
180  curVertices.emplace_back(a_vertices[vertexIndex]);
181  }
182 
183  // Build inside half edges and give each vertex an outgoing half edge. This may get overwritten later,
184  // but the outgoing edge is not unique so it doesn't matter.
185  std::vector<std::shared_ptr<Edge> > halfEdges;
186  for (const auto& v : curVertices){
187  halfEdges.emplace_back(std::make_shared<Edge>(v));
188  v->setEdge(halfEdges.back());
189  }
190 
191  a_edges.insert(a_edges.end(), halfEdges.begin(), halfEdges.end());
192 
193  // Associate next/previous for the half edges inside the current face. Wish we had a circular iterator
194  // but this will have to do.
195  for (unsigned int i = 0; i < halfEdges.size(); i++){
196  auto& curEdge = halfEdges[i];
197  auto& nextEdge = halfEdges[(i+1)%halfEdges.size()];
198 
199  curEdge->setNextEdge(nextEdge);
200  nextEdge->setPreviousEdge(curEdge);
201  }
202 
203  // Construct a new face
204  a_faces.emplace_back(std::make_shared<Face>(halfEdges.front()));
205  auto& curFace = a_faces.back();
206 
207  // Half edges get a reference to the currently created face
208  for (auto& e : halfEdges){
209  e->setFace(curFace);
210  }
211 
212  // Must give vertices access to all faces associated with them since PLY files do not give any edge association.
213  for (auto& v : curVertices){
214  v->addFace(curFace);
215  }
216 
217 
218  if(counter == a_numFaces) break;
219  }
220  }
221 
222  template <class T>
223  inline
224  void Parser::PLY<T>::reconcilePairEdges(std::vector<std::shared_ptr<Edge> >& a_edges) {
225  for (auto& curEdge : a_edges){
226  const auto& nextEdge = curEdge->getNextEdge();
227 
228  const auto& vertexStart = curEdge->getVertex();
229  const auto& vertexEnd = nextEdge->getVertex();
230 
231  for (const auto& p : vertexStart->getFaces()){
232  for (EdgeIterator edgeIt(*p); edgeIt.ok(); ++edgeIt){
233  const auto& polyCurEdge = edgeIt();
234  const auto& polyNextEdge = polyCurEdge->getNextEdge();
235 
236  const auto& polyVertexStart = polyCurEdge->getVertex();
237  const auto& polyVertexEnd = polyNextEdge->getVertex();
238 
239  if(vertexStart == polyVertexEnd && polyVertexStart == vertexEnd){ // Found the pair edge
240  curEdge->setPairEdge(polyCurEdge);
241  polyCurEdge->setPairEdge(curEdge);
242  }
243  }
244  }
245  }
246  }
247 }
248 
250 
251 #endif
Declaration of utilities for passing data into DCEL structures.
+
std::vector< VertexPtr > & getVertices() noexcept
Get modifiable vertices in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:238
+
static std::shared_ptr< Mesh > readASCII(const std::string a_filename)
Static function which reads an ASCII .ply file and returns a DCEL mesh.
Definition: EBGeometry_DcelParserImplem.hpp:34
+
bool ok() const noexcept
Function which checks if the iteration can be continued.
Definition: EBGeometry_DcelIteratorImplem.hpp:97
+
static void readFacesASCII(std::vector< std::shared_ptr< Face > > &a_faces, std::vector< std::shared_ptr< Edge > > &a_edges, const std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numFaces, std::ifstream &a_inputStream)
Read ASCII faces and create mesh connectivity.
Definition: EBGeometry_DcelParserImplem.hpp:153
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
Declaration of a mesh class which stores a DCEL mesh (with signed distance functions) ...
+
static void readHeaderASCII(int &a_numVertices, int &a_numFaces, std::ifstream &a_inputStream)
Read an ASCII header.
Definition: EBGeometry_DcelParserImplem.hpp:78
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
std::vector< FacePtr > & getFaces() noexcept
Get modifiable faces in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:262
+
Mesh class which stores a full DCEL mesh (with signed distance functions)
Definition: EBGeometry_DcelMesh.hpp:43
+
Declaration of iterators for DCEL surface Tesselations.
+
std::vector< EdgePtr > & getEdges() noexcept
Get modifiable half-edges in this mesh.
Definition: EBGeometry_DcelMeshImplem.hpp:250
+
static void readVerticesASCII(std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numVertices, std::ifstream &a_inputStream)
Read ASCII vertices.
Definition: EBGeometry_DcelParserImplem.hpp:122
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+ +
void reconcile(typename Dcel::MeshT< T >::VertexNormalWeight a_weight=VertexNormalWeight::Angle) noexcept
Reconcile function which computes the internal parameters in vertices, edges, and faces for use with ...
Definition: EBGeometry_DcelMeshImplem.hpp:197
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
void sanityCheck() const noexcept
Perform a sanity check.
Definition: EBGeometry_DcelMeshImplem.hpp:73
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
static void reconcilePairEdges(std::vector< std::shared_ptr< Edge > > &a_edges)
Reconcile pair edges, i.e. find the pair edge for every constructed half-edge.
Definition: EBGeometry_DcelParserImplem.hpp:224
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp.html b/docs/doxygen/html/EBGeometry__DcelParser_8hpp.html new file mode 100644 index 00000000..539433ed --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParser_8hpp.html @@ -0,0 +1,149 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelParser.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelParser.hpp File Reference
+
+
+ +

Declaration of utilities for passing data into DCEL structures. +More...

+
#include <vector>
+#include <memory>
+#include <map>
+#include "EBGeometry_DcelVertex.hpp"
+#include "EBGeometry_DcelEdge.hpp"
+#include "EBGeometry_DcelFace.hpp"
+#include "EBGeometry_DcelMesh.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_DcelParserImplem.hpp"
+
+Include dependency graph for EBGeometry_DcelParser.hpp:
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  Dcel::Parser::PLY< T >
 Class for generation a Dcel::MeshT<T> from the Stanford PLY file format. More...
 
+ + + + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
 Dcel::Parser
 Namespace which encapsulates possible file parsers for building DCEL meshes.
 
+

Detailed Description

+

Declaration of utilities for passing data into DCEL structures.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.map new file mode 100644 index 00000000..1d1f1f16 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.md5 new file mode 100644 index 00000000..993aa789 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +9d4c84a2c539e84ca13af6ded4ad4264 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.png new file mode 100644 index 00000000..0e543620 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.map new file mode 100644 index 00000000..0fced4f6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.map @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.md5 new file mode 100644 index 00000000..82ba8484 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.md5 @@ -0,0 +1 @@ +770dcca1b3f86d3c5fe5cbbd463914c0 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.png new file mode 100644 index 00000000..3236bf3a Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelParser_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelParser_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelParser_8hpp_source.html new file mode 100644 index 00000000..0926358c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelParser_8hpp_source.html @@ -0,0 +1,97 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelParser.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelParser.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelParser
13 #define EBGeometry_DcelParser
14 
15 // Std includes
16 #include <vector>
17 #include <memory>
18 #include <map>
19 
20 // Our includes
22 #include "EBGeometry_DcelEdge.hpp"
23 #include "EBGeometry_DcelFace.hpp"
24 #include "EBGeometry_DcelMesh.hpp"
26 
27 namespace Dcel {
28 
32  namespace Parser {
33 
38  template <class T>
39  class PLY {
40  public:
41 
45  using Vertex = VertexT<T>;
46 
50  using Edge = EdgeT<T>;
51 
55  using Face = FaceT<T>;
56 
60  using Mesh = MeshT<T>;
61 
66 
71  inline
72  static std::shared_ptr<Mesh> readASCII(const std::string a_filename);
73 
79  inline
80  static void readASCII(Mesh& a_mesh, const std::string a_filename);
81 
82  protected:
83 
91  inline
92  static void readHeaderASCII(int& a_numVertices,
93  int& a_numFaces,
94  std::ifstream& a_inputStream);
95 
103  inline
104  static void readVerticesASCII(std::vector<std::shared_ptr<Vertex> >& a_vertices,
105  const int a_numVertices,
106  std::ifstream& a_inputStream);
107 
118  inline
119  static void readFacesASCII(std::vector<std::shared_ptr<Face> >& a_faces,
120  std::vector<std::shared_ptr<Edge> >& a_edges,
121  const std::vector<std::shared_ptr<Vertex> >& a_vertices,
122  const int a_numFaces,
123  std::ifstream& a_inputStream);
124 
129  inline
130  static void reconcilePairEdges(std::vector<std::shared_ptr<Edge> >& a_edges);
131  };
132  }
133 }
134 
136 
138 
139 #endif
Class for generation a Dcel::MeshT<T> from the Stanford PLY file format.
Definition: EBGeometry_DcelParser.hpp:39
+
static std::shared_ptr< Mesh > readASCII(const std::string a_filename)
Static function which reads an ASCII .ply file and returns a DCEL mesh.
Definition: EBGeometry_DcelParserImplem.hpp:34
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
static void readFacesASCII(std::vector< std::shared_ptr< Face > > &a_faces, std::vector< std::shared_ptr< Edge > > &a_edges, const std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numFaces, std::ifstream &a_inputStream)
Read ASCII faces and create mesh connectivity.
Definition: EBGeometry_DcelParserImplem.hpp:153
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
Declaration of a mesh class which stores a DCEL mesh (with signed distance functions) ...
+
static void readHeaderASCII(int &a_numVertices, int &a_numFaces, std::ifstream &a_inputStream)
Read an ASCII header.
Definition: EBGeometry_DcelParserImplem.hpp:78
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
Mesh class which stores a full DCEL mesh (with signed distance functions)
Definition: EBGeometry_DcelMesh.hpp:43
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
static void readVerticesASCII(std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numVertices, std::ifstream &a_inputStream)
Read ASCII vertices.
Definition: EBGeometry_DcelParserImplem.hpp:122
+ +
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+ +
Implementation of EBGeometry_DcelParser.hpp.
+
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
static void reconcilePairEdges(std::vector< std::shared_ptr< Edge > > &a_edges)
Reconcile pair edges, i.e. find the pair edge for every constructed half-edge.
Definition: EBGeometry_DcelParserImplem.hpp:224
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp.html new file mode 100644 index 00000000..cb2450e3 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp.html @@ -0,0 +1,133 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelPolygon2DImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelPolygon2DImplem.hpp File Reference
+
+
+ +

Implementation of DcelPolygon.hpp. +More...

+
#include <iostream>
+#include "EBGeometry_DcelPolygon2D.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+
+Include dependency graph for EBGeometry_DcelPolygon2DImplem.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of DcelPolygon.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..97caa531 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..f325e581 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +baa3979a35268f23acfb45388c0089d2 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..ff079b25 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.map new file mode 100644 index 00000000..7a83e823 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.md5 new file mode 100644 index 00000000..13393ef9 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +7a6612cf98b53b7c93116a59ec87116e \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.png new file mode 100644 index 00000000..733bd015 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp_source.html new file mode 100644 index 00000000..c57c1e8c --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2DImplem_8hpp_source.html @@ -0,0 +1,95 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelPolygon2DImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelPolygon2DImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelPolygon2DImplem
13 #define EBGeometry_DcelPolygon2DImplem
14 
15 // Std includes
16 #include <iostream>
17 
18 // Our includes
21 
22 namespace Dcel {
23 
24  template <class T>
25  inline
26  Polygon2D<T>::Polygon2D(const Vec3& a_normal, const std::vector<Vec3>& a_points) {
27  this->define(a_normal, a_points);
28  }
29 
30  template <class T>
31  inline
32  bool Polygon2D<T>::isPointInside(const Vec3& a_point, const InsideOutsideAlgorithm a_algorithm) const noexcept {
33  bool ret =false;
34 
35  switch(a_algorithm){
36  case InsideOutsideAlgorithm::SubtendedAngle:
37  {
38  ret = this->isPointInsidePolygonSubtend(a_point);
39 
40  break;
41  }
42  case InsideOutsideAlgorithm::CrossingNumber:
43  {
44  ret = this->isPointInsidePolygonCrossingNumber(a_point);
45 
46  break;
47  }
48  case InsideOutsideAlgorithm::WindingNumber:
49  {
50  ret = this->isPointInsidePolygonWindingNumber(a_point);
51 
52  break;
53  }
54  default:
55  std::cerr << "In file 'CD_DcelPolygon2DImplem.H' function Dcel::Polygon2D<T>::isPointInside - logic bust.\n";
56  }
57 
58  return ret;
59  }
60 
61  template <class T>
62  inline
63  Vec2T<T> Polygon2D<T>::projectPoint(const Vec3& a_point) const noexcept {
64  return Vec2(a_point[m_xDir], a_point[m_yDir]);
65  }
66 
67  template <class T>
68  inline
69  void Polygon2D<T>::define(const Vec3& a_normal, const std::vector<Vec3>& a_points) {
70  m_ignoreDir = 0;
71 
72  for (int dir = 1; dir < 3; dir++){
73  if(std::abs(a_normal[dir]) > std::abs(a_normal[m_ignoreDir])) {
74  m_ignoreDir = dir;
75  }
76  }
77 
78  m_xDir = 3;
79  m_yDir = -1;
80 
81  for (int dir = 0; dir < 3; dir++){
82  if(dir != m_ignoreDir){
83  m_xDir = std::min(m_xDir, dir);
84  m_yDir = std::max(m_yDir, dir);
85  }
86  }
87 
88  for (const auto& p3 : a_points){
89  m_points.emplace_back(this->projectPoint(p3));
90  }
91  }
92 
93  template <class T>
94  inline
95  int Polygon2D<T>::computeWindingNumber(const Vec2& P) const noexcept {
96  int wn = 0; // the winding number counter
97 
98  const int N = m_points.size();
99 
100  auto isLeft = [](const Vec2& P0, const Vec2& P1, const Vec2& P2){
101  return (P1.x - P0.x)*(P2.y - P0.y) - (P2.x - P0.x)*(P1.y - P0.y);
102  };
103 
104  // loop through all edges of the polygon
105  for (int i = 0; i < N; i++) { // edge from V[i] to V[i+1]
106 
107  const Vec2& P1 = m_points[i];
108  const Vec2& P2 = m_points[(i+1)%N];
109 
110  const T res = isLeft(P1, P2, P);
111 
112  if (P1.y <= P.y) { // start y <= P.y
113  if (P2.y > P.y) // an upward crossing
114  if (res > 0.) // P left of edge
115  ++wn; // have a valid up intersect
116  }
117  else { // start y > P.y (no test needed)
118  if (P2.y <= P.y) // a downward crossing
119  if (res < 0.) // P right of edge
120  --wn; // have a valid down intersect
121  }
122  }
123 
124  return wn;
125  }
126 
127  template <class T>
128  inline
129  int Polygon2D<T>::computeCrossingNumber(const Vec2& P) const noexcept {
130  int cn = 0;
131 
132  const int N = m_points.size();
133 
134  for (int i = 0; i < N; i++) { // edge from V[i] to V[i+1]
135  const Vec2& P1 = m_points[i];
136  const Vec2& P2 = m_points[(i+1)%N];
137 
138  const bool upwardCrossing = (P1.y <= P.y) && (P2.y > P.y);
139  const bool downwardCrossing = (P1.y > P.y) && (P2.y <= P.y);
140 
141  if(upwardCrossing || downwardCrossing){
142  const T t = (P.y - P1.y)/(P2.y - P1.y);
143 
144  if (P.x < P1.x + t * (P2.x - P1.x)) {// P.x < intersect
145  cn += 1; // a valid crossing of y=P.y right of P.x
146  }
147  }
148  }
149 
150  return cn;
151  }
152 
153  template <class T>
154  inline
155  T Polygon2D<T>::computeSubtendedAngle(const Vec2& p) const noexcept {
156  T sumTheta = 0.0;
157 
158  const int N = m_points.size();
159 
160  for (int i = 0; i < N; i++){
161  const Vec2 p1 = m_points[i] - p;
162  const Vec2 p2 = m_points[(i+1)%N] - p;
163 
164  const T theta1 = atan2(p1.y, p1.x);
165  const T theta2 = atan2(p2.y, p2.x);
166 
167  T dTheta = theta2 - theta1;
168 
169  while (dTheta > M_PI)
170  dTheta -= 2.0*M_PI;
171  while (dTheta < -M_PI)
172  dTheta += 2.0*M_PI;
173 
174  sumTheta += dTheta;
175  }
176 
177  return sumTheta;
178  }
179 
180  template <class T>
181  inline
182  bool Polygon2D<T>::isPointInsidePolygonWindingNumber(const Vec3& a_point) const noexcept {
183  const Vec2 p = this->projectPoint(a_point);
184 
185  const int wn = this->computeWindingNumber(p);
186 
187  return wn != 0;
188  }
189 
190  template <class T>
191  inline
192  bool Polygon2D<T>::isPointInsidePolygonCrossingNumber(const Vec3& a_point) const noexcept {
193  const Vec2 p = this->projectPoint(a_point);
194 
195  const int cn = this->computeCrossingNumber(p);
196 
197  const bool ret = (cn&1);
198 
199  return ret;
200  }
201 
202  template <class T>
203  inline
204  bool Polygon2D<T>::isPointInsidePolygonSubtend(const Vec3& a_point) const noexcept {
205  const Vec2 p = this->projectPoint(a_point);
206 
207  T sumTheta = this->computeSubtendedAngle(p); // Should be = 2pi if point is inside.
208 
209  sumTheta = std::abs(sumTheta)/(2.*M_PI);
210 
211  const bool ret = (round(sumTheta) == 1); // 2PI if the polygon is inside.
212 
213  return ret;
214  }
215 }
216 
218 
219 #endif
Polygon2D()=delete
Disallowed constructor, use the one with the normal vector and points.
+
T y
Second component in the vector.
Definition: EBGeometry_Vec.hpp:60
+
bool isPointInsidePolygonCrossingNumber(const Vec3 &a_point) const noexcept
Check if a point is inside a 2D polygon, by computing the number of times a ray crosses the polygon e...
Definition: EBGeometry_DcelPolygon2DImplem.hpp:192
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
Declaration of a two-dimensional polygon class for embedding 3D polygon faces.
+
InsideOutsideAlgorithm
Supported algorithms for performing inside/outside tests when checking if a point projects to the ins...
Definition: EBGeometry_DcelPolygon2D.hpp:41
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
T x
First component in the vector.
Definition: EBGeometry_Vec.hpp:55
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+ +
bool isPointInside(const Vec3 &a_point, const InsideOutsideAlgorithm a_algorithm) const noexcept
Check if a point is inside or outside the 2D polygon.
Definition: EBGeometry_DcelPolygon2DImplem.hpp:32
+
Two-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:24
+
Class for embedding a DCEL polygon face into 2D.
Definition: EBGeometry_DcelMesh.hpp:31
+
bool isPointInsidePolygonWindingNumber(const Vec3 &a_point) const noexcept
Check if a point is inside a 2D polygon, using the winding number algorithm.
Definition: EBGeometry_DcelPolygon2DImplem.hpp:182
+
bool isPointInsidePolygonSubtend(const Vec3 &a_point) const noexcept
Check if a point is inside a 2D polygon, using the subtended angles.
Definition: EBGeometry_DcelPolygon2DImplem.hpp:204
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp.html b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp.html new file mode 100644 index 00000000..6a4a3ebe --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp.html @@ -0,0 +1,142 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelPolygon2D.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelPolygon2D.hpp File Reference
+
+
+ +

Declaration of a two-dimensional polygon class for embedding 3D polygon faces. +More...

+
#include <memory>
+#include <vector>
+#include "EBGeometry_Vec.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_DcelPolygon2DImplem.hpp"
+
+Include dependency graph for EBGeometry_DcelPolygon2D.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  Dcel::Polygon2D< T >
 Class for embedding a DCEL polygon face into 2D. More...
 
+ + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Declaration of a two-dimensional polygon class for embedding 3D polygon faces.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.map new file mode 100644 index 00000000..c6367c33 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.map @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.md5 new file mode 100644 index 00000000..04ac4477 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +17d54449ea1fce2954d29480659af65b \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.png new file mode 100644 index 00000000..01ecad7b Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.map new file mode 100644 index 00000000..1d10562f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.md5 new file mode 100644 index 00000000..9f200406 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.md5 @@ -0,0 +1 @@ +68be7c82d4db851b40c54c08bcc577d5 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.png new file mode 100644 index 00000000..6c3a0473 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp_source.html new file mode 100644 index 00000000..9e86e515 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelPolygon2D_8hpp_source.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelPolygon2D.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelPolygon2D.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
11 #ifndef EBGeometry_DcelPolygon2D
12 #define EBGeometry_DcelPolygon2D
13 
14 // Std includes
15 #include <memory>
16 #include <vector>
17 
18 // Our includes
19 #include "EBGeometry_Vec.hpp"
21 
22 namespace Dcel {
23 
34  template <class T>
35  class Polygon2D {
36  public:
37 
42  SubtendedAngle,
43  CrossingNumber,
44  WindingNumber
45  };
46 
50  using Vec2 = Vec2T<T>;
51 
55  using Vec3 = Vec3T<T>;
56 
60  Polygon2D() = delete;
61 
67  Polygon2D(const Vec3& a_normal, const std::vector<Vec3>& a_points);
68 
72  ~Polygon2D() = default;
73 
80  inline
81  bool isPointInside(const Vec3& a_point, const InsideOutsideAlgorithm a_algorithm) const noexcept;
82 
88  inline
89  bool isPointInsidePolygonWindingNumber(const Vec3& a_point) const noexcept;
90 
96  inline
97  bool isPointInsidePolygonSubtend(const Vec3& a_point) const noexcept;
98 
104  inline
105  bool isPointInsidePolygonCrossingNumber(const Vec3& a_point) const noexcept;
106 
107  private:
108 
109 
113  int m_ignoreDir;
114 
118  int m_xDir;
119 
123  int m_yDir;
124 
128  std::vector<Vec2> m_points;
129 
135  inline
136  Vec2 projectPoint(const Vec3& a_point) const noexcept;
137 
143  inline
144  void define(const Vec3& a_normal, const std::vector<Vec3>& a_points);
145 
151  inline
152  int computeWindingNumber(const Vec2& P) const noexcept;
153 
159  inline
160  int computeCrossingNumber(const Vec2& P) const noexcept;
161 
167  inline
168  T computeSubtendedAngle(const Vec2& P) const noexcept;
169  };
170 }
171 
173 
175 
176 #endif
Polygon2D()=delete
Disallowed constructor, use the one with the normal vector and points.
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
bool isPointInsidePolygonCrossingNumber(const Vec3 &a_point) const noexcept
Check if a point is inside a 2D polygon, by computing the number of times a ray crosses the polygon e...
Definition: EBGeometry_DcelPolygon2DImplem.hpp:192
+
Implementation of DcelPolygon.hpp.
+
InsideOutsideAlgorithm
Supported algorithms for performing inside/outside tests when checking if a point projects to the ins...
Definition: EBGeometry_DcelPolygon2D.hpp:41
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
~Polygon2D()=default
Destructor (does nothing.
+ +
bool isPointInside(const Vec3 &a_point, const InsideOutsideAlgorithm a_algorithm) const noexcept
Check if a point is inside or outside the 2D polygon.
Definition: EBGeometry_DcelPolygon2DImplem.hpp:32
+
Two-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:24
+
bool isPointInsidePolygonWindingNumber(const Vec3 &a_point) const noexcept
Check if a point is inside a 2D polygon, using the winding number algorithm.
Definition: EBGeometry_DcelPolygon2DImplem.hpp:182
+
bool isPointInsidePolygonSubtend(const Vec3 &a_point) const noexcept
Check if a point is inside a 2D polygon, using the subtended angles.
Definition: EBGeometry_DcelPolygon2DImplem.hpp:204
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp.html b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp.html new file mode 100644 index 00000000..7d0102ca --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp.html @@ -0,0 +1,142 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelVertexImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelVertexImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_DcelVertex.hpp. +More...

+
+Include dependency graph for EBGeometry_DcelVertexImplem.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Implementation of EBGeometry_DcelVertex.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..eeef8b58 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..2b8efe39 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +33da051e0c75469add594c39443e88e8 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..2102c4cb Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.map new file mode 100644 index 00000000..cc1edaca --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.md5 new file mode 100644 index 00000000..38b2d048 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +93a1cc1d1f3d10353606b757ddc9fad6 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.png new file mode 100644 index 00000000..4fd9a6cf Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp_source.html new file mode 100644 index 00000000..d5bd74ac --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertexImplem_8hpp_source.html @@ -0,0 +1,115 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelVertexImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelVertexImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelVertexImplem
13 #define EBGeometry_DcelVertexImplem
14 
15 // Our includes
17 #include "EBGeometry_DcelEdge.hpp"
18 #include "EBGeometry_DcelFace.hpp"
21 
22 namespace Dcel {
23 
24  template <class T>
25  inline
27  m_position = Vec3::zero();
28  m_normal = Vec3::zero();
29 
30  m_faces.resize(0);
31  }
32 
33  template <class T>
34  inline
35  VertexT<T>::VertexT(const Vec3& a_position) : VertexT() {
36  m_position = a_position;
37  }
38 
39  template <class T>
40  inline
41  VertexT<T>::VertexT(const Vec3& a_position, const Vec3& a_normal) : VertexT() {
42  m_position = a_position;
43  m_normal = a_normal;
44  }
45 
46  template <class T>
47  inline
48  VertexT<T>::VertexT(const VertexT<T>& a_otherVertex){
49  m_position = a_otherVertex.m_position;
50  m_normal = a_otherVertex.m_m_normal;
51  m_outgoingEdge = a_otherVertex.m_outgoingEdge;
52  }
53 
54  template <class T>
55  inline
57 
58  }
59 
60  template <class T>
61  inline
62  void VertexT<T>::define(const Vec3& a_position, const EdgePtr& a_edge, const Vec3& a_normal) noexcept {
63  m_position = a_position;
64  m_outgoingEdge = a_edge;
65  m_normal = a_normal;
66  }
67 
68  template <class T>
69  inline
70  void VertexT<T>::setPosition(const Vec3& a_position) noexcept {
71  m_position = a_position;
72  }
73 
74  template <class T>
75  inline
76  void VertexT<T>::setEdge(const EdgePtr& a_edge) noexcept {
77  m_outgoingEdge = a_edge;
78  }
79 
80  template <class T>
81  inline
82  void VertexT<T>::setNormal(const Vec3& a_normal) noexcept {
83  m_normal = a_normal;
84  }
85 
86  template <class T>
87  inline
88  void VertexT<T>::addFace(const FacePtr& a_face) noexcept {
89  m_faces.emplace_back(a_face);
90  }
91 
92  template <class T>
93  inline
96  }
97 
98  template <class T>
99  inline
102  }
103 
104  template <class T>
105  inline
106  void VertexT<T>::computeVertexNormalAverage(const std::vector<FacePtr>& a_faces) noexcept {
107  m_normal = Vec3::zero();
108 
109  // TLDR: We simply compute the sum of the normal vectors for each face in a_faces and then normalize. This
110  // will yield an "average" of the normal vectors of the faces circulating this vertex.
111  for (const auto& f : a_faces){
112  m_normal += f->getNormal();
113  }
114 
115  this->normalizeNormalVector();
116  }
117 
118  template <class T>
119  inline
122  }
123 
124  template <class T>
125  inline
126  void VertexT<T>::computeVertexNormalAngleWeighted(const std::vector<FacePtr>& a_faces) noexcept {
127  m_normal = Vec3::zero();
128 
129  // This routine computes the pseudonormal from pseudnormal algorithm from Baerentzen and Aanes in
130  // "Signed distance computation using the angle weighted pseudonormal" (DOI: 10.1109/TVCG.2005.49).
131  // This algorithm computes an average normal vector using the normal vectors of each face connected
132  // to this vertex, i.e. in the form
133  //
134  // n = sum(w * n(face))/sum(w)
135  //
136  // where w are weights for each face. This weight is given by the subtended angle of the face, which means the angle spanned
137  // by the incoming/outgoing edges of the face that pass through this vertex.
138  //
139  //
140  // The below code is more complicated than it looks. It happens because we want the two half edges that has the current vertex
141  // as a mutual vertex (i.e. the "incoming" and "outgoing" edges into this vertex). Normally we'd just iterate through edges,
142  // but if it happens that an input face is flipped, this will result in infinite iteration. Instead, we have stored the pointers
143  // to each face connected to this vertex. We look through each face to find the endpoints of the edges the have the current vertex
144  // as the common vertex, and then compute the subtended angle between those. Sigh...
145 
146  const VertexPtr& originVertex = m_outgoingEdge->getVertex(); // AKA 'this'
147 
148  for (const auto& f : a_faces){
149 
150  std::vector<VertexPtr> inoutVertices(0);
151  for (EdgeIterator edgeIt(f->getHalfEdge()); edgeIt.ok(); ++edgeIt){
152  const auto& e = edgeIt();
153 
154  const auto& v1 = e->getVertex();
155  const auto& v2 = e->getOtherVertex();
156 
157  if(v1 == originVertex || v2 == originVertex){
158  if(v1 == originVertex){
159  inoutVertices.emplace_back(v2);
160  }
161  else if(v2 == originVertex){
162  inoutVertices.emplace_back(v1);
163  }
164  else{
165  std::cerr << "In file 'CD_DcelVertexImplem.H' function vertexT<T>::computeVertexNormalAngleWeighted() - logic bust.\n";
166  }
167  }
168  }
169 
170  if(inoutVertices.size() != 2) {
171  std::cerr << "In file 'CD_DcelVertexImplem.H' function vertexT<T>::computeVertexNormalAngleWeighted() - logic bust 2.\n";
172  }
173 
174  const Vec3& x0 = originVertex ->getPosition();
175  const Vec3& x1 = inoutVertices[0]->getPosition();
176  const Vec3& x2 = inoutVertices[1]->getPosition();
177 
178  if(x0 == x1 || x0 == x2 || x1 == x2){
179  std::cerr << "In file 'CD_DcelVertexImplem.H' function vertexT<T>::computeVertexNormalAngleWeighted() - logic bust 3.\n";
180  }
181 
182  Vec3 v1 = x1-x0;
183  Vec3 v2 = x2-x0;
184 
185  v1 = v1/v1.length();
186  v2 = v2/v2.length();
187 
188  const Vec3& norm = f->getNormal();
189 
190  const T alpha = acos(v1.dot(v2));
191 
192  m_normal += alpha*norm;
193  }
194 
195  this->normalizeNormalVector();
196  }
197 
198  template <class T>
199  inline
201  return (m_position);
202  }
203 
204  template <class T>
205  inline
206  const Vec3T<T>& VertexT<T>::getPosition() const noexcept {
207  return (m_position);
208  }
209 
210  template <class T>
211  inline
213  return (m_normal);
214  }
215 
216  template <class T>
217  inline
218  const Vec3T<T>& VertexT<T>::getNormal() const noexcept {
219  return (m_normal);
220  }
221 
222  template <class T>
223  inline
224  std::shared_ptr<EdgeT<T> >& VertexT<T>::getOutgoingEdge() noexcept {
225  return (m_outgoingEdge);
226  }
227 
228  template <class T>
229  inline
230  const std::shared_ptr<EdgeT<T> >& VertexT<T>::getOutgoingEdge() const noexcept {
231  return (m_outgoingEdge);
232  }
233 
234  template <class T>
235  inline
236  std::vector<std::shared_ptr<FaceT<T> > >& VertexT<T>::getFaces() noexcept {
237  return (m_faces);
238  }
239 
240  template <class T>
241  inline
242  const std::vector<std::shared_ptr<FaceT<T> > >& VertexT<T>::getFaces() const noexcept {
243  return (m_faces);
244  }
245 
246  template <class T>
247  inline
248  T VertexT<T>::signedDistance(const Vec3& a_x0) const noexcept {
249  const auto delta = a_x0 - m_position;
250  const T dist = delta.length();
251  const T dot = m_normal.dot(delta);
252  const int sign = (dot > 0.) ? 1 : -1;
253 
254  return dist*sign;
255  }
256 
257  template <class T>
258  inline
259  T VertexT<T>::unsignedDistance2(const Vec3& a_x0) const noexcept {
260  const auto d = a_x0 - m_position;
261 
262  return d.dot(d);
263  }
264 }
265 
267 
268 #endif
void define(const Vec3 &a_position, const EdgePtr &a_edge, const Vec3 &a_normal) noexcept
Define function.
Definition: EBGeometry_DcelVertexImplem.hpp:62
+
static constexpr Vec3T< T > zero() noexcept
Return av vector with x = y = z = 0.
Definition: EBGeometry_VecImplem.hpp:205
+
bool ok() const noexcept
Function which checks if the iteration can be continued.
Definition: EBGeometry_DcelIteratorImplem.hpp:97
+
std::vector< FacePtr > & getFaces() noexcept
Get modifiable polygon face list for this vertex.
Definition: EBGeometry_DcelVertexImplem.hpp:236
+
Vec3 m_position
Vertex position.
Definition: EBGeometry_DcelVertex.hpp:268
+
VertexT()
Default constructor.
Definition: EBGeometry_DcelVertexImplem.hpp:26
+
std::shared_ptr< Face > FacePtr
Alias to cut down on typing. Note that this is std::shared_ptr<FaceT<T> >
Definition: EBGeometry_DcelVertex.hpp:78
+
~VertexT()
Destructor (does nothing)
Definition: EBGeometry_DcelVertexImplem.hpp:56
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
void setEdge(const EdgePtr &a_edge) noexcept
Set the reference to the outgoing edge.
Definition: EBGeometry_DcelVertexImplem.hpp:76
+
void normalizeNormalVector() noexcept
Normalize the normal vector, ensuring its length is 1.
Definition: EBGeometry_DcelVertexImplem.hpp:94
+
Vec3 m_normal
Vertex normal vector.
Definition: EBGeometry_DcelVertex.hpp:273
+
Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
Vec3T< T > & getNormal() noexcept
Return modifiable vertex normal vector.
Definition: EBGeometry_DcelVertexImplem.hpp:212
+
Declaration of iterators for DCEL surface Tesselations.
+
void setNormal(const Vec3 &a_normal) noexcept
Set the vertex normal vector.
Definition: EBGeometry_DcelVertexImplem.hpp:82
+
T dot(const Vec3T< T > &u) const noexcept
Vector dot product.
Definition: EBGeometry_VecImplem.hpp:417
+
void setPosition(const Vec3 &a_position) noexcept
Set the vertex position.
Definition: EBGeometry_DcelVertexImplem.hpp:70
+
EdgePtr m_outgoingEdge
Pointer to an outgoing edge from this vertex.
Definition: EBGeometry_DcelVertex.hpp:263
+
void computeVertexNormalAverage() noexcept
Compute the vertex normal, using an average the normal vector in this vertex&#39;s face list (m_faces) ...
Definition: EBGeometry_DcelVertexImplem.hpp:100
+
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing. Note that this is std::shared_ptr<EdgeT<T> >
Definition: EBGeometry_DcelVertex.hpp:73
+
Vec3T< T > & getPosition() noexcept
Return modifiable vertex position.
Definition: EBGeometry_DcelVertexImplem.hpp:200
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
std::vector< FacePtr > m_faces
List of faces connected to this vertex (these must be "manually" added)
Definition: EBGeometry_DcelVertex.hpp:278
+
T unsignedDistance2(const Vec3 &a_x0) const noexcept
Get the squared unsigned distance to this vertex.
Definition: EBGeometry_DcelVertexImplem.hpp:259
+
Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
+
EdgePtr & getOutgoingEdge() noexcept
Return modifiable pointer to outgoing edge.
Definition: EBGeometry_DcelVertexImplem.hpp:224
+
T length() const noexcept
Compute vector length.
Definition: EBGeometry_VecImplem.hpp:423
+ +
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
T signedDistance(const Vec3 &a_x0) const noexcept
Get the signed distance to this vertex.
Definition: EBGeometry_DcelVertexImplem.hpp:248
+
void addFace(const FacePtr &a_face) noexcept
Add a face to the polygon face list.
Definition: EBGeometry_DcelVertexImplem.hpp:88
+
void computeVertexNormalAngleWeighted() noexcept
Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtend...
Definition: EBGeometry_DcelVertexImplem.hpp:120
+
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on typing. Note that this is std::shared_ptr<VertexT<T> >
Definition: EBGeometry_DcelVertex.hpp:68
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp.html b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp.html new file mode 100644 index 00000000..04d7a0f9 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp.html @@ -0,0 +1,163 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelVertex.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_DcelVertex.hpp File Reference
+
+
+ +

Declaration of a vertex class for use in DCEL descriptions of polygon tesselations. +More...

+
#include <vector>
+#include <memory>
+#include "EBGeometry_Vec.hpp"
+#include "EBGeometry_Dcel.hpp"
+#include "EBGeometry_DcelFace.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_DcelVertexImplem.hpp"
+
+Include dependency graph for EBGeometry_DcelVertex.hpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + +

+Classes

class  Dcel::VertexT< T >
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeT< T >
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
class  Dcel::FaceT< T >
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
class  Dcel::EdgeIteratorT< T >
 Class which can iterate through edges and vertices around a DCEL polygon face. More...
 
class  Dcel::VertexT< T >
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
+ + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.map new file mode 100644 index 00000000..846c6ac2 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.md5 new file mode 100644 index 00000000..2bbbf7fa --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +e834913a4abb5576108bb5d01c267e67 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.png new file mode 100644 index 00000000..e57e8a3a Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.map b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.map new file mode 100644 index 00000000..42899284 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.md5 new file mode 100644 index 00000000..4a8e5dee --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.md5 @@ -0,0 +1 @@ +f3b9855a80efe90ece8a62ce46024732 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.png b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.png new file mode 100644 index 00000000..4dcb61d8 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__DcelVertex_8hpp_source.html b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp_source.html new file mode 100644 index 00000000..92c54f9a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__DcelVertex_8hpp_source.html @@ -0,0 +1,112 @@ + + + + + + + +EBGeometry: Source/EBGeometry_DcelVertex.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_DcelVertex.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_DcelVertex
13 #define EBGeometry_DcelVertex
14 
15 // Std includes
16 #include <vector>
17 #include <memory>
18 
19 // Our includes
20 #include "EBGeometry_Vec.hpp"
21 #include "EBGeometry_Dcel.hpp"
22 #include "EBGeometry_DcelFace.hpp"
24 
25 namespace Dcel {
26 
27  // Forward declare classes.
28  template <class T> class VertexT;
29  template <class T> class EdgeT;
30  template <class T> class FaceT;
31  template <class T> class EdgeIteratorT;
32 
41  template <class T>
42  class VertexT {
43  public:
44 
48  using Vec3 = Vec3T<T>;
49 
53  using Vertex = VertexT<T>;
54 
58  using Edge = EdgeT<T>;
59 
63  using Face = FaceT<T>;
64 
68  using VertexPtr = std::shared_ptr<Vertex>;
69 
73  using EdgePtr = std::shared_ptr<Edge>;
74 
78  using FacePtr = std::shared_ptr<Face>;
79 
84 
89  VertexT();
90 
96  VertexT(const Vec3& a_position);
97 
104  VertexT(const Vec3& a_position, const Vec3& a_normal);
105 
111  VertexT(const Vertex& a_otherVertex);
112 
116  ~VertexT();
117 
125  inline
126  void define(const Vec3& a_position, const EdgePtr& a_edge, const Vec3& a_normal) noexcept;
127 
132  inline
133  void setPosition(const Vec3& a_position) noexcept;
134 
139  inline
140  void setNormal(const Vec3& a_normal) noexcept;
141 
146  inline
147  void setEdge(const EdgePtr& a_edge) noexcept;
148 
153  inline
154  void addFace(const FacePtr& a_face) noexcept;
155 
159  inline
160  void normalizeNormalVector() noexcept;
161 
165  inline
166  void computeVertexNormalAverage() noexcept;
167 
173  inline
174  void computeVertexNormalAverage(const std::vector<FacePtr>& a_faces) noexcept;
175 
182  inline
183  void computeVertexNormalAngleWeighted() noexcept;
184 
191  inline
192  void computeVertexNormalAngleWeighted(const std::vector<FacePtr>& a_faces) noexcept;
193 
197  inline
198  Vec3T<T>& getPosition() noexcept;
199 
203  inline
204  const Vec3T<T>& getPosition() const noexcept;
205 
209  inline
210  Vec3T<T>& getNormal() noexcept;
211 
215  inline
216  const Vec3T<T>& getNormal() const noexcept;
217 
221  inline
222  EdgePtr& getOutgoingEdge() noexcept;
223 
227  inline
228  const EdgePtr& getOutgoingEdge() const noexcept;
229 
233  inline
234  std::vector<FacePtr>& getFaces() noexcept;
235 
239  inline
240  const std::vector<FacePtr>& getFaces() const noexcept;
241 
247  inline
248  T signedDistance(const Vec3& a_x0) const noexcept;
249 
255  inline
256  T unsignedDistance2(const Vec3& a_x0) const noexcept;
257 
258  protected:
259 
264 
269 
274 
278  std::vector<FacePtr > m_faces;
279  };
280 }
281 
282 #include "EBGeometry_NamespaceFooter.hpp"
283 
285 
286 #endif
Implementation of EBGeometry_DcelVertex.hpp.
+
void define(const Vec3 &a_position, const EdgePtr &a_edge, const Vec3 &a_normal) noexcept
Define function.
Definition: EBGeometry_DcelVertexImplem.hpp:62
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
Class which represents a polygon face in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:29
+
std::vector< FacePtr > & getFaces() noexcept
Get modifiable polygon face list for this vertex.
Definition: EBGeometry_DcelVertexImplem.hpp:236
+
Vec3 m_position
Vertex position.
Definition: EBGeometry_DcelVertex.hpp:268
+
VertexT()
Default constructor.
Definition: EBGeometry_DcelVertexImplem.hpp:26
+
std::shared_ptr< Face > FacePtr
Alias to cut down on typing. Note that this is std::shared_ptr<FaceT<T> >
Definition: EBGeometry_DcelVertex.hpp:78
+
~VertexT()
Destructor (does nothing)
Definition: EBGeometry_DcelVertexImplem.hpp:56
+
Class which can iterate through edges and vertices around a DCEL polygon face.
Definition: EBGeometry_DcelEdge.hpp:30
+
void setEdge(const EdgePtr &a_edge) noexcept
Set the reference to the outgoing edge.
Definition: EBGeometry_DcelVertexImplem.hpp:76
+
void normalizeNormalVector() noexcept
Normalize the normal vector, ensuring its length is 1.
Definition: EBGeometry_DcelVertexImplem.hpp:94
+
Class which represents a half-edge in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:28
+
Vec3 m_normal
Vertex normal vector.
Definition: EBGeometry_DcelVertex.hpp:273
+
Class which represents a vertex node in a double-edge connected list (DCEL).
Definition: EBGeometry_DcelEdge.hpp:27
+
Vec3T< T > & getNormal() noexcept
Return modifiable vertex normal vector.
Definition: EBGeometry_DcelVertexImplem.hpp:212
+
void setNormal(const Vec3 &a_normal) noexcept
Set the vertex normal vector.
Definition: EBGeometry_DcelVertexImplem.hpp:82
+
void setPosition(const Vec3 &a_position) noexcept
Set the vertex position.
Definition: EBGeometry_DcelVertexImplem.hpp:70
+
EdgePtr m_outgoingEdge
Pointer to an outgoing edge from this vertex.
Definition: EBGeometry_DcelVertex.hpp:263
+
void computeVertexNormalAverage() noexcept
Compute the vertex normal, using an average the normal vector in this vertex&#39;s face list (m_faces) ...
Definition: EBGeometry_DcelVertexImplem.hpp:100
+
std::shared_ptr< Edge > EdgePtr
Alias to cut down on typing. Note that this is std::shared_ptr<EdgeT<T> >
Definition: EBGeometry_DcelVertex.hpp:73
+
Vec3T< T > & getPosition() noexcept
Return modifiable vertex position.
Definition: EBGeometry_DcelVertexImplem.hpp:200
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
std::vector< FacePtr > m_faces
List of faces connected to this vertex (these must be "manually" added)
Definition: EBGeometry_DcelVertex.hpp:278
+
T unsignedDistance2(const Vec3 &a_x0) const noexcept
Get the squared unsigned distance to this vertex.
Definition: EBGeometry_DcelVertexImplem.hpp:259
+
EdgePtr & getOutgoingEdge() noexcept
Return modifiable pointer to outgoing edge.
Definition: EBGeometry_DcelVertexImplem.hpp:224
+ +
Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
+
T signedDistance(const Vec3 &a_x0) const noexcept
Get the signed distance to this vertex.
Definition: EBGeometry_DcelVertexImplem.hpp:248
+
void addFace(const FacePtr &a_face) noexcept
Add a face to the polygon face list.
Definition: EBGeometry_DcelVertexImplem.hpp:88
+
void computeVertexNormalAngleWeighted() noexcept
Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtend...
Definition: EBGeometry_DcelVertexImplem.hpp:120
+
Namespace documentation.
+
std::shared_ptr< Vertex > VertexPtr
Alias to cut down on typing. Note that this is std::shared_ptr<VertexT<T> >
Definition: EBGeometry_DcelVertex.hpp:68
+
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp.html b/docs/doxygen/html/EBGeometry__Dcel_8hpp.html new file mode 100644 index 00000000..eb061d7e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Dcel_8hpp.html @@ -0,0 +1,127 @@ + + + + + + + +EBGeometry: Source/EBGeometry_Dcel.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_Dcel.hpp File Reference
+
+
+ +

Namespace documentation. +More...

+
+Include dependency graph for EBGeometry_Dcel.hpp:
+
+
+ + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Namespaces

 Dcel
 Namespace containing various double-connected edge list (DCEL) functionality.
 
+

Detailed Description

+

Namespace documentation.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.map new file mode 100644 index 00000000..f61332dc --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.md5 new file mode 100644 index 00000000..a30e63f5 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ac6449fa5feaa39e7530d91dadafce6b \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.png new file mode 100644 index 00000000..41524229 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__Dcel_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.map b/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.map new file mode 100644 index 00000000..29f768aa --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.md5 new file mode 100644 index 00000000..8d4c2b06 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.md5 @@ -0,0 +1 @@ +c096df0970a05fcceb6b93689c8dddee \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.png b/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.png new file mode 100644 index 00000000..83e43953 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__Dcel_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__Dcel_8hpp_source.html b/docs/doxygen/html/EBGeometry__Dcel_8hpp_source.html new file mode 100644 index 00000000..a8e75e82 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Dcel_8hpp_source.html @@ -0,0 +1,81 @@ + + + + + + + +EBGeometry: Source/EBGeometry_Dcel.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_Dcel.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_Dcel
13 #define EBGeometry_Dcel
14 
16 
21 namespace Dcel {
22 
23 }
24 
25 #endif
26 
+ +
Namespace containing various double-connected edge list (DCEL) functionality.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp.html b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp.html new file mode 100644 index 00000000..2890320e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp.html @@ -0,0 +1,125 @@ + + + + + + + +EBGeometry: Source/EBGeometry_NamespaceFooter.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_NamespaceFooter.hpp File Reference
+
+
+ +

Name space footer. +More...

+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+

Detailed Description

+

Name space footer.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.map new file mode 100644 index 00000000..a0664f38 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.map @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.md5 new file mode 100644 index 00000000..ec737005 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +484bcfe25db3ea4eb0b94a23430f85a1 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.png new file mode 100644 index 00000000..9e10c9f2 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp_source.html b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp_source.html new file mode 100644 index 00000000..b09ca65e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceFooter_8hpp_source.html @@ -0,0 +1,78 @@ + + + + + + + +EBGeometry: Source/EBGeometry_NamespaceFooter.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_NamespaceFooter.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 }
+ + + + diff --git a/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp.html b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp.html new file mode 100644 index 00000000..4f227935 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp.html @@ -0,0 +1,125 @@ + + + + + + + +EBGeometry: Source/EBGeometry_NamespaceHeader.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_NamespaceHeader.hpp File Reference
+
+
+ +

Name space header. +More...

+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+

Detailed Description

+

Name space header.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.map new file mode 100644 index 00000000..2e693c35 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.map @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.md5 new file mode 100644 index 00000000..e42bce17 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +69324f54015a58892babe7b5944d72cf \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.png new file mode 100644 index 00000000..5d63579d Binary files /dev/null and b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp_source.html b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp_source.html new file mode 100644 index 00000000..3e464263 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__NamespaceHeader_8hpp_source.html @@ -0,0 +1,79 @@ + + + + + + + +EBGeometry: Source/EBGeometry_NamespaceHeader.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_NamespaceHeader.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 namespace EBGeometry {
Name space for all of EBGeometry.
Definition: EBGeometry.hpp:18
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp.html b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp.html new file mode 100644 index 00000000..18986c64 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp.html @@ -0,0 +1,117 @@ + + + + + + + +EBGeometry: Source/EBGeometry_SignedDistanceFunctionImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_SignedDistanceFunctionImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_SignedDistanceFunctionImplem.hpp. +More...

+
+Include dependency graph for EBGeometry_SignedDistanceFunctionImplem.hpp:
+
+
+ + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + +
+
+

Go to the source code of this file.

+

Detailed Description

+

Implementation of EBGeometry_SignedDistanceFunctionImplem.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..5df8b05f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..ddd096f9 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ef8b54572ac88d550bb65677f4f0fe5a \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..8e7a86c6 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.map new file mode 100644 index 00000000..6aeca4f4 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.md5 new file mode 100644 index 00000000..90f0efc3 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +c6636b26291fe2340ec5b623d5165d33 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.png new file mode 100644 index 00000000..ba2d107b Binary files /dev/null and b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp_source.html new file mode 100644 index 00000000..a4a40f12 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunctionImplem_8hpp_source.html @@ -0,0 +1,87 @@ + + + + + + + +EBGeometry: Source/EBGeometry_SignedDistanceFunctionImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_SignedDistanceFunctionImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_SignedDistanceFunctionImplem
13 #define EBGeometry_SignedDistanceFunctionImplem
14 
15 // Our includes
18 
19 template <class T>
20 T SignedDistanceFunction<T>::unsignedDistance2(const Vec3T<T>& a_point) const noexcept {
21  return std::pow(this->signedDistance(a_point), 2);
22 }
23 
24 template <class T>
25 void SignedDistanceFunction<T>::scale(const Vec3T<T>& a_scale) noexcept {
26  m_transformOps.emplace_back(std::make_shared<EBGeometry::ScaleOp<T> > (a_scale));
27 }
28 
29 template <class T>
30 void SignedDistanceFunction<T>::translate(const Vec3T<T>& a_translation) noexcept {
31  m_transformOps.emplace_back(std::make_shared<EBGeometry::TranslateOp<T> > (a_translation));
32 }
33 
34 template <class T>
35 void SignedDistanceFunction<T>::rotate(const T a_angle, const int a_axis) noexcept {
36  m_transformOps.emplace_back(std::make_shared<EBGeometry::RotateOp<T> >(a_angle, a_axis));
37 }
38 
39 template <class T>
41  auto p = a_point;
42 
43  for (const auto& op : m_transformOps){
44  p = op->transform(p);
45  }
46 
47  return p;
48 }
49 
51 
52 #endif
void rotate(const T a_angle, const int a_axis) noexcept
Rotate the signed distance function around.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:35
+
void translate(const Vec3T< T > &a_translation) noexcept
Translate signed distance function.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:30
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Abstract base class for representing a signed distance function.
+ +
virtual T unsignedDistance2(const Vec3T< T > &a_point) const noexcept
Unsigned distance function. Must return the distance^2.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:20
+
void scale(const Vec3T< T > &a_scale) noexcept
Scale signed distance function.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:25
+
Vec3T< T > transformPoint(const Vec3T< T > &a_point) const noexcept
Apply transformation operators and move point.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:40
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp.html b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp.html new file mode 100644 index 00000000..c605ca40 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp.html @@ -0,0 +1,129 @@ + + + + + + + +EBGeometry: Source/EBGeometry_SignedDistanceFunction.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_SignedDistanceFunction.hpp File Reference
+
+
+ +

Abstract base class for representing a signed distance function. +More...

+
#include <memory>
+#include <deque>
+#include "EBGeometry_TransformOps.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+#include "EBGeometry_SignedDistanceFunctionImplem.hpp"
+
+Include dependency graph for EBGeometry_SignedDistanceFunction.hpp:
+
+
+ + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  SignedDistanceFunction< T >
 Abstract representation of a signed distance function. More...
 
+

Detailed Description

+

Abstract base class for representing a signed distance function.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.map new file mode 100644 index 00000000..d8e1fbe5 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.md5 new file mode 100644 index 00000000..234891ec --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +744550eb5acb7fa9c93fc0f54090d80a \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.png new file mode 100644 index 00000000..ffc0ef52 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.map b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.map new file mode 100644 index 00000000..ab9294a1 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.md5 new file mode 100644 index 00000000..453812b6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.md5 @@ -0,0 +1 @@ +da40908d802214cdff008ac6f847ab84 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.png b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.png new file mode 100644 index 00000000..aa9a354a Binary files /dev/null and b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp_source.html b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp_source.html new file mode 100644 index 00000000..a05b4bb7 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__SignedDistanceFunction_8hpp_source.html @@ -0,0 +1,93 @@ + + + + + + + +EBGeometry: Source/EBGeometry_SignedDistanceFunction.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_SignedDistanceFunction.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_SignedDistanceFunction
13 #define EBGeometry_SignedDistanceFunction
14 
15 #include <memory>
16 #include <deque>
17 
18 // Our includes
21 
28 template <class T>
30 public:
31 
35  SignedDistanceFunction() = default;
36 
40  virtual ~SignedDistanceFunction() = default;
41 
46  virtual T signedDistance(const Vec3T<T>& a_point) const noexcept = 0;
47 
52  virtual T unsignedDistance2(const Vec3T<T>& a_point) const noexcept;
53 
58  inline
59  void scale(const Vec3T<T>& a_scale) noexcept;
60 
65  inline
66  void translate(const Vec3T<T>& a_translation) noexcept;
67 
73  inline
74  void rotate(const T a_angle, const int a_axis) noexcept;
75 
76 protected:
77 
81  std::deque<std::shared_ptr<TransformOp<T> > > m_transformOps;
82 
86  inline
87  Vec3T<T> transformPoint(const Vec3T<T>& a_point) const noexcept;
88 };
89 
91 
93 
94 #endif
void rotate(const T a_angle, const int a_axis) noexcept
Rotate the signed distance function around.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:35
+
std::deque< std::shared_ptr< TransformOp< T > > > m_transformOps
List of transformation operators for the signed distance field.
Definition: EBGeometry_SignedDistanceFunction.hpp:81
+
Implementation of EBGeometry_SignedDistanceFunctionImplem.hpp.
+
void translate(const Vec3T< T > &a_translation) noexcept
Translate signed distance function.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:30
+
Declaration of transformation operators for signed distance fields.
+
SignedDistanceFunction()=default
Disallowed, use the full constructor.
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Abstract representation of a signed distance function.
Definition: EBGeometry_SignedDistanceFunction.hpp:29
+ +
virtual T unsignedDistance2(const Vec3T< T > &a_point) const noexcept
Unsigned distance function. Must return the distance^2.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:20
+
void scale(const Vec3T< T > &a_scale) noexcept
Scale signed distance function.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:25
+
Vec3T< T > transformPoint(const Vec3T< T > &a_point) const noexcept
Apply transformation operators and move point.
Definition: EBGeometry_SignedDistanceFunctionImplem.hpp:40
+
virtual T signedDistance(const Vec3T< T > &a_point) const noexcept=0
Signed distance function.
+
virtual ~SignedDistanceFunction()=default
Destructor (does nothing)
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp.html b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp.html new file mode 100644 index 00000000..6e28355b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp.html @@ -0,0 +1,117 @@ + + + + + + + +EBGeometry: Source/EBGeometry_TransformOpsImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_TransformOpsImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_TransformOps.hpp. +More...

+
+Include dependency graph for EBGeometry_TransformOpsImplem.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + +
+
+

Go to the source code of this file.

+

Detailed Description

+

Implementation of EBGeometry_TransformOps.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..8033cfb4 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..88568adb --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +dd3663bd474e7f6c87e765fc8ca5d0c0 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..43688bb7 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.map new file mode 100644 index 00000000..bf93e86d --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.md5 new file mode 100644 index 00000000..568564ba --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +4e5300cfa5315d3d43396c421cbfbd6e \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.png new file mode 100644 index 00000000..68c30bcc Binary files /dev/null and b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp_source.html new file mode 100644 index 00000000..e14fc028 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOpsImplem_8hpp_source.html @@ -0,0 +1,89 @@ + + + + + + + +EBGeometry: Source/EBGeometry_TransformOpsImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_TransformOpsImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_TransformOpsImplem
13 #define EBGeometry_TransformOpsImplem
14 
15 // Our includes
18 
19 template <class T>
21  m_translation = Vec3T<T>::zero();
22 }
23 
24 template <class T>
25 TranslateOp<T>::TranslateOp(const Vec3T<T>& a_translation) {
26  m_translation = a_translation;
27 }
28 
29 template <class T>
30 Vec3T<T> TranslateOp<T>::transform(const Vec3T<T>& a_inputPoint) const noexcept {
31  return a_inputPoint - m_translation;
32 }
33 
34 template <class T>
36  m_scale = Vec3T<T>::unit();
37 }
38 
39 template <class T>
40 ScaleOp<T>::ScaleOp(const Vec3T<T>& a_translation) {
41  m_scale = a_translation;
42 }
43 
44 template <class T>
45 Vec3T<T> ScaleOp<T>::transform(const Vec3T<T>& a_inputPoint) const noexcept {
46  return a_inputPoint/m_scale;
47 }
48 
49 template <class T>
51  m_axis = Vec3T<T>::unit();
52  m_cosAngle = std::cos(T(0.0));
53  m_sinAngle = std::sin(T(0.0));
54 }
55 
56 template <class T>
57 RotateOp<T>::RotateOp(const T a_angle, const int a_axis) noexcept {
58  m_axis = a_axis;
59  m_cosAngle = std::cos(a_angle);
60  m_sinAngle = std::sin(a_angle);
61 }
62 
63 template <class T>
64 Vec3T<T> RotateOp<T>::transform(const Vec3T<T>& a_inputPoint) const noexcept {
65 
66  const T& x = a_inputPoint[0];
67  const T& y = a_inputPoint[1];
68  const T& z = a_inputPoint[2];
69 
70  Vec3T<T> rotatePoint = a_inputPoint;
71 
72  switch(m_axis){
73  case 0:
74  {
75  rotatePoint[1] = y*m_cosAngle + z*m_sinAngle;
76  rotatePoint[2] = -y*m_sinAngle + z*m_cosAngle;
77 
78  break;
79  }
80  case 1:
81  {
82  rotatePoint[0] = x*m_cosAngle - z*m_sinAngle;
83  rotatePoint[2] = y*m_sinAngle + z*m_cosAngle;
84 
85  break;
86  }
87  case 2:
88  {
89  rotatePoint[0] = x*m_cosAngle + y*m_sinAngle;
90  rotatePoint[1] = -x*m_sinAngle + y*m_cosAngle;
91 
92  break;
93  }
94  }
95 
96  return rotatePoint;
97 }
98 
100 
101 #endif
TranslateOp()
Default constructor.
Definition: EBGeometry_TransformOpsImplem.hpp:20
+
Vec3T< T > transform(const Vec3T< T > &a_inputPoint) const noexcept override
Transform input point.
Definition: EBGeometry_TransformOpsImplem.hpp:64
+
static constexpr Vec3T< T > zero() noexcept
Return av vector with x = y = z = 0.
Definition: EBGeometry_VecImplem.hpp:205
+
Vec3T< T > transform(const Vec3T< T > &a_inputPoint) const noexcept override
Transform input point.
Definition: EBGeometry_TransformOpsImplem.hpp:30
+
Vec3T< T > transform(const Vec3T< T > &a_inputPoint) const noexcept override
Transform input point.
Definition: EBGeometry_TransformOpsImplem.hpp:45
+
RotateOp()
Weak constructor.
Definition: EBGeometry_TransformOpsImplem.hpp:50
+
Declaration of transformation operators for signed distance fields.
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
ScaleOp()
Default constructor.
Definition: EBGeometry_TransformOpsImplem.hpp:35
+ +
+ + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp.html b/docs/doxygen/html/EBGeometry__TransformOps_8hpp.html new file mode 100644 index 00000000..08dc77d7 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOps_8hpp.html @@ -0,0 +1,136 @@ + + + + + + + +EBGeometry: Source/EBGeometry_TransformOps.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_TransformOps.hpp File Reference
+
+
+ +

Declaration of transformation operators for signed distance fields. +More...

+
+Include dependency graph for EBGeometry_TransformOps.hpp:
+
+
+ + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + +

+Classes

class  TransformOp< T >
 Base class for transformation operators. More...
 
class  TranslateOp< T >
 Translation operator. Can translate an input point. More...
 
class  ScaleOp< T >
 Scale operator. Can also be used as a reflection operator. More...
 
class  RotateOp< T >
 Rotation operator. Can scale an input point. More...
 
+

Detailed Description

+

Declaration of transformation operators for signed distance fields.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.map new file mode 100644 index 00000000..049dd33d --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.md5 new file mode 100644 index 00000000..a3f83972 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +05e21e67ba122d096b245b0ceef11fd4 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.png new file mode 100644 index 00000000..d10306cc Binary files /dev/null and b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.map b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.map new file mode 100644 index 00000000..4b5e0efd --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.md5 new file mode 100644 index 00000000..2f8c2c39 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.md5 @@ -0,0 +1 @@ +432c0480f85c0746daa98a3a92f6b53f \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.png b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.png new file mode 100644 index 00000000..b7b3adaa Binary files /dev/null and b/docs/doxygen/html/EBGeometry__TransformOps_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__TransformOps_8hpp_source.html b/docs/doxygen/html/EBGeometry__TransformOps_8hpp_source.html new file mode 100644 index 00000000..bf697727 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__TransformOps_8hpp_source.html @@ -0,0 +1,95 @@ + + + + + + + +EBGeometry: Source/EBGeometry_TransformOps.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_TransformOps.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_TransformOps
13 #define EBGeometry_TransformOps
14 
15 // Our includes
16 #include "EBGeometry_Vec.hpp"
18 
22 template <class T>
23 class TransformOp {
24 public:
25 
29  TransformOp() = default;
30 
34  virtual ~TransformOp() = default;
35 
41  virtual Vec3T<T> transform(const Vec3T<T>& a_inputPoint) const noexcept = 0;
42 };
43 
47 template <class T>
48 class TranslateOp : public TransformOp<T> {
49 public:
50 
54  TranslateOp();
55 
59  TranslateOp(const Vec3T<T>& a_translation);
60 
64  virtual ~TranslateOp() = default;
65 
69  Vec3T<T> transform(const Vec3T<T>& a_inputPoint) const noexcept override;
70 
71 protected:
72 
77 };
78 
82 template <class T>
83 class ScaleOp : public TransformOp<T> {
84 public:
85 
89  ScaleOp();
90 
94  ScaleOp(const Vec3T<T>& a_scale);
95 
99  virtual ~ScaleOp() = default;
100 
104  Vec3T<T> transform(const Vec3T<T>& a_inputPoint) const noexcept override;
105 
106 protected:
107 
112 };
113 
117 template <class T>
118 class RotateOp : public TransformOp<T> {
119 public:
120 
124  RotateOp();
125 
131  RotateOp(const T a_angle, const int a_axis) noexcept;
132 
136  virtual ~RotateOp() = default;
137 
141  Vec3T<T> transform(const Vec3T<T>& a_inputPoint) const noexcept override;
142 
143 protected:
144 
148  int m_axis;
149 
154 
159 };
160 
162 
164 
165 #endif
Translation operator. Can translate an input point.
Definition: EBGeometry_TransformOps.hpp:48
+
T m_cosAngle
Theta-rotation (degrees)
Definition: EBGeometry_TransformOps.hpp:153
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
int m_axis
Rotation axis. 0 = x, 1=y etc.
Definition: EBGeometry_TransformOps.hpp:148
+
Base class for transformation operators.
Definition: EBGeometry_TransformOps.hpp:23
+
virtual Vec3T< T > transform(const Vec3T< T > &a_inputPoint) const noexcept=0
Transform input coordinate.
+
Scale operator. Can also be used as a reflection operator.
Definition: EBGeometry_TransformOps.hpp:83
+
Rotation operator. Can scale an input point.
Definition: EBGeometry_TransformOps.hpp:118
+
T m_sinAngle
Phi-rotation (degrees)
Definition: EBGeometry_TransformOps.hpp:158
+
Vec3T< T > m_scale
Scaling of input point.
Definition: EBGeometry_TransformOps.hpp:111
+
Vec3T< T > m_translation
Translation of input point.
Definition: EBGeometry_TransformOps.hpp:76
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
TransformOp()=default
Default constructor.
+ +
Implementation of EBGeometry_TransformOps.hpp.
+
virtual ~TransformOp()=default
Destructor.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp.html b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp.html new file mode 100644 index 00000000..9eb05914 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp.html @@ -0,0 +1,114 @@ + + + + + + + +EBGeometry: Source/EBGeometry_UnionBVHImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_UnionBVHImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_UnionBVH.hpp. +More...

+
+Include dependency graph for EBGeometry_UnionBVHImplem.hpp:
+
+
+ + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+

Detailed Description

+

Implementation of EBGeometry_UnionBVH.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..e581b26f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..af4a7851 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ff3d60360991635c2b148aa9a9ab9629 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..abd57d22 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.map new file mode 100644 index 00000000..d0a71e05 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.md5 new file mode 100644 index 00000000..f2dc208e --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +acff515523b74711a03077f0cc1b3248 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.png new file mode 100644 index 00000000..3e9e107f Binary files /dev/null and b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp_source.html new file mode 100644 index 00000000..3c52031d --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVHImplem_8hpp_source.html @@ -0,0 +1,96 @@ + + + + + + + +EBGeometry: Source/EBGeometry_UnionBVHImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_UnionBVHImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_UnionBVHImplem
13 #define EBGeometry_UnionBVHImplem
14 
15 // Our includes
16 #include "EBGeometry_UnionBVH.hpp"
18 
19 template <class T, class BV, int K>
20 UnionBVH<T, BV, K>::UnionBVH(const std::vector<std::shared_ptr<SDF> >& a_distanceFunctions, const bool a_flipSign) {
21  for (const auto& sdf : a_distanceFunctions){
22  m_distanceFunctions.emplace_back(sdf);
23  }
24 
25  m_flipSign = a_flipSign;
26  m_isGood = false;
27 }
28 
29 template <class T, class BV, int K>
30 UnionBVH<T, BV, K>::UnionBVH(const std::vector<std::shared_ptr<SDF> >& a_distanceFunctions, const bool a_flipSign, const BVConstructor& a_bvConstructor) :
31  UnionBVH<T, BV, K>(a_distanceFunctions, a_flipSign) {
32 
33  this->buildTree(a_bvConstructor);
34 }
35 
36 template <class T, class BV, int K>
37 void UnionBVH<T, BV, K>::buildTree(const BVConstructor& a_bvConstructor) {
38 
39  // This function is a partitioning function taking the input SDFs and partitioning them into K subvolumes. Since the SDFs don't themselves
40  // have vertices, centroids, etc., we use their bounding volumes as criteria for subdividing them. We do this by computing the spatial centroid
41  // of each bounding volume that encloses the SDFs. We then do a spatial subdivision along the longest coordinate into K almost-equal chunks.
42  EBGeometry::BVH::PartitionerT<SDF, K> partitioner = [a_bvConstructor] (const SDFList& a_primitives) -> std::array<SDFList, K> {
43  const int numPrimitives = a_primitives.size();
44 
45  if(numPrimitives < K){
46  std::cerr << "UnionBVH<T, BV, K>::buildTree -- not enough primitives to partition into K new nodes\n";
47  }
48 
49  // 1. Compute the bounding volume centroids for each input SDF.
50  std::vector<Vec3T<T> > bvCentroids;
51  for (const auto& P : a_primitives){
52  bvCentroids.emplace_back((a_bvConstructor(P)).getCentroid());
53  }
54 
55  // 2. Figure out which coordinate direction has the longest/smallest extent. We split along the longest direction.
56  auto lo = Vec3T<T>::infinity();
57  auto hi = -Vec3T<T>::infinity();
58 
59  for (const auto& c : bvCentroids){
60  lo = min(lo, c);
61  hi = max(hi, c);
62  }
63 
64  const int splitDir = (hi-lo).maxDir(true);
65 
66  // 3. Sort input primitives based on the centroid location of their bounding volumes. We do this by packing the SDFs and their BV centroids
67  // in a vector which we sort (I love C++).
68  using Primitive = std::shared_ptr<const SDF>;
69  using Centroid = Vec3T<T>;
70  using PC = std::pair<Primitive, Centroid>;
71 
72  // Vector pack.
73  std::vector<PC> primsAndCentroids;
74  for (unsigned int i = 0; i < a_primitives.size(); i++){
75  primsAndCentroids.emplace_back(a_primitives[i], bvCentroids[i]);
76  }
77 
78  // Vector sort.
79  std::sort(primsAndCentroids.begin(),
80  primsAndCentroids.end(),
81  [=](const PC& sdf1, const PC& sdf2) -> bool {
82  return sdf1.second < sdf2.second;
83  });
84 
85  // Vector unpack. The input SDFs are not sorted based on their bounding volume centroids.
86  std::vector<Primitive> sortedPrimitives;
87  for (int i = 0 ; i < numPrimitives; i++){
88  sortedPrimitives.emplace_back(primsAndCentroids[i].first);
89  }
90 
91  // 4. Figure out where along the PC vector we should do our spatial splits. We try to balance the chunks.
92  const int almostEqualChunkSize = numPrimitives / K;
93  int remainder = numPrimitives % K;
94 
95  std::array<int, K> startIndices;
96  std::array<int, K> endIndices;
97 
98  startIndices[0] = 0;
99  endIndices [K-1] = numPrimitives;
100 
101  for (unsigned int i = 1; i < K; i++){
102  startIndices[i] = startIndices[i-1] + almostEqualChunkSize;
103 
104  if(remainder > 0){
105  startIndices[i]++;
106  remainder--;
107  }
108  }
109 
110  for (unsigned int i = 0; i < K-1; i++){
111  endIndices[i] = startIndices[i+1];
112  }
113 
114  // 5. Put the primitives in separate lists and return them like the API says.
115  std::array<SDFList, K> subVolumePrimitives;
116  for (int i = 0; i < K; i++){
117  typename SDFList::const_iterator first = sortedPrimitives.begin() + startIndices[i];
118  typename SDFList::const_iterator last = sortedPrimitives.begin() + endIndices [i];
119 
120  subVolumePrimitives[i] = SDFList(first, last);
121  }
122 
123  return subVolumePrimitives;
124  };
125 
126  // Stop function. Exists subdivision if there are not enough primitives left to keep subdividing. We set the limit at 10 primitives.
127  EBGeometry::BVH::StopFunctionT<T, SDF, BV, K> stopFunc = [] (const BuilderNode& a_node) -> bool {
128  const int numPrimsInNode = (a_node.getPrimitives()).size();
129  return numPrimsInNode < K;
130  };
131 
132  // Init the root node and partition the primitives.
133  auto root = std::make_shared<BuilderNode>(m_distanceFunctions);
134 
135  root->topDownSortAndPartitionPrimitives(a_bvConstructor,
136  partitioner,
137  stopFunc);
138 
139  m_rootNode = root->flattenTree();
140 
141  m_isGood = true;
142 }
143 
144 template <class T, class BV, int K>
145 T UnionBVH<T, BV, K>::signedDistance(const Vec3T<T>& a_point) const noexcept {
146  const T sign = (m_flipSign) ? -1.0 : 1.0;
147 
148  return sign * m_rootNode->signedDistance(a_point);
149 }
150 
152 
153 #endif
EBGeometry::BVH::BVConstructorT< SDF, BV > BVConstructor
Alias for cutting down on typing. This is a std::function<BV(SDF)>, i.e. a function which returns a b...
Definition: EBGeometry_UnionBVH.hpp:38
+
T signedDistance(const Vec3T< T > &a_point) const noexcept override
Value function.
Definition: EBGeometry_UnionBVHImplem.hpp:145
+
EBGeometry::BVH::NodeT< T, SDF, BV, K > BuilderNode
Builder node type in BVH tree. Tree is constructed in "full".
Definition: EBGeometry_UnionBVH.hpp:87
+
bool m_isGood
Is good or not.
Definition: EBGeometry_UnionBVH.hpp:107
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
static constexpr Vec3T< T > infinity() noexcept
Return a vector with inf components.
Definition: EBGeometry_VecImplem.hpp:229
+
bool m_flipSign
Hook for turning inside to outside.
Definition: EBGeometry_UnionBVH.hpp:112
+
std::vector< std::shared_ptr< const SDF > > m_distanceFunctions
List of distance functions.
Definition: EBGeometry_UnionBVH.hpp:97
+
std::vector< std::shared_ptr< const SDF > > SDFList
Alias for cutting down on typing.
Definition: EBGeometry_UnionBVH.hpp:82
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
void buildTree(const BVConstructor &a_bvConstructor)
Build BVH tree for the input objects. User must supply a partitioner and a BV constructor for the SDF...
Definition: EBGeometry_UnionBVHImplem.hpp:37
+
std::shared_ptr< LinearNode > m_rootNode
Root node for BVH tree.
Definition: EBGeometry_UnionBVH.hpp:102
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+ +
UnionBVH()=delete
Disallowed, use the full constructor.
+
Distance function union using BVHs. Computes the signed distance to the closest object of N non-overl...
Definition: EBGeometry_UnionBVH.hpp:27
+
Declaration of a union operator for creating multi-object scenes.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp.html b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp.html new file mode 100644 index 00000000..2e765c39 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp.html @@ -0,0 +1,125 @@ + + + + + + + +EBGeometry: Source/EBGeometry_UnionBVH.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_UnionBVH.hpp File Reference
+
+
+ +

Declaration of a union operator for creating multi-object scenes. +More...

+
+Include dependency graph for EBGeometry_UnionBVH.hpp:
+
+
+ + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  UnionBVH< T, BV, K >
 Distance function union using BVHs. Computes the signed distance to the closest object of N non-overlapping objects. More...
 
+

Detailed Description

+

Declaration of a union operator for creating multi-object scenes.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.map new file mode 100644 index 00000000..19641980 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.md5 new file mode 100644 index 00000000..087128c6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +489f8bd9ebeb24549ca68431399475cd \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.png new file mode 100644 index 00000000..815fa709 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.map b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.map new file mode 100644 index 00000000..79fc9800 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.md5 new file mode 100644 index 00000000..b6865123 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.md5 @@ -0,0 +1 @@ +8f5656c95bdfe835ba600de805d3d58d \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.png b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.png new file mode 100644 index 00000000..0e93da5c Binary files /dev/null and b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__UnionBVH_8hpp_source.html b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp_source.html new file mode 100644 index 00000000..c5ca5137 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionBVH_8hpp_source.html @@ -0,0 +1,97 @@ + + + + + + + +EBGeometry: Source/EBGeometry_UnionBVH.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_UnionBVH.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_UnionBVH
13 #define EBGeometry_UnionBVH
14 
15 // Std includes
16 #include <vector>
17 
18 // Our includes
21 
26 template <class T, class BV, int K>
27 class UnionBVH : public SignedDistanceFunction<T> {
28 public:
29 
34 
38  using BVConstructor = EBGeometry::BVH::BVConstructorT<SDF, BV>;
39 
43  UnionBVH() = delete;
44 
50  UnionBVH(const std::vector<std::shared_ptr<SDF> >& a_distanceFunctions, const bool a_flipSign);
51 
58  UnionBVH(const std::vector<std::shared_ptr<SDF> >& a_distanceFunctions, const bool a_flipSign, const BVConstructor& a_bvConstructor);
59 
64  void buildTree(const BVConstructor& a_bvConstructor);
65 
69  virtual ~UnionBVH() = default;
70 
75  T signedDistance(const Vec3T<T>& a_point) const noexcept override;
76 
77 protected:
78 
82  using SDFList = std::vector<std::shared_ptr<const SDF> >;
83 
87  using BuilderNode = EBGeometry::BVH::NodeT<T, SDF, BV, K>;
88 
92  using LinearNode = EBGeometry::BVH::LinearBVH<T, SDF, BV, K>;
93 
97  std::vector<std::shared_ptr<const SDF> > m_distanceFunctions;
98 
102  std::shared_ptr<LinearNode> m_rootNode;
103 
107  bool m_isGood;
108 
113 };
114 
116 
118 
119 #endif
EBGeometry::BVH::BVConstructorT< SDF, BV > BVConstructor
Alias for cutting down on typing. This is a std::function<BV(SDF)>, i.e. a function which returns a b...
Definition: EBGeometry_UnionBVH.hpp:38
+
T signedDistance(const Vec3T< T > &a_point) const noexcept override
Value function.
Definition: EBGeometry_UnionBVHImplem.hpp:145
+
EBGeometry::BVH::NodeT< T, SDF, BV, K > BuilderNode
Builder node type in BVH tree. Tree is constructed in "full".
Definition: EBGeometry_UnionBVH.hpp:87
+
virtual ~UnionBVH()=default
Destructor (does nothing)
+
bool m_isGood
Is good or not.
Definition: EBGeometry_UnionBVH.hpp:107
+
Implementation of EBGeometry_UnionBVH.hpp.
+
bool m_flipSign
Hook for turning inside to outside.
Definition: EBGeometry_UnionBVH.hpp:112
+
std::vector< std::shared_ptr< const SDF > > m_distanceFunctions
List of distance functions.
Definition: EBGeometry_UnionBVH.hpp:97
+
std::vector< std::shared_ptr< const SDF > > SDFList
Alias for cutting down on typing.
Definition: EBGeometry_UnionBVH.hpp:82
+ +
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
void buildTree(const BVConstructor &a_bvConstructor)
Build BVH tree for the input objects. User must supply a partitioner and a BV constructor for the SDF...
Definition: EBGeometry_UnionBVHImplem.hpp:37
+
std::shared_ptr< LinearNode > m_rootNode
Root node for BVH tree.
Definition: EBGeometry_UnionBVH.hpp:102
+
Abstract base class for representing a signed distance function.
+
Abstract representation of a signed distance function.
Definition: EBGeometry_SignedDistanceFunction.hpp:29
+ +
UnionBVH()=delete
Disallowed, use the full constructor.
+
Distance function union using BVHs. Computes the signed distance to the closest object of N non-overl...
Definition: EBGeometry_UnionBVH.hpp:27
+
EBGeometry::BVH::LinearBVH< T, SDF, BV, K > LinearNode
Node type in BVH tree. We use a flattened tree.
Definition: EBGeometry_UnionBVH.hpp:92
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp.html b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp.html new file mode 100644 index 00000000..56a3fd97 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp.html @@ -0,0 +1,114 @@ + + + + + + + +EBGeometry: Source/EBGeometry_UnionImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_UnionImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_Union.hpp. +More...

+
+Include dependency graph for EBGeometry_UnionImplem.hpp:
+
+
+ + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+

Detailed Description

+

Implementation of EBGeometry_Union.hpp.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..ab3835dd --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..2b5e2374 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +1d99e30e296e58264164681f25a1f78d \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..007812ed Binary files /dev/null and b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.map new file mode 100644 index 00000000..1fc69c9f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.md5 new file mode 100644 index 00000000..3d1eb08f --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +e56bba42fd7e05e33da2aa7accc5b62a \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.png new file mode 100644 index 00000000..638578a6 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__UnionImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp_source.html new file mode 100644 index 00000000..3f6865a0 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__UnionImplem_8hpp_source.html @@ -0,0 +1,84 @@ + + + + + + + +EBGeometry: Source/EBGeometry_UnionImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_UnionImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_UnionImplem
13 #define EBGeometry_UnionImplem
14 
15 // Our includes
16 #include "EBGeometry_Union.hpp"
18 
19 template <class T>
20 Union<T>::Union(const std::vector<std::shared_ptr<SDF> >& a_distanceFunctions, const bool a_flipSign) {
21  for (const auto& sdf : a_distanceFunctions){
22  m_distanceFunctions.emplace_back(sdf);
23  }
24 
25  m_flipSign = a_flipSign;
26 }
27 
28 template <class T>
29 T Union<T>::signedDistance(const Vec3T<T>& a_point) const noexcept {
30  const int numDistanceFunctions = m_distanceFunctions.size();
31 
32  T ret = std::numeric_limits<T>::infinity();
33 
34  for (const auto & sdf : m_distanceFunctions){
35  const T cur = sdf->signedDistance(a_point);
36 
37  ret = (std::abs(cur) < std::abs(ret)) ? cur : ret;
38  }
39 
40  T sign = (m_flipSign) ? -1.0 : 1.0;
41 
42  return sign * ret;
43 }
44 
46 
47 #endif
Union()=delete
Disallowed, use the full constructor.
+
Declaration of a union operator for creating multi-object scenes.
+ +
T signedDistance(const Vec3T< T > &a_point) const noexcept override
Value function.
Definition: EBGeometry_UnionImplem.hpp:29
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+ +
+ + + + diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp.html b/docs/doxygen/html/EBGeometry__Union_8hpp.html new file mode 100644 index 00000000..71ae32a6 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Union_8hpp.html @@ -0,0 +1,125 @@ + + + + + + + +EBGeometry: Source/EBGeometry_Union.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_Union.hpp File Reference
+
+
+ +

Declaration of a union operator for creating multi-object scenes. +More...

+
+Include dependency graph for EBGeometry_Union.hpp:
+
+
+ + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  Union< T >
 Distance function union. Computes the signed distance to the closest object of N non-overlapping objects. More...
 
+

Detailed Description

+

Declaration of a union operator for creating multi-object scenes.

+
Author
Robert Marskar
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.map new file mode 100644 index 00000000..15f63513 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.md5 new file mode 100644 index 00000000..d7708d21 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +5a4680e1977966c5d74cac148bf5d512 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.png new file mode 100644 index 00000000..e85aaef1 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__Union_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp__incl.map b/docs/doxygen/html/EBGeometry__Union_8hpp__incl.map new file mode 100644 index 00000000..a6b58c14 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Union_8hpp__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__Union_8hpp__incl.md5 new file mode 100644 index 00000000..a60dfade --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Union_8hpp__incl.md5 @@ -0,0 +1 @@ +9be88e1aca6b39c6a6dbcbe8f4315b5d \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp__incl.png b/docs/doxygen/html/EBGeometry__Union_8hpp__incl.png new file mode 100644 index 00000000..51f7ab96 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__Union_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__Union_8hpp_source.html b/docs/doxygen/html/EBGeometry__Union_8hpp_source.html new file mode 100644 index 00000000..e79c95b9 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Union_8hpp_source.html @@ -0,0 +1,90 @@ + + + + + + + +EBGeometry: Source/EBGeometry_Union.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_Union.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_Union
13 #define EBGeometry_Union
14 
15 // Std includes
16 #include <vector>
17 
18 // Our includes
21 
26 template <class T>
27 class Union : public SignedDistanceFunction<T> {
28 public:
29 
34 
38  Union() = delete;
39 
45  Union(const std::vector<std::shared_ptr<SDF> >& a_distanceFunctions, const bool a_flipSign);
46 
50  virtual ~Union() = default;
51 
56  T signedDistance(const Vec3T<T>& a_point) const noexcept override;
57 
58 protected:
59 
63  std::vector<std::shared_ptr<const SDF> > m_distanceFunctions;
64 
68  bool m_flipSign;
69 };
70 
72 
74 
75 #endif
Union()=delete
Disallowed, use the full constructor.
+
virtual ~Union()=default
Destructor (does nothing)
+
bool m_flipSign
Hook for turning inside to outside.
Definition: EBGeometry_Union.hpp:68
+
Distance function union. Computes the signed distance to the closest object of N non-overlapping obje...
Definition: EBGeometry_Union.hpp:27
+
std::vector< std::shared_ptr< const SDF > > m_distanceFunctions
List of distance functions.
Definition: EBGeometry_Union.hpp:63
+ +
T signedDistance(const Vec3T< T > &a_point) const noexcept override
Value function.
Definition: EBGeometry_UnionImplem.hpp:29
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
Abstract base class for representing a signed distance function.
+
Abstract representation of a signed distance function.
Definition: EBGeometry_SignedDistanceFunction.hpp:29
+ +
Implementation of EBGeometry_Union.hpp.
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp.html b/docs/doxygen/html/EBGeometry__VecImplem_8hpp.html new file mode 100644 index 00000000..3e132748 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__VecImplem_8hpp.html @@ -0,0 +1,457 @@ + + + + + + + +EBGeometry: Source/EBGeometry_VecImplem.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_VecImplem.hpp File Reference
+
+
+ +

Implementation of EBGeometry_Vec.hpp. +More...

+
#include <math.h>
+#include <algorithm>
+#include "EBGeometry_Vec.hpp"
+#include "EBGeometry_NamespaceHeader.hpp"
+#include "EBGeometry_NamespaceFooter.hpp"
+
+Include dependency graph for EBGeometry_VecImplem.hpp:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

template<class T >
Vec2T< T > operator* (const T &s, const Vec2T< T > &a_other) noexcept
 Multiplication operator in the form s*Vec2T. More...
 
template<class T >
Vec2T< T > operator/ (const T &s, const Vec2T< T > &a_other) noexcept
 Division operator in the form s*Vec2T. More...
 
template<class T >
Vec3T< T > operator* (const T &s, const Vec3T< T > &a_other) noexcept
 Multiplication operator. More...
 
template<class T >
Vec3T< T > operator/ (const T &s, const Vec3T< T > &a_other) noexcept
 Division operator. More...
 
template<class T >
Vec3T< T > min (const Vec3T< T > &u, const Vec3T< T > &v) noexcept
 Minimum fucntion. Returns new vector with component-wise minimums. More...
 
template<class T >
Vec3T< T > max (const Vec3T< T > &u, const Vec3T< T > &v) noexcept
 Minimum fucntion. Returns new vector with component-wise minimums. More...
 
+

Detailed Description

+

Implementation of EBGeometry_Vec.hpp.

+
Author
Robert Marskar
+

Function Documentation

+ +

◆ max()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> max (const Vec3T< T > & u,
const Vec3T< T > & v 
)
+
+inlinenoexcept
+
+ +

Minimum fucntion. Returns new vector with component-wise minimums.

+
Parameters
+ + + +
[in]uVector
[in]vOther vector
+
+
+
Returns
Returns new vector with components X[0] = std::max(u.X[0], v.X[0]) and so on
+ +
+
+ +

◆ min()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> min (const Vec3T< T > & u,
const Vec3T< T > & v 
)
+
+inlinenoexcept
+
+ +

Minimum fucntion. Returns new vector with component-wise minimums.

+
Parameters
+ + + +
[in]uVector
[in]vOther vector
+
+
+
Returns
Returns new vector with components X[0] = std::min(u.X[0], v.X[0]) and so on
+ +
+
+ +

◆ operator*() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec2T<T> operator* (const T & s,
const Vec2T< T > & a_other 
)
+
+inlinenoexcept
+
+ +

Multiplication operator in the form s*Vec2T.

+
Parameters
+ + + +
[in]sMultiplication factor
[in]a_otherOther vector
+
+
+
Returns
Returns a new vector with components x = s*a_other.x (and same for y)
+ +
+
+ +

◆ operator*() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> operator* (const T & s,
const Vec3T< T > & u 
)
+
+inlinenoexcept
+
+ +

Multiplication operator.

+
Parameters
+ + + +
[in]sMultiplication scalar
[in]uVector
+
+
+
Returns
Returns new vector with components X[0] = s*X[0] and so on.
+ +
+
+ +

◆ operator/() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec2T<T> operator/ (const T & s,
const Vec2T< T > & a_other 
)
+
+inlinenoexcept
+
+ +

Division operator in the form s*Vec2T.

+
Parameters
+ + + +
[in]sDivision factor
[in]a_otherOther vector
+
+
+
Returns
Returns a new vector with components x = (1/s)*a_other.x (and same for y)
+ +
+
+ +

◆ operator/() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> operator/ (const T & s,
const Vec3T< T > & u 
)
+
+inlinenoexcept
+
+ +

Division operator.

+
Parameters
+ + + +
[in]sDivision scalar
[in]uVector
+
+
+
Returns
Returns new vector with components X[0] = X[0]/s and so on.
+ +
+
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.map new file mode 100644 index 00000000..ed51107b --- /dev/null +++ b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.map @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..85552299 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +fec4ec5e9a79cb4b1eef6c80b7d145dc \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.png new file mode 100644 index 00000000..bf5f939e Binary files /dev/null and b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.map b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.map new file mode 100644 index 00000000..d1d17e22 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.md5 new file mode 100644 index 00000000..516dcdbd --- /dev/null +++ b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +35c70af9e26477eadddfbb0d829ee10d \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.png b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.png new file mode 100644 index 00000000..51869a6c Binary files /dev/null and b/docs/doxygen/html/EBGeometry__VecImplem_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__VecImplem_8hpp_source.html b/docs/doxygen/html/EBGeometry__VecImplem_8hpp_source.html new file mode 100644 index 00000000..c86280ed --- /dev/null +++ b/docs/doxygen/html/EBGeometry__VecImplem_8hpp_source.html @@ -0,0 +1,133 @@ + + + + + + + +EBGeometry: Source/EBGeometry_VecImplem.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_VecImplem.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_VecImplem
13 #define EBGeometry_VecImplem
14 
15 // Std includes
16 #include <math.h>
17 #include <algorithm>
18 
19 // Our includes
20 #include "EBGeometry_Vec.hpp"
22 
23 template <class T>
24 inline
26  *this = Vec2T<T>::zero();
27 }
28 
29 template <class T>
30 inline
32  x = u.x;
33  y = u.y;
34 }
35 
36 template <class T>
37 inline
38 Vec2T<T>::Vec2T(const T& a_x, const T& a_y){
39  x = a_x;
40  y = a_y;
41 }
42 
43 template <class T>
44 inline
45 constexpr Vec2T<T> Vec2T<T>::zero() noexcept {
46  return Vec2T<T>(T(0.0), T(0.0));
47 }
48 
49 template <class T>
50 inline
51 constexpr Vec2T<T> Vec2T<T>::one() noexcept {
52  return Vec2T<T>(T(1.0), T(1.0));
53 }
54 
55 template <class T>
56 inline
57 constexpr Vec2T<T> Vec2T<T>::min() noexcept {
59 }
60 
61 template <class T>
62 inline
63 constexpr Vec2T<T> Vec2T<T>::max() noexcept {
65 }
66 
67 template <class T>
68 inline
69 constexpr Vec2T<T> Vec2T<T>::infinity() noexcept {
70  return Vec2T<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity());
71 }
72 
73 template <class T>
74 inline
75 Vec2T<T>& Vec2T<T>::operator=(const Vec2T<T>& u) noexcept {
76  x = u.x;
77  y = u.y;
78 
79  return (*this);
80 }
81 
82 template <class T>
83 inline
84 Vec2T<T> Vec2T<T>::operator+(const Vec2T<T>& u) const noexcept {
85  return Vec2T<T>(x+u.x, y+u.y);
86 }
87 
88 template <class T>
89 inline
90 Vec2T<T> Vec2T<T>::operator-(const Vec2T<T>& u) const noexcept {
91  return Vec2T<T>(x-u.x, y-u.y);
92 }
93 
94 template <class T>
95 inline
96 Vec2T<T> Vec2T<T>::operator-() const noexcept {
97  return Vec2T<T>(-x, -y);
98 }
99 
100 template <class T>
101 inline
102 Vec2T<T> Vec2T<T>::operator*(const T& s) const noexcept {
103  return Vec2T<T>(x*s, y*s);
104 }
105 
106 template <class T>
107 inline
108 Vec2T<T> Vec2T<T>::operator/(const T& s) const noexcept {
109  const T is = 1./s;
110  return Vec2T<T>(x*is, y*is);
111 }
112 
113 template <class T>
114 inline
116  x += u.x;
117  y += u.y;
118 
119  return (*this);
120 }
121 
122 template <class T>
123 inline
125  x -= u.x;
126  y -= u.y;
127 
128  return (*this);
129 }
130 
131 template <class T>
132 inline
133 Vec2T<T>& Vec2T<T>::operator*=(const T& s) noexcept {
134  x *= s;
135  y *= s;
136 
137  return (*this);
138 }
139 
140 template <class T>
141 inline
142 Vec2T<T>& Vec2T<T>::operator/=(const T& s) noexcept {
143  const T is = 1./s;
144 
145  x *= is;
146  y *= is;
147 
148  return (*this);
149 }
150 
151 template <class T>
152 inline
153 T Vec2T<T>::dot(const Vec2T<T>& u) const noexcept {
154  return x*u.x + y*u.y;
155 }
156 
157 template <class T>
158 inline
159 T Vec2T<T>::length() const noexcept {
160  return sqrt(x*x + y*y);
161 }
162 
163 template <class T>
164 inline
165 T Vec2T<T>::length2() const noexcept {
166  return x*x + y*y;
167 }
168 
169 template <class T>
170 inline
171 Vec2T<T> operator*(const T& s, const Vec2T<T>& a_other) noexcept {
172  return a_other*s;
173 }
174 
175 template <class T>
176 inline
177 Vec2T<T> operator/(const T& s, const Vec2T<T>& a_other) noexcept {
178  return a_other/s;
179 }
180 
181 template <class T>
182 inline
184  (*this) = Vec3T<T>::zero();
185 }
186 
187 template <class T>
188 inline
190  X[0] = u[0];
191  X[1] = u[1];
192  X[2] = u[2];
193 }
194 
195 template <class T>
196 inline
197 Vec3T<T>::Vec3T(const T& a_x, const T& a_y, const T& a_z){
198  X[0] = a_x;
199  X[1] = a_y;
200  X[2] = a_z;
201 }
202 
203 template <class T>
204 inline
205 constexpr Vec3T<T> Vec3T<T>::zero() noexcept {
206  return Vec3T<T>(0, 0, 0);
207 }
208 
209 template <class T>
210 inline
211 constexpr Vec3T<T> Vec3T<T>::one() noexcept {
212  return Vec3T<T>(1, 1, 1);
213 }
214 
215 template <class T>
216 inline
217 constexpr Vec3T<T> Vec3T<T>::min() noexcept {
219 }
220 
221 template <class T>
222 inline
223 constexpr Vec3T<T> Vec3T<T>::max() noexcept {
225 }
226 
227 template <class T>
228 inline
229 constexpr Vec3T<T> Vec3T<T>::infinity() noexcept {
230  return Vec3T<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity());
231 }
232 
233 template <class T>
234 inline
235 Vec3T<T>& Vec3T<T>::operator=(const Vec3T<T>& u) noexcept {
236  X[0] = u[0];
237  X[1] = u[1];
238  X[2] = u[2];
239 
240  return (*this);
241 }
242 
243 template <class T>
244 inline
245 Vec3T<T> Vec3T<T>::operator+(const Vec3T<T>& u) const noexcept {
246  return Vec3T<T>(X[0]+u[0], X[1]+u[1], X[2]+u[2]);
247 }
248 
249 template <class T>
250 inline
251 Vec3T<T> Vec3T<T>::operator-(const Vec3T<T>& u) const noexcept {
252  return Vec3T<T>(X[0]-u[0], X[1]-u[1], X[2]-u[2]);
253 }
254 
255 template <class T>
256 inline
257 Vec3T<T> Vec3T<T>::operator-() const noexcept {
258  return Vec3T<T>(-X[0], -X[1], -X[2]);
259 }
260 
261 template <class T>
262 inline
263 Vec3T<T> Vec3T<T>::operator*(const T& s) const noexcept {
264  return Vec3T<T>(s*X[0], s*X[1], s*X[2]);
265 }
266 
267 template <class T>
268 inline
269 Vec3T<T> Vec3T<T>::operator/(const T& s) const noexcept {
270  const T is = 1./s;
271  return Vec3T<T>(is*X[0], is*X[1], is*X[2]);
272 }
273 
274 template <class T>
275 inline
276 Vec3T<T> Vec3T<T>::operator/(const Vec3T<T>& v) const noexcept {
277  return Vec3T<T>(X[0]/v[0], X[1]/v[1], X[2]/v[2]);
278 }
279 
280 template <class T>
281 inline
283  X[0] += u[0];
284  X[1] += u[1];
285  X[2] += u[2];
286 
287  return (*this);
288 }
289 
290 template <class T>
291 inline
293  X[0] -= u[0];
294  X[1] -= u[1];
295  X[2] -= u[2];
296 
297  return (*this);
298 }
299 
300 template <class T>
301 
302 inline
303 Vec3T<T>& Vec3T<T>::operator*=(const T& s) noexcept {
304  X[0] *= s;
305  X[1] *= s;
306  X[2] *= s;
307 
308  return (*this);
309 }
310 
311 template <class T>
312 inline
313 Vec3T<T>& Vec3T<T>::operator/=(const T& s) noexcept {
314  const T is = 1./s;
315 
316  X[0] *= is;
317  X[1] *= is;
318  X[2] *= is;
319 
320  return (*this);
321 }
322 
323 template <class T>
324 inline
325 Vec3T<T> Vec3T<T>::cross(const Vec3T<T>& u) const noexcept {
326  return Vec3T<T>(X[1]*u[2] - X[2]*u[1],
327  X[2]*u[0] - X[0]*u[2],
328  X[0]*u[1] - X[1]*u[0]);
329 }
330 
331 template <class T>
332 inline
333 T& Vec3T<T>::operator[](int i) noexcept {
334  return X[i];
335 }
336 
337 template <class T>
338 inline
339 const T& Vec3T<T>::operator[](int i) const noexcept {
340  return X[i];
341 }
342 
343 template <class T>
344 inline
345 Vec3T<T> Vec3T<T>::min(const Vec3T<T>& u) noexcept {
346  X[0] = std::min(X[0], u[0]);
347  X[1] = std::min(X[1], u[1]);
348  X[2] = std::min(X[2], u[2]);
349 
350  return *this;
351 }
352 
353 template <class T>
354 inline
355 Vec3T<T> Vec3T<T>::max(const Vec3T<T>& u) noexcept {
356  X[0] = std::max(X[0], u[0]);
357  X[1] = std::max(X[1], u[1]);
358  X[2] = std::max(X[2], u[2]);
359 
360  return *this;
361 }
362 
363 template <class T>
364 inline
365 int Vec3T<T>::maxDir(const bool a_doAbs) const noexcept {
366  int mDir = 0;
367 
368  for (int dir = 0; dir < 3; dir++){
369  if (a_doAbs){
370  if (std::abs(X[dir]) > std::abs(X[mDir])) {
371  mDir = dir;
372  }
373  }
374  else{
375  if (X[dir] > X[mDir]){
376  mDir = dir;
377  }
378  }
379  }
380 
381  return mDir;
382 }
383 
384 template <class T>
385 inline
386 bool Vec3T<T>::operator==(const Vec3T<T>& u) const noexcept {
387  return (X[0]==u[0] && X[1]==u[1] && X[2]==u[2]);
388 }
389 
390 template <class T>
391 inline
392 bool Vec3T<T>::operator<(const Vec3T<T>& u) const noexcept {
393  return (X[0]<u[0] && X[1]<u[1] && X[2]<u[2]);
394 }
395 
396 template <class T>
397 inline
398 bool Vec3T<T>::operator>(const Vec3T<T>& u) const noexcept {
399  return (X[0]>u[0] && X[1]>u[1] && X[2]>u[2]);
400 }
401 
402 template <class T>
403 inline
404 bool Vec3T<T>::operator<=(const Vec3T<T>& u) const noexcept {
405  return (X[0]<=u[0] && X[1]<=u[1] && X[2]<=u[2]);
406 }
407 
408 template <class T>
409 
410 inline
411 bool Vec3T<T>::operator>=(const Vec3T<T>& u) const noexcept {
412  return (X[0]>=u[0] && X[1]>=u[1] && X[2]>=u[2]);
413 }
414 
415 template <class T>
416 inline
417 T Vec3T<T>::dot(const Vec3T<T>& u) const noexcept {
418  return X[0]*u[0] + X[1]*u[1] + X[2]*u[2];
419 }
420 
421 template <class T>
422 inline
423 T Vec3T<T>::length() const noexcept {
424  return sqrt(X[0]*X[0] + X[1]*X[1] + X[2]*X[2]);
425 }
426 
427 template <class T>
428 inline
429 T Vec3T<T>::length2() const noexcept {
430  return X[0]*X[0] + X[1]*X[1] + X[2]*X[2];
431 }
432 
433 template <class T>
434 inline
435 Vec3T<T> operator*(const T& s, const Vec3T<T>& a_other) noexcept {
436  return a_other*s;
437 }
438 
439 template <class T>
440 inline
441 Vec3T<T> operator/(const T& s, const Vec3T<T>& a_other) noexcept {
442  return a_other/s;
443 }
444 
445 template <class T>
446 inline
447 Vec3T<T> min(const Vec3T<T>& u, const Vec3T<T>& v) noexcept {
448  return Vec3T<T>(std::min(u[0], v[0]),
449  std::min(u[1], v[1]),
450  std::min(u[2], v[2]));
451 }
452 
453 template <class T>
454 inline
455 Vec3T<T> max(const Vec3T<T>& u, const Vec3T<T>& v) noexcept {
456  return Vec3T<T>(std::max(u[0], v[0]),
457  std::max(u[1], v[1]),
458  std::max(u[2], v[2]));
459 }
460 
462 
463 #endif
Vec3T< T > & operator*=(const T &s) noexcept
Vector multiplication operator.
Definition: EBGeometry_VecImplem.hpp:303
+
Vec3T< T > & operator=(const Vec3T< T > &u) noexcept
Assignment operator. Sets components equal to the argument vector&#39;s components.
Definition: EBGeometry_VecImplem.hpp:235
+
Vec3T< T > & operator+=(const Vec3T< T > &u) noexcept
Vector addition operator.
Definition: EBGeometry_VecImplem.hpp:282
+
Vec2T< T > & operator/=(const T &s) noexcept
Division operator operator.
Definition: EBGeometry_VecImplem.hpp:142
+
static constexpr Vec2T< T > zero() noexcept
Return av vector with x = y = 0.
Definition: EBGeometry_VecImplem.hpp:45
+
bool operator<(const Vec3T< T > &u) const noexcept
"Smaller than" operator.
Definition: EBGeometry_VecImplem.hpp:392
+
T & operator[](int i) noexcept
Return component in vector. (i=0 => x and so on)
Definition: EBGeometry_VecImplem.hpp:333
+
bool operator>(const Vec3T< T > &u) const noexcept
"Greater than" operator.
Definition: EBGeometry_VecImplem.hpp:398
+
Vec3T< T > & operator-=(const Vec3T< T > &u) noexcept
Vector subtraction operator.
Definition: EBGeometry_VecImplem.hpp:292
+
Vec2T< T > & operator-=(const Vec2T &a_other) noexcept
Subtraction operator.
Definition: EBGeometry_VecImplem.hpp:124
+
Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools...
+
static constexpr Vec3T< T > zero() noexcept
Return av vector with x = y = z = 0.
Definition: EBGeometry_VecImplem.hpp:205
+
bool operator<=(const Vec3T< T > &u) const noexcept
"Smaller or equal to" operator.
Definition: EBGeometry_VecImplem.hpp:404
+
Vec3T< T > max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:455
+
T dot(const Vec2T &a_other) const noexcept
Dot product operator.
Definition: EBGeometry_VecImplem.hpp:153
+
T y
Second component in the vector.
Definition: EBGeometry_Vec.hpp:60
+
Vec3T()
Default constructor. Sets the vector to the zero vector.
Definition: EBGeometry_VecImplem.hpp:183
+
Vec3T< T > operator+(const Vec3T< T > &u) const noexcept
Addition operator. Returns a new vector with added compoments.
Definition: EBGeometry_VecImplem.hpp:245
+
static constexpr Vec2T< T > infinity() noexcept
Return a vector with inf components.
Definition: EBGeometry_VecImplem.hpp:69
+
static constexpr Vec3T< T > min() noexcept
Return a vector with minimum representable components.
Definition: EBGeometry_VecImplem.hpp:217
+
Vec2T< T > operator+(const Vec2T &a_other) const noexcept
Addition operator.
Definition: EBGeometry_VecImplem.hpp:84
+
static constexpr Vec2T< T > one() noexcept
Return av vector with x = y = 1.
Definition: EBGeometry_VecImplem.hpp:51
+
Vec3T< T > operator-() const noexcept
Negation operator. Returns a vector with negated components.
Definition: EBGeometry_VecImplem.hpp:257
+
Vec2T< T > operator/(const T &s, const Vec2T< T > &a_other) noexcept
Division operator in the form s*Vec2T.
Definition: EBGeometry_VecImplem.hpp:177
+
bool operator==(const Vec3T< T > &u) const noexcept
Comparison operator. Returns true if all components are the same.
Definition: EBGeometry_VecImplem.hpp:386
+
static constexpr Vec3T< T > infinity() noexcept
Return a vector with inf components.
Definition: EBGeometry_VecImplem.hpp:229
+
Vec3T< T > operator*(const T &s) const noexcept
Multiplication operator. Returns a vector with scalar multiplied components.
Definition: EBGeometry_VecImplem.hpp:263
+
int maxDir(const bool a_doAbs) const noexcept
Return the direction which has the largest component (can be absolute)
Definition: EBGeometry_VecImplem.hpp:365
+
Vec3T< T > & operator/=(const T &s) noexcept
Vector division operator.
Definition: EBGeometry_VecImplem.hpp:313
+
static constexpr Vec3T< T > max() noexcept
Return a vector with maximum representable components.
Definition: EBGeometry_VecImplem.hpp:223
+
T dot(const Vec3T< T > &u) const noexcept
Vector dot product.
Definition: EBGeometry_VecImplem.hpp:417
+
Vec3T< T > operator/(const T &s) const noexcept
Division operator. Returns a vector with scalar divided components.
Definition: EBGeometry_VecImplem.hpp:269
+
static constexpr Vec2T< T > max() noexcept
Return maximum possible representative vector.
Definition: EBGeometry_VecImplem.hpp:63
+ +
T length2() const noexcept
Compute square of vector.
Definition: EBGeometry_VecImplem.hpp:165
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
static constexpr Vec2T< T > min() noexcept
Return minimum possible representative vector.
Definition: EBGeometry_VecImplem.hpp:57
+
Vec2T< T > & operator+=(const Vec2T &a_other) noexcept
Addition operator.
Definition: EBGeometry_VecImplem.hpp:115
+
bool operator>=(const Vec3T< T > &u) const noexcept
"Greater or equal to" operator.
Definition: EBGeometry_VecImplem.hpp:411
+
T x
First component in the vector.
Definition: EBGeometry_Vec.hpp:55
+
Vec2T< T > operator*(const T &s) const noexcept
Multiplication operator.
Definition: EBGeometry_VecImplem.hpp:102
+
T length() const noexcept
Compute vector length.
Definition: EBGeometry_VecImplem.hpp:423
+ +
static constexpr Vec3T< T > one() noexcept
Return av vector with x = y = z = 1.
Definition: EBGeometry_VecImplem.hpp:211
+
Vec2T< T > operator*(const T &s, const Vec2T< T > &a_other) noexcept
Multiplication operator in the form s*Vec2T.
Definition: EBGeometry_VecImplem.hpp:171
+
Vec2T< T > & operator=(const Vec2T &a_other) noexcept
Assignment operator. Sets this.x = a_other.x and this.y = a_other.y.
Definition: EBGeometry_VecImplem.hpp:75
+
Vec3T< T > cross(const Vec3T< T > &u) const noexcept
Vector cross product.
Definition: EBGeometry_VecImplem.hpp:325
+
Vec2T< T > operator-() const noexcept
Negation operator. Returns a new Vec2T<T> with negated components.
Definition: EBGeometry_VecImplem.hpp:96
+
Vec2T()
Default constructor. Sets the vector to the zero vector.
Definition: EBGeometry_VecImplem.hpp:25
+
Two-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:24
+
T length() const noexcept
Compute length of vector.
Definition: EBGeometry_VecImplem.hpp:159
+
Vec2T< T > & operator*=(const T &s) noexcept
Multiplication operator.
Definition: EBGeometry_VecImplem.hpp:133
+
Vec3T< T > min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept
Minimum fucntion. Returns new vector with component-wise minimums.
Definition: EBGeometry_VecImplem.hpp:447
+
T length2() const noexcept
Compute vector length squared.
Definition: EBGeometry_VecImplem.hpp:429
+
Vec2T< T > operator/(const T &s) const noexcept
Division operator.
Definition: EBGeometry_VecImplem.hpp:108
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp.html b/docs/doxygen/html/EBGeometry__Vec_8hpp.html new file mode 100644 index 00000000..70ffc118 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Vec_8hpp.html @@ -0,0 +1,465 @@ + + + + + + + +EBGeometry: Source/EBGeometry_Vec.hpp File Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry_Vec.hpp File Reference
+
+
+ +

Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools. +More...

+
+Include dependency graph for EBGeometry_Vec.hpp:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + +

+Classes

class  Vec2T< T >
 Two-dimensional vector class with arithmetic operators. More...
 
class  Vec3T< T >
 Three-dimensional vector class with arithmetic operators. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

template<class T >
Vec2T< T > operator* (const T &s, const Vec2T< T > &a_other) noexcept
 Multiplication operator in the form s*Vec2T. More...
 
template<class T >
Vec2T< T > operator/ (const T &s, const Vec2T< T > &a_other) noexcept
 Division operator in the form s*Vec2T. More...
 
template<class T >
Vec3T< T > operator* (const T &s, const Vec3T< T > &u) noexcept
 Multiplication operator. More...
 
template<class T >
Vec3T< T > operator/ (const T &s, const Vec3T< T > &u) noexcept
 Division operator. More...
 
template<class T >
Vec3T< T > min (const Vec3T< T > &u, const Vec3T< T > &v) noexcept
 Minimum fucntion. Returns new vector with component-wise minimums. More...
 
template<class T >
Vec3T< T > max (const Vec3T< T > &u, const Vec3T< T > &v) noexcept
 Minimum fucntion. Returns new vector with component-wise minimums. More...
 
+

Detailed Description

+

Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools.

+
Author
Robert Marskar
+

Function Documentation

+ +

◆ max()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> max (const Vec3T< T > & u,
const Vec3T< T > & v 
)
+
+inlinenoexcept
+
+ +

Minimum fucntion. Returns new vector with component-wise minimums.

+
Parameters
+ + + +
[in]uVector
[in]vOther vector
+
+
+
Returns
Returns new vector with components X[0] = std::max(u.X[0], v.X[0]) and so on
+ +
+
+ +

◆ min()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> min (const Vec3T< T > & u,
const Vec3T< T > & v 
)
+
+inlinenoexcept
+
+ +

Minimum fucntion. Returns new vector with component-wise minimums.

+
Parameters
+ + + +
[in]uVector
[in]vOther vector
+
+
+
Returns
Returns new vector with components X[0] = std::min(u.X[0], v.X[0]) and so on
+ +
+
+ +

◆ operator*() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec2T<T> operator* (const T & s,
const Vec2T< T > & a_other 
)
+
+inlinenoexcept
+
+ +

Multiplication operator in the form s*Vec2T.

+
Parameters
+ + + +
[in]sMultiplication factor
[in]a_otherOther vector
+
+
+
Returns
Returns a new vector with components x = s*a_other.x (and same for y)
+ +
+
+ +

◆ operator*() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> operator* (const T & s,
const Vec3T< T > & u 
)
+
+inlinenoexcept
+
+ +

Multiplication operator.

+
Parameters
+ + + +
[in]sMultiplication scalar
[in]uVector
+
+
+
Returns
Returns new vector with components X[0] = s*X[0] and so on.
+ +
+
+ +

◆ operator/() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec2T<T> operator/ (const T & s,
const Vec2T< T > & a_other 
)
+
+inlinenoexcept
+
+ +

Division operator in the form s*Vec2T.

+
Parameters
+ + + +
[in]sDivision factor
[in]a_otherOther vector
+
+
+
Returns
Returns a new vector with components x = (1/s)*a_other.x (and same for y)
+ +
+
+ +

◆ operator/() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec3T<T> operator/ (const T & s,
const Vec3T< T > & u 
)
+
+inlinenoexcept
+
+ +

Division operator.

+
Parameters
+ + + +
[in]sDivision scalar
[in]uVector
+
+
+
Returns
Returns new vector with components X[0] = X[0]/s and so on.
+ +
+
+
+ + + + diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.map b/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.map new file mode 100644 index 00000000..0899196d --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.map @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.md5 b/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.md5 new file mode 100644 index 00000000..01389f49 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +36760280ed4de133b33592c7cabecd1a \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.png b/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.png new file mode 100644 index 00000000..470c8043 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__Vec_8hpp__dep__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.map b/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.map new file mode 100644 index 00000000..9444a3a7 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.md5 b/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.md5 new file mode 100644 index 00000000..2d84a56a --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.md5 @@ -0,0 +1 @@ +e5700da657834e089882a2b0788f8425 \ No newline at end of file diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.png b/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.png new file mode 100644 index 00000000..0858f3f0 Binary files /dev/null and b/docs/doxygen/html/EBGeometry__Vec_8hpp__incl.png differ diff --git a/docs/doxygen/html/EBGeometry__Vec_8hpp_source.html b/docs/doxygen/html/EBGeometry__Vec_8hpp_source.html new file mode 100644 index 00000000..44d34759 --- /dev/null +++ b/docs/doxygen/html/EBGeometry__Vec_8hpp_source.html @@ -0,0 +1,104 @@ + + + + + + + +EBGeometry: Source/EBGeometry_Vec.hpp Source File + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry_Vec.hpp
+
+
+Go to the documentation of this file.
1 /* EBGeometry
2  * Copyright © 2022 Robert Marskar
3  * Please refer to Copyright.txt and LICENSE in the EBGeometry root directory.
4  */
5 
12 #ifndef EBGeometry_Vec
13 #define EBGeometry_Vec
14 
15 // Our includes
17 
23 template<class T>
24 class Vec2T {
25 public:
26 
30  Vec2T();
31 
37  Vec2T(const Vec2T& u);
38 
45  Vec2T(const T& a_x, const T& a_y);
46 
50  ~Vec2T() = default;
51 
55  T x;
56 
60  T y;
61 
65  inline
66  static constexpr Vec2T<T> zero() noexcept;
67 
71  inline
72  static constexpr Vec2T<T> one() noexcept;
73 
77  inline
78  static constexpr Vec2T<T> min() noexcept;
79 
83  inline
84  static constexpr Vec2T<T> max() noexcept;
85 
89  inline
90  static constexpr Vec2T<T> infinity() noexcept;
91 
96  inline
97  Vec2T<T>& operator=(const Vec2T& a_other) noexcept;
98 
104  inline
105  Vec2T<T> operator+(const Vec2T& a_other) const noexcept;
106 
112  inline
113  Vec2T<T> operator-(const Vec2T& a_other) const noexcept;
114 
118  inline
119  Vec2T<T> operator-() const noexcept;
120 
126  inline
127  Vec2T<T> operator*(const T& s) const noexcept;
128 
134  inline
135  Vec2T<T> operator/(const T& s) const noexcept;
136 
142  inline
143  Vec2T<T>& operator+=(const Vec2T& a_other) noexcept;
144 
150  inline
151  Vec2T<T>& operator-=(const Vec2T& a_other) noexcept;
152 
158  inline
159  Vec2T<T>& operator*=(const T& s) noexcept;
160 
166  inline
167  Vec2T<T>& operator/=(const T& s) noexcept;
168 
174  inline
175  T dot(const Vec2T& a_other) const noexcept;
176 
181  inline
182  T length() const noexcept;
183 
188  inline
189  T length2() const noexcept;
190 };
191 
198 template <class T>
199 inline
200 Vec2T<T> operator*(const T& s, const Vec2T<T>& a_other) noexcept;
201 
208 template <class T>
209 inline
210 Vec2T<T> operator/(const T& s, const Vec2T<T>& a_other) noexcept;
211 
212 
219 template <class T>
220 class Vec3T {
221 public:
222 
226  Vec3T();
227 
233  Vec3T(const Vec3T<T>& a_u);
234 
242  Vec3T(const T& a_x, const T& a_y, const T& a_z);
243 
247  ~Vec3T() = default;
248 
252  inline
253  static constexpr Vec3T<T> zero() noexcept;
254 
258  inline
259  static constexpr Vec3T<T> one() noexcept;
260 
264  inline
265  static constexpr Vec3T<T> min() noexcept;
266 
270  inline
271  static constexpr Vec3T<T> max() noexcept;
272 
276  inline
277  static constexpr Vec3T<T> infinity() noexcept;
278 
283  inline
284  T& operator[](int i) noexcept;
285 
290  inline
291  const T& operator[](int i) const noexcept;
292 
297  inline
298  bool operator==(const Vec3T<T>& u) const noexcept;
299 
305  inline
306  bool operator<(const Vec3T<T>& u) const noexcept;
307 
313  inline
314  bool operator>(const Vec3T<T>& u) const noexcept;
315 
321  inline
322  bool operator<=(const Vec3T<T>& u) const noexcept;
323 
329  inline
330  bool operator>=(const Vec3T<T>& u) const noexcept;
331 
336  inline
337  Vec3T<T>& operator=(const Vec3T<T>& u) noexcept;
338 
344  inline
345  Vec3T<T> operator+(const Vec3T<T>& u) const noexcept;
346 
352  inline
353  Vec3T<T> operator-(const Vec3T<T>& u) const noexcept;
354 
358  inline
359  Vec3T<T> operator-() const noexcept;
360 
366  inline
367  Vec3T<T> operator*(const T& s) const noexcept;
368 
374  inline
375  Vec3T<T> operator*(const Vec3T<T>& s) const noexcept;
376 
382  inline
383  Vec3T<T> operator/(const T& s) const noexcept;
384 
390  inline
391  Vec3T<T> operator/(const Vec3T<T>& v) const noexcept;
392 
398  inline
399  Vec3T<T>& operator+=(const Vec3T<T>& u) noexcept;
400 
406  inline
407  Vec3T<T>& operator-=(const Vec3T<T>& u) noexcept;
408 
414  inline
415  Vec3T<T>& operator*=(const T& s) noexcept;
416 
422  inline
423  Vec3T<T>& operator/=(const T& s) noexcept;
424 
430  inline
431  Vec3T<T> min(const Vec3T<T>& u) noexcept;
432 
438  inline
439  Vec3T<T> max(const Vec3T<T>& u) noexcept;
440 
446  inline
447  Vec3T<T> cross(const Vec3T<T>& u) const noexcept;
448 
454  inline
455  T dot(const Vec3T<T>& u) const noexcept;
456 
462  inline
463  int maxDir(const bool a_doAbs) const noexcept;
464 
469  inline
470  T length() const noexcept;
471 
476  inline
477  T length2() const noexcept;
478 
479 protected:
480 
484  T X[3];
485 };
486 
493 template <class T>
494 inline
495 Vec3T<T> operator*(const T& s, const Vec3T<T>& u) noexcept;
496 
503 template <class T>
504 inline
505 Vec3T<T> operator/(const T& s, const Vec3T<T>& u) noexcept;
506 
513 template <class T>
514 inline
515 Vec3T<T> min(const Vec3T<T>& u, const Vec3T<T>& v) noexcept;
516 
523 template <class T>
524 inline
525 Vec3T<T> max(const Vec3T<T>& u, const Vec3T<T>& v) noexcept;
526 
528 
529 #include "EBGeometry_VecImplem.hpp"
530 
531 #endif
Vec2T< T > & operator/=(const T &s) noexcept
Division operator operator.
Definition: EBGeometry_VecImplem.hpp:142
+
static constexpr Vec2T< T > zero() noexcept
Return av vector with x = y = 0.
Definition: EBGeometry_VecImplem.hpp:45
+
Vec2T< T > & operator-=(const Vec2T &a_other) noexcept
Subtraction operator.
Definition: EBGeometry_VecImplem.hpp:124
+
T dot(const Vec2T &a_other) const noexcept
Dot product operator.
Definition: EBGeometry_VecImplem.hpp:153
+
T y
Second component in the vector.
Definition: EBGeometry_Vec.hpp:60
+
static constexpr Vec2T< T > infinity() noexcept
Return a vector with inf components.
Definition: EBGeometry_VecImplem.hpp:69
+
Vec2T< T > operator+(const Vec2T &a_other) const noexcept
Addition operator.
Definition: EBGeometry_VecImplem.hpp:84
+
static constexpr Vec2T< T > one() noexcept
Return av vector with x = y = 1.
Definition: EBGeometry_VecImplem.hpp:51
+
static constexpr Vec2T< T > max() noexcept
Return maximum possible representative vector.
Definition: EBGeometry_VecImplem.hpp:63
+ +
T length2() const noexcept
Compute square of vector.
Definition: EBGeometry_VecImplem.hpp:165
+
Three-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:220
+
static constexpr Vec2T< T > min() noexcept
Return minimum possible representative vector.
Definition: EBGeometry_VecImplem.hpp:57
+
Vec2T< T > & operator+=(const Vec2T &a_other) noexcept
Addition operator.
Definition: EBGeometry_VecImplem.hpp:115
+
T x
First component in the vector.
Definition: EBGeometry_Vec.hpp:55
+
Vec2T< T > operator*(const T &s) const noexcept
Multiplication operator.
Definition: EBGeometry_VecImplem.hpp:102
+ +
Vec2T< T > & operator=(const Vec2T &a_other) noexcept
Assignment operator. Sets this.x = a_other.x and this.y = a_other.y.
Definition: EBGeometry_VecImplem.hpp:75
+
Vec2T< T > operator-() const noexcept
Negation operator. Returns a new Vec2T<T> with negated components.
Definition: EBGeometry_VecImplem.hpp:96
+
Vec2T()
Default constructor. Sets the vector to the zero vector.
Definition: EBGeometry_VecImplem.hpp:25
+
Two-dimensional vector class with arithmetic operators.
Definition: EBGeometry_Vec.hpp:24
+
T length() const noexcept
Compute length of vector.
Definition: EBGeometry_VecImplem.hpp:159
+
Vec2T< T > & operator*=(const T &s) noexcept
Multiplication operator.
Definition: EBGeometry_VecImplem.hpp:133
+
~Vec2T()=default
Destructor (does nothing)
+
Implementation of EBGeometry_Vec.hpp.
+
Vec2T< T > operator/(const T &s) const noexcept
Division operator.
Definition: EBGeometry_VecImplem.hpp:108
+
+ + + + diff --git a/docs/doxygen/html/annotated.html b/docs/doxygen/html/annotated.html new file mode 100644 index 00000000..5780298b --- /dev/null +++ b/docs/doxygen/html/annotated.html @@ -0,0 +1,104 @@ + + + + + + + +EBGeometry: Class List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
 NBoundingVolumesNamespace for encapsulating various bounding volumes for usage with BVHs
 CAABBTAxis-aligned bounding box as bounding volume
 CBoundingSphereTClass which encloses a set of points using a bounding sphere
 NBVHNamespace for various bounding volume heirarchy (BVH) functionality
 CLinearBVHForward declare linear BVH class
 CLinearNodeTForward declare linear node class
 CNodeTForward declare the BVH node since it is needed for the polymorphic lambdas
 NDcelNamespace containing various double-connected edge list (DCEL) functionality
 NParserNamespace which encapsulates possible file parsers for building DCEL meshes
 CPLYClass for generation a Dcel::MeshT<T> from the Stanford PLY file format
 CEdgeIteratorTClass which can iterate through edges and vertices around a DCEL polygon face
 CEdgeTClass which represents a half-edge in a double-edge connected list (DCEL)
 CFaceTClass which represents a polygon face in a double-edge connected list (DCEL)
 CMeshTMesh class which stores a full DCEL mesh (with signed distance functions)
 CPolygon2DClass for embedding a DCEL polygon face into 2D
 CVertexTClass which represents a vertex node in a double-edge connected list (DCEL)
 CRotateOpRotation operator. Can scale an input point
 CScaleOpScale operator. Can also be used as a reflection operator
 CSignedDistanceFunctionAbstract representation of a signed distance function
 CSphereSDFSigned distance field for sphere
 CTransformOpBase class for transformation operators
 CTranslateOpTranslation operator. Can translate an input point
 CUnionDistance function union. Computes the signed distance to the closest object of N non-overlapping objects
 CUnionBVHDistance function union using BVHs. Computes the signed distance to the closest object of N non-overlapping objects
 CVec2TTwo-dimensional vector class with arithmetic operators
 CVec3TThree-dimensional vector class with arithmetic operators
+
+
+ + + + diff --git a/docs/doxygen/html/bc_s.png b/docs/doxygen/html/bc_s.png new file mode 100644 index 00000000..224b29aa Binary files /dev/null and b/docs/doxygen/html/bc_s.png differ diff --git a/docs/doxygen/html/bdwn.png b/docs/doxygen/html/bdwn.png new file mode 100644 index 00000000..940a0b95 Binary files /dev/null and b/docs/doxygen/html/bdwn.png differ diff --git a/docs/doxygen/html/classBVH_1_1LinearBVH-members.html b/docs/doxygen/html/classBVH_1_1LinearBVH-members.html new file mode 100644 index 00000000..ee475628 --- /dev/null +++ b/docs/doxygen/html/classBVH_1_1LinearBVH-members.html @@ -0,0 +1,90 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BVH::LinearBVH< T, P, BV, K > Member List
+
+
+ +

This is the complete list of members for BVH::LinearBVH< T, P, BV, K >, including all inherited members.

+ + + + + + + + + + +
LinearBVH()=deleteBVH::LinearBVH< T, P, BV, K >
LinearBVH(const std::vector< LinearNode > &a_linearNodes, const PrimitiveList &a_primitives)BVH::LinearBVH< T, P, BV, K >inline
LinearNode typedefBVH::LinearBVH< T, P, BV, K >
m_linearNodesBVH::LinearBVH< T, P, BV, K >protected
m_primitivesBVH::LinearBVH< T, P, BV, K >protected
PrimitiveList typedefBVH::LinearBVH< T, P, BV, K >
signedDistance(const Vec3 &a_point, const Prune a_pruning=Prune::Ordered2) const noexceptBVH::LinearBVH< T, P, BV, K >inline
Vec3 typedefBVH::LinearBVH< T, P, BV, K >
~LinearBVH()BVH::LinearBVH< T, P, BV, K >inlinevirtual
+ + + + diff --git a/docs/doxygen/html/classBVH_1_1LinearBVH.html b/docs/doxygen/html/classBVH_1_1LinearBVH.html new file mode 100644 index 00000000..7a729c38 --- /dev/null +++ b/docs/doxygen/html/classBVH_1_1LinearBVH.html @@ -0,0 +1,238 @@ + + + + + + + +EBGeometry: BVH::LinearBVH< T, P, BV, K > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BVH::LinearBVH< T, P, BV, K > Class Template Reference
+
+
+ +

Forward declare linear BVH class. + More...

+ +

#include <EBGeometry_BVH.hpp>

+ + + + + + + + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Cut down on typing.
 
+using LinearNode = LinearNodeT< T, P, BV, K >
 Alias for cutting down on typing.
 
+using PrimitiveList = std::vector< std::shared_ptr< const P > >
 List of primitives.
 
+ + + + + + + + + + + + + +

+Public Member Functions

LinearBVH ()=delete
 Disallowed. Use the full constructor please.
 
 LinearBVH (const std::vector< LinearNode > &a_linearNodes, const PrimitiveList &a_primitives)
 Full constructor. Associates the nodes and primitives. More...
 
+virtual ~LinearBVH ()
 Destructor. Does nothing.
 
signedDistance (const Vec3 &a_point, const Prune a_pruning=Prune::Ordered2) const noexcept
 Function which computes the signed distance. More...
 
+ + + + + + + +

+Protected Attributes

+std::vector< LinearNodeT< T, P, BV, K > > m_linearNodes
 List of linearly stored nodes.
 
+PrimitiveList m_primitives
 Global list of primitives. Note that this is ALL primitives, sorted so that LinearNodeT can interface into it.
 
+

Detailed Description

+

template<class T, class P, class BV, int K>
+class BVH::LinearBVH< T, P, BV, K >

+ +

Forward declare linear BVH class.

+

Linear root node for BVH hierarchy.

+

Constructor & Destructor Documentation

+ +

◆ LinearBVH()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
BVH::LinearBVH< T, P, BV, K >::LinearBVH (const std::vector< LinearNode > & a_linearNodes,
const PrimitiveLista_primitives 
)
+
+inline
+
+ +

Full constructor. Associates the nodes and primitives.

+
Parameters
+ + + +
[in]a_linearNodesLinearized BVH nodes.
[in]a_primitivesPrimitives.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ signedDistance()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T BVH::LinearBVH< T, P, BV, K >::signedDistance (const Vec3a_point,
const Prune a_pruning = Prune::Ordered2 
) const
+
+inlinenoexcept
+
+ +

Function which computes the signed distance.

+
Parameters
+ + + +
[in]a_point3D point in space
[in]a_pruningPruning algorithm.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classBVH_1_1LinearNodeT-members.html b/docs/doxygen/html/classBVH_1_1LinearNodeT-members.html new file mode 100644 index 00000000..1dafc575 --- /dev/null +++ b/docs/doxygen/html/classBVH_1_1LinearNodeT-members.html @@ -0,0 +1,101 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BVH::LinearNodeT< T, P, BV, K > Member List
+
+
+ +

This is the complete list of members for BVH::LinearNodeT< T, P, BV, K >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
getBoundingVolume() const noexceptBVH::LinearNodeT< T, P, BV, K >inline
getChildOffsets() const noexceptBVH::LinearNodeT< T, P, BV, K >inline
getDistanceToBoundingVolume(const Vec3 &a_point) const noexceptBVH::LinearNodeT< T, P, BV, K >inline
getDistanceToBoundingVolume2(const Vec3 &a_point) const noexceptBVH::LinearNodeT< T, P, BV, K >inline
getDistanceToPrimitives(const Vec3 &a_point, const std::vector< std::shared_ptr< const P > > &a_primitives) const noexceptBVH::LinearNodeT< T, P, BV, K >inline
getNumPrimitives() const noexceptBVH::LinearNodeT< T, P, BV, K >inline
getPrimitivesOffset() const noexceptBVH::LinearNodeT< T, P, BV, K >inline
isLeaf() const noexceptBVH::LinearNodeT< T, P, BV, K >inline
LinearNodeT()BVH::LinearNodeT< T, P, BV, K >inline
m_boundingVolumeBVH::LinearNodeT< T, P, BV, K >protected
m_childOffsetsBVH::LinearNodeT< T, P, BV, K >protected
m_numPrimitivesBVH::LinearNodeT< T, P, BV, K >protected
m_primitivesOffsetBVH::LinearNodeT< T, P, BV, K >protected
pruneOrdered2(T &a_shortestSquareDistanceSoFar, unsigned long &a_closestPrimitiveSoFar, const Vec3 &a_point, const std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, const std::vector< std::shared_ptr< const P > > &a_primitives) const noexceptBVH::LinearNodeT< T, P, BV, K >inline
setBoundingVolume(const BV &a_boundingVolume) noexceptBVH::LinearNodeT< T, P, BV, K >inline
setChildOffset(const unsigned long a_childOffset, const int a_whichChild) noexceptBVH::LinearNodeT< T, P, BV, K >inline
setNumPrimitives(const int a_numPrimitives) noexceptBVH::LinearNodeT< T, P, BV, K >inline
setPrimitivesOffset(const unsigned long a_primitivesOffset) noexceptBVH::LinearNodeT< T, P, BV, K >inline
Vec3 typedefBVH::LinearNodeT< T, P, BV, K >
~LinearNodeT()BVH::LinearNodeT< T, P, BV, K >inlinevirtual
+ + + + diff --git a/docs/doxygen/html/classBVH_1_1LinearNodeT.html b/docs/doxygen/html/classBVH_1_1LinearNodeT.html new file mode 100644 index 00000000..7da3502e --- /dev/null +++ b/docs/doxygen/html/classBVH_1_1LinearNodeT.html @@ -0,0 +1,509 @@ + + + + + + + +EBGeometry: BVH::LinearNodeT< T, P, BV, K > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BVH::LinearNodeT< T, P, BV, K > Class Template Reference
+
+
+ +

Forward declare linear node class. + More...

+ +

#include <EBGeometry_BVH.hpp>

+ + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Alias for cutting down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

LinearNodeT ()
 Constructor.
 
+virtual ~LinearNodeT ()
 Destructor.
 
void setBoundingVolume (const BV &a_boundingVolume) noexcept
 Set the bounding volume. More...
 
+void setPrimitivesOffset (const unsigned long a_primitivesOffset) noexcept
 Set the offset into the primitives array.
 
void setNumPrimitives (const int a_numPrimitives) noexcept
 Set number of primitives. More...
 
void setChildOffset (const unsigned long a_childOffset, const int a_whichChild) noexcept
 Set the child offsets. More...
 
+const BV & getBoundingVolume () const noexcept
 Get the node bounding volume. return m_boundingVolume.
 
const unsigned long & getPrimitivesOffset () const noexcept
 Get the primitives offset. More...
 
const unsigned long & getNumPrimitives () const noexcept
 Get the number of primitives. More...
 
const std::array< unsigned long, K > & getChildOffsets () const noexcept
 Get the child offsets. More...
 
+bool isLeaf () const noexcept
 Is leaf or not.
 
getDistanceToBoundingVolume (const Vec3 &a_point) const noexcept
 Get the distance from a 3D point to the bounding volume. More...
 
getDistanceToBoundingVolume2 (const Vec3 &a_point) const noexcept
 Get the unsigned square from a 3D point to the bounding volume. More...
 
getDistanceToPrimitives (const Vec3 &a_point, const std::vector< std::shared_ptr< const P > > &a_primitives) const noexcept
 Compute signed distance to primitives. More...
 
+void pruneOrdered2 (T &a_shortestSquareDistanceSoFar, unsigned long &a_closestPrimitiveSoFar, const Vec3 &a_point, const std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, const std::vector< std::shared_ptr< const P > > &a_primitives) const noexcept
 Pruning algorithm. This is the same algorithm as NodeT::pruneOrdered2, except that the nodes and primitives come in as arguments (and the node has been collapsed onto one cache line).
 
+ + + + + + + + + + + + + +

+Protected Attributes

+BV m_boundingVolume
 Bounding volume.
 
+unsigned long m_primitivesOffset
 Offset into primitives array.
 
+int m_numPrimitives
 Number of primitives.
 
+std::array< unsigned long, K > m_childOffsets
 Offset to child nodes.
 
+

Detailed Description

+

template<class T, class P, class BV, int K>
+class BVH::LinearNodeT< T, P, BV, K >

+ +

Forward declare linear node class.

+

Node type for linearized (flattened) BVH. This will be constructed from the other (conventional) BVH type.

+

T is the precision for Vec3, P is the primitive type you want to enclose, BV is the bounding volume you use for it.

+
Note
P MUST supply function signedDistance(...) and unsignedDistance2(Vec3). BV must supply a function getDistance (had this been C++20, we would have use concepts to enforce this). Note that LinearNode is the result of a flattnened BVH hierarchy where nodes are stored with depth-first ordering for improved cache-location in the downward traversal.
+
+This class exists so that we can fit the nodes with a smaller memory footprint. The standard BVH node (NodeT) is very useful when building the tree but less useful when traversing it since it stores references to the primitives in the node itself. It will span multiple cache lines. This node exists so that we can fit all the BVH info onto fewer cache lines. The number of cache lines will depend on the tree degree, precision, and bounding volume that is chosen.
+
Todo:
There's a minor optimization that can be made to the memory alignment, which is as follows: For a leaf node we never really need the m_childOffsets array, and for a regular node we never really need the m_primitivesOffset member. Moreover, m_childOffsets could be made into a K-1 sized array because we happen to know that the linearized hierarchy will store the first child node immediately after the regular node. We could shave off 16 bytes of storage, which would mean that a double-precision binary tree only takes up one word of CPU memory.
+

Member Function Documentation

+ +

◆ getChildOffsets()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
const std::array< unsigned long, K > & BVH::LinearNodeT< T, P, BV, K >::getChildOffsets () const
+
+inlinenoexcept
+
+ +

Get the child offsets.

+
Returns
Returns m_childOffsets
+ +
+
+ +

◆ getDistanceToBoundingVolume()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::LinearNodeT< T, P, BV, K >::getDistanceToBoundingVolume (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Get the distance from a 3D point to the bounding volume.

+
Parameters
+ + +
[in]a_point3D point
+
+
+
Returns
Returns distance to bounding volume. A zero distance implies that the input point is inside the bounding volume.
+ +
+
+ +

◆ getDistanceToBoundingVolume2()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::LinearNodeT< T, P, BV, K >::getDistanceToBoundingVolume2 (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Get the unsigned square from a 3D point to the bounding volume.

+
Parameters
+ + +
[in]a_point3D point
+
+
+
Returns
Returns squared distance to bounding volume. A zero distance implies that the input point is inside the bounding volume.
+ +
+
+ +

◆ getDistanceToPrimitives()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T BVH::LinearNodeT< T, P, BV, K >::getDistanceToPrimitives (const Vec3a_point,
const std::vector< std::shared_ptr< const P > > & a_primitives 
) const
+
+inlinenoexcept
+
+ +

Compute signed distance to primitives.

+
Note
Only call if this is a leaf node.
+ +
+
+ +

◆ getNumPrimitives()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
const unsigned long & BVH::LinearNodeT< T, P, BV, K >::getNumPrimitives () const
+
+inlinenoexcept
+
+ +

Get the number of primitives.

+
Returns
Returns m_numPrimitives
+ +
+
+ +

◆ getPrimitivesOffset()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
const unsigned long & BVH::LinearNodeT< T, P, BV, K >::getPrimitivesOffset () const
+
+inlinenoexcept
+
+ +

Get the primitives offset.

+
Returns
Returns m_primitivesOffset
+ +
+
+ +

◆ setBoundingVolume()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
void BVH::LinearNodeT< T, P, BV, K >::setBoundingVolume (const BV & a_boundingVolume)
+
+inlinenoexcept
+
+ +

Set the bounding volume.

+
Parameters
+ + +
[in]a_boundingVolumeBounding volume for this node.
+
+
+ +
+
+ +

◆ setChildOffset()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void BVH::LinearNodeT< T, P, BV, K >::setChildOffset (const unsigned long a_childOffset,
const int a_whichChild 
)
+
+inlinenoexcept
+
+ +

Set the child offsets.

+
Parameters
+ + + +
[in]a_childOffsetOffset in node array.
[in]a_whichChildChild index in m_childrenOffsets. Must be [0,K-1]
+
+
+ +
+
+ +

◆ setNumPrimitives()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
void BVH::LinearNodeT< T, P, BV, K >::setNumPrimitives (const int a_numPrimitives)
+
+inlinenoexcept
+
+ +

Set number of primitives.

+
Parameters
+ + +
[in]a_numPrimitivesNumber of primitives.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classBVH_1_1NodeT-members.html b/docs/doxygen/html/classBVH_1_1NodeT-members.html new file mode 100644 index 00000000..d432d4b3 --- /dev/null +++ b/docs/doxygen/html/classBVH_1_1NodeT-members.html @@ -0,0 +1,126 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BVH::NodeT< T, P, BV, K > Member List
+
+
+ +

This is the complete list of members for BVH::NodeT< T, P, BV, K >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BVConstructor typedefBVH::NodeT< T, P, BV, K >
flattenTree()BVH::NodeT< T, P, BV, K >inline
flattenTree(std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, std::vector< std::shared_ptr< const P > > &a_sortedPrimitives, unsigned long &a_offset) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
getBoundingVolume() const noexceptBVH::NodeT< T, P, BV, K >inline
getDepth() const noexceptBVH::NodeT< T, P, BV, K >inline
getDistanceToBoundingVolume(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
getDistanceToBoundingVolume2(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
getDistanceToPrimitives(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
getNodeType() const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
getPrimitives() const noexceptBVH::NodeT< T, P, BV, K >inline
getPrimitives() noexceptBVH::NodeT< T, P, BV, K >inlineprotected
insertNode(NodePtr &a_node, const PrimitiveList &a_primitives) noexceptBVH::NodeT< T, P, BV, K >inlineprotected
insertNodes(const std::array< PrimitiveList, K > &a_primitives) noexceptBVH::NodeT< T, P, BV, K >inlineprotected
m_boundingVolumeBVH::NodeT< T, P, BV, K >protected
m_childrenBVH::NodeT< T, P, BV, K >protected
m_depthBVH::NodeT< T, P, BV, K >protected
m_nodeTypeBVH::NodeT< T, P, BV, K >protected
m_parentBVH::NodeT< T, P, BV, K >protected
m_primitivesBVH::NodeT< T, P, BV, K >protected
Node typedefBVH::NodeT< T, P, BV, K >
NodePtr typedefBVH::NodeT< T, P, BV, K >
NodeT()BVH::NodeT< T, P, BV, K >inline
NodeT(const NodePtr &a_parent)BVH::NodeT< T, P, BV, K >inline
NodeT(const std::vector< std::shared_ptr< P > > &a_primitives)BVH::NodeT< T, P, BV, K >inline
NodeT(const std::vector< std::shared_ptr< const P > > &a_primitives)BVH::NodeT< T, P, BV, K >inline
Partitioner typedefBVH::NodeT< T, P, BV, K >
PrimitiveList typedefBVH::NodeT< T, P, BV, K >
pruneOrdered(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inline
pruneOrdered(T &a_closest, const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
pruneOrdered2(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inline
pruneOrdered2(T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
pruneUnordered(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inline
pruneUnordered(T &a_closest, const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
pruneUnordered2(const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inline
pruneUnordered2(T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexceptBVH::NodeT< T, P, BV, K >inlineprotected
setDepth(const int a_depth) noexceptBVH::NodeT< T, P, BV, K >inlineprotected
setNodeType(const NodeType a_nodeType) noexceptBVH::NodeT< T, P, BV, K >inlineprotected
setParent(const NodePtr &a_parent) noexceptBVH::NodeT< T, P, BV, K >inlineprotected
setPrimitives(const PrimitiveList &a_primitives) noexceptBVH::NodeT< T, P, BV, K >inlineprotected
setToRegularNode() noexceptBVH::NodeT< T, P, BV, K >inlineprotected
signedDistance(const Vec3 &a_point, const Prune a_pruning=Prune::Ordered2) const noexceptBVH::NodeT< T, P, BV, K >inline
StopFunction typedefBVH::NodeT< T, P, BV, K >
topDownSortAndPartitionPrimitives(const BVConstructor &a_bvConstructor, const Partitioner &a_partitioner, const StopFunction &a_stopCrit) noexceptBVH::NodeT< T, P, BV, K >inline
Vec3 typedefBVH::NodeT< T, P, BV, K >
~NodeT()BVH::NodeT< T, P, BV, K >inline
+ + + + diff --git a/docs/doxygen/html/classBVH_1_1NodeT.html b/docs/doxygen/html/classBVH_1_1NodeT.html new file mode 100644 index 00000000..7a67c943 --- /dev/null +++ b/docs/doxygen/html/classBVH_1_1NodeT.html @@ -0,0 +1,1396 @@ + + + + + + + +EBGeometry: BVH::NodeT< T, P, BV, K > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BVH::NodeT< T, P, BV, K > Class Template Reference
+
+
+ +

Forward declare the BVH node since it is needed for the polymorphic lambdas. + More...

+ +

#include <EBGeometry_BVH.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using PrimitiveList = PrimitiveListT< P >
 Alias for cutting down on typing.
 
+using Vec3 = Vec3T< T >
 Alias for cutting down on typing.
 
using Node = NodeT< T, P, BV, K >
 Alias for cutting down on typing. More...
 
+using NodePtr = std::shared_ptr< Node >
 Alias for cutting down on typing.
 
+using StopFunction = StopFunctionT< T, P, BV, K >
 Alias for cutting down on typing.
 
+using Partitioner = PartitionerT< P, K >
 Alias for cutting down on typing.
 
+using BVConstructor = BVConstructorT< P, BV >
 Alias for cutting down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

NodeT ()
 Default constructor which sets a regular node without any data (no parent/children and no depth)
 
 NodeT (const NodePtr &a_parent)
 Construct node from parent. More...
 
 NodeT (const std::vector< std::shared_ptr< P > > &a_primitives)
 Construct node from a set of primitives. More...
 
 NodeT (const std::vector< std::shared_ptr< const P > > &a_primitives)
 Construct node from a set of primitives. More...
 
~NodeT ()
 Destructor (does nothing)
 
void topDownSortAndPartitionPrimitives (const BVConstructor &a_bvConstructor, const Partitioner &a_partitioner, const StopFunction &a_stopCrit) noexcept
 Function for using top-down construction of the bounding volume hierarchy. More...
 
int getDepth () const noexcept
 Get the depth of the current node. More...
 
const PrimitiveListgetPrimitives () const noexcept
 Get the primitives stored in this node. More...
 
+const BV & getBoundingVolume () const noexcept
 Get bounding volume.
 
signedDistance (const Vec3 &a_point, const Prune a_pruning=Prune::Ordered2) const noexcept
 Function which computes the signed distance. More...
 
pruneOrdered (const Vec3 &a_point) const noexcept
 Function which computes the signed distance using ordered pruning along the BVH branches. More...
 
pruneOrdered2 (const Vec3 &a_point) const noexcept
 Function which computes the signed distance using ordered pruning along the BVH branches. More...
 
pruneUnordered (const Vec3 &a_point) const noexcept
 Function which computes the signed distance using unordered pruning along the BVH branches. More...
 
pruneUnordered2 (const Vec3 &a_point) const noexcept
 Function which computes the signed distance using unordered pruning along the BVH branches. More...
 
std::shared_ptr< LinearBVH< T, P, BV, K > > flattenTree ()
 Flatten everything beneath this node into a depth-first sorted BVH hierarchy. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

void setNodeType (const NodeType a_nodeType) noexcept
 Set node type to leaf or regular. More...
 
void setDepth (const int a_depth) noexcept
 Set node depth. More...
 
void insertNode (NodePtr &a_node, const PrimitiveList &a_primitives) noexcept
 Insert a new node in the tree. More...
 
+void insertNodes (const std::array< PrimitiveList, K > &a_primitives) noexcept
 Insert nodes with primitives.
 
void setToRegularNode () noexcept
 Set to regular node. More...
 
void setPrimitives (const PrimitiveList &a_primitives) noexcept
 Set primitives in this node. More...
 
getDistanceToBoundingVolume (const Vec3 &a_point) const noexcept
 Get the distance from a 3D point to the bounding volume. More...
 
getDistanceToBoundingVolume2 (const Vec3 &a_point) const noexcept
 Get the unsigned square from a 3D point to the bounding volume. More...
 
getDistanceToPrimitives (const Vec3 &a_point) const noexcept
 Compute the shortest distance to the primitives in this node. More...
 
NodeType getNodeType () const noexcept
 Get the node type. More...
 
PrimitiveListgetPrimitives () noexcept
 Get the list of primitives in this node. More...
 
void setParent (const NodePtr &a_parent) noexcept
 Set parent node. More...
 
void pruneOrdered (T &a_closest, const Vec3 &a_point) const noexcept
 Implementation function for pruneOrdered (it requires a different signature). More...
 
void pruneOrdered2 (T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexcept
 Implementation function for pruneOrdered2 (it requires a different signature). More...
 
void pruneUnordered (T &a_closest, const Vec3 &a_point) const noexcept
 Implementation function for pruneUnordered (it requires a different signature). More...
 
void pruneUnordered2 (T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexcept
 Implementation function for pruneUnordered2 (it requires a different signature). More...
 
unsigned long flattenTree (std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, std::vector< std::shared_ptr< const P > > &a_sortedPrimitives, unsigned long &a_offset) const noexcept
 Flatten tree method. More...
 
+ + + + + + + + + + + + + + + + + + + +

+Protected Attributes

+BV m_boundingVolume
 Bounding volume object.
 
+NodeType m_nodeType
 Node type (leaf or regular)
 
+int m_depth
 Node depth.
 
+PrimitiveList m_primitives
 Primitives list. This will be empty for regular nodes.
 
+std::array< NodePtr, K > m_children
 Children nodes.
 
+NodePtr m_parent
 Pointer to parent node.
 
+

Detailed Description

+

template<class T, class P, class BV, int K>
+class BVH::NodeT< T, P, BV, K >

+ +

Forward declare the BVH node since it is needed for the polymorphic lambdas.

+

Class which encapsulates a node in a bounding volume hierarchy.

+

T is the precision used in the BVH computations, P is the enclosing primitive and BV is the bounding volume used in the BVH.

+

T is the precision for Vec3, P is the primitive type you want to enclose, BV is the bounding volume you use for it.

Note
P MUST supply function signedDistance(...) and unsignedDistance2(Vec3). BV must supply a function getDistance (had this been C++20, we would have use concepts to enforce this).
+

Member Typedef Documentation

+ +

◆ Node

+ +
+
+
+template<class T, class P, class BV, int K>
+ + + + +
using BVH::NodeT< T, P, BV, K >::Node = NodeT<T, P, BV, K>
+
+ +

Alias for cutting down on typing.

+

In the below, 'Node' is a class which uses precision T for computations and encloses primitives P using a bounding volume BV.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ NodeT() [1/3]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
BVH::NodeT< T, P, BV, K >::NodeT (const NodePtra_parent)
+
+inline
+
+ +

Construct node from parent.

+
Parameters
+ + +
[in]a_parentParent node.
+
+
+

This sets the node's parent to be a_parent and the node's depth to be the parent's depth + 1.

Note
This node becomes a leaf node.
+ +
+
+ +

◆ NodeT() [2/3]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
BVH::NodeT< T, P, BV, K >::NodeT (const std::vector< std::shared_ptr< P > > & a_primitives)
+
+inline
+
+ +

Construct node from a set of primitives.

+
Parameters
+ + +
[in]a_primitivesInput primitives.
+
+
+

This sets the node's parent to be a_parent and the node's depth to be the parent's depth + 1.

Note
This node becomes a leaf node with depth=0 and which contains the input primitives.
+ +
+
+ +

◆ NodeT() [3/3]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
BVH::NodeT< T, P, BV, K >::NodeT (const std::vector< std::shared_ptr< const P > > & a_primitives)
+
+inline
+
+ +

Construct node from a set of primitives.

+
Parameters
+ + +
[in]a_primitivesInput primitives.
+
+
+
Note
This node becomes a leaf node with depth=0 and which contains the input primitives.
+ +
+
+

Member Function Documentation

+ +

◆ flattenTree() [1/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
std::shared_ptr< LinearBVH< T, P, BV, K > > BVH::NodeT< T, P, BV, K >::flattenTree ()
+
+inline
+
+ +

Flatten everything beneath this node into a depth-first sorted BVH hierarchy.

+

This will compute the flattening of the standard BVH tree and return a pointer to the root node.

+ +
+
+ +

◆ flattenTree() [2/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
unsigned long BVH::NodeT< T, P, BV, K >::flattenTree (std::vector< LinearNodeT< T, P, BV, K > > & a_linearNodes,
std::vector< std::shared_ptr< const P > > & a_sortedPrimitives,
unsigned long & a_offset 
) const
+
+inlineprotectednoexcept
+
+ +

Flatten tree method.

+

This function will flatten everything beneath the current node and linearize all the nodes and primitives beneath it to a_linearNodes and a_sortedPrimitives. This function is called recursively.

Parameters
+ + + + +
[in,out]a_linearNodesBVH nodes, linearized onto a vector.
[in,out]a_sortedPrimitivesSorted primitives (in leaf node order).
[in,out]a_offsetSupporting integer for figuring out where in the tree we are.
+
+
+
Note
When called from the root node, a_linearNodes and a_sortedPrimitives should be empty and a_offset=0UL.
+ +
+
+ +

◆ getDepth()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
int BVH::NodeT< T, P, BV, K >::getDepth () const
+
+inlinenoexcept
+
+ +

Get the depth of the current node.

+
Returns
Depth of current node
+ +
+
+ +

◆ getDistanceToBoundingVolume()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::getDistanceToBoundingVolume (const Vec3a_point) const
+
+inlineprotectednoexcept
+
+ +

Get the distance from a 3D point to the bounding volume.

+
Parameters
+ + +
[in]a_point3D point
+
+
+
Returns
Returns distance to bounding volume. A zero distance implies that the input point is inside the bounding volume.
+ +
+
+ +

◆ getDistanceToBoundingVolume2()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::getDistanceToBoundingVolume2 (const Vec3a_point) const
+
+inlineprotectednoexcept
+
+ +

Get the unsigned square from a 3D point to the bounding volume.

+
Parameters
+ + +
[in]a_point3D point
+
+
+
Returns
Returns squared distance to bounding volume. A zero distance implies that the input point is inside the bounding volume.
+ +
+
+ +

◆ getDistanceToPrimitives()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::getDistanceToPrimitives (const Vec3a_point) const
+
+inlineprotectednoexcept
+
+ +

Compute the shortest distance to the primitives in this node.

+
Parameters
+ + +
[in]a_point3D point
+
+
+
Returns
Returns the signed distance to the primitives.
+ +
+
+ +

◆ getNodeType()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
NodeType BVH::NodeT< T, P, BV, K >::getNodeType () const
+
+inlineprotectednoexcept
+
+ +

Get the node type.

+
Returns
Node type
+ +
+
+ +

◆ getPrimitives() [1/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
const PrimitiveListT< P > & BVH::NodeT< T, P, BV, K >::getPrimitives () const
+
+inlinenoexcept
+
+ +

Get the primitives stored in this node.

+
Returns
List of primitives.
+ +
+
+ +

◆ getPrimitives() [2/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
PrimitiveListT< P > & BVH::NodeT< T, P, BV, K >::getPrimitives ()
+
+inlineprotectednoexcept
+
+ +

Get the list of primitives in this node.

+
Returns
Primitives list
+ +
+
+ +

◆ insertNode()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void BVH::NodeT< T, P, BV, K >::insertNode (NodePtra_node,
const PrimitiveLista_primitives 
)
+
+inlineprotectednoexcept
+
+ +

Insert a new node in the tree.

+
Parameters
+ + + +
[in]a_nodeNode to insert
[in]a_primitivesPrimitives provided to a_node
+
+
+ +
+
+ +

◆ pruneOrdered() [1/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::pruneOrdered (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Function which computes the signed distance using ordered pruning along the BVH branches.

+
Parameters
+ + +
[in]a_point3D point in space
+
+
+
Returns
Signed distance to the input point
+

This routine computes the distance to a_point using ordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine first descends along the sub-branch with the shortest distance to its bounding volume. Once we hit leaf node we update the shortest distance 'd' found so far. As we investigate more branches, they can be pruned if the distance 'd' is shorter than the distance to the node's bounding volume.

+ +
+
+ +

◆ pruneOrdered() [2/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void BVH::NodeT< T, P, BV, K >::pruneOrdered (T & a_closest,
const Vec3a_point 
) const
+
+inlineprotectednoexcept
+
+ +

Implementation function for pruneOrdered (it requires a different signature).

+
Parameters
+ + + +
[in,out]a_closestShortest distance to primitives so far.
[in,out]a_pointInput 3D point
+
+
+ +
+
+ +

◆ pruneOrdered2() [1/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::pruneOrdered2 (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Function which computes the signed distance using ordered pruning along the BVH branches.

+
Parameters
+ + +
[in]a_point3D point in space
+
+
+
Returns
Signed distance to the input point
+

This routine computes the distance to a_point using ordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine first descends along the sub-branch with the shortest distance to its bounding volume. Once we hit leaf node we update the shortest distance 'd' found so far. As we investigate more branches, they can be pruned if the distance 'd' is shorter than the distance to the node's bounding volume.

Note
The difference between this and pruneOrdered(a_point) only consist of the fact that this routine uses the unsigned square distance to prune branches and primitives. This is more efficient than pruneOrdered(a_point) because it does e.g. not involve an extra square root for computing the distance.
+
Returns
Returns the signed distance from a_point to the primitives.
+ +
+
+ +

◆ pruneOrdered2() [2/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void BVH::NodeT< T, P, BV, K >::pruneOrdered2 (T & a_minDist2,
std::shared_ptr< const P > & a_closest,
const Vec3a_point 
) const
+
+inlineprotectednoexcept
+
+ +

Implementation function for pruneOrdered2 (it requires a different signature).

+
Parameters
+ + + + +
[in,out]a_minDist2Shortest square distance so far.
[in,out]a_closestClosest primitive so far.
[in,out]a_pointInput 3D point
+
+
+ +
+
+ +

◆ pruneUnordered() [1/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::pruneUnordered (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Function which computes the signed distance using unordered pruning along the BVH branches.

+
Parameters
+ + +
[in]a_point3D point in space
+
+
+
Returns
Signed distance to the input point
+

This routine computes the distance to a_point using unordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine visits nodes in the order they were created. Once we hit leaf node we update the shortest distance 'd' found so far. As we investigate more branches, they can be pruned if the distance 'd' is shorter than the distance to the node's bounding volume.

Note
The difference between this and pruneOrdered(a_point) is that this routine always does the nodes in the order they were created. In almost all cases this is more inefficient than pruneOrdered(a_point).
+
Returns
Returns the signed distance from a_point to the primitives.
+ +
+
+ +

◆ pruneUnordered() [2/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void BVH::NodeT< T, P, BV, K >::pruneUnordered (T & a_closest,
const Vec3a_point 
) const
+
+inlineprotectednoexcept
+
+ +

Implementation function for pruneUnordered (it requires a different signature).

+
Parameters
+ + + +
[in,out]a_closestShortest distance to primitives so far.
[in,out]a_pointInput 3D point
+
+
+ +
+
+ +

◆ pruneUnordered2() [1/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
T BVH::NodeT< T, P, BV, K >::pruneUnordered2 (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Function which computes the signed distance using unordered pruning along the BVH branches.

+
Parameters
+ + +
[in]a_point3D point in space
+
+
+
Returns
Signed distance to the input point
+

This routine computes the distance to a_point using unordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine visits nodes in the order they were created. Once we hit leaf node we update the shortest distance 'd' found so far. As we investigate more branches, they can be pruned if the distance 'd' is shorter than the distance to the node's bounding volume. The only difference between this routine and pruneUnordered(a_point) is that this routine prunes based on the unsigned square distance first, and only computes the signed distance at the end.

Note
The difference between this and pruneOrdered2(a_point) is that this routine always does nodes in the order they were created. In almost all cases this is more inefficient than pruneOrdered2(a_point).
+
Returns
Returns the signed distance from a_point to the primitives.
+ +
+
+ +

◆ pruneUnordered2() [2/2]

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void BVH::NodeT< T, P, BV, K >::pruneUnordered2 (T & a_minDist2,
std::shared_ptr< const P > & a_closest,
const Vec3a_point 
) const
+
+inlineprotectednoexcept
+
+ +

Implementation function for pruneUnordered2 (it requires a different signature).

+
Parameters
+ + + + +
[in,out]a_minDist2Shortest square distance so far.
[in,out]a_closestClosest primitive so far.
[in,out]a_pointInput 3D point
+
+
+ +
+
+ +

◆ setDepth()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
void BVH::NodeT< T, P, BV, K >::setDepth (const int a_depth)
+
+inlineprotectednoexcept
+
+ +

Set node depth.

+
Parameters
+ + +
[in]a_depthNode depth
+
+
+ +
+
+ +

◆ setNodeType()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
void BVH::NodeT< T, P, BV, K >::setNodeType (const NodeType a_nodeType)
+
+inlineprotectednoexcept
+
+ +

Set node type to leaf or regular.

+
Parameters
+ + +
[in]a_nodeTypeNode type
+
+
+ +
+
+ +

◆ setParent()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
void BVH::NodeT< T, P, BV, K >::setParent (const NodePtra_parent)
+
+inlineprotectednoexcept
+
+ +

Set parent node.

+
Parameters
+ + +
[in]a_parentParent node
+
+
+ +
+
+ +

◆ setPrimitives()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + +
void BVH::NodeT< T, P, BV, K >::setPrimitives (const PrimitiveLista_primitives)
+
+inlineprotectednoexcept
+
+ +

Set primitives in this node.

+
Parameters
+ + +
[in]a_primitivesPrimitives
+
+
+ +
+
+ +

◆ setToRegularNode()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + +
void BVH::NodeT< T, P, BV, K >::setToRegularNode ()
+
+inlineprotectednoexcept
+
+ +

Set to regular node.

+
Note
This sets m_nodeType to regular and clears the primitives list
+ +
+
+ +

◆ signedDistance()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T BVH::NodeT< T, P, BV, K >::signedDistance (const Vec3a_point,
const Prune a_pruning = Prune::Ordered2 
) const
+
+inlinenoexcept
+
+ +

Function which computes the signed distance.

+
Parameters
+ + + +
[in]a_point3D point in space
[in]a_pruningPruning algorithm
+
+
+
Returns
Signed distance to the input point
+

This will select amongs the various implementations.

+ +
+
+ +

◆ topDownSortAndPartitionPrimitives()

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void BVH::NodeT< T, P, BV, K >::topDownSortAndPartitionPrimitives (const BVConstructora_bvConstructor,
const Partitionera_partitioner,
const StopFunctiona_stopCrit 
)
+
+inlinenoexcept
+
+ +

Function for using top-down construction of the bounding volume hierarchy.

+
Parameters
+ + + + +
[in]a_bvConstructorPolymorphic function which builds a bounding volume from a set of primitives.
[in]a_partitionerPartitioning function. This is a polymorphic function which divides a set of primitives into two lists.
[in]a_stopCritTermination function which tells us when to stop the recursion.
+
+
+

The rules for terminating the hierarchy construction, how to partition sets of primitives, and how to enclose them by bounding volumes are given in the input arguments (a_stopFunc, a_partFunc, a_bvFunc)

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classBoundingVolumes_1_1AABBT-members.html b/docs/doxygen/html/classBoundingVolumes_1_1AABBT-members.html new file mode 100644 index 00000000..b6dbd1b3 --- /dev/null +++ b/docs/doxygen/html/classBoundingVolumes_1_1AABBT-members.html @@ -0,0 +1,102 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BoundingVolumes::AABBT< T > Member List
+
+
+ +

This is the complete list of members for BoundingVolumes::AABBT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
AABBT()BoundingVolumes::AABBT< T >
AABBT(const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)BoundingVolumes::AABBT< T >
AABBT(const AABBT &a_other)BoundingVolumes::AABBT< T >
AABBT(const std::vector< AABBT< T > > &a_others)BoundingVolumes::AABBT< T >
AABBT(const std::vector< Vec3T< P > > &a_points)BoundingVolumes::AABBT< T >
define(const std::vector< Vec3T< P > > &a_points) noexceptBoundingVolumes::AABBT< T >inline
getArea() const noexceptBoundingVolumes::AABBT< T >inline
getCentroid() const noexceptBoundingVolumes::AABBT< T >inline
getDistance(const Vec3 &a_x0) const noexceptBoundingVolumes::AABBT< T >inline
getDistance2(const Vec3 &a_x0) const noexceptBoundingVolumes::AABBT< T >inline
getHighCorner() noexceptBoundingVolumes::AABBT< T >inline
getHighCorner() const noexceptBoundingVolumes::AABBT< T >inline
getLowCorner() noexceptBoundingVolumes::AABBT< T >inline
getLowCorner() const noexceptBoundingVolumes::AABBT< T >inline
getOverlappingVolume(const AABBT< T > &a_other) const noexceptBoundingVolumes::AABBT< T >inline
getVolume() const noexceptBoundingVolumes::AABBT< T >inline
intersects(const AABBT &a_other) const noexceptBoundingVolumes::AABBT< T >inline
m_hiCornerBoundingVolumes::AABBT< T >protected
m_loCornerBoundingVolumes::AABBT< T >protected
Vec3 typedefBoundingVolumes::AABBT< T >
~AABBT()BoundingVolumes::AABBT< T >virtual
+ + + + diff --git a/docs/doxygen/html/classBoundingVolumes_1_1AABBT.html b/docs/doxygen/html/classBoundingVolumes_1_1AABBT.html new file mode 100644 index 00000000..aa446288 --- /dev/null +++ b/docs/doxygen/html/classBoundingVolumes_1_1AABBT.html @@ -0,0 +1,499 @@ + + + + + + + +EBGeometry: BoundingVolumes::AABBT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BoundingVolumes::AABBT< T > Class Template Reference
+
+
+ +

Axis-aligned bounding box as bounding volume. + More...

+ +

#include <EBGeometry_BoundingVolumes.hpp>

+ + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Alias which cuts down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

AABBT ()
 Default constructor (does nothing)
 
 AABBT (const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)
 Full constructor taking the low/high corners of the bounding box. More...
 
 AABBT (const AABBT &a_other)
 Copy constructor of another bounding box. More...
 
 AABBT (const std::vector< AABBT< T > > &a_others)
 Constructor which creates an AABB which encloses a set of other AABBs. More...
 
+virtual ~AABBT ()
 Destructor (does nothing)
 
template<class P >
 AABBT (const std::vector< Vec3T< P > > &a_points)
 Template constructor (since mixed precision allowed) which creates an AABB that encloses a set of 3D points. More...
 
template<class P >
void define (const std::vector< Vec3T< P > > &a_points) noexcept
 Define function (since mixed precision allowed) which sets this AABB such that it encloses a set of 3D points. More...
 
bool intersects (const AABBT &a_other) const noexcept
 Check if this AABB intersects another AABB. More...
 
+Vec3T< T > & getLowCorner () noexcept
 Get the modifiable lower-left corner of the AABB.
 
+const Vec3T< T > & getLowCorner () const noexcept
 Get the immutable lower-left corner of the AABB.
 
+Vec3T< T > & getHighCorner () noexcept
 Get the modifiable upper-right corner of the AABB.
 
+const Vec3T< T > & getHighCorner () const noexcept
 Get the immutable upper-right corner of the AABB.
 
+Vec3 getCentroid () const noexcept
 Get bounding volume centroid.
 
getOverlappingVolume (const AABBT< T > &a_other) const noexcept
 Compute the overlapping volume between this AABB and another AABB. More...
 
getDistance (const Vec3 &a_x0) const noexcept
 Get the distance to this AABB (points inside the bounding box have a zero distance) More...
 
getDistance2 (const Vec3 &a_x0) const noexcept
 Get the squared distance to this bounding box (points inside the bounding box have a zero distance) More...
 
+T getVolume () const noexcept
 Compute the bounding box volume.
 
+T getArea () const noexcept
 Compute the bounding box area.
 
+ + + + + + + +

+Protected Attributes

+Vec3 m_loCorner
 Lower-left corner of bounding box.
 
+Vec3 m_hiCorner
 Upper-right corner of bounding box.
 
+

Detailed Description

+

template<class T>
+class BoundingVolumes::AABBT< T >

+ +

Axis-aligned bounding box as bounding volume.

+

This class represents a Cartesian box that encloses a set of 3D points.

Note
The template parameter T is the precision.
+

Constructor & Destructor Documentation

+ +

◆ AABBT() [1/4]

+ +
+
+
+template<class T >
+ + + + + + + + + + + + + + + + + + +
BoundingVolumes::AABBT< T >::AABBT (const Vec3T< T > & a_lo,
const Vec3T< T > & a_hi 
)
+
+ +

Full constructor taking the low/high corners of the bounding box.

+
Parameters
+ + + +
[in]a_loLow corner
[in]a_hiHigh
+
+
+ +
+
+ +

◆ AABBT() [2/4]

+ +
+
+
+template<class T >
+ + + + + + + + +
BoundingVolumes::AABBT< T >::AABBT (const AABBT< T > & a_other)
+
+ +

Copy constructor of another bounding box.

+
Parameters
+ + +
[in]a_otherOther bounding box
+
+
+ +
+
+ +

◆ AABBT() [3/4]

+ +
+
+
+template<class T >
+ + + + + + + + +
BoundingVolumes::AABBT< T >::AABBT (const std::vector< AABBT< T > > & a_others)
+
+ +

Constructor which creates an AABB which encloses a set of other AABBs.

+
Parameters
+ + +
[in]a_othersOther bounding boxes
+
+
+ +
+
+ +

◆ AABBT() [4/4]

+ +
+
+
+template<class T >
+
+template<class P >
+ + + + + + + + +
BoundingVolumes::AABBT< T >::AABBT (const std::vector< Vec3T< P > > & a_points)
+
+ +

Template constructor (since mixed precision allowed) which creates an AABB that encloses a set of 3D points.

+
Parameters
+ + +
[in]a_pointsSet of 3D points
+
+
+
Note
Calls the define function
+ +
+
+

Member Function Documentation

+ +

◆ define()

+ +
+
+
+template<class T >
+
+template<class P >
+ + + + + +
+ + + + + + + + +
void BoundingVolumes::AABBT< T >::define (const std::vector< Vec3T< P > > & a_points)
+
+inlinenoexcept
+
+ +

Define function (since mixed precision allowed) which sets this AABB such that it encloses a set of 3D points.

+
Parameters
+ + +
[in]a_pointsSet of 3D points
+
+
+ +
+
+ +

◆ getDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::AABBT< T >::getDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the distance to this AABB (points inside the bounding box have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the distance to the bounding box (a point inside has a zero distance)
+ +
+
+ +

◆ getDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::AABBT< T >::getDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the squared distance to this bounding box (points inside the bounding box have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the squared distance to the bounding box (a point inside has a zero distance)
+ +
+
+ +

◆ getOverlappingVolume()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::AABBT< T >::getOverlappingVolume (const AABBT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Compute the overlapping volume between this AABB and another AABB.

+
Parameters
+ + +
[in]a_otherThe other AABB
+
+
+
Returns
Returns overlapping volume
+ +
+
+ +

◆ intersects()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool BoundingVolumes::AABBT< T >::intersects (const AABBT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Check if this AABB intersects another AABB.

+
Parameters
+ + +
[in]a_otherThe other AABB
+
+
+
Returns
True if they intersect and false otherwise.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classBoundingVolumes_1_1BoundingSphereT-members.html b/docs/doxygen/html/classBoundingVolumes_1_1BoundingSphereT-members.html new file mode 100644 index 00000000..2edacddd --- /dev/null +++ b/docs/doxygen/html/classBoundingVolumes_1_1BoundingSphereT-members.html @@ -0,0 +1,103 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BoundingVolumes::BoundingSphereT< T > Member List
+
+
+ +

This is the complete list of members for BoundingVolumes::BoundingSphereT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
BoundingSphereT()BoundingVolumes::BoundingSphereT< T >inline
BoundingSphereT(const Vec3T< T > &a_center, const T &a_radius)BoundingVolumes::BoundingSphereT< T >inline
BoundingSphereT(const std::vector< BoundingSphereT< T > > &a_otherSpheres)BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const BoundingSphereT &a_other)BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg=BoundingVolumeAlgorithm::Ritter)BoundingVolumes::BoundingSphereT< T >
BoundingVolumeAlgorithm enum nameBoundingVolumes::BoundingSphereT< T >
buildRitter(const std::vector< Vec3T< P > > &a_points) noexceptBoundingVolumes::BoundingSphereT< T >inlineprotected
define(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg) noexceptBoundingVolumes::BoundingSphereT< T >inline
getArea() const noexceptBoundingVolumes::BoundingSphereT< T >inline
getCentroid() noexceptBoundingVolumes::BoundingSphereT< T >inline
getCentroid() const noexceptBoundingVolumes::BoundingSphereT< T >inline
getDistance(const Vec3 &a_x0) const noexceptBoundingVolumes::BoundingSphereT< T >inline
getDistance2(const Vec3 &a_x0) const noexceptBoundingVolumes::BoundingSphereT< T >inline
getOverlappingVolume(const BoundingSphereT< T > &a_other) const noexceptBoundingVolumes::BoundingSphereT< T >inline
getRadius() noexceptBoundingVolumes::BoundingSphereT< T >inline
getRadius() const noexceptBoundingVolumes::BoundingSphereT< T >inline
getVolume() const noexceptBoundingVolumes::BoundingSphereT< T >inline
intersects(const BoundingSphereT &a_other) const noexceptBoundingVolumes::BoundingSphereT< T >inline
m_centerBoundingVolumes::BoundingSphereT< T >protected
m_radiusBoundingVolumes::BoundingSphereT< T >protected
Vec3 typedefBoundingVolumes::BoundingSphereT< T >
~BoundingSphereT()BoundingVolumes::BoundingSphereT< T >virtual
+ + + + diff --git a/docs/doxygen/html/classBoundingVolumes_1_1BoundingSphereT.html b/docs/doxygen/html/classBoundingVolumes_1_1BoundingSphereT.html new file mode 100644 index 00000000..a7d25301 --- /dev/null +++ b/docs/doxygen/html/classBoundingVolumes_1_1BoundingSphereT.html @@ -0,0 +1,596 @@ + + + + + + + +EBGeometry: BoundingVolumes::BoundingSphereT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
BoundingVolumes::BoundingSphereT< T > Class Template Reference
+
+
+ +

Class which encloses a set of points using a bounding sphere. + More...

+ +

#include <EBGeometry_BoundingVolumes.hpp>

+ + + + + + + + +

+Public Types

enum  BoundingVolumeAlgorithm { Ritter + }
 Typename for possible algorithms that support the computation of a bounding sphere for a set of 3D points.
 
+using Vec3 = Vec3T< T >
 Alias to cut down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

BoundingSphereT ()
 Default constructor. Leaves object in undefined state.
 
 BoundingSphereT (const Vec3T< T > &a_center, const T &a_radius)
 Full constructor. Sets the center and radius of the bounding sphere. More...
 
 BoundingSphereT (const std::vector< BoundingSphereT< T > > &a_otherSpheres)
 Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres. More...
 
 BoundingSphereT (const BoundingSphereT &a_other)
 Copy constructor. Sets the center and radius from the other sphere. More...
 
+virtual ~BoundingSphereT ()
 Destructor (does nothing).
 
template<class P >
 BoundingSphereT (const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg=BoundingVolumeAlgorithm::Ritter)
 Template constructor which takes a set of 3D points (mixed precision allowed). More...
 
template<class P >
void define (const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg) noexcept
 Template define function which takes a set of 3D points (mixed precision allowed). More...
 
bool intersects (const BoundingSphereT &a_other) const noexcept
 Check if this bounding sphere intersect another bounding sphere. More...
 
+T & getRadius () noexcept
 Get modifiable radius for this sphere.
 
+const T & getRadius () const noexcept
 Get immutable radius for this sphere.
 
+Vec3getCentroid () noexcept
 Get modifiable center for this sphere.
 
+const Vec3getCentroid () const noexcept
 Get immutable center for this sphere.
 
getOverlappingVolume (const BoundingSphereT< T > &a_other) const noexcept
 Compute the overlapping volume between this bounding sphere and another. More...
 
getDistance (const Vec3 &a_x0) const noexcept
 Get the distance to this bounding sphere (points inside the sphere have a zero distance) More...
 
getDistance2 (const Vec3 &a_x0) const noexcept
 Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) More...
 
getVolume () const noexcept
 Get the sphere volume. More...
 
getArea () const noexcept
 Get the sphere area. More...
 
+ + + + + +

+Protected Member Functions

+template<class P >
void buildRitter (const std::vector< Vec3T< P > > &a_points) noexcept
 Template function which computes the bounding sphere for a set of points (mixed precision allowed) using Ritter's algorithm.
 
+ + + + + + + +

+Protected Attributes

+T m_radius
 Sphere radius.
 
+Vec3 m_center
 Sphere center.
 
+

Detailed Description

+

template<class T>
+class BoundingVolumes::BoundingSphereT< T >

+ +

Class which encloses a set of points using a bounding sphere.

+

The template parameter T is the floating-point precision which is used.

+

Constructor & Destructor Documentation

+ +

◆ BoundingSphereT() [1/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const Vec3T< T > & a_center,
const T & a_radius 
)
+
+inline
+
+ +

Full constructor. Sets the center and radius of the bounding sphere.

+
Parameters
+ + + +
[in]a_centerBounding sphere center
[in]a_radiusBounding sphere radius
+
+
+ +
+
+ +

◆ BoundingSphereT() [2/4]

+ +
+
+
+template<class T >
+ + + + + + + + +
BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const std::vector< BoundingSphereT< T > > & a_otherSpheres)
+
+ +

Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres.

+
Parameters
+ + +
[in]a_otherSpheresOther bounding spheres.
+
+
+ +
+
+ +

◆ BoundingSphereT() [3/4]

+ +
+
+
+template<class T >
+ + + + + + + + +
BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const BoundingSphereT< T > & a_other)
+
+ +

Copy constructor. Sets the center and radius from the other sphere.

+
Parameters
+ + +
[in]a_otherOther sphere
+
+
+ +
+
+ +

◆ BoundingSphereT() [4/4]

+ +
+
+
+template<class T >
+
+template<class P >
+ + + + + + + + + + + + + + + + + + +
BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const std::vector< Vec3T< P > > & a_points,
const BoundingVolumeAlgorithma_alg = BoundingVolumeAlgorithm::Ritter 
)
+
+ +

Template constructor which takes a set of 3D points (mixed precision allowed).

+

This computes the bounding sphere using the supplied algorithm.

Parameters
+ + + +
[in]a_pointsSet of 3D points
[in]a_algBounding sphere algorithm.
+
+
+
Note
This calls the define(...) function.
+ +
+
+

Member Function Documentation

+ +

◆ define()

+ +
+
+
+template<class T >
+
+template<class P >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void BoundingVolumes::BoundingSphereT< T >::define (const std::vector< Vec3T< P > > & a_points,
const BoundingVolumeAlgorithma_alg 
)
+
+inlinenoexcept
+
+ +

Template define function which takes a set of 3D points (mixed precision allowed).

+

This computes the bounding sphere using the supplied algorithm.

Parameters
+ + + +
[in]a_pointsSet of 3D points
[in]a_algBounding sphere algorithm.
+
+
+ +
+
+ +

◆ getArea()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
T BoundingVolumes::BoundingSphereT< T >::getArea () const
+
+inlinenoexcept
+
+ +

Get the sphere area.

+
Returns
Sphere area.
+ +
+
+ +

◆ getDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::BoundingSphereT< T >::getDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the distance to this bounding sphere (points inside the sphere have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the distance to the sphere (a point inside has a zero distance)
+ +
+
+ +

◆ getDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::BoundingSphereT< T >::getDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the squared distance to this bounding sphere (points inside the sphere have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the squared distance to the sphere (a point inside has a zero distance)
+ +
+
+ +

◆ getOverlappingVolume()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::BoundingSphereT< T >::getOverlappingVolume (const BoundingSphereT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Compute the overlapping volume between this bounding sphere and another.

+
Parameters
+ + +
[in]a_otherOther bounding sphere
+
+
+
Returns
The overlapping volume, computing using standard expressions.
+ +
+
+ +

◆ getVolume()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
T BoundingVolumes::BoundingSphereT< T >::getVolume () const
+
+inlinenoexcept
+
+ +

Get the sphere volume.

+
Returns
Sphere volume
+ +
+
+ +

◆ intersects()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool BoundingVolumes::BoundingSphereT< T >::intersects (const BoundingSphereT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Check if this bounding sphere intersect another bounding sphere.

+
Parameters
+ + +
[in]a_otherOther bounding sphere.
+
+
+
Returns
True if the two sphere intersect.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1EdgeIteratorT-members.html b/docs/doxygen/html/classDcel_1_1EdgeIteratorT-members.html new file mode 100644 index 00000000..16f35328 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1EdgeIteratorT-members.html @@ -0,0 +1,102 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::EdgeIteratorT< T > Member List
+
+ + + + + diff --git a/docs/doxygen/html/classDcel_1_1EdgeIteratorT.html b/docs/doxygen/html/classDcel_1_1EdgeIteratorT.html new file mode 100644 index 00000000..43cbe84f --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1EdgeIteratorT.html @@ -0,0 +1,373 @@ + + + + + + + +EBGeometry: Dcel::EdgeIteratorT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::EdgeIteratorT< T > Class Template Reference
+
+
+ +

Class which can iterate through edges and vertices around a DCEL polygon face. + More...

+ +

#include <EBGeometry_DcelIterator.hpp>

+ + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Vertex = VertexT< T >
 Alias to cut down on typing.
 
+using Edge = EdgeT< T >
 Alias to cut down on typing.
 
+using Face = FaceT< T >
 Alias to cut down on typing.
 
+using VertexPtr = std::shared_ptr< Vertex >
 Alias to cut down on typing.
 
+using EdgePtr = std::shared_ptr< Edge >
 Alias to cut down on typing.
 
+using FacePtr = std::shared_ptr< Face >
 Alias to cut down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

EdgeIteratorT ()=delete
 Default construction is not allowed. Use one of the full constructors.
 
 EdgeIteratorT (Face &a_face)
 Constructor, taking a face as argument. The iterator begins at the half-edge pointer contained in the face. More...
 
 EdgeIteratorT (const Face &a_face)
 Constructor, taking a face as argument. The iterator begins at the half-edge pointer contained in the face. More...
 
 EdgeIteratorT (Vertex &a_vertex)
 Constructor, taking a vertex as argument. The iterator begins at the outgoing half-edge from the vertex. More...
 
 EdgeIteratorT (const Vertex &a_vertex)
 Constructor, taking a vertex as argument. The iterator begins at the outgoing half-edge from the vertex. More...
 
+EdgePtroperator() () noexcept
 Operator returning a pointer to the current half-edge.
 
+const EdgePtroperator() () const noexcept
 Operator returning a pointer to the current half-edge.
 
+void reset () noexcept
 Reset function for the iterator. This resets the iterator so that it begins from the starting half-edge.
 
+void operator++ () noexcept
 Incrementation operator, bringing the iterator to the next half-edge.
 
bool ok () const noexcept
 Function which checks if the iteration can be continued. More...
 
+ + + + +

+Protected Types

enum  IterationMode { Vertices, +Faces + }
 Iteration mode, used to distinguish between the two constructors (face- or vertex-based iteration)
 
+ + + + + + + + + + + + + +

+Protected Attributes

+bool m_fullLoop
 If true, a full loop has been made around the polygon face.
 
+IterationMode m_iterMode
 Iteration mode. Set in constructor.
 
+std::shared_ptr< Edgem_startEdge
 Starting half-edge.
 
+std::shared_ptr< Edgem_curEdge
 Current half-edge.
 
+

Detailed Description

+

template<class T>
+class Dcel::EdgeIteratorT< T >

+ +

Class which can iterate through edges and vertices around a DCEL polygon face.

+

This class can be used so that it either visits all the half-edges in a face, or all the outgoing half-edges from a vertex.

+

Constructor & Destructor Documentation

+ +

◆ EdgeIteratorT() [1/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::EdgeIteratorT< T >::EdgeIteratorT (Facea_face)
+
+inline
+
+ +

Constructor, taking a face as argument. The iterator begins at the half-edge pointer contained in the face.

+
Parameters
+ + +
[in]a_faceDCEL polygon face
+
+
+
Note
This constructor will will iterate through the half-edges in the polygon face.
+ +
+
+ +

◆ EdgeIteratorT() [2/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::EdgeIteratorT< T >::EdgeIteratorT (const Facea_face)
+
+inline
+
+ +

Constructor, taking a face as argument. The iterator begins at the half-edge pointer contained in the face.

+
Parameters
+ + +
[in]a_faceDCEL polygon face
+
+
+
Note
This constructor will will iterate through the half-edges in the polygon face.
+ +
+
+ +

◆ EdgeIteratorT() [3/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::EdgeIteratorT< T >::EdgeIteratorT (Vertexa_vertex)
+
+inline
+
+ +

Constructor, taking a vertex as argument. The iterator begins at the outgoing half-edge from the vertex.

+
Parameters
+ + +
[in]a_vertexDCEL vertex
+
+
+
Note
This constructor will will iterate through the outgoing half-edges from a vertex.
+ +
+
+ +

◆ EdgeIteratorT() [4/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::EdgeIteratorT< T >::EdgeIteratorT (const Vertexa_vertex)
+
+inline
+
+ +

Constructor, taking a vertex as argument. The iterator begins at the outgoing half-edge from the vertex.

+
Parameters
+ + +
[in]a_vertexDCEL vertex
+
+
+
Note
This constructor will will iterate through the outgoing half-edges from a vertex.
+ +
+
+

Member Function Documentation

+ +

◆ ok()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
bool Dcel::EdgeIteratorT< T >::ok () const
+
+inlinenoexcept
+
+ +

Function which checks if the iteration can be continued.

+
Returns
Returns true unless the current half-edge is a nullptr (i.e., a broken polygon face) OR a full loop has been made around the polygon face (i.e. all half-edges have been visited)
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1EdgeT-members.html b/docs/doxygen/html/classDcel_1_1EdgeT-members.html new file mode 100644 index 00000000..b011ed53 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1EdgeT-members.html @@ -0,0 +1,128 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::EdgeT< T > Member List
+
+
+ +

This is the complete list of members for Dcel::EdgeT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
computeEdgeLength() noexceptDcel::EdgeT< T >inlineprotected
computeNormal() noexceptDcel::EdgeT< T >inlineprotected
define(const VertexPtr &a_vertex, const EdgePtr &a_pairEdge, const EdgePtr &a_nextEdge, const EdgePtr &a_previousEdge, const Vec3 a_normal) noexceptDcel::EdgeT< T >inline
Edge typedefDcel::EdgeT< T >
EdgeIterator typedefDcel::EdgeT< T >
EdgePtr typedefDcel::EdgeT< T >
EdgeT()Dcel::EdgeT< T >inline
EdgeT(const Edge &a_otherEdge)Dcel::EdgeT< T >inline
EdgeT(const VertexPtr &a_vertex)Dcel::EdgeT< T >inline
Face typedefDcel::EdgeT< T >
FacePtr typedefDcel::EdgeT< T >
getFace() noexceptDcel::EdgeT< T >inline
getFace() const noexceptDcel::EdgeT< T >inline
getNextEdge() noexceptDcel::EdgeT< T >inline
getNextEdge() const noexceptDcel::EdgeT< T >inline
getNormal() noexceptDcel::EdgeT< T >inline
getNormal() const noexceptDcel::EdgeT< T >inline
getOtherVertex() noexceptDcel::EdgeT< T >inline
getOtherVertex() const noexceptDcel::EdgeT< T >inline
getPairEdge() noexceptDcel::EdgeT< T >inline
getPairEdge() const noexceptDcel::EdgeT< T >inline
getPreviousEdge() noexceptDcel::EdgeT< T >inline
getPreviousEdge() const noexceptDcel::EdgeT< T >inline
getVertex() noexceptDcel::EdgeT< T >inline
getVertex() const noexceptDcel::EdgeT< T >inline
m_faceDcel::EdgeT< T >protected
m_invLen2Dcel::EdgeT< T >protected
m_nextEdgeDcel::EdgeT< T >protected
m_normalDcel::EdgeT< T >protected
m_pairEdgeDcel::EdgeT< T >protected
m_previousEdgeDcel::EdgeT< T >protected
m_vertexDcel::EdgeT< T >protected
m_x2x1Dcel::EdgeT< T >protected
normalizeNormalVector() noexceptDcel::EdgeT< T >inlineprotected
projectPointToEdge(const Vec3 &a_x0) const noexceptDcel::EdgeT< T >inlineprotected
reconcile() noexceptDcel::EdgeT< T >inline
setFace(const FacePtr &a_face) noexceptDcel::EdgeT< T >inline
setNextEdge(const EdgePtr &a_nextEdge) noexceptDcel::EdgeT< T >inline
setPairEdge(const EdgePtr &a_pairEdge) noexceptDcel::EdgeT< T >inline
setPreviousEdge(const EdgePtr &a_previousEdge) noexceptDcel::EdgeT< T >inline
setVertex(const VertexPtr &a_vertex) noexceptDcel::EdgeT< T >inline
signedDistance(const Vec3 &a_x0) const noexceptDcel::EdgeT< T >inline
unsignedDistance2(const Vec3 &a_x0) const noexceptDcel::EdgeT< T >inline
Vec3 typedefDcel::EdgeT< T >
Vertex typedefDcel::EdgeT< T >
VertexPtr typedefDcel::EdgeT< T >
~EdgeT()Dcel::EdgeT< T >inline
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1EdgeT.html b/docs/doxygen/html/classDcel_1_1EdgeT.html new file mode 100644 index 00000000..aeb287ed --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1EdgeT.html @@ -0,0 +1,1015 @@ + + + + + + + +EBGeometry: Dcel::EdgeT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::EdgeT< T > Class Template Reference
+
+
+ +

Class which represents a half-edge in a double-edge connected list (DCEL). + More...

+ +

#include <EBGeometry_DcelEdge.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Alias to cut down on typing.
 
+using Vertex = VertexT< T >
 Alias to cut down on typing.
 
+using Edge = EdgeT< T >
 Alias to cut down on typing.
 
+using Face = FaceT< T >
 Alias to cut down on typing.
 
+using VertexPtr = std::shared_ptr< Vertex >
 Alias to cut down on typing.
 
+using EdgePtr = std::shared_ptr< Edge >
 Alias to cut down on typing.
 
+using FacePtr = std::shared_ptr< Face >
 Alias to cut down on typing.
 
+using EdgeIterator = EdgeIteratorT< T >
 Alias to cut down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

EdgeT ()
 Default constructor. Sets all pointers to zero and vectors to zero vectors.
 
 EdgeT (const Edge &a_otherEdge)
 Copy constructor. Copies all information from the other half-edge. More...
 
 EdgeT (const VertexPtr &a_vertex)
 Partial constructor. Calls the default constructor but sets the starting vertex. More...
 
~EdgeT ()
 Destructor (does nothing)
 
void define (const VertexPtr &a_vertex, const EdgePtr &a_pairEdge, const EdgePtr &a_nextEdge, const EdgePtr &a_previousEdge, const Vec3 a_normal) noexcept
 Define function. Sets the starting vertex, edges, and normal vectors. More...
 
void setVertex (const VertexPtr &a_vertex) noexcept
 Set the starting vertex. More...
 
void setPairEdge (const EdgePtr &a_pairEdge) noexcept
 Set the pair edge. More...
 
void setNextEdge (const EdgePtr &a_nextEdge) noexcept
 Set the next edge. More...
 
void setPreviousEdge (const EdgePtr &a_previousEdge) noexcept
 Set the previous edge. More...
 
+void setFace (const FacePtr &a_face) noexcept
 Set the pointer to this half-edge's face.
 
+void reconcile () noexcept
 Compute edge normal and edge length (for performance reasons)
 
VertexPtrgetVertex () noexcept
 Get modifiable starting vertex. More...
 
const VertexPtrgetVertex () const noexcept
 Get immutable starting vertex. More...
 
VertexPtrgetOtherVertex () noexcept
 Get modifiable end vertex. More...
 
const VertexPtrgetOtherVertex () const noexcept
 Get immutable end vertex. More...
 
EdgePtrgetPairEdge () noexcept
 Get modifiable pair edge. More...
 
const EdgePtrgetPairEdge () const noexcept
 Get immutable pair edge. More...
 
EdgePtrgetPreviousEdge () noexcept
 Get modifiable previous edge. More...
 
const EdgePtrgetPreviousEdge () const noexcept
 Get immutable previous edge. More...
 
EdgePtrgetNextEdge () noexcept
 Get modifiable next edge. More...
 
const EdgePtrgetNextEdge () const noexcept
 Get immutable next edge. More...
 
+Vec3T< T > & getNormal () noexcept
 Get modifiable half-edge normal vector.
 
+const Vec3T< T > & getNormal () const noexcept
 Get immutable half-edge normal vector.
 
+FacePtrgetFace () noexcept
 Get modifiable half-edge face.
 
+const FacePtrgetFace () const noexcept
 Get immutable half-edge face.
 
signedDistance (const Vec3 &a_x0) const noexcept
 Get the signed distance to this half edge. More...
 
unsignedDistance2 (const Vec3 &a_x0) const noexcept
 Get the signed distance to this half edge. More...
 
+ + + + + + + + + + + + + +

+Protected Member Functions

projectPointToEdge (const Vec3 &a_x0) const noexcept
 Returns the "projection" of a point to an edge. More...
 
+void normalizeNormalVector () noexcept
 Normalize the normal vector, ensuring it has length 1.
 
void computeEdgeLength () noexcept
 Compute the edge length. More...
 
+void computeNormal () noexcept
 Compute normal vector as average of face normals.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

Vec3 m_normal
 Half-edge normal vector. More...
 
+Vec3 m_x2x1
 Vector from the starting vertex to the end vertex. Exists for performance reasons.
 
+T m_invLen2
 Squared inverse edge length. Exists for performance reasons.
 
+VertexPtr m_vertex
 Starting vertex.
 
+EdgePtr m_pairEdge
 Pair edge.
 
+EdgePtr m_previousEdge
 Previous edge.
 
+EdgePtr m_nextEdge
 Next edge.
 
+FacePtr m_face
 Enclosing polygon face.
 
+

Detailed Description

+

template<class T>
+class Dcel::EdgeT< T >

+ +

Class which represents a half-edge in a double-edge connected list (DCEL).

+

This class is used in DCEL functionality which stores polygonal surfaces in a mesh. The information contain in an EdgeT object contains the necessary object for logically circulating the inside of a polygon face. This means that a polygon face has a double-connected list of half-edges which circulate the interior of the face. The EdgeT object is such a half-edge; it represents the outgoing half-edge from a vertex, located such that it can be logically represented as a half edge on the "inside" of a polygon face. It contains pointers to the polygon face, next half edge, and the previous half edge. It also contains a pointer to the "pair" half edge, i.e. the corresponding half-edge on the other face that shares this edge. Since this class is used with DCEL functionality and signed distance fields, this class also has a signed distance function and thus a "normal vector". For numericaly efficiency, some extra storage is also allocated (such as the vector between the starting vertex and the end vertex).

Note
The normal vector is outgoing, i.e. a point x is "outside" if the dot product between n and (x - x0) is positive.
+

Constructor & Destructor Documentation

+ +

◆ EdgeT() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::EdgeT< T >::EdgeT (const Edgea_otherEdge)
+
+inline
+
+ +

Copy constructor. Copies all information from the other half-edge.

+
Parameters
+ + +
[in]a_otherEdgeOther edge
+
+
+ +
+
+ +

◆ EdgeT() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::EdgeT< T >::EdgeT (const VertexPtra_vertex)
+
+inline
+
+ +

Partial constructor. Calls the default constructor but sets the starting vertex.

+
Parameters
+ + +
[in]a_vertexStarting vertex.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ computeEdgeLength()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void Dcel::EdgeT< T >::computeEdgeLength ()
+
+inlineprotectednoexcept
+
+ +

Compute the edge length.

+

This computes the vector m_x2x1 (vector from starting vertex to end vertex) and the inverse length squared.

+ +
+
+ +

◆ define()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Dcel::EdgeT< T >::define (const VertexPtra_vertex,
const EdgePtra_pairEdge,
const EdgePtra_nextEdge,
const EdgePtra_previousEdge,
const Vec3 a_normal 
)
+
+inlinenoexcept
+
+ +

Define function. Sets the starting vertex, edges, and normal vectors.

+
Parameters
+ + + + + + +
[in]a_vertexStarting vertex
[in]a_pairEdgePair half-edge
[in]a_nextEdgeNext half-edge
[in]a_previousEdgePrevious half-edge
[in]a_normalEdge normal vector
+
+
+ +
+
+ +

◆ getNextEdge() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::shared_ptr< EdgeT< T > > & Dcel::EdgeT< T >::getNextEdge ()
+
+inlinenoexcept
+
+ +

Get modifiable next edge.

+
Returns
Returns the next edge
+ +
+
+ +

◆ getNextEdge() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
const std::shared_ptr< EdgeT< T > > & Dcel::EdgeT< T >::getNextEdge () const
+
+inlinenoexcept
+
+ +

Get immutable next edge.

+
Returns
Returns the next edge
+ +
+
+ +

◆ getOtherVertex() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::shared_ptr< VertexT< T > > & Dcel::EdgeT< T >::getOtherVertex ()
+
+inlinenoexcept
+
+ +

Get modifiable end vertex.

+
Returns
Returns the next half-edge's starting vertex
+ +
+
+ +

◆ getOtherVertex() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
const std::shared_ptr< VertexT< T > > & Dcel::EdgeT< T >::getOtherVertex () const
+
+inlinenoexcept
+
+ +

Get immutable end vertex.

+
Returns
Returns the next half-edge's starting vertex
+ +
+
+ +

◆ getPairEdge() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::shared_ptr< EdgeT< T > > & Dcel::EdgeT< T >::getPairEdge ()
+
+inlinenoexcept
+
+ +

Get modifiable pair edge.

+
Returns
Returns the pair edge
+ +
+
+ +

◆ getPairEdge() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
const std::shared_ptr< EdgeT< T > > & Dcel::EdgeT< T >::getPairEdge () const
+
+inlinenoexcept
+
+ +

Get immutable pair edge.

+
Returns
Returns the pair edge
+ +
+
+ +

◆ getPreviousEdge() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::shared_ptr< EdgeT< T > > & Dcel::EdgeT< T >::getPreviousEdge ()
+
+inlinenoexcept
+
+ +

Get modifiable previous edge.

+
Returns
Returns the previous edge
+ +
+
+ +

◆ getPreviousEdge() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
const std::shared_ptr< EdgeT< T > > & Dcel::EdgeT< T >::getPreviousEdge () const
+
+inlinenoexcept
+
+ +

Get immutable previous edge.

+
Returns
Returns the previous edge
+ +
+
+ +

◆ getVertex() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::shared_ptr< VertexT< T > > & Dcel::EdgeT< T >::getVertex ()
+
+inlinenoexcept
+
+ +

Get modifiable starting vertex.

+
Returns
Returns m_vertex
+ +
+
+ +

◆ getVertex() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
const std::shared_ptr< VertexT< T > > & Dcel::EdgeT< T >::getVertex () const
+
+inlinenoexcept
+
+ +

Get immutable starting vertex.

+
Returns
Returns m_vertex
+ +
+
+ +

◆ projectPointToEdge()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::EdgeT< T >::projectPointToEdge (const Vec3a_x0) const
+
+inlineprotectednoexcept
+
+ +

Returns the "projection" of a point to an edge.

+

This function parametrizes the edge as x(t) = x0 + (x1-x0)*t and returns where on the this edge the point a_x0 projects. If projects onto the edge if t = [0,1] and to one of the start/end vertices otherwise.

+ +
+
+ +

◆ setNextEdge()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::EdgeT< T >::setNextEdge (const EdgePtra_nextEdge)
+
+inlinenoexcept
+
+ +

Set the next edge.

+
Parameters
+ + +
[in]a_nextEdgeNext edge
+
+
+ +
+
+ +

◆ setPairEdge()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::EdgeT< T >::setPairEdge (const EdgePtra_pairEdge)
+
+inlinenoexcept
+
+ +

Set the pair edge.

+
Parameters
+ + +
[in]a_pairEdgePair edge
+
+
+ +
+
+ +

◆ setPreviousEdge()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::EdgeT< T >::setPreviousEdge (const EdgePtra_previousEdge)
+
+inlinenoexcept
+
+ +

Set the previous edge.

+
Parameters
+ + +
[in]a_previousEdgePrevious edge
+
+
+ +
+
+ +

◆ setVertex()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::EdgeT< T >::setVertex (const VertexPtra_vertex)
+
+inlinenoexcept
+
+ +

Set the starting vertex.

+
Parameters
+ + +
[in]a_vertexStarting vertex
+
+
+ +
+
+ +

◆ signedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::EdgeT< T >::signedDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the signed distance to this half edge.

+

This routine will check if the input point projects to the edge or one of the vertices. If it projectes to one of the vertices we compute the signed distance to the corresponding vertex. Otherwise we compute the projection to the edge and compute the sign from the normal vector.

+ +
+
+ +

◆ unsignedDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::EdgeT< T >::unsignedDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the signed distance to this half edge.

+

This routine will check if the input point projects to the edge or one of the vertices. If it projectes to one of the vertices we compute the squared distance to the corresponding vertex. Otherwise we compute the squared distance of the projection to the edge. This is faster than signedDistance()

+ +
+
+

Member Data Documentation

+ +

◆ m_normal

+ +
+
+
+template<class T >
+ + + + + +
+ + + + +
Vec3 Dcel::EdgeT< T >::m_normal
+
+protected
+
+ +

Half-edge normal vector.

+

Computed in computeNormal which sets the normal vector to be the average of the normal vector of the connected faces

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1FaceT-members.html b/docs/doxygen/html/classDcel_1_1FaceT-members.html new file mode 100644 index 00000000..c5a890ac --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1FaceT-members.html @@ -0,0 +1,128 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::FaceT< T > Member List
+
+
+ +

This is the complete list of members for Dcel::FaceT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
computeAndStoreEdges() noexceptDcel::FaceT< T >inlineprotected
computeArea() noexceptDcel::FaceT< T >inlineprotected
computeCentroid() noexceptDcel::FaceT< T >inlineprotected
computeNormal() noexceptDcel::FaceT< T >inlineprotected
computePolygon2D() noexceptDcel::FaceT< T >inlineprotected
define(const Vec3 &a_normal, const EdgePtr &a_edge) noexceptDcel::FaceT< T >inline
Edge typedefDcel::FaceT< T >
EdgeIterator typedefDcel::FaceT< T >
EdgePtr typedefDcel::FaceT< T >
Face typedefDcel::FaceT< T >
FacePtr typedefDcel::FaceT< T >
FaceT()Dcel::FaceT< T >inline
FaceT(const EdgePtr &a_edge)Dcel::FaceT< T >inline
FaceT(const Face &a_otherFace)Dcel::FaceT< T >inline
gatherVertices() const noexceptDcel::FaceT< T >inline
getAllVertexCoordinates() const noexceptDcel::FaceT< T >inline
getArea() noexceptDcel::FaceT< T >inlineprotected
getArea() const noexceptDcel::FaceT< T >inlineprotected
getCentroid() noexceptDcel::FaceT< T >inline
getCentroid() const noexceptDcel::FaceT< T >inline
getCentroid(const int a_dir) noexceptDcel::FaceT< T >inline
getCentroid(const int a_dir) const noexceptDcel::FaceT< T >inline
getHalfEdge() noexceptDcel::FaceT< T >inline
getHalfEdge() const noexceptDcel::FaceT< T >inline
getHighestCoordinate() const noexceptDcel::FaceT< T >inline
getNormal() noexceptDcel::FaceT< T >inline
getNormal() const noexceptDcel::FaceT< T >inline
getSmallestCoordinate() const noexceptDcel::FaceT< T >inline
isPointInsideFace(const Vec3 &a_p) const noexceptDcel::FaceT< T >inlineprotected
m_areaDcel::FaceT< T >protected
m_centroidDcel::FaceT< T >protected
m_edgesDcel::FaceT< T >protected
m_halfEdgeDcel::FaceT< T >protected
m_normalDcel::FaceT< T >protected
m_poly2Dcel::FaceT< T >protected
m_poly2AlgorithmDcel::FaceT< T >protected
normalizeNormalVector() noexceptDcel::FaceT< T >inlineprotected
projectPointIntoFacePlane(const Vec3 &a_p) const noexceptDcel::FaceT< T >inlineprotected
reconcile() noexceptDcel::FaceT< T >inline
setHalfEdge(const EdgePtr &a_halfEdge) noexceptDcel::FaceT< T >inline
setInsideOutsideAlgorithm(typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm &a_algorithm) noexceptDcel::FaceT< T >inline
signedDistance(const Vec3 &a_x0) const noexceptDcel::FaceT< T >inline
unsignedDistance2(const Vec3 &a_x0) const noexceptDcel::FaceT< T >inline
Vec3 typedefDcel::FaceT< T >
Vertex typedefDcel::FaceT< T >
VertexPtr typedefDcel::FaceT< T >
~FaceT()Dcel::FaceT< T >inline
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1FaceT.html b/docs/doxygen/html/classDcel_1_1FaceT.html new file mode 100644 index 00000000..715f2bf1 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1FaceT.html @@ -0,0 +1,785 @@ + + + + + + + +EBGeometry: Dcel::FaceT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::FaceT< T > Class Template Reference
+
+
+ +

Class which represents a polygon face in a double-edge connected list (DCEL). + More...

+ +

#include <EBGeometry_DcelFace.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Alias to cut down on typing.
 
+using Vertex = VertexT< T >
 Alias to cut down on typing.
 
+using Edge = EdgeT< T >
 Alias to cut down on typing.
 
+using Face = FaceT< T >
 Alias to cut down on typing.
 
+using VertexPtr = std::shared_ptr< Vertex >
 Alias to cut down on typing.
 
+using EdgePtr = std::shared_ptr< Edge >
 Alias to cut down on typing.
 
+using FacePtr = std::shared_ptr< Face >
 Alias to cut down on typing.
 
+using EdgeIterator = EdgeIteratorT< T >
 Alias to cut down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

FaceT ()
 Default constructor. Sets the half-edge to zero and the inside/outside algorithm to crossing number algorithm.
 
 FaceT (const EdgePtr &a_edge)
 Partial constructor. Calls default constructor but associates a half-edge. More...
 
 FaceT (const Face &a_otherFace)
 Partial constructor. More...
 
~FaceT ()
 Destructor (does nothing)
 
void define (const Vec3 &a_normal, const EdgePtr &a_edge) noexcept
 Define function which sets the normal vector and half-edge. More...
 
void reconcile () noexcept
 Reconcile face. This will compute the normal vector, area, centroid, and the 2D embedding of the polygon. More...
 
void setHalfEdge (const EdgePtr &a_halfEdge) noexcept
 Set the half edge. More...
 
void setInsideOutsideAlgorithm (typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm &a_algorithm) noexcept
 Set the inside/outside algorithm when determining if a point projects to the inside or outside of the polygon. More...
 
+EdgePtrgetHalfEdge () noexcept
 Get modifiable half-edge.
 
+const EdgePtrgetHalfEdge () const noexcept
 Get immutable half-edge.
 
+Vec3T< T > & getCentroid () noexcept
 Get modifiable centroid.
 
+const Vec3T< T > & getCentroid () const noexcept
 Get immutable centroid.
 
T & getCentroid (const int a_dir) noexcept
 Get modifiable centroid position in specified coordinate direction. More...
 
const T & getCentroid (const int a_dir) const noexcept
 Get immutable centroid position in specified coordinate direction. More...
 
+Vec3T< T > & getNormal () noexcept
 Get modifiable normal vector.
 
+const Vec3T< T > & getNormal () const noexcept
 Get immutable normal vector.
 
signedDistance (const Vec3 &a_x0) const noexcept
 Compute the signed distance to a point. More...
 
unsignedDistance2 (const Vec3 &a_x0) const noexcept
 Compute the unsigned squared distance to a point. More...
 
std::vector< Vec3T< T > > getAllVertexCoordinates () const noexcept
 Return the coordinates of all the vertices on this polygon. More...
 
std::vector< VertexPtrgatherVertices () const noexcept
 Return all the vertices on this polygon. More...
 
+Vec3T< T > getSmallestCoordinate () const noexcept
 Get the lower-left-most coordinate of this polygon face.
 
+Vec3T< T > getHighestCoordinate () const noexcept
 Get the upper-right-most coordinate of this polygon face.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

+void computeArea () noexcept
 Compute the area of this polygon.
 
+void computeCentroid () noexcept
 Compute the centroid position of this polygon.
 
+void computeNormal () noexcept
 Compute the normal position of this polygon.
 
+void computePolygon2D () noexcept
 Compute the 2D embedding of this polygon.
 
+void normalizeNormalVector () noexcept
 Normalize the normal vector, ensuring it has a length of 1.
 
+T getArea () noexcept
 Get the area of this polygon face.
 
+T getArea () const noexcept
 Get the area of this polygon face.
 
+void computeAndStoreEdges () noexcept
 Compute and store all the half-edges around this polygon face.
 
Vec3T< T > projectPointIntoFacePlane (const Vec3 &a_p) const noexcept
 Compute the projection of a point onto the polygon face plane. More...
 
bool isPointInsideFace (const Vec3 &a_p) const noexcept
 Check if a point projects to inside or outside the polygon face. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

+EdgePtr m_halfEdge
 This polygon's half-edge. A valid face will always have != nullptr.
 
+std::vector< EdgePtrm_edges
 Pointers to all the half-edges of this face. Exists for performance reasons (in signedDistance(...))
 
+T m_area
 Polygon face area.
 
+Vec3 m_normal
 Polygon face normal vector.
 
+Vec3 m_centroid
 Polygon face centroid position.
 
+std::shared_ptr< Polygon2D< T > > m_poly2
 2D embedding of this polygon. This is the 2D view of the current object projected along its normal vector cardinal.
 
+Polygon2D< T >::InsideOutsideAlgorithm m_poly2Algorithm
 Algorithm for inside/outside tests.
 
+

Detailed Description

+

template<class T>
+class Dcel::FaceT< T >

+ +

Class which represents a polygon face in a double-edge connected list (DCEL).

+

This class is a polygon face in a DCEL mesh. It contains pointer storage to one of the half-edges that circulate the inside of the polygon face, as well as having a normal vector, a centroid, and an area. This class supports signed distance computations. These computations require algorithms that compute e.g. the winding number of the polygon, or the number of times a ray cast passes through it. Thus, one of its central features is that it can be embedded in 2D by projecting it along the cardinal direction of its normal vector. To be fully consistent with a DCEL structure the class stores a reference to one of its half edges, but for performance reasons it also stores references to the other half edges.

Note
To compute the distance from a point to the face one must determine if the point projects "inside" or "outside" the polygon. There are several algorithms for this, and by default this class uses a crossing number algorithm. Other algorithms can be set in setInsideOutsideAlgorithm (see CD_DcelAlgorithms.H)
+

Constructor & Destructor Documentation

+ +

◆ FaceT() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::FaceT< T >::FaceT (const EdgePtra_edge)
+
+inline
+
+ +

Partial constructor. Calls default constructor but associates a half-edge.

+
Parameters
+ + +
[in]a_edgeHalf-edge
+
+
+ +
+
+ +

◆ FaceT() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::FaceT< T >::FaceT (const Facea_otherFace)
+
+inline
+
+ +

Partial constructor.

+

Calls default constructor but sets the normal vector and half-edge equal to the other face's (rest is undefined)

+ +
+
+

Member Function Documentation

+ +

◆ define()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Dcel::FaceT< T >::define (const Vec3a_normal,
const EdgePtra_edge 
)
+
+inlinenoexcept
+
+ +

Define function which sets the normal vector and half-edge.

+
Parameters
+ + + +
[in]a_normalNormal vector
[in]a_edgeHalf edge
+
+
+ +
+
+ +

◆ gatherVertices()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::vector< std::shared_ptr< VertexT< T > > > Dcel::FaceT< T >::gatherVertices () const
+
+inlinenoexcept
+
+ +

Return all the vertices on this polygon.

+

This builds a list of all the vertices and returns it.

+ +
+
+ +

◆ getAllVertexCoordinates()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
std::vector< Vec3T< T > > Dcel::FaceT< T >::getAllVertexCoordinates () const
+
+inlinenoexcept
+
+ +

Return the coordinates of all the vertices on this polygon.

+

This builds a list of all the vertex coordinates and returns it.

+ +
+
+ +

◆ getCentroid() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T & Dcel::FaceT< T >::getCentroid (const int a_dir)
+
+inlinenoexcept
+
+ +

Get modifiable centroid position in specified coordinate direction.

+
Parameters
+ + +
[in]a_dirCoordinate direction
+
+
+ +
+
+ +

◆ getCentroid() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
const T & Dcel::FaceT< T >::getCentroid (const int a_dir) const
+
+inlinenoexcept
+
+ +

Get immutable centroid position in specified coordinate direction.

+
Parameters
+ + +
[in]a_dirCoordinate direction
+
+
+ +
+
+ +

◆ isPointInsideFace()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Dcel::FaceT< T >::isPointInsideFace (const Vec3a_p) const
+
+inlineprotectednoexcept
+
+ +

Check if a point projects to inside or outside the polygon face.

+
Parameters
+ + +
[in]a_pPoint in space
+
+
+
Returns
Returns true if a_p projects to inside the polygon and false otherwise.
+ +
+
+ +

◆ projectPointIntoFacePlane()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Dcel::FaceT< T >::projectPointIntoFacePlane (const Vec3a_p) const
+
+inlineprotectednoexcept
+
+ +

Compute the projection of a point onto the polygon face plane.

+
Parameters
+ + +
[in]a_pPoint in space
+
+
+ +
+
+ +

◆ reconcile()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void Dcel::FaceT< T >::reconcile ()
+
+inlinenoexcept
+
+ +

Reconcile face. This will compute the normal vector, area, centroid, and the 2D embedding of the polygon.

+
Note
"Everything" must be set before doing this, i.e. the face must be complete with half edges and there can be no dangling edges.
+ +
+
+ +

◆ setHalfEdge()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::FaceT< T >::setHalfEdge (const EdgePtra_halfEdge)
+
+inlinenoexcept
+
+ +

Set the half edge.

+
Parameters
+ + +
[in]a_halfEdgeHalf edge
+
+
+ +
+
+ +

◆ setInsideOutsideAlgorithm()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::FaceT< T >::setInsideOutsideAlgorithm (typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm & a_algorithm)
+
+inlinenoexcept
+
+ +

Set the inside/outside algorithm when determining if a point projects to the inside or outside of the polygon.

+
Parameters
+ + +
[in]a_algorithmDesired algorithm
+
+
+
Note
See CD_DcelAlgorithms.H for options (and CD_DcelPolyImplem.H for how the algorithms operate).
+ +
+
+ +

◆ signedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::FaceT< T >::signedDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Compute the signed distance to a point.

+
Parameters
+ + +
[in]a_x0Point in space
+
+
+

This algorithm operates by checking if the input point projects to the inside of the polygon. If it does then the distance is just the projected distance onto the polygon plane and the sign is well-defined. Otherwise, we check the distance to the edges of the polygon.

+ +
+
+ +

◆ unsignedDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::FaceT< T >::unsignedDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Compute the unsigned squared distance to a point.

+
Parameters
+ + +
[in]a_x0Point in space
+
+
+

This algorithm operates by checking if the input point projects to the inside of the polygon. If it does then the distance is just the projected distance onto the polygon plane. Otherwise, we check the distance to the edges of the polygon.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1MeshT-members.html b/docs/doxygen/html/classDcel_1_1MeshT-members.html new file mode 100644 index 00000000..278ae18e --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1MeshT-members.html @@ -0,0 +1,120 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::MeshT< T > Member List
+
+
+ +

This is the complete list of members for Dcel::MeshT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
define(std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices) noexceptDcel::MeshT< T >inline
DirectSignedDistance(const Vec3 &a_point) const noexceptDcel::MeshT< T >inlineprotected
DirectSignedDistance2(const Vec3 &a_point) const noexceptDcel::MeshT< T >inlineprotected
Edge typedefDcel::MeshT< T >
EdgePtr typedefDcel::MeshT< T >
Face typedefDcel::MeshT< T >
FacePtr typedefDcel::MeshT< T >
getAllVertexCoordinates() const noexceptDcel::MeshT< T >inlineprotected
getEdges() noexceptDcel::MeshT< T >inline
getEdges() const noexceptDcel::MeshT< T >inline
getFaces() noexceptDcel::MeshT< T >inline
getFaces() const noexceptDcel::MeshT< T >inline
getVertices() noexceptDcel::MeshT< T >inline
getVertices() const noexceptDcel::MeshT< T >inline
incrementWarning(std::map< std::string, int > &a_warnings, const std::string &a_warn) const noexceptDcel::MeshT< T >inlineprotected
m_algorithmDcel::MeshT< T >protected
m_edgesDcel::MeshT< T >protected
m_facesDcel::MeshT< T >protected
m_verticesDcel::MeshT< T >protected
Mesh typedefDcel::MeshT< T >
MeshT()Dcel::MeshT< T >inline
MeshT(const Mesh &a_otherMesh)=deleteDcel::MeshT< T >
MeshT(std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices)Dcel::MeshT< T >inline
printWarnings(const std::map< std::string, int > &a_warnings) const noexceptDcel::MeshT< T >inlineprotected
reconcile(typename Dcel::MeshT< T >::VertexNormalWeight a_weight=VertexNormalWeight::Angle) noexceptDcel::MeshT< T >inline
reconcileEdges() noexceptDcel::MeshT< T >inlineprotected
reconcileFaces() noexceptDcel::MeshT< T >inlineprotected
reconcileVertices(typename Dcel::MeshT< T >::VertexNormalWeight a_weight) noexceptDcel::MeshT< T >inlineprotected
sanityCheck() const noexceptDcel::MeshT< T >inline
SearchAlgorithm enum nameDcel::MeshT< T >
setInsideOutsideAlgorithm(typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm a_algorithm) noexceptDcel::MeshT< T >inline
setSearchAlgorithm(const SearchAlgorithm a_algorithm) noexceptDcel::MeshT< T >inline
signedDistance(const Vec3 &a_x0) const noexceptDcel::MeshT< T >inline
signedDistance(const Vec3 &a_x0, SearchAlgorithm a_algorithm) const noexceptDcel::MeshT< T >inline
Vec3 typedefDcel::MeshT< T >
Vertex typedefDcel::MeshT< T >
VertexNormalWeight enum nameDcel::MeshT< T >
VertexPtr typedefDcel::MeshT< T >
~MeshT()Dcel::MeshT< T >inline
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1MeshT.html b/docs/doxygen/html/classDcel_1_1MeshT.html new file mode 100644 index 00000000..b5182047 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1MeshT.html @@ -0,0 +1,871 @@ + + + + + + + +EBGeometry: Dcel::MeshT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::MeshT< T > Class Template Reference
+
+
+ +

Mesh class which stores a full DCEL mesh (with signed distance functions) + More...

+ +

#include <EBGeometry_DcelMesh.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

enum  SearchAlgorithm { Direct, +Direct2 + }
 Possible search algorithms for Dcel::MeshT. More...
 
enum  VertexNormalWeight { None, +Angle + }
 How to weight vertex normal.
 
+using Vec3 = Vec3T< T >
 Alias to cut down on the typing.
 
+using Vertex = VertexT< T >
 Alias to cut down on the typing.
 
+using Edge = EdgeT< T >
 Alias to cut down on the typing.
 
+using Face = FaceT< T >
 Alias to cut down on the typing.
 
+using VertexPtr = std::shared_ptr< Vertex >
 Alias to cut down on the typing.
 
+using EdgePtr = std::shared_ptr< Edge >
 Alias to cut down on the typing.
 
+using FacePtr = std::shared_ptr< Face >
 Alias to cut down on the typing.
 
+using Mesh = MeshT< T >
 Alias to cut down on the typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

MeshT ()
 Default constructor. Leaves unobject in an unusable state.
 
 MeshT (const Mesh &a_otherMesh)=delete
 Disallowed copy construction. More...
 
 MeshT (std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices)
 Full constructor. This provides the faces, edges, and vertices to the mesh. More...
 
~MeshT ()
 Destructor (does nothing)
 
void define (std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices) noexcept
 Define function. Puts Mesh in usable state. More...
 
void sanityCheck () const noexcept
 Perform a sanity check. More...
 
void setSearchAlgorithm (const SearchAlgorithm a_algorithm) noexcept
 Search algorithm for direct signed distance computations. More...
 
void setInsideOutsideAlgorithm (typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm a_algorithm) noexcept
 Set the inside/outside algorithm to use when computing the signed distance to polygon faces. More...
 
void reconcile (typename Dcel::MeshT< T >::VertexNormalWeight a_weight=VertexNormalWeight::Angle) noexcept
 Reconcile function which computes the internal parameters in vertices, edges, and faces for use with signed distance functionality. More...
 
+std::vector< VertexPtr > & getVertices () noexcept
 Get modifiable vertices in this mesh.
 
+const std::vector< VertexPtr > & getVertices () const noexcept
 Get immutable vertices in this mesh.
 
+std::vector< EdgePtr > & getEdges () noexcept
 Get modifiable half-edges in this mesh.
 
+const std::vector< EdgePtr > & getEdges () const noexcept
 Get immutable half-edges in this mesh.
 
+std::vector< FacePtr > & getFaces () noexcept
 Get modifiable faces in this mesh.
 
+const std::vector< FacePtr > & getFaces () const noexcept
 Get immutable faces in this mesh.
 
signedDistance (const Vec3 &a_x0) const noexcept
 Compute the signed distance from a point to this mesh. More...
 
signedDistance (const Vec3 &a_x0, SearchAlgorithm a_algorithm) const noexcept
 Compute the signed distance from a point to this mesh. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

+std::vector< Vec3T< T > > getAllVertexCoordinates () const noexcept
 Return all vertex coordinates in the mesh.
 
void reconcileFaces () noexcept
 Function which computes internal things for the polygon faces. More...
 
void reconcileEdges () noexcept
 Function which computes internal things for the half-edges. More...
 
void reconcileVertices (typename Dcel::MeshT< T >::VertexNormalWeight a_weight) noexcept
 Function which computes internal things for the vertices. More...
 
DirectSignedDistance (const Vec3 &a_point) const noexcept
 Implementation of signed distance function which iterates through all faces. More...
 
DirectSignedDistance2 (const Vec3 &a_point) const noexcept
 Implementation of squared signed distance function which iterates through all faces. More...
 
void incrementWarning (std::map< std::string, int > &a_warnings, const std::string &a_warn) const noexcept
 Increment a warning. This is used in sanityCheck() for locating holes or bad inputs in the mesh. More...
 
+void printWarnings (const std::map< std::string, int > &a_warnings) const noexcept
 Print all warnings to std::cerr.
 
+ + + + + + + + + + + + + +

+Protected Attributes

+SearchAlgorithm m_algorithm
 Search algorithm. Only used in signed distance functions.
 
+std::vector< VertexPtrm_vertices
 Mesh vertices.
 
+std::vector< EdgePtrm_edges
 Mesh half-edges.
 
+std::vector< FacePtrm_faces
 Mesh faces.
 
+

Detailed Description

+

template<class T>
+class Dcel::MeshT< T >

+ +

Mesh class which stores a full DCEL mesh (with signed distance functions)

+

This encapsulates a full DCEL mesh, and also includes DIRECT signed distance functions. The mesh consists of a set of vertices, half-edges, and polygon faces who each have references to other vertices, half-edges, and polygon faces. The signed distance functions DIRECT, which means that they go through ALL of the polygon faces and compute the signed distance to them. This is extremely inefficient, which is why this class is almost always embedded into a bounding volume hierarchy.

Note
This class is not for the light of heart – it will almost always be instantiated through a file parser which reads vertices and edges from file and builds the mesh from that. Do not try to build a MeshT object yourself, use file parsers!
+

Member Enumeration Documentation

+ +

◆ SearchAlgorithm

+ +
+
+
+template<class T>
+ + + + + +
+ + + + +
enum Dcel::MeshT::SearchAlgorithm
+
+strong
+
+ +

Possible search algorithms for Dcel::MeshT.

+

Direct means compute the signed distance for all primitives, Direct2 means compute the squared signed distance for all primitives.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ MeshT() [1/2]

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
Dcel::MeshT< T >::MeshT (const Mesha_otherMesh)
+
+delete
+
+ +

Disallowed copy construction.

+
Parameters
+ + +
[in]a_otherMeshOther mesh
+
+
+ +
+
+ +

◆ MeshT() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Dcel::MeshT< T >::MeshT (std::vector< FacePtr > & a_faces,
std::vector< EdgePtr > & a_edges,
std::vector< VertexPtr > & a_vertices 
)
+
+inline
+
+ +

Full constructor. This provides the faces, edges, and vertices to the mesh.

+

Calls define(a_faces, a_edges, a_vertices)

Parameters
+ + + + +
[in]a_facesPolygon faces
[in]a_edgesHalf-edges
[in]a_verticesVertices
+
+
+
Note
The constructor arguments should provide a complete DCEL mesh description. This is usually done through a file parser which reads a mesh file format and creates the DCEL mesh structure
+ +
+
+

Member Function Documentation

+ +

◆ define()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Dcel::MeshT< T >::define (std::vector< FacePtr > & a_faces,
std::vector< EdgePtr > & a_edges,
std::vector< VertexPtr > & a_vertices 
)
+
+inlinenoexcept
+
+ +

Define function. Puts Mesh in usable state.

+
Parameters
+ + + + +
[in]a_facesPolygon faces
[in]a_edgesHalf-edges
[in]a_verticesVertices
+
+
+
Note
The function arguments should provide a complete DCEL mesh description. This is usually done through a file parser which reads a mesh file format and creates the DCEL mesh structure. Note that this only involves associating pointer structures through the mesh. Internal parameters like face area and normal is computed in MeshT<T>::reconcile.
+ +
+
+ +

◆ DirectSignedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::MeshT< T >::DirectSignedDistance (const Vec3a_point) const
+
+inlineprotectednoexcept
+
+ +

Implementation of signed distance function which iterates through all faces.

+
Parameters
+ + +
[in]a_point3D point
+
+
+ +
+
+ +

◆ DirectSignedDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::MeshT< T >::DirectSignedDistance2 (const Vec3a_point) const
+
+inlineprotectednoexcept
+
+ +

Implementation of squared signed distance function which iterates through all faces.

+

This first find the face with the smallest unsigned square distance, and the returns the signed distance to that face (more efficient than the other version).

Parameters
+ + +
[in]a_point3D point
+
+
+ +
+
+ +

◆ incrementWarning()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Dcel::MeshT< T >::incrementWarning (std::map< std::string, int > & a_warnings,
const std::string & a_warn 
) const
+
+inlineprotectednoexcept
+
+ +

Increment a warning. This is used in sanityCheck() for locating holes or bad inputs in the mesh.

+
Parameters
+ + + +
[in]a_warningsMap of all registered warnings
[in]a_warnCurrent warning to increment by
+
+
+ +
+
+ +

◆ reconcile()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::MeshT< T >::reconcile (typename Dcel::MeshT< T >::VertexNormalWeight a_weight = VertexNormalWeight::Angle)
+
+inlinenoexcept
+
+ +

Reconcile function which computes the internal parameters in vertices, edges, and faces for use with signed distance functionality.

+
Parameters
+ + +
[in]a_weightVertex angle weighting function. Either VertexNormalWeight::None for unweighted vertex normals or VertexNormalWeight::Angle for the pseudonormal
+
+
+

This will reconcile faces, edges, and vertices, e.g. computing the area and normal vector for faces

+ +
+
+ +

◆ reconcileEdges()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void Dcel::MeshT< T >::reconcileEdges ()
+
+inlineprotectednoexcept
+
+ +

Function which computes internal things for the half-edges.

+
Note
This calls Dcel::EdgeT<T>::reconcile()
+ +
+
+ +

◆ reconcileFaces()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void Dcel::MeshT< T >::reconcileFaces ()
+
+inlineprotectednoexcept
+
+ +

Function which computes internal things for the polygon faces.

+
Note
This calls Dcel::FaceT<T>::reconcile()
+ +
+
+ +

◆ reconcileVertices()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::MeshT< T >::reconcileVertices (typename Dcel::MeshT< T >::VertexNormalWeight a_weight)
+
+inlineprotectednoexcept
+
+ +

Function which computes internal things for the vertices.

+
Parameters
+ + +
[in]a_weightVertex angle weighting
+
+
+
Note
This calls Dcel::VertexT<T>::computeVertexNormalAverage() or Dcel::VertexT<T>::computeVertexNormalAngleWeighted()
+ +
+
+ +

◆ sanityCheck()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void Dcel::MeshT< T >::sanityCheck () const
+
+inlinenoexcept
+
+ +

Perform a sanity check.

+

This will provide error messages if vertices are badly linked, faces are nullptr, and so on. These messages are logged by calling incrementWarning() which identifies types of errors that can occur, and how many of those errors have occured.

+ +
+
+ +

◆ setInsideOutsideAlgorithm()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::MeshT< T >::setInsideOutsideAlgorithm (typename Dcel::Polygon2D< T >::InsideOutsideAlgorithm a_algorithm)
+
+inlinenoexcept
+
+ +

Set the inside/outside algorithm to use when computing the signed distance to polygon faces.

+

Computing the signed distance to faces requires testing if a point projected to a polygo face plane falls inside or outside the polygon face. There are multiple algorithms to use here.

Parameters
+ + +
[in]a_algorithmAlgorithm to use
+
+
+ +
+
+ +

◆ setSearchAlgorithm()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::MeshT< T >::setSearchAlgorithm (const SearchAlgorithm a_algorithm)
+
+inlinenoexcept
+
+ +

Search algorithm for direct signed distance computations.

+
Parameters
+ + +
[in]a_algorithmAlgorithm to use
+
+
+ +
+
+ +

◆ signedDistance() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::MeshT< T >::signedDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Compute the signed distance from a point to this mesh.

+
Parameters
+ + +
[in]a_x03D point in space.
+
+
+

This function will iterate through ALL faces in the mesh and return the value with the smallest magnitude. This is horrendously slow, which is why this function is almost never called. Rather, MeshT<T> can be embedded in a bounding volume hierarchy for faster access.

Note
This will call the other version with the object's search algorithm.
+ +
+
+ +

◆ signedDistance() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T Dcel::MeshT< T >::signedDistance (const Vec3a_x0,
SearchAlgorithm a_algorithm 
) const
+
+inlinenoexcept
+
+ +

Compute the signed distance from a point to this mesh.

+
Parameters
+ + + +
[in]a_x03D point in space.
[in]a_algorithmSearch algorithm
+
+
+

This function will iterate through ALL faces in the mesh and return the value with the smallest magnitude. This is horrendously slow, which is why this function is almost never called. Rather, MeshT<T> can be embedded in a bounding volume hierarchy for faster access.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1Parser_1_1PLY-members.html b/docs/doxygen/html/classDcel_1_1Parser_1_1PLY-members.html new file mode 100644 index 00000000..6d8d9ffc --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1Parser_1_1PLY-members.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::Parser::PLY< T > Member List
+
+
+ +

This is the complete list of members for Dcel::Parser::PLY< T >, including all inherited members.

+ + + + + + + + + + + + +
Edge typedefDcel::Parser::PLY< T >
EdgeIterator typedefDcel::Parser::PLY< T >
Face typedefDcel::Parser::PLY< T >
Mesh typedefDcel::Parser::PLY< T >
readASCII(const std::string a_filename)Dcel::Parser::PLY< T >inlinestatic
readASCII(Mesh &a_mesh, const std::string a_filename)Dcel::Parser::PLY< T >inlinestatic
readFacesASCII(std::vector< std::shared_ptr< Face > > &a_faces, std::vector< std::shared_ptr< Edge > > &a_edges, const std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numFaces, std::ifstream &a_inputStream)Dcel::Parser::PLY< T >inlineprotectedstatic
readHeaderASCII(int &a_numVertices, int &a_numFaces, std::ifstream &a_inputStream)Dcel::Parser::PLY< T >inlineprotectedstatic
readVerticesASCII(std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numVertices, std::ifstream &a_inputStream)Dcel::Parser::PLY< T >inlineprotectedstatic
reconcilePairEdges(std::vector< std::shared_ptr< Edge > > &a_edges)Dcel::Parser::PLY< T >inlineprotectedstatic
Vertex typedefDcel::Parser::PLY< T >
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1Parser_1_1PLY.html b/docs/doxygen/html/classDcel_1_1Parser_1_1PLY.html new file mode 100644 index 00000000..ce5a7fb9 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1Parser_1_1PLY.html @@ -0,0 +1,444 @@ + + + + + + + +EBGeometry: Dcel::Parser::PLY< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::Parser::PLY< T > Class Template Reference
+
+
+ +

Class for generation a Dcel::MeshT<T> from the Stanford PLY file format. + More...

+ +

#include <EBGeometry_DcelParser.hpp>

+ + + + + + + + + + + + + + + + + +

+Public Types

+using Vertex = VertexT< T >
 Alias for cutting down on typing.
 
+using Edge = EdgeT< T >
 Alias for cutting down on typing.
 
+using Face = FaceT< T >
 Alias for cutting down on typing.
 
+using Mesh = MeshT< T >
 Alias for cutting down on typing.
 
+using EdgeIterator = EdgeIteratorT< T >
 Alias for cutting down on typing.
 
+ + + + + + + +

+Static Public Member Functions

static std::shared_ptr< MeshreadASCII (const std::string a_filename)
 Static function which reads an ASCII .ply file and returns a DCEL mesh. More...
 
static void readASCII (Mesh &a_mesh, const std::string a_filename)
 Static function which reads an ASCII .ply file and puts it in a mesh. More...
 
+ + + + + + + + + + + + + +

+Static Protected Member Functions

static void readHeaderASCII (int &a_numVertices, int &a_numFaces, std::ifstream &a_inputStream)
 Read an ASCII header. More...
 
static void readVerticesASCII (std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numVertices, std::ifstream &a_inputStream)
 Read ASCII vertices. More...
 
static void readFacesASCII (std::vector< std::shared_ptr< Face > > &a_faces, std::vector< std::shared_ptr< Edge > > &a_edges, const std::vector< std::shared_ptr< Vertex > > &a_vertices, const int a_numFaces, std::ifstream &a_inputStream)
 Read ASCII faces and create mesh connectivity. More...
 
static void reconcilePairEdges (std::vector< std::shared_ptr< Edge > > &a_edges)
 Reconcile pair edges, i.e. find the pair edge for every constructed half-edge. More...
 
+

Detailed Description

+

template<class T>
+class Dcel::Parser::PLY< T >

+ +

Class for generation a Dcel::MeshT<T> from the Stanford PLY file format.

+
Note
T is the precision used for storing the mesh.
+

Member Function Documentation

+ +

◆ readASCII() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
std::shared_ptr< EBGeometry::Dcel::MeshT< T > > Dcel::Parser::PLY< T >::readASCII (const std::string a_filename)
+
+inlinestatic
+
+ +

Static function which reads an ASCII .ply file and returns a DCEL mesh.

+
Parameters
+ + +
[in]a_filenameFile name
+
+
+ +
+
+ +

◆ readASCII() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Dcel::Parser::PLY< T >::readASCII (Mesha_mesh,
const std::string a_filename 
)
+
+inlinestatic
+
+ +

Static function which reads an ASCII .ply file and puts it in a mesh.

+
Parameters
+ + + +
[out]a_meshDCEL mesh
[in]a_filenameFile name
+
+
+ +
+
+ +

◆ readFacesASCII()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Dcel::Parser::PLY< T >::readFacesASCII (std::vector< std::shared_ptr< Face > > & a_faces,
std::vector< std::shared_ptr< Edge > > & a_edges,
const std::vector< std::shared_ptr< Vertex > > & a_vertices,
const int a_numFaces,
std::ifstream & a_inputStream 
)
+
+inlinestaticprotected
+
+ +

Read ASCII faces and create mesh connectivity.

+
Parameters
+ + + + + + +
[out]a_facesDCEL faces. Constructured in this routine.
[out]a_edgesDCEL edges. Constructured in this routine.
[out]a_verticesDCEL edges. Constructured in readVerticesASCII.
[in]a_numFacesTotal number of faces in mesh.
[in,out]a_inputStreamInput stream
+
+
+
Note
The next getline() from inputStream must read the first face, i.e. we assume that read_ascii_vertices was called IMMEDIATELY before this function. That function will center the fstream on the correct line in the input file.
+ +
+
+ +

◆ readHeaderASCII()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Dcel::Parser::PLY< T >::readHeaderASCII (int & a_numVertices,
int & a_numFaces,
std::ifstream & a_inputStream 
)
+
+inlinestaticprotected
+
+ +

Read an ASCII header.

+

This reads the number of vertices and faces in the PLY file. Note that it only reads the header.

Parameters
+ + + + +
[out]a_numVerticesNumber of vertices
[out]a_numFacesNumber of faces
[in,out]a_inputStreamFile stream. On output, the filestream is at the end of the PLY header.
+
+
+ +
+
+ +

◆ readVerticesASCII()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Dcel::Parser::PLY< T >::readVerticesASCII (std::vector< std::shared_ptr< Vertex > > & a_vertices,
const int a_numVertices,
std::ifstream & a_inputStream 
)
+
+inlinestaticprotected
+
+ +

Read ASCII vertices.

+
Parameters
+ + + + +
[out]a_verticesDCEL vertices. These are constructed in this routine.
[in]a_numVerticesNumber of vertices to read
[in]a_inputStreamInput file stream.
+
+
+
Note
The next getline() from a_inputStream must read the first vertex (i.e. don't rewind the stream before entering this routine)
+ +
+
+ +

◆ reconcilePairEdges()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::Parser::PLY< T >::reconcilePairEdges (std::vector< std::shared_ptr< Edge > > & a_edges)
+
+inlinestaticprotected
+
+ +

Reconcile pair edges, i.e. find the pair edge for every constructed half-edge.

+
Parameters
+ + +
[in,out]a_edgesHalf edges.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1Polygon2D-members.html b/docs/doxygen/html/classDcel_1_1Polygon2D-members.html new file mode 100644 index 00000000..ffd30713 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1Polygon2D-members.html @@ -0,0 +1,91 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::Polygon2D< T > Member List
+
+
+ +

This is the complete list of members for Dcel::Polygon2D< T >, including all inherited members.

+ + + + + + + + + + + +
InsideOutsideAlgorithm enum nameDcel::Polygon2D< T >
isPointInside(const Vec3 &a_point, const InsideOutsideAlgorithm a_algorithm) const noexceptDcel::Polygon2D< T >inline
isPointInsidePolygonCrossingNumber(const Vec3 &a_point) const noexceptDcel::Polygon2D< T >inline
isPointInsidePolygonSubtend(const Vec3 &a_point) const noexceptDcel::Polygon2D< T >inline
isPointInsidePolygonWindingNumber(const Vec3 &a_point) const noexceptDcel::Polygon2D< T >inline
Polygon2D()=deleteDcel::Polygon2D< T >
Polygon2D(const Vec3 &a_normal, const std::vector< Vec3 > &a_points)Dcel::Polygon2D< T >inline
Vec2 typedefDcel::Polygon2D< T >
Vec3 typedefDcel::Polygon2D< T >
~Polygon2D()=defaultDcel::Polygon2D< T >
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1Polygon2D.html b/docs/doxygen/html/classDcel_1_1Polygon2D.html new file mode 100644 index 00000000..5afeb35d --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1Polygon2D.html @@ -0,0 +1,350 @@ + + + + + + + +EBGeometry: Dcel::Polygon2D< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::Polygon2D< T > Class Template Reference
+
+
+ +

Class for embedding a DCEL polygon face into 2D. + More...

+ +

#include <EBGeometry_DcelPolygon2D.hpp>

+ + + + + + + + + + + +

+Public Types

enum  InsideOutsideAlgorithm { SubtendedAngle, +CrossingNumber, +WindingNumber + }
 Supported algorithms for performing inside/outside tests when checking if a point projects to the inside or outside of a polygon face.
 
+using Vec2 = Vec2T< T >
 Alias to cut down on typing.
 
+using Vec3 = Vec3T< T >
 Alias to cut down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Polygon2D ()=delete
 Disallowed constructor, use the one with the normal vector and points.
 
 Polygon2D (const Vec3 &a_normal, const std::vector< Vec3 > &a_points)
 Full constructor. More...
 
~Polygon2D ()=default
 Destructor (does nothing.
 
bool isPointInside (const Vec3 &a_point, const InsideOutsideAlgorithm a_algorithm) const noexcept
 Check if a point is inside or outside the 2D polygon. More...
 
bool isPointInsidePolygonWindingNumber (const Vec3 &a_point) const noexcept
 Check if a point is inside a 2D polygon, using the winding number algorithm. More...
 
bool isPointInsidePolygonSubtend (const Vec3 &a_point) const noexcept
 Check if a point is inside a 2D polygon, using the subtended angles. More...
 
bool isPointInsidePolygonCrossingNumber (const Vec3 &a_point) const noexcept
 Check if a point is inside a 2D polygon, by computing the number of times a ray crosses the polygon edges. More...
 
+

Detailed Description

+

template<class T>
+class Dcel::Polygon2D< T >

+ +

Class for embedding a DCEL polygon face into 2D.

+

This class is required for determining whether or not a 3D point projected to the plane of an N-sided polygon lies inside or outside the polygon face. To do this we compute the 2D embedding of the polygon face, reducing the problem to a tractable dimension where we can use well-tested algorithm. The 2D embedding of a polygon occurs by taking a set of 3D points and a corresponding normal vector, and projecting those points along one of the 3D Cartesian axes such that the polygon has the largest area. In essence, we simply find the direction with the smallest normal vector component and ignore that. Once the 2D embedding is computed, we can use well-known algorithms for checking if a point lies inside or outside. The supported algorithms are 1) The winding number algorithm (computing the winding number), 2) Computing the subtended angle of the point with the edges of the polygon (sums to 360 degrees if the point is inside), or computing the crossing number which checks how many times a ray cast from the point crosses the edges of the polygon.

+

Constructor & Destructor Documentation

+ +

◆ Polygon2D()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Dcel::Polygon2D< T >::Polygon2D (const Vec3a_normal,
const std::vector< Vec3 > & a_points 
)
+
+inline
+
+ +

Full constructor.

+
Parameters
+ + + +
[in]a_normalNormal vector of the 3D polygon face
[in]a_pointsVertex coordinates of the 3D polygon face
+
+
+ +
+
+

Member Function Documentation

+ +

◆ isPointInside()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool Dcel::Polygon2D< T >::isPointInside (const Vec3a_point,
const InsideOutsideAlgorithm a_algorithm 
) const
+
+inlinenoexcept
+
+ +

Check if a point is inside or outside the 2D polygon.

+
Parameters
+ + + +
[in]a_point3D point coordinates
[in]a_algorithmInside/outside algorithm
+
+
+

This will call the function corresponding to a_algorithm.

+ +
+
+ +

◆ isPointInsidePolygonCrossingNumber()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Dcel::Polygon2D< T >::isPointInsidePolygonCrossingNumber (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Check if a point is inside a 2D polygon, by computing the number of times a ray crosses the polygon edges.

+
Parameters
+ + +
[in]a_point3D point coordinates
+
+
+
Returns
Returns true if the 3D point projects to the inside of the 2D polygon
+ +
+
+ +

◆ isPointInsidePolygonSubtend()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Dcel::Polygon2D< T >::isPointInsidePolygonSubtend (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Check if a point is inside a 2D polygon, using the subtended angles.

+
Parameters
+ + +
[in]a_point3D point coordinates
+
+
+
Returns
Returns true if the 3D point projects to the inside of the 2D polygon
+ +
+
+ +

◆ isPointInsidePolygonWindingNumber()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Dcel::Polygon2D< T >::isPointInsidePolygonWindingNumber (const Vec3a_point) const
+
+inlinenoexcept
+
+ +

Check if a point is inside a 2D polygon, using the winding number algorithm.

+
Parameters
+ + +
[in]a_point3D point coordinates
+
+
+
Returns
Returns true if the 3D point projects to the inside of the 2D polygon
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1VertexT-members.html b/docs/doxygen/html/classDcel_1_1VertexT-members.html new file mode 100644 index 00000000..2b995633 --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1VertexT-members.html @@ -0,0 +1,118 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dcel::VertexT< T > Member List
+
+
+ +

This is the complete list of members for Dcel::VertexT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
addFace(const FacePtr &a_face) noexceptDcel::VertexT< T >inline
computeVertexNormalAngleWeighted() noexceptDcel::VertexT< T >inline
computeVertexNormalAngleWeighted(const std::vector< FacePtr > &a_faces) noexceptDcel::VertexT< T >inline
computeVertexNormalAverage() noexceptDcel::VertexT< T >inline
computeVertexNormalAverage(const std::vector< FacePtr > &a_faces) noexceptDcel::VertexT< T >inline
define(const Vec3 &a_position, const EdgePtr &a_edge, const Vec3 &a_normal) noexceptDcel::VertexT< T >inline
Edge typedefDcel::VertexT< T >
EdgeIterator typedefDcel::VertexT< T >
EdgePtr typedefDcel::VertexT< T >
Face typedefDcel::VertexT< T >
FacePtr typedefDcel::VertexT< T >
getFaces() noexceptDcel::VertexT< T >inline
getFaces() const noexceptDcel::VertexT< T >inline
getNormal() noexceptDcel::VertexT< T >inline
getNormal() const noexceptDcel::VertexT< T >inline
getOutgoingEdge() noexceptDcel::VertexT< T >inline
getOutgoingEdge() const noexceptDcel::VertexT< T >inline
getPosition() noexceptDcel::VertexT< T >inline
getPosition() const noexceptDcel::VertexT< T >inline
m_facesDcel::VertexT< T >protected
m_normalDcel::VertexT< T >protected
m_outgoingEdgeDcel::VertexT< T >protected
m_positionDcel::VertexT< T >protected
normalizeNormalVector() noexceptDcel::VertexT< T >inline
setEdge(const EdgePtr &a_edge) noexceptDcel::VertexT< T >inline
setNormal(const Vec3 &a_normal) noexceptDcel::VertexT< T >inline
setPosition(const Vec3 &a_position) noexceptDcel::VertexT< T >inline
signedDistance(const Vec3 &a_x0) const noexceptDcel::VertexT< T >inline
unsignedDistance2(const Vec3 &a_x0) const noexceptDcel::VertexT< T >inline
Vec3 typedefDcel::VertexT< T >
Vertex typedefDcel::VertexT< T >
VertexPtr typedefDcel::VertexT< T >
VertexT()Dcel::VertexT< T >inline
VertexT(const Vec3 &a_position)Dcel::VertexT< T >inline
VertexT(const Vec3 &a_position, const Vec3 &a_normal)Dcel::VertexT< T >inline
VertexT(const Vertex &a_otherVertex)Dcel::VertexT< T >inline
~VertexT()Dcel::VertexT< T >inline
+ + + + diff --git a/docs/doxygen/html/classDcel_1_1VertexT.html b/docs/doxygen/html/classDcel_1_1VertexT.html new file mode 100644 index 00000000..dae1d19a --- /dev/null +++ b/docs/doxygen/html/classDcel_1_1VertexT.html @@ -0,0 +1,768 @@ + + + + + + + +EBGeometry: Dcel::VertexT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::VertexT< T > Class Template Reference
+
+
+ +

Class which represents a vertex node in a double-edge connected list (DCEL). + More...

+ +

#include <EBGeometry_DcelVertex.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Alias to cut down on typing.
 
+using Vertex = VertexT< T >
 Alias to cut down on typing.
 
+using Edge = EdgeT< T >
 Alias to cut down on typing.
 
+using Face = FaceT< T >
 Alias to cut down on typing.
 
+using VertexPtr = std::shared_ptr< Vertex >
 Alias to cut down on typing. Note that this is std::shared_ptr<VertexT<T> >
 
+using EdgePtr = std::shared_ptr< Edge >
 Alias to cut down on typing. Note that this is std::shared_ptr<EdgeT<T> >
 
+using FacePtr = std::shared_ptr< Face >
 Alias to cut down on typing. Note that this is std::shared_ptr<FaceT<T> >
 
+using EdgeIterator = EdgeIteratorT< T >
 Alias to cut down on typing. Note that this is std::shared_ptr<EdgeIteratorT<T> >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 VertexT ()
 Default constructor. More...
 
 VertexT (const Vec3 &a_position)
 Partial constructor. More...
 
 VertexT (const Vec3 &a_position, const Vec3 &a_normal)
 Constructor. More...
 
 VertexT (const Vertex &a_otherVertex)
 Full copy constructor. More...
 
~VertexT ()
 Destructor (does nothing)
 
void define (const Vec3 &a_position, const EdgePtr &a_edge, const Vec3 &a_normal) noexcept
 Define function. More...
 
void setPosition (const Vec3 &a_position) noexcept
 Set the vertex position. More...
 
void setNormal (const Vec3 &a_normal) noexcept
 Set the vertex normal vector. More...
 
void setEdge (const EdgePtr &a_edge) noexcept
 Set the reference to the outgoing edge. More...
 
void addFace (const FacePtr &a_face) noexcept
 Add a face to the polygon face list. More...
 
+void normalizeNormalVector () noexcept
 Normalize the normal vector, ensuring its length is 1.
 
+void computeVertexNormalAverage () noexcept
 Compute the vertex normal, using an average the normal vector in this vertex's face list (m_faces)
 
void computeVertexNormalAverage (const std::vector< FacePtr > &a_faces) noexcept
 Compute the vertex normal, using an average of the normal vectors in the input face list. More...
 
void computeVertexNormalAngleWeighted () noexcept
 Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face. More...
 
void computeVertexNormalAngleWeighted (const std::vector< FacePtr > &a_faces) noexcept
 Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face. More...
 
+Vec3T< T > & getPosition () noexcept
 Return modifiable vertex position.
 
+const Vec3T< T > & getPosition () const noexcept
 Return immutable vertex position.
 
+Vec3T< T > & getNormal () noexcept
 Return modifiable vertex normal vector.
 
+const Vec3T< T > & getNormal () const noexcept
 Return immutable vertex normal vector.
 
+EdgePtrgetOutgoingEdge () noexcept
 Return modifiable pointer to outgoing edge.
 
+const EdgePtrgetOutgoingEdge () const noexcept
 Return immutable pointer to outgoing edge.
 
+std::vector< FacePtr > & getFaces () noexcept
 Get modifiable polygon face list for this vertex.
 
+const std::vector< FacePtr > & getFaces () const noexcept
 Get immutable polygon face list for this vertex.
 
signedDistance (const Vec3 &a_x0) const noexcept
 Get the signed distance to this vertex. More...
 
unsignedDistance2 (const Vec3 &a_x0) const noexcept
 Get the squared unsigned distance to this vertex. More...
 
+ + + + + + + + + + + + + +

+Protected Attributes

+EdgePtr m_outgoingEdge
 Pointer to an outgoing edge from this vertex.
 
+Vec3 m_position
 Vertex position.
 
+Vec3 m_normal
 Vertex normal vector.
 
+std::vector< FacePtrm_faces
 List of faces connected to this vertex (these must be "manually" added)
 
+

Detailed Description

+

template<class T>
+class Dcel::VertexT< T >

+ +

Class which represents a vertex node in a double-edge connected list (DCEL).

+

This class is used in DCEL functionality which stores polygonal surfaces in a mesh. The VertexT class has a position, a normal vector, and a pointer to one of the outgoing edges from the vertex. For performance reasons we also include pointers to all the polygon faces that share this vertex.

Note
The normal vector is outgoing, i.e. a point x is "outside" the vertex if the dot product between n and (x - x0) is positive.
+

Constructor & Destructor Documentation

+ +

◆ VertexT() [1/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
Dcel::VertexT< T >::VertexT ()
+
+inline
+
+ +

Default constructor.

+

This initializes the position and the normal vector to zero vectors, and the polygon face list is empty

+ +
+
+ +

◆ VertexT() [2/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::VertexT< T >::VertexT (const Vec3a_position)
+
+inline
+
+ +

Partial constructor.

+
Parameters
+ + +
[in]a_positionVertex position
+
+
+

This initializes the position to a_position and the normal vector to the zero vector. The polygon face list is empty.

+ +
+
+ +

◆ VertexT() [3/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Dcel::VertexT< T >::VertexT (const Vec3a_position,
const Vec3a_normal 
)
+
+inline
+
+ +

Constructor.

+
Parameters
+ + + +
[in]a_positionVertex position
[in]a_normalVertex normal vector
+
+
+

This initializes the position to a_position and the normal vector to a_normal. The polygon face list is empty.

+ +
+
+ +

◆ VertexT() [4/4]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Dcel::VertexT< T >::VertexT (const Vertexa_otherVertex)
+
+inline
+
+ +

Full copy constructor.

+
Parameters
+ + +
[in]a_otherVertexOther vertex
+
+
+

This copies the position, normal vector, and outgoing edge pointer from the other vertex. The polygon face list.

+ +
+
+

Member Function Documentation

+ +

◆ addFace()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::VertexT< T >::addFace (const FacePtra_face)
+
+inlinenoexcept
+
+ +

Add a face to the polygon face list.

+
Parameters
+ + +
[in]a_facePointer to face.
+
+
+ +
+
+ +

◆ computeVertexNormalAngleWeighted() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void Dcel::VertexT< T >::computeVertexNormalAngleWeighted ()
+
+inlinenoexcept
+
+ +

Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face.

+

This calls the other version with a_faces = m_faces

Note
This computes the normal vector using the pseudnormal algorithm from Baerentzen and Aanes in "Signed distance computation using the angle weighted pseudonormal" (DOI: 10.1109/TVCG.2005.49)
+ +
+
+ +

◆ computeVertexNormalAngleWeighted() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::VertexT< T >::computeVertexNormalAngleWeighted (const std::vector< FacePtr > & a_faces)
+
+inlinenoexcept
+
+ +

Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face.

+
Parameters
+ + +
[in]a_facesFaces to use for computation.
+
+
+
Note
This computes the normal vector using the pseudnormal algorithm from Baerentzen and Aanes in "Signed distance computation using the angle weighted pseudonormal" (DOI: 10.1109/TVCG.2005.49)
+ +
+
+ +

◆ computeVertexNormalAverage()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::VertexT< T >::computeVertexNormalAverage (const std::vector< FacePtr > & a_faces)
+
+inlinenoexcept
+
+ +

Compute the vertex normal, using an average of the normal vectors in the input face list.

+
Parameters
+ + +
[in]a_facesFaces
+
+
+
Note
This computes the vertex normal as n = sum(normal(face))/num(faces)
+ +
+
+ +

◆ define()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void Dcel::VertexT< T >::define (const Vec3a_position,
const EdgePtra_edge,
const Vec3a_normal 
)
+
+inlinenoexcept
+
+ +

Define function.

+
Parameters
+ + + + +
[in]a_positionVertex position
[in]a_edgePointer to outgoing edge
[in]a_normalVertex normal vector
+
+
+

This sets the position, normal vector, and edge pointer.

+ +
+
+ +

◆ setEdge()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::VertexT< T >::setEdge (const EdgePtra_edge)
+
+inlinenoexcept
+
+ +

Set the reference to the outgoing edge.

+
Parameters
+ + +
[in]a_edgePointer to an outgoing edge
+
+
+ +
+
+ +

◆ setNormal()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::VertexT< T >::setNormal (const Vec3a_normal)
+
+inlinenoexcept
+
+ +

Set the vertex normal vector.

+
Parameters
+ + +
[in]a_normalVertex normal vector
+
+
+ +
+
+ +

◆ setPosition()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void Dcel::VertexT< T >::setPosition (const Vec3a_position)
+
+inlinenoexcept
+
+ +

Set the vertex position.

+
Parameters
+ + +
[in]a_positionVertex position
+
+
+ +
+
+ +

◆ signedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::VertexT< T >::signedDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the signed distance to this vertex.

+
Parameters
+ + +
[in]a_x0Position in space.
+
+
+
Returns
The returned distance is |a_x0 - m_position| and the sign is given by the sign of m_normal * |a_x0 - m_position|.
+ +
+
+ +

◆ unsignedDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Dcel::VertexT< T >::unsignedDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the squared unsigned distance to this vertex.

+

This is faster to compute than signedDistance, and might be preferred for some algorithms.

Returns
Returns the vector length of (a_x - m_position)
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1AABBT-members.html b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1AABBT-members.html new file mode 100644 index 00000000..122b969a --- /dev/null +++ b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1AABBT-members.html @@ -0,0 +1,108 @@ + + + + + + + +EBGeometry class API: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry class API +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry::BoundingVolumes::AABBT< T > Member List
+
+
+ +

This is the complete list of members for EBGeometry::BoundingVolumes::AABBT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AABBT()EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const AABBT &a_other)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const std::vector< AABBT< T > > &a_others)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const std::vector< Vec3T< P > > &a_points)EBGeometry::BoundingVolumes::AABBT< T >
AABBT() (defined in EBGeometry::BoundingVolumes::AABBT< T >)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const Vec3T< T > &a_lo, const Vec3T< T > &a_hi) (defined in EBGeometry::BoundingVolumes::AABBT< T >)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const AABBT< T > &a_other) (defined in EBGeometry::BoundingVolumes::AABBT< T >)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const std::vector< AABBT< T > > &a_others) (defined in EBGeometry::BoundingVolumes::AABBT< T >)EBGeometry::BoundingVolumes::AABBT< T >
AABBT(const std::vector< Vec3T< P > > &a_points) (defined in EBGeometry::BoundingVolumes::AABBT< T >)EBGeometry::BoundingVolumes::AABBT< T >
define(const std::vector< Vec3T< P > > &a_points) noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
define(const std::vector< Vec3T< P > > &a_points) noexcept (defined in EBGeometry::BoundingVolumes::AABBT< T >)EBGeometry::BoundingVolumes::AABBT< T >inline
getArea() const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getCentroid() const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getDistance(const Vec3 &a_x0) const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getDistance2(const Vec3 &a_x0) const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getHighCorner() noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getHighCorner() const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getLowCorner() noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getLowCorner() const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getOverlappingVolume(const AABBT< T > &a_other) const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
getVolume() const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
intersects(const AABBT &a_other) const noexceptEBGeometry::BoundingVolumes::AABBT< T >inline
m_hiCornerEBGeometry::BoundingVolumes::AABBT< T >protected
m_loCornerEBGeometry::BoundingVolumes::AABBT< T >protected
Vec3 typedefEBGeometry::BoundingVolumes::AABBT< T >
~AABBT()EBGeometry::BoundingVolumes::AABBT< T >virtual
+ + + + diff --git a/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1AABBT.html b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1AABBT.html new file mode 100644 index 00000000..783c0683 --- /dev/null +++ b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1AABBT.html @@ -0,0 +1,519 @@ + + + + + + + +EBGeometry class API: EBGeometry::BoundingVolumes::AABBT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry class API +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry::BoundingVolumes::AABBT< T > Class Template Reference
+
+
+ +

Axis-aligned bounding box as bounding volume. + More...

+ +

#include <EBGeometry_BoundingVolumes.hpp>

+ + + + + +

+Public Types

+using Vec3 = Vec3T< T >
 Alias which cuts down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

AABBT ()
 Default constructor (does nothing)
 
 AABBT (const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)
 Full constructor taking the low/high corners of the bounding box. More...
 
 AABBT (const AABBT &a_other)
 Copy constructor of another bounding box. More...
 
 AABBT (const std::vector< AABBT< T > > &a_others)
 Constructor which creates an AABB which encloses a set of other AABBs. More...
 
+virtual ~AABBT ()
 Destructor (does nothing)
 
template<class P >
 AABBT (const std::vector< Vec3T< P > > &a_points)
 Template constructor (since mixed precision allowed) which creates an AABB that encloses a set of 3D points. More...
 
template<class P >
void define (const std::vector< Vec3T< P > > &a_points) noexcept
 Define function (since mixed precision allowed) which sets this AABB such that it encloses a set of 3D points. More...
 
bool intersects (const AABBT &a_other) const noexcept
 Check if this AABB intersects another AABB. More...
 
+Vec3T< T > & getLowCorner () noexcept
 Get the modifiable lower-left corner of the AABB.
 
+const Vec3T< T > & getLowCorner () const noexcept
 Get the immutable lower-left corner of the AABB.
 
+Vec3T< T > & getHighCorner () noexcept
 Get the modifiable upper-right corner of the AABB.
 
+const Vec3T< T > & getHighCorner () const noexcept
 Get the immutable upper-right corner of the AABB.
 
+Vec3 getCentroid () const noexcept
 Get bounding volume centroid.
 
getOverlappingVolume (const AABBT< T > &a_other) const noexcept
 Compute the overlapping volume between this AABB and another AABB. More...
 
getDistance (const Vec3 &a_x0) const noexcept
 Get the distance to this AABB (points inside the bounding box have a zero distance) More...
 
getDistance2 (const Vec3 &a_x0) const noexcept
 Get the squared distance to this bounding box (points inside the bounding box have a zero distance) More...
 
+T getVolume () const noexcept
 Compute the bounding box volume.
 
+T getArea () const noexcept
 Compute the bounding box area.
 
+template<class T >
 AABBT (const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)
 
+template<class T >
 AABBT (const AABBT< T > &a_other)
 
+template<class T >
 AABBT (const std::vector< AABBT< T > > &a_others)
 
+template<class P >
 AABBT (const std::vector< Vec3T< P > > &a_points)
 
+template<class P >
void define (const std::vector< Vec3T< P > > &a_points) noexcept
 
+ + + + + + + +

+Protected Attributes

+Vec3 m_loCorner
 Lower-left corner of bounding box.
 
+Vec3 m_hiCorner
 Upper-right corner of bounding box.
 
+

Detailed Description

+

template<class T>
+class EBGeometry::BoundingVolumes::AABBT< T >

+ +

Axis-aligned bounding box as bounding volume.

+

This class represents a Cartesian box that encloses a set of 3D points.

Note
The template parameter T is the precision.
+

Constructor & Destructor Documentation

+ +

◆ AABBT() [1/4]

+ +
+
+
+template<class T>
+ + + + + + + + + + + + + + + + + + +
EBGeometry::BoundingVolumes::AABBT< T >::AABBT (const Vec3T< T > & a_lo,
const Vec3T< T > & a_hi 
)
+
+ +

Full constructor taking the low/high corners of the bounding box.

+
Parameters
+ + + +
[in]a_loLow corner
[in]a_hiHigh
+
+
+ +
+
+ +

◆ AABBT() [2/4]

+ +
+
+
+template<class T>
+ + + + + + + + +
EBGeometry::BoundingVolumes::AABBT< T >::AABBT (const AABBT< T > & a_other)
+
+ +

Copy constructor of another bounding box.

+
Parameters
+ + +
[in]a_otherOther bounding box
+
+
+ +
+
+ +

◆ AABBT() [3/4]

+ +
+
+
+template<class T>
+ + + + + + + + +
EBGeometry::BoundingVolumes::AABBT< T >::AABBT (const std::vector< AABBT< T > > & a_others)
+
+ +

Constructor which creates an AABB which encloses a set of other AABBs.

+
Parameters
+ + +
[in]a_othersOther bounding boxes
+
+
+ +
+
+ +

◆ AABBT() [4/4]

+ +
+
+
+template<class T>
+
+template<class P >
+ + + + + + + + +
EBGeometry::BoundingVolumes::AABBT< T >::AABBT (const std::vector< Vec3T< P > > & a_points)
+
+ +

Template constructor (since mixed precision allowed) which creates an AABB that encloses a set of 3D points.

+
Parameters
+ + +
[in]a_pointsSet of 3D points
+
+
+
Note
Calls the define function
+ +
+
+

Member Function Documentation

+ +

◆ define()

+ +
+
+
+template<class T>
+
+template<class P >
+ + + + + +
+ + + + + + + + +
void EBGeometry::BoundingVolumes::AABBT< T >::define (const std::vector< Vec3T< P > > & a_points)
+
+inlinenoexcept
+
+ +

Define function (since mixed precision allowed) which sets this AABB such that it encloses a set of 3D points.

+
Parameters
+ + +
[in]a_pointsSet of 3D points
+
+
+ +
+
+ +

◆ getDistance()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::AABBT::getDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the distance to this AABB (points inside the bounding box have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the distance to the bounding box (a point inside has a zero distance)
+ +
+
+ +

◆ getDistance2()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::AABBT::getDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the squared distance to this bounding box (points inside the bounding box have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the squared distance to the bounding box (a point inside has a zero distance)
+ +
+
+ +

◆ getOverlappingVolume()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::AABBT::getOverlappingVolume (const AABBT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Compute the overlapping volume between this AABB and another AABB.

+
Parameters
+ + +
[in]a_otherThe other AABB
+
+
+
Returns
Returns overlapping volume
+ +
+
+ +

◆ intersects()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
bool BoundingVolumes::AABBT::intersects (const AABBT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Check if this AABB intersects another AABB.

+
Parameters
+ + +
[in]a_otherThe other AABB
+
+
+
Returns
True if they intersect and false otherwise.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT-members.html b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT-members.html new file mode 100644 index 00000000..ef11fc7b --- /dev/null +++ b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT-members.html @@ -0,0 +1,110 @@ + + + + + + + +EBGeometry class API: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry class API +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
EBGeometry::BoundingVolumes::BoundingSphereT< T > Member List
+
+
+ +

This is the complete list of members for EBGeometry::BoundingVolumes::BoundingSphereT< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BoundingSphereT()EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const Vec3T< T > &a_center, const T &a_radius)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const std::vector< BoundingSphereT< T > > &a_otherSpheres)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const BoundingSphereT &a_other)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg=BoundingVolumeAlgorithm::Ritter)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT() (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >inline
BoundingSphereT(const Vec3T< T > &a_center, const T &a_radius) (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >inline
BoundingSphereT(const BoundingSphereT &a_other) (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const std::vector< BoundingSphereT< T > > &a_otherSpheres) (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingSphereT(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_algorithm) (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >
BoundingVolumeAlgorithm enum nameEBGeometry::BoundingVolumes::BoundingSphereT< T >
buildRitter(const std::vector< Vec3T< P > > &a_points) noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inlineprotected
buildRitter(const std::vector< Vec3T< P > > &a_points) noexcept (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >inline
define(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg) noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
define(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_algorithm) noexcept (defined in EBGeometry::BoundingVolumes::BoundingSphereT< T >)EBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getArea() const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getCentroid() noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getCentroid() const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getDistance(const Vec3 &a_x0) const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getDistance2(const Vec3 &a_x0) const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getOverlappingVolume(const BoundingSphereT< T > &a_other) const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getRadius() noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getRadius() const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
getVolume() const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
intersects(const BoundingSphereT &a_other) const noexceptEBGeometry::BoundingVolumes::BoundingSphereT< T >inline
m_centerEBGeometry::BoundingVolumes::BoundingSphereT< T >protected
m_radiusEBGeometry::BoundingVolumes::BoundingSphereT< T >protected
Vec3 typedefEBGeometry::BoundingVolumes::BoundingSphereT< T >
~BoundingSphereT()EBGeometry::BoundingVolumes::BoundingSphereT< T >virtual
+ + + + diff --git a/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT.html b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT.html new file mode 100644 index 00000000..adfa2a28 --- /dev/null +++ b/docs/doxygen/html/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT.html @@ -0,0 +1,612 @@ + + + + + + + +EBGeometry class API: EBGeometry::BoundingVolumes::BoundingSphereT< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry class API +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
EBGeometry::BoundingVolumes::BoundingSphereT< T > Class Template Reference
+
+
+ +

Class which encloses a set of points using a bounding sphere. + More...

+ +

#include <EBGeometry_BoundingVolumes.hpp>

+ + + + + + + + +

+Public Types

enum  BoundingVolumeAlgorithm { Ritter + }
 Typename for possible algorithms that support the computation of a bounding sphere for a set of 3D points.
 
+using Vec3 = Vec3T< T >
 Alias to cut down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

BoundingSphereT ()
 Default constructor. Leaves object in undefined state.
 
 BoundingSphereT (const Vec3T< T > &a_center, const T &a_radius)
 Full constructor. Sets the center and radius of the bounding sphere. More...
 
 BoundingSphereT (const std::vector< BoundingSphereT< T > > &a_otherSpheres)
 Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres. More...
 
 BoundingSphereT (const BoundingSphereT &a_other)
 Copy constructor. Sets the center and radius from the other sphere. More...
 
+virtual ~BoundingSphereT ()
 Destructor (does nothing).
 
template<class P >
 BoundingSphereT (const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg=BoundingVolumeAlgorithm::Ritter)
 Template constructor which takes a set of 3D points (mixed precision allowed). More...
 
template<class P >
void define (const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg) noexcept
 Template define function which takes a set of 3D points (mixed precision allowed). More...
 
bool intersects (const BoundingSphereT &a_other) const noexcept
 Check if this bounding sphere intersect another bounding sphere. More...
 
+T & getRadius () noexcept
 Get modifiable radius for this sphere.
 
+const T & getRadius () const noexcept
 Get immutable radius for this sphere.
 
+Vec3getCentroid () noexcept
 Get modifiable center for this sphere.
 
+const Vec3getCentroid () const noexcept
 Get immutable center for this sphere.
 
getOverlappingVolume (const BoundingSphereT< T > &a_other) const noexcept
 Compute the overlapping volume between this bounding sphere and another. More...
 
getDistance (const Vec3 &a_x0) const noexcept
 Get the distance to this bounding sphere (points inside the sphere have a zero distance) More...
 
getDistance2 (const Vec3 &a_x0) const noexcept
 Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) More...
 
getVolume () const noexcept
 Get the sphere volume. More...
 
getArea () const noexcept
 Get the sphere area. More...
 
+template<class T >
 BoundingSphereT (const Vec3T< T > &a_center, const T &a_radius)
 
+template<class T >
 BoundingSphereT (const BoundingSphereT &a_other)
 
+template<class T >
 BoundingSphereT (const std::vector< BoundingSphereT< T > > &a_otherSpheres)
 
+template<class P >
 BoundingSphereT (const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_algorithm)
 
+template<class P >
void define (const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_algorithm) noexcept
 
+template<class P >
void buildRitter (const std::vector< Vec3T< P > > &a_points) noexcept
 
+ + + + + +

+Protected Member Functions

+template<class P >
void buildRitter (const std::vector< Vec3T< P > > &a_points) noexcept
 Template function which computes the bounding sphere for a set of points (mixed precision allowed) using Ritter's algorithm.
 
+ + + + + + + +

+Protected Attributes

+T m_radius
 Sphere radius.
 
+Vec3 m_center
 Sphere center.
 
+

Detailed Description

+

template<class T>
+class EBGeometry::BoundingVolumes::BoundingSphereT< T >

+ +

Class which encloses a set of points using a bounding sphere.

+

The template parameter T is the floating-point precision which is used.

+

Constructor & Destructor Documentation

+ +

◆ BoundingSphereT() [1/4]

+ +
+
+
+template<class T>
+ + + + + + + + + + + + + + + + + + +
EBGeometry::BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const Vec3T< T > & a_center,
const T & a_radius 
)
+
+ +

Full constructor. Sets the center and radius of the bounding sphere.

+
Parameters
+ + + +
[in]a_centerBounding sphere center
[in]a_radiusBounding sphere radius
+
+
+ +
+
+ +

◆ BoundingSphereT() [2/4]

+ +
+
+
+template<class T>
+ + + + + + + + +
EBGeometry::BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const std::vector< BoundingSphereT< T > > & a_otherSpheres)
+
+ +

Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres.

+
Parameters
+ + +
[in]a_otherSpheresOther bounding spheres.
+
+
+ +
+
+ +

◆ BoundingSphereT() [3/4]

+ +
+
+
+template<class T>
+ + + + + + + + +
EBGeometry::BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const BoundingSphereT< T > & a_other)
+
+ +

Copy constructor. Sets the center and radius from the other sphere.

+
Parameters
+ + +
[in]a_otherOther sphere
+
+
+ +
+
+ +

◆ BoundingSphereT() [4/4]

+ +
+
+
+template<class T>
+
+template<class P >
+ + + + + + + + + + + + + + + + + + +
EBGeometry::BoundingVolumes::BoundingSphereT< T >::BoundingSphereT (const std::vector< Vec3T< P > > & a_points,
const BoundingVolumeAlgorithma_alg = BoundingVolumeAlgorithm::Ritter 
)
+
+ +

Template constructor which takes a set of 3D points (mixed precision allowed).

+

This computes the bounding sphere using the supplied algorithm.

Parameters
+ + + +
[in]a_pointsSet of 3D points
[in]a_algBounding sphere algorithm.
+
+
+
Note
This calls the define(...) function.
+ +
+
+

Member Function Documentation

+ +

◆ define()

+ +
+
+
+template<class T>
+
+template<class P >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void EBGeometry::BoundingVolumes::BoundingSphereT< T >::define (const std::vector< Vec3T< P > > & a_points,
const BoundingVolumeAlgorithma_alg 
)
+
+inlinenoexcept
+
+ +

Template define function which takes a set of 3D points (mixed precision allowed).

+

This computes the bounding sphere using the supplied algorithm.

Parameters
+ + + +
[in]a_pointsSet of 3D points
[in]a_algBounding sphere algorithm.
+
+
+ +
+
+ +

◆ getArea()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + +
T BoundingVolumes::BoundingSphereT::getArea () const
+
+inlinenoexcept
+
+ +

Get the sphere area.

+
Returns
Sphere area.
+ +
+
+ +

◆ getDistance()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::BoundingSphereT::getDistance (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the distance to this bounding sphere (points inside the sphere have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the distance to the sphere (a point inside has a zero distance)
+ +
+
+ +

◆ getDistance2()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::BoundingSphereT::getDistance2 (const Vec3a_x0) const
+
+inlinenoexcept
+
+ +

Get the squared distance to this bounding sphere (points inside the sphere have a zero distance)

+
Parameters
+ + +
[in]a_x03D point
+
+
+
Returns
Returns the squared distance to the sphere (a point inside has a zero distance)
+ +
+
+ +

◆ getOverlappingVolume()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
T BoundingVolumes::BoundingSphereT::getOverlappingVolume (const BoundingSphereT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Compute the overlapping volume between this bounding sphere and another.

+
Parameters
+ + +
[in]a_otherOther bounding sphere
+
+
+
Returns
The overlapping volume, computing using standard expressions.
+ +
+
+ +

◆ getVolume()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + +
T BoundingVolumes::BoundingSphereT::getVolume () const
+
+inlinenoexcept
+
+ +

Get the sphere volume.

+
Returns
Sphere volume
+ +
+
+ +

◆ intersects()

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
bool BoundingVolumes::BoundingSphereT::intersects (const BoundingSphereT< T > & a_other) const
+
+inlinenoexcept
+
+ +

Check if this bounding sphere intersect another bounding sphere.

+
Parameters
+ + +
[in]a_otherOther bounding sphere.
+
+
+
Returns
True if the two sphere intersect.
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classRotateOp-members.html b/docs/doxygen/html/classRotateOp-members.html new file mode 100644 index 00000000..768322d6 --- /dev/null +++ b/docs/doxygen/html/classRotateOp-members.html @@ -0,0 +1,86 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
RotateOp< T > Member List
+
+
+ +

This is the complete list of members for RotateOp< T >, including all inherited members.

+ + + + + + + + + + +
m_axisRotateOp< T >protected
m_cosAngleRotateOp< T >protected
m_sinAngleRotateOp< T >protected
RotateOp()RotateOp< T >
RotateOp(const T a_angle, const int a_axis) noexceptRotateOp< T >
transform(const Vec3T< T > &a_inputPoint) const noexcept overrideRotateOp< T >virtual
TransformOp()=defaultTransformOp< T >
~RotateOp()=defaultRotateOp< T >virtual
~TransformOp()=defaultTransformOp< T >virtual
+ + + + diff --git a/docs/doxygen/html/classRotateOp.html b/docs/doxygen/html/classRotateOp.html new file mode 100644 index 00000000..376deedf --- /dev/null +++ b/docs/doxygen/html/classRotateOp.html @@ -0,0 +1,199 @@ + + + + + + + +EBGeometry: RotateOp< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
RotateOp< T > Class Template Reference
+
+
+ +

Rotation operator. Can scale an input point. + More...

+ +

#include <EBGeometry_TransformOps.hpp>

+
+Inheritance diagram for RotateOp< T >:
+
+
Inheritance graph
+ + + +
[legend]
+
+Collaboration diagram for RotateOp< T >:
+
+
Collaboration graph
+ + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

RotateOp ()
 Weak constructor.
 
 RotateOp (const T a_angle, const int a_axis) noexcept
 Full constructor. More...
 
+virtual ~RotateOp ()=default
 Destructor.
 
+Vec3T< T > transform (const Vec3T< T > &a_inputPoint) const noexcept override
 Transform input point.
 
- Public Member Functions inherited from TransformOp< T >
TransformOp ()=default
 Default constructor.
 
+virtual ~TransformOp ()=default
 Destructor.
 
+ + + + + + + + + + +

+Protected Attributes

+int m_axis
 Rotation axis. 0 = x, 1=y etc.
 
+T m_cosAngle
 Theta-rotation (degrees)
 
+T m_sinAngle
 Phi-rotation (degrees)
 
+

Detailed Description

+

template<class T>
+class RotateOp< T >

+ +

Rotation operator. Can scale an input point.

+

Constructor & Destructor Documentation

+ +

◆ RotateOp()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
RotateOp< T >::RotateOp (const T a_angle,
const int a_axis 
)
+
+noexcept
+
+ +

Full constructor.

+
Parameters
+ + + +
[in]a_angleRotation angle
[in]a_axisRotation axis
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classRotateOp__coll__graph.map b/docs/doxygen/html/classRotateOp__coll__graph.map new file mode 100644 index 00000000..9273521f --- /dev/null +++ b/docs/doxygen/html/classRotateOp__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classRotateOp__coll__graph.md5 b/docs/doxygen/html/classRotateOp__coll__graph.md5 new file mode 100644 index 00000000..3f610ad3 --- /dev/null +++ b/docs/doxygen/html/classRotateOp__coll__graph.md5 @@ -0,0 +1 @@ +19bd2ab8c4686f74e216e3d4d31d9fc2 \ No newline at end of file diff --git a/docs/doxygen/html/classRotateOp__coll__graph.png b/docs/doxygen/html/classRotateOp__coll__graph.png new file mode 100644 index 00000000..ce8d848a Binary files /dev/null and b/docs/doxygen/html/classRotateOp__coll__graph.png differ diff --git a/docs/doxygen/html/classRotateOp__inherit__graph.map b/docs/doxygen/html/classRotateOp__inherit__graph.map new file mode 100644 index 00000000..9273521f --- /dev/null +++ b/docs/doxygen/html/classRotateOp__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classRotateOp__inherit__graph.md5 b/docs/doxygen/html/classRotateOp__inherit__graph.md5 new file mode 100644 index 00000000..9b22f201 --- /dev/null +++ b/docs/doxygen/html/classRotateOp__inherit__graph.md5 @@ -0,0 +1 @@ +f18e3df72e40ac95ded6585c38f35894 \ No newline at end of file diff --git a/docs/doxygen/html/classRotateOp__inherit__graph.png b/docs/doxygen/html/classRotateOp__inherit__graph.png new file mode 100644 index 00000000..ce8d848a Binary files /dev/null and b/docs/doxygen/html/classRotateOp__inherit__graph.png differ diff --git a/docs/doxygen/html/classScaleOp-members.html b/docs/doxygen/html/classScaleOp-members.html new file mode 100644 index 00000000..ae04750f --- /dev/null +++ b/docs/doxygen/html/classScaleOp-members.html @@ -0,0 +1,84 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ScaleOp< T > Member List
+
+
+ +

This is the complete list of members for ScaleOp< T >, including all inherited members.

+ + + + + + + + +
m_scaleScaleOp< T >protected
ScaleOp()ScaleOp< T >
ScaleOp(const Vec3T< T > &a_scale)ScaleOp< T >
transform(const Vec3T< T > &a_inputPoint) const noexcept overrideScaleOp< T >virtual
TransformOp()=defaultTransformOp< T >
~ScaleOp()=defaultScaleOp< T >virtual
~TransformOp()=defaultTransformOp< T >virtual
+ + + + diff --git a/docs/doxygen/html/classScaleOp.html b/docs/doxygen/html/classScaleOp.html new file mode 100644 index 00000000..55ead398 --- /dev/null +++ b/docs/doxygen/html/classScaleOp.html @@ -0,0 +1,144 @@ + + + + + + + +EBGeometry: ScaleOp< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ScaleOp< T > Class Template Reference
+
+
+ +

Scale operator. Can also be used as a reflection operator. + More...

+ +

#include <EBGeometry_TransformOps.hpp>

+
+Inheritance diagram for ScaleOp< T >:
+
+
Inheritance graph
+ + + +
[legend]
+
+Collaboration diagram for ScaleOp< T >:
+
+
Collaboration graph
+ + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ScaleOp ()
 Default constructor.
 
ScaleOp (const Vec3T< T > &a_scale)
 Full constructor.
 
+virtual ~ScaleOp ()=default
 Destructor.
 
+Vec3T< T > transform (const Vec3T< T > &a_inputPoint) const noexcept override
 Transform input point.
 
- Public Member Functions inherited from TransformOp< T >
TransformOp ()=default
 Default constructor.
 
+virtual ~TransformOp ()=default
 Destructor.
 
+ + + + +

+Protected Attributes

+Vec3T< T > m_scale
 Scaling of input point.
 
+

Detailed Description

+

template<class T>
+class ScaleOp< T >

+ +

Scale operator. Can also be used as a reflection operator.

+

The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classScaleOp__coll__graph.map b/docs/doxygen/html/classScaleOp__coll__graph.map new file mode 100644 index 00000000..6a63223a --- /dev/null +++ b/docs/doxygen/html/classScaleOp__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classScaleOp__coll__graph.md5 b/docs/doxygen/html/classScaleOp__coll__graph.md5 new file mode 100644 index 00000000..7f00c2ea --- /dev/null +++ b/docs/doxygen/html/classScaleOp__coll__graph.md5 @@ -0,0 +1 @@ +f6c97a3eb044af4ed3b0e377a0e8c0ee \ No newline at end of file diff --git a/docs/doxygen/html/classScaleOp__coll__graph.png b/docs/doxygen/html/classScaleOp__coll__graph.png new file mode 100644 index 00000000..66a2e9af Binary files /dev/null and b/docs/doxygen/html/classScaleOp__coll__graph.png differ diff --git a/docs/doxygen/html/classScaleOp__inherit__graph.map b/docs/doxygen/html/classScaleOp__inherit__graph.map new file mode 100644 index 00000000..6a63223a --- /dev/null +++ b/docs/doxygen/html/classScaleOp__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classScaleOp__inherit__graph.md5 b/docs/doxygen/html/classScaleOp__inherit__graph.md5 new file mode 100644 index 00000000..340b0570 --- /dev/null +++ b/docs/doxygen/html/classScaleOp__inherit__graph.md5 @@ -0,0 +1 @@ +42743fb3706aa802302c6d6de814e838 \ No newline at end of file diff --git a/docs/doxygen/html/classScaleOp__inherit__graph.png b/docs/doxygen/html/classScaleOp__inherit__graph.png new file mode 100644 index 00000000..66a2e9af Binary files /dev/null and b/docs/doxygen/html/classScaleOp__inherit__graph.png differ diff --git a/docs/doxygen/html/classSignedDistanceFunction-members.html b/docs/doxygen/html/classSignedDistanceFunction-members.html new file mode 100644 index 00000000..ce034898 --- /dev/null +++ b/docs/doxygen/html/classSignedDistanceFunction-members.html @@ -0,0 +1,86 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SignedDistanceFunction< T > Member List
+
+
+ +

This is the complete list of members for SignedDistanceFunction< T >, including all inherited members.

+ + + + + + + + + + +
m_transformOpsSignedDistanceFunction< T >protected
rotate(const T a_angle, const int a_axis) noexceptSignedDistanceFunction< T >inline
scale(const Vec3T< T > &a_scale) noexceptSignedDistanceFunction< T >inline
signedDistance(const Vec3T< T > &a_point) const noexcept=0SignedDistanceFunction< T >pure virtual
SignedDistanceFunction()=defaultSignedDistanceFunction< T >
transformPoint(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >inlineprotected
translate(const Vec3T< T > &a_translation) noexceptSignedDistanceFunction< T >inline
unsignedDistance2(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >virtual
~SignedDistanceFunction()=defaultSignedDistanceFunction< T >virtual
+ + + + diff --git a/docs/doxygen/html/classSignedDistanceFunction.html b/docs/doxygen/html/classSignedDistanceFunction.html new file mode 100644 index 00000000..954264cb --- /dev/null +++ b/docs/doxygen/html/classSignedDistanceFunction.html @@ -0,0 +1,339 @@ + + + + + + + +EBGeometry: SignedDistanceFunction< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SignedDistanceFunction< T > Class Template Referenceabstract
+
+
+ +

Abstract representation of a signed distance function. + More...

+ +

#include <EBGeometry_SignedDistanceFunction.hpp>

+
+Inheritance diagram for SignedDistanceFunction< T >:
+
+
Inheritance graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

SignedDistanceFunction ()=default
 Disallowed, use the full constructor.
 
+virtual ~SignedDistanceFunction ()=default
 Destructor (does nothing)
 
virtual T signedDistance (const Vec3T< T > &a_point) const noexcept=0
 Signed distance function. More...
 
virtual T unsignedDistance2 (const Vec3T< T > &a_point) const noexcept
 Unsigned distance function. Must return the distance^2. More...
 
void scale (const Vec3T< T > &a_scale) noexcept
 Scale signed distance function. More...
 
void translate (const Vec3T< T > &a_translation) noexcept
 Translate signed distance function. More...
 
void rotate (const T a_angle, const int a_axis) noexcept
 Rotate the signed distance function around. More...
 
+ + + + +

+Protected Member Functions

+Vec3T< T > transformPoint (const Vec3T< T > &a_point) const noexcept
 Apply transformation operators and move point.
 
+ + + + +

+Protected Attributes

+std::deque< std::shared_ptr< TransformOp< T > > > m_transformOps
 List of transformation operators for the signed distance field.
 
+

Detailed Description

+

template<class T>
+class SignedDistanceFunction< T >

+ +

Abstract representation of a signed distance function.

+

Users can put whatever they like in here, e.g. analytic functions, DCEL meshes, or DCEL meshes stored in full or compact BVH trees. The signedDistance function must be implemented by the user. When computing it, the user can apply transformation operators (rotations, scaling, translations) by calling transformPoint on the input coordinate.

+

Member Function Documentation

+ +

◆ rotate()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void SignedDistanceFunction< T >::rotate (const T a_angle,
const int a_axis 
)
+
+inlinenoexcept
+
+ +

Rotate the signed distance function around.

+
Parameters
+ + + +
[in]a_angleRotation angle
[in]a_axisRotation axis. 0 = x, 1 = y etc.
+
+
+ +
+
+ +

◆ scale()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void SignedDistanceFunction< T >::scale (const Vec3T< T > & a_scale)
+
+inlinenoexcept
+
+ +

Scale signed distance function.

+
Parameters
+ + +
[in]a_scaleScaling factor.
+
+
+ +
+
+ +

◆ signedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
virtual T SignedDistanceFunction< T >::signedDistance (const Vec3T< T > & a_point) const
+
+pure virtualnoexcept
+
+ +

Signed distance function.

+
Parameters
+ + +
[in]a_point3D point.
+
+
+ +

Implemented in SphereSDF< T >, UnionBVH< T, BV, K >, and Union< T >.

+ +
+
+ +

◆ translate()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
void SignedDistanceFunction< T >::translate (const Vec3T< T > & a_translation)
+
+inlinenoexcept
+
+ +

Translate signed distance function.

+
Parameters
+ + +
[in]a_translationDistance to translate the function.
+
+
+ +
+
+ +

◆ unsignedDistance2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T SignedDistanceFunction< T >::unsignedDistance2 (const Vec3T< T > & a_point) const
+
+virtualnoexcept
+
+ +

Unsigned distance function. Must return the distance^2.

+
Parameters
+ + +
[in]a_point3D point.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.map b/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.map new file mode 100644 index 00000000..230f7338 --- /dev/null +++ b/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.md5 b/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.md5 new file mode 100644 index 00000000..2589135f --- /dev/null +++ b/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.md5 @@ -0,0 +1 @@ +4be34061f768dc18245dbc028b21e9aa \ No newline at end of file diff --git a/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.png b/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.png new file mode 100644 index 00000000..1306bab1 Binary files /dev/null and b/docs/doxygen/html/classSignedDistanceFunction__inherit__graph.png differ diff --git a/docs/doxygen/html/classSphereSDF-members.html b/docs/doxygen/html/classSphereSDF-members.html new file mode 100644 index 00000000..27c1f909 --- /dev/null +++ b/docs/doxygen/html/classSphereSDF-members.html @@ -0,0 +1,97 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SphereSDF< T > Member List
+
+
+ +

This is the complete list of members for SphereSDF< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
getCenter() const noexceptSphereSDF< T >inline
getCenter() noexceptSphereSDF< T >inline
getRadius() const noexceptSphereSDF< T >inline
getRadius() noexceptSphereSDF< T >inline
m_centerSphereSDF< T >protected
m_flipInsideSphereSDF< T >protected
m_radiusSphereSDF< T >protected
m_transformOpsSignedDistanceFunction< T >protected
rotate(const T a_angle, const int a_axis) noexceptSignedDistanceFunction< T >inline
scale(const Vec3T< T > &a_scale) noexceptSignedDistanceFunction< T >inline
signedDistance(const Vec3T< T > &a_point) const noexcept overrideSphereSDF< T >inlinevirtual
SignedDistanceFunction()=defaultSignedDistanceFunction< T >
SphereSDF()SphereSDF< T >inline
SphereSDF(const Vec3T< T > &a_center, const T &a_radius, const bool a_flipInside)SphereSDF< T >inline
SphereSDF(const SphereSDF &a_other)SphereSDF< T >inline
transformPoint(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >inlineprotected
translate(const Vec3T< T > &a_translation) noexceptSignedDistanceFunction< T >inline
unsignedDistance2(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >virtual
~SignedDistanceFunction()=defaultSignedDistanceFunction< T >virtual
~SphereSDF()=defaultSphereSDF< T >virtual
+ + + + diff --git a/docs/doxygen/html/classSphereSDF.html b/docs/doxygen/html/classSphereSDF.html new file mode 100644 index 00000000..73e353e0 --- /dev/null +++ b/docs/doxygen/html/classSphereSDF.html @@ -0,0 +1,288 @@ + + + + + + + +EBGeometry: SphereSDF< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SphereSDF< T > Class Template Reference
+
+
+ +

Signed distance field for sphere. + More...

+ +

#include <EBGeometry_AnalyticDistanceFunctions.hpp>

+
+Inheritance diagram for SphereSDF< T >:
+
+
Inheritance graph
+ + + +
[legend]
+
+Collaboration diagram for SphereSDF< T >:
+
+
Collaboration graph
+ + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

SphereSDF ()
 Disallowed weak construction. Use one of the full constructors.
 
 SphereSDF (const Vec3T< T > &a_center, const T &a_radius, const bool a_flipInside)
 Default constructor. More...
 
SphereSDF (const SphereSDF &a_other)
 Copy constructor.
 
+virtual ~SphereSDF ()=default
 Destructor.
 
+const Vec3T< T > & getCenter () const noexcept
 Get center.
 
+Vec3T< T > & getCenter () noexcept
 Get center.
 
+const T & getRadius () const noexcept
 Get radius.
 
+T & getRadius () noexcept
 Get radius.
 
virtual T signedDistance (const Vec3T< T > &a_point) const noexcept override
 Signed distance function for sphere. More...
 
- Public Member Functions inherited from SignedDistanceFunction< T >
SignedDistanceFunction ()=default
 Disallowed, use the full constructor.
 
+virtual ~SignedDistanceFunction ()=default
 Destructor (does nothing)
 
virtual T unsignedDistance2 (const Vec3T< T > &a_point) const noexcept
 Unsigned distance function. Must return the distance^2. More...
 
void scale (const Vec3T< T > &a_scale) noexcept
 Scale signed distance function. More...
 
void translate (const Vec3T< T > &a_translation) noexcept
 Translate signed distance function. More...
 
void rotate (const T a_angle, const int a_axis) noexcept
 Rotate the signed distance function around. More...
 
+ + + + + + + + + + + + + + +

+Protected Attributes

+Vec3T< T > m_center
 Sphere center.
 
+T m_radius
 Sphere radius.
 
+bool m_flipInside
 For flipping sign.
 
- Protected Attributes inherited from SignedDistanceFunction< T >
+std::deque< std::shared_ptr< TransformOp< T > > > m_transformOps
 List of transformation operators for the signed distance field.
 
+ + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from SignedDistanceFunction< T >
+Vec3T< T > transformPoint (const Vec3T< T > &a_point) const noexcept
 Apply transformation operators and move point.
 
+

Detailed Description

+

template<class T>
+class SphereSDF< T >

+ +

Signed distance field for sphere.

+

Constructor & Destructor Documentation

+ +

◆ SphereSDF()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
SphereSDF< T >::SphereSDF (const Vec3T< T > & a_center,
const T & a_radius,
const bool a_flipInside 
)
+
+inline
+
+ +

Default constructor.

+
Parameters
+ + + + +
[in]a_centerSphere center
[in]a_radiusSphere radius
[in]a_flipInsideFlip inside or not
+
+
+ +
+
+

Member Function Documentation

+ +

◆ signedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
virtual T SphereSDF< T >::signedDistance (const Vec3T< T > & a_point) const
+
+inlineoverridevirtualnoexcept
+
+ +

Signed distance function for sphere.

+
Parameters
+ + +
[in]a_pointPosition.
+
+
+ +

Implements SignedDistanceFunction< T >.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/doxygen/html/classSphereSDF__coll__graph.map b/docs/doxygen/html/classSphereSDF__coll__graph.map new file mode 100644 index 00000000..493108dc --- /dev/null +++ b/docs/doxygen/html/classSphereSDF__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classSphereSDF__coll__graph.md5 b/docs/doxygen/html/classSphereSDF__coll__graph.md5 new file mode 100644 index 00000000..467a4ef5 --- /dev/null +++ b/docs/doxygen/html/classSphereSDF__coll__graph.md5 @@ -0,0 +1 @@ +d31bae65254dd6c030951a4f5409785b \ No newline at end of file diff --git a/docs/doxygen/html/classSphereSDF__coll__graph.png b/docs/doxygen/html/classSphereSDF__coll__graph.png new file mode 100644 index 00000000..92204e84 Binary files /dev/null and b/docs/doxygen/html/classSphereSDF__coll__graph.png differ diff --git a/docs/doxygen/html/classSphereSDF__inherit__graph.map b/docs/doxygen/html/classSphereSDF__inherit__graph.map new file mode 100644 index 00000000..493108dc --- /dev/null +++ b/docs/doxygen/html/classSphereSDF__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classSphereSDF__inherit__graph.md5 b/docs/doxygen/html/classSphereSDF__inherit__graph.md5 new file mode 100644 index 00000000..1f10b33b --- /dev/null +++ b/docs/doxygen/html/classSphereSDF__inherit__graph.md5 @@ -0,0 +1 @@ +208a5ea8b27b6b280eb4294b808ce2f7 \ No newline at end of file diff --git a/docs/doxygen/html/classSphereSDF__inherit__graph.png b/docs/doxygen/html/classSphereSDF__inherit__graph.png new file mode 100644 index 00000000..92204e84 Binary files /dev/null and b/docs/doxygen/html/classSphereSDF__inherit__graph.png differ diff --git a/docs/doxygen/html/classTransformOp-members.html b/docs/doxygen/html/classTransformOp-members.html new file mode 100644 index 00000000..eebe705c --- /dev/null +++ b/docs/doxygen/html/classTransformOp-members.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TransformOp< T > Member List
+
+
+ +

This is the complete list of members for TransformOp< T >, including all inherited members.

+ + + + +
transform(const Vec3T< T > &a_inputPoint) const noexcept=0TransformOp< T >pure virtual
TransformOp()=defaultTransformOp< T >
~TransformOp()=defaultTransformOp< T >virtual
+ + + + diff --git a/docs/doxygen/html/classTransformOp.html b/docs/doxygen/html/classTransformOp.html new file mode 100644 index 00000000..8a919a08 --- /dev/null +++ b/docs/doxygen/html/classTransformOp.html @@ -0,0 +1,155 @@ + + + + + + + +EBGeometry: TransformOp< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
TransformOp< T > Class Template Referenceabstract
+
+
+ +

Base class for transformation operators. + More...

+ +

#include <EBGeometry_TransformOps.hpp>

+
+Inheritance diagram for TransformOp< T >:
+
+
Inheritance graph
+ + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

TransformOp ()=default
 Default constructor.
 
+virtual ~TransformOp ()=default
 Destructor.
 
virtual Vec3T< T > transform (const Vec3T< T > &a_inputPoint) const noexcept=0
 Transform input coordinate. More...
 
+

Detailed Description

+

template<class T>
+class TransformOp< T >

+ +

Base class for transformation operators.

+

Member Function Documentation

+ +

◆ transform()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
virtual Vec3T<T> TransformOp< T >::transform (const Vec3T< T > & a_inputPoint) const
+
+pure virtualnoexcept
+
+ +

Transform input coordinate.

+
Parameters
+ + +
[in]a_inputPointInput point
+
+
+
Returns
Returns transformed point.
+ +

Implemented in RotateOp< T >, ScaleOp< T >, and TranslateOp< T >.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/doxygen/html/classTransformOp__inherit__graph.map b/docs/doxygen/html/classTransformOp__inherit__graph.map new file mode 100644 index 00000000..104c12b0 --- /dev/null +++ b/docs/doxygen/html/classTransformOp__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/doxygen/html/classTransformOp__inherit__graph.md5 b/docs/doxygen/html/classTransformOp__inherit__graph.md5 new file mode 100644 index 00000000..73a9875b --- /dev/null +++ b/docs/doxygen/html/classTransformOp__inherit__graph.md5 @@ -0,0 +1 @@ +c1ab0ee67eebb3f698105fe4e19249f7 \ No newline at end of file diff --git a/docs/doxygen/html/classTransformOp__inherit__graph.png b/docs/doxygen/html/classTransformOp__inherit__graph.png new file mode 100644 index 00000000..84967194 Binary files /dev/null and b/docs/doxygen/html/classTransformOp__inherit__graph.png differ diff --git a/docs/doxygen/html/classTranslateOp-members.html b/docs/doxygen/html/classTranslateOp-members.html new file mode 100644 index 00000000..dd8e75b0 --- /dev/null +++ b/docs/doxygen/html/classTranslateOp-members.html @@ -0,0 +1,84 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TranslateOp< T > Member List
+
+
+ +

This is the complete list of members for TranslateOp< T >, including all inherited members.

+ + + + + + + + +
m_translationTranslateOp< T >protected
transform(const Vec3T< T > &a_inputPoint) const noexcept overrideTranslateOp< T >virtual
TransformOp()=defaultTransformOp< T >
TranslateOp()TranslateOp< T >
TranslateOp(const Vec3T< T > &a_translation)TranslateOp< T >
~TransformOp()=defaultTransformOp< T >virtual
~TranslateOp()=defaultTranslateOp< T >virtual
+ + + + diff --git a/docs/doxygen/html/classTranslateOp.html b/docs/doxygen/html/classTranslateOp.html new file mode 100644 index 00000000..cff48a45 --- /dev/null +++ b/docs/doxygen/html/classTranslateOp.html @@ -0,0 +1,144 @@ + + + + + + + +EBGeometry: TranslateOp< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
TranslateOp< T > Class Template Reference
+
+
+ +

Translation operator. Can translate an input point. + More...

+ +

#include <EBGeometry_TransformOps.hpp>

+
+Inheritance diagram for TranslateOp< T >:
+
+
Inheritance graph
+ + + +
[legend]
+
+Collaboration diagram for TranslateOp< T >:
+
+
Collaboration graph
+ + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

TranslateOp ()
 Default constructor.
 
TranslateOp (const Vec3T< T > &a_translation)
 Full constructor.
 
+virtual ~TranslateOp ()=default
 Destructor.
 
+Vec3T< T > transform (const Vec3T< T > &a_inputPoint) const noexcept override
 Transform input point.
 
- Public Member Functions inherited from TransformOp< T >
TransformOp ()=default
 Default constructor.
 
+virtual ~TransformOp ()=default
 Destructor.
 
+ + + + +

+Protected Attributes

+Vec3T< T > m_translation
 Translation of input point.
 
+

Detailed Description

+

template<class T>
+class TranslateOp< T >

+ +

Translation operator. Can translate an input point.

+

The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classTranslateOp__coll__graph.map b/docs/doxygen/html/classTranslateOp__coll__graph.map new file mode 100644 index 00000000..a6d76bdb --- /dev/null +++ b/docs/doxygen/html/classTranslateOp__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classTranslateOp__coll__graph.md5 b/docs/doxygen/html/classTranslateOp__coll__graph.md5 new file mode 100644 index 00000000..52d1a310 --- /dev/null +++ b/docs/doxygen/html/classTranslateOp__coll__graph.md5 @@ -0,0 +1 @@ +e8ed4c6a88d7574688b7606cec5dd88e \ No newline at end of file diff --git a/docs/doxygen/html/classTranslateOp__coll__graph.png b/docs/doxygen/html/classTranslateOp__coll__graph.png new file mode 100644 index 00000000..f2787a7a Binary files /dev/null and b/docs/doxygen/html/classTranslateOp__coll__graph.png differ diff --git a/docs/doxygen/html/classTranslateOp__inherit__graph.map b/docs/doxygen/html/classTranslateOp__inherit__graph.map new file mode 100644 index 00000000..a6d76bdb --- /dev/null +++ b/docs/doxygen/html/classTranslateOp__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classTranslateOp__inherit__graph.md5 b/docs/doxygen/html/classTranslateOp__inherit__graph.md5 new file mode 100644 index 00000000..7e3fda6c --- /dev/null +++ b/docs/doxygen/html/classTranslateOp__inherit__graph.md5 @@ -0,0 +1 @@ +afd519cf5e6a0e34a8d6feee1d652a7a \ No newline at end of file diff --git a/docs/doxygen/html/classTranslateOp__inherit__graph.png b/docs/doxygen/html/classTranslateOp__inherit__graph.png new file mode 100644 index 00000000..f2787a7a Binary files /dev/null and b/docs/doxygen/html/classTranslateOp__inherit__graph.png differ diff --git a/docs/doxygen/html/classUnion-members.html b/docs/doxygen/html/classUnion-members.html new file mode 100644 index 00000000..3e1e13e5 --- /dev/null +++ b/docs/doxygen/html/classUnion-members.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Union< T > Member List
+
+
+ +

This is the complete list of members for Union< T >, including all inherited members.

+ + + + + + + + + + + + + + + + +
m_distanceFunctionsUnion< T >protected
m_flipSignUnion< T >protected
m_transformOpsSignedDistanceFunction< T >protected
rotate(const T a_angle, const int a_axis) noexceptSignedDistanceFunction< T >inline
scale(const Vec3T< T > &a_scale) noexceptSignedDistanceFunction< T >inline
SDF typedefUnion< T >
signedDistance(const Vec3T< T > &a_point) const noexcept overrideUnion< T >virtual
SignedDistanceFunction()=defaultSignedDistanceFunction< T >
transformPoint(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >inlineprotected
translate(const Vec3T< T > &a_translation) noexceptSignedDistanceFunction< T >inline
Union()=deleteUnion< T >
Union(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)Union< T >
unsignedDistance2(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >virtual
~SignedDistanceFunction()=defaultSignedDistanceFunction< T >virtual
~Union()=defaultUnion< T >virtual
+ + + + diff --git a/docs/doxygen/html/classUnion.html b/docs/doxygen/html/classUnion.html new file mode 100644 index 00000000..4606c6cf --- /dev/null +++ b/docs/doxygen/html/classUnion.html @@ -0,0 +1,259 @@ + + + + + + + +EBGeometry: Union< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
Union< T > Class Template Reference
+
+
+ +

Distance function union. Computes the signed distance to the closest object of N non-overlapping objects. + More...

+ +

#include <EBGeometry_Union.hpp>

+
+Inheritance diagram for Union< T >:
+
+
Inheritance graph
+ + + +
[legend]
+
+Collaboration diagram for Union< T >:
+
+
Collaboration graph
+ + + +
[legend]
+ + + + + +

+Public Types

+using SDF = SignedDistanceFunction< T >
 Alias for cutting down on typing.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Union ()=delete
 Disallowed, use the full constructor.
 
 Union (const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)
 Full constructor. Computes the signed distance. More...
 
+virtual ~Union ()=default
 Destructor (does nothing)
 
signedDistance (const Vec3T< T > &a_point) const noexcept override
 Value function. More...
 
- Public Member Functions inherited from SignedDistanceFunction< T >
SignedDistanceFunction ()=default
 Disallowed, use the full constructor.
 
+virtual ~SignedDistanceFunction ()=default
 Destructor (does nothing)
 
virtual T unsignedDistance2 (const Vec3T< T > &a_point) const noexcept
 Unsigned distance function. Must return the distance^2. More...
 
void scale (const Vec3T< T > &a_scale) noexcept
 Scale signed distance function. More...
 
void translate (const Vec3T< T > &a_translation) noexcept
 Translate signed distance function. More...
 
void rotate (const T a_angle, const int a_axis) noexcept
 Rotate the signed distance function around. More...
 
+ + + + + + + + + + + +

+Protected Attributes

+std::vector< std::shared_ptr< const SDF > > m_distanceFunctions
 List of distance functions.
 
+bool m_flipSign
 Hook for turning inside to outside.
 
- Protected Attributes inherited from SignedDistanceFunction< T >
+std::deque< std::shared_ptr< TransformOp< T > > > m_transformOps
 List of transformation operators for the signed distance field.
 
+ + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from SignedDistanceFunction< T >
+Vec3T< T > transformPoint (const Vec3T< T > &a_point) const noexcept
 Apply transformation operators and move point.
 
+

Detailed Description

+

template<class T>
+class Union< T >

+ +

Distance function union. Computes the signed distance to the closest object of N non-overlapping objects.

+
Note
This class only makes sense if the object do not overlap.
+

Constructor & Destructor Documentation

+ +

◆ Union()

+ +
+
+
+template<class T >
+ + + + + + + + + + + + + + + + + + +
Union< T >::Union (const std::vector< std::shared_ptr< SDF > > & a_distanceFunctions,
const bool a_flipSign 
)
+
+ +

Full constructor. Computes the signed distance.

+
Parameters
+ + + +
[in]a_distanceFunctionsDistance functions
[in]a_flipSignHook for turning inside to outside
+
+
+ +
+
+

Member Function Documentation

+ +

◆ signedDistance()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Union< T >::signedDistance (const Vec3T< T > & a_point) const
+
+overridevirtualnoexcept
+
+ +

Value function.

+
Parameters
+ + +
[in]a_point3D point.
+
+
+ +

Implements SignedDistanceFunction< T >.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classUnionBVH-members.html b/docs/doxygen/html/classUnionBVH-members.html new file mode 100644 index 00000000..21bd29d0 --- /dev/null +++ b/docs/doxygen/html/classUnionBVH-members.html @@ -0,0 +1,100 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
UnionBVH< T, BV, K > Member List
+
+
+ +

This is the complete list of members for UnionBVH< T, BV, K >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
BuilderNode typedefUnionBVH< T, BV, K >protected
buildTree(const BVConstructor &a_bvConstructor)UnionBVH< T, BV, K >
BVConstructor typedefUnionBVH< T, BV, K >
LinearNode typedefUnionBVH< T, BV, K >protected
m_distanceFunctionsUnionBVH< T, BV, K >protected
m_flipSignUnionBVH< T, BV, K >protected
m_isGoodUnionBVH< T, BV, K >protected
m_rootNodeUnionBVH< T, BV, K >protected
m_transformOpsSignedDistanceFunction< T >protected
rotate(const T a_angle, const int a_axis) noexceptSignedDistanceFunction< T >inline
scale(const Vec3T< T > &a_scale) noexceptSignedDistanceFunction< T >inline
SDF typedefUnionBVH< T, BV, K >
SDFList typedefUnionBVH< T, BV, K >protected
signedDistance(const Vec3T< T > &a_point) const noexcept overrideUnionBVH< T, BV, K >virtual
SignedDistanceFunction()=defaultSignedDistanceFunction< T >
transformPoint(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >inlineprotected
translate(const Vec3T< T > &a_translation) noexceptSignedDistanceFunction< T >inline
UnionBVH()=deleteUnionBVH< T, BV, K >
UnionBVH(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)UnionBVH< T, BV, K >
UnionBVH(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign, const BVConstructor &a_bvConstructor)UnionBVH< T, BV, K >
unsignedDistance2(const Vec3T< T > &a_point) const noexceptSignedDistanceFunction< T >virtual
~SignedDistanceFunction()=defaultSignedDistanceFunction< T >virtual
~UnionBVH()=defaultUnionBVH< T, BV, K >virtual
+ + + + diff --git a/docs/doxygen/html/classUnionBVH.html b/docs/doxygen/html/classUnionBVH.html new file mode 100644 index 00000000..0d4bfcfe --- /dev/null +++ b/docs/doxygen/html/classUnionBVH.html @@ -0,0 +1,367 @@ + + + + + + + +EBGeometry: UnionBVH< T, BV, K > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
UnionBVH< T, BV, K > Class Template Reference
+
+
+ +

Distance function union using BVHs. Computes the signed distance to the closest object of N non-overlapping objects. + More...

+ +

#include <EBGeometry_UnionBVH.hpp>

+
+Inheritance diagram for UnionBVH< T, BV, K >:
+
+
Inheritance graph
+ + + +
[legend]
+
+Collaboration diagram for UnionBVH< T, BV, K >:
+
+
Collaboration graph
+ + + +
[legend]
+ + + + + + + + +

+Public Types

+using SDF = SignedDistanceFunction< T >
 Alias for cutting down on typing.
 
+using BVConstructor = EBGeometry::BVH::BVConstructorT< SDF, BV >
 Alias for cutting down on typing. This is a std::function<BV(SDF)>, i.e. a function which returns a bounding volume for an SDF.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

UnionBVH ()=delete
 Disallowed, use the full constructor.
 
 UnionBVH (const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)
 Partial constructor. Associates distance functions but does not build BVH tree. More...
 
 UnionBVH (const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign, const BVConstructor &a_bvConstructor)
 Full constructor. More...
 
void buildTree (const BVConstructor &a_bvConstructor)
 Build BVH tree for the input objects. User must supply a partitioner and a BV constructor for the SDF objects. More...
 
+virtual ~UnionBVH ()=default
 Destructor (does nothing)
 
signedDistance (const Vec3T< T > &a_point) const noexcept override
 Value function. More...
 
- Public Member Functions inherited from SignedDistanceFunction< T >
SignedDistanceFunction ()=default
 Disallowed, use the full constructor.
 
+virtual ~SignedDistanceFunction ()=default
 Destructor (does nothing)
 
virtual T unsignedDistance2 (const Vec3T< T > &a_point) const noexcept
 Unsigned distance function. Must return the distance^2. More...
 
void scale (const Vec3T< T > &a_scale) noexcept
 Scale signed distance function. More...
 
void translate (const Vec3T< T > &a_translation) noexcept
 Translate signed distance function. More...
 
void rotate (const T a_angle, const int a_axis) noexcept
 Rotate the signed distance function around. More...
 
+ + + + + + + + + + +

+Protected Types

+using SDFList = std::vector< std::shared_ptr< const SDF > >
 Alias for cutting down on typing.
 
+using BuilderNode = EBGeometry::BVH::NodeT< T, SDF, BV, K >
 Builder node type in BVH tree. Tree is constructed in "full".
 
+using LinearNode = EBGeometry::BVH::LinearBVH< T, SDF, BV, K >
 Node type in BVH tree. We use a flattened tree.
 
+ + + + + + + + + + + + + + + + + +

+Protected Attributes

+std::vector< std::shared_ptr< const SDF > > m_distanceFunctions
 List of distance functions.
 
+std::shared_ptr< LinearNodem_rootNode
 Root node for BVH tree.
 
+bool m_isGood
 Is good or not.
 
+bool m_flipSign
 Hook for turning inside to outside.
 
- Protected Attributes inherited from SignedDistanceFunction< T >
+std::deque< std::shared_ptr< TransformOp< T > > > m_transformOps
 List of transformation operators for the signed distance field.
 
+ + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from SignedDistanceFunction< T >
+Vec3T< T > transformPoint (const Vec3T< T > &a_point) const noexcept
 Apply transformation operators and move point.
 
+

Detailed Description

+

template<class T, class BV, int K>
+class UnionBVH< T, BV, K >

+ +

Distance function union using BVHs. Computes the signed distance to the closest object of N non-overlapping objects.

+
Note
This class only makes sense if the object do not overlap.
+

Constructor & Destructor Documentation

+ +

◆ UnionBVH() [1/2]

+ +
+
+
+template<class T , class BV , int K>
+ + + + + + + + + + + + + + + + + + +
UnionBVH< T, BV, K >::UnionBVH (const std::vector< std::shared_ptr< SDF > > & a_distanceFunctions,
const bool a_flipSign 
)
+
+ +

Partial constructor. Associates distance functions but does not build BVH tree.

+
Parameters
+ + + +
[in]a_distanceFunctionsSigned distance functions.
[in]a_flipSignHook for turning inside to outside
+
+
+ +
+
+ +

◆ UnionBVH() [2/2]

+ +
+
+
+template<class T , class BV , int K>
+ + + + + + + + + + + + + + + + + + + + + + + + +
UnionBVH< T, BV, K >::UnionBVH (const std::vector< std::shared_ptr< SDF > > & a_distanceFunctions,
const bool a_flipSign,
const BVConstructora_bvConstructor 
)
+
+ +

Full constructor.

+
Parameters
+ + + + +
[in]a_distanceFunctionsSigned distance functions.
[in]a_flipSignHook for turning inside to outside
[in]a_bvConstructorBounding volume constructor.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ buildTree()

+ +
+
+
+template<class T , class BV , int K>
+ + + + + + + + +
void UnionBVH< T, BV, K >::buildTree (const BVConstructora_bvConstructor)
+
+ +

Build BVH tree for the input objects. User must supply a partitioner and a BV constructor for the SDF objects.

+
Parameters
+ + +
[in]a_bvConstructorConstructor for building a bounding volume that encloses an object.
+
+
+ +
+
+ +

◆ signedDistance()

+ +
+
+
+template<class T , class BV , int K>
+ + + + + +
+ + + + + + + + +
T UnionBVH< T, BV, K >::signedDistance (const Vec3T< T > & a_point) const
+
+overridevirtualnoexcept
+
+ +

Value function.

+
Parameters
+ + +
[in]a_point3D point.
+
+
+ +

Implements SignedDistanceFunction< T >.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classUnionBVH__coll__graph.map b/docs/doxygen/html/classUnionBVH__coll__graph.map new file mode 100644 index 00000000..076719e9 --- /dev/null +++ b/docs/doxygen/html/classUnionBVH__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classUnionBVH__coll__graph.md5 b/docs/doxygen/html/classUnionBVH__coll__graph.md5 new file mode 100644 index 00000000..894879f4 --- /dev/null +++ b/docs/doxygen/html/classUnionBVH__coll__graph.md5 @@ -0,0 +1 @@ +89260ebc0c4910bc19f4d7f598b390c8 \ No newline at end of file diff --git a/docs/doxygen/html/classUnionBVH__coll__graph.png b/docs/doxygen/html/classUnionBVH__coll__graph.png new file mode 100644 index 00000000..7dae05e5 Binary files /dev/null and b/docs/doxygen/html/classUnionBVH__coll__graph.png differ diff --git a/docs/doxygen/html/classUnionBVH__inherit__graph.map b/docs/doxygen/html/classUnionBVH__inherit__graph.map new file mode 100644 index 00000000..076719e9 --- /dev/null +++ b/docs/doxygen/html/classUnionBVH__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classUnionBVH__inherit__graph.md5 b/docs/doxygen/html/classUnionBVH__inherit__graph.md5 new file mode 100644 index 00000000..f8d96020 --- /dev/null +++ b/docs/doxygen/html/classUnionBVH__inherit__graph.md5 @@ -0,0 +1 @@ +d7ced99dce532dc8db25c358f7b67e7a \ No newline at end of file diff --git a/docs/doxygen/html/classUnionBVH__inherit__graph.png b/docs/doxygen/html/classUnionBVH__inherit__graph.png new file mode 100644 index 00000000..7dae05e5 Binary files /dev/null and b/docs/doxygen/html/classUnionBVH__inherit__graph.png differ diff --git a/docs/doxygen/html/classUnion__coll__graph.map b/docs/doxygen/html/classUnion__coll__graph.map new file mode 100644 index 00000000..0a835f0a --- /dev/null +++ b/docs/doxygen/html/classUnion__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classUnion__coll__graph.md5 b/docs/doxygen/html/classUnion__coll__graph.md5 new file mode 100644 index 00000000..34d26c02 --- /dev/null +++ b/docs/doxygen/html/classUnion__coll__graph.md5 @@ -0,0 +1 @@ +d9d57de9e37f5aec4de4fe627c6961fe \ No newline at end of file diff --git a/docs/doxygen/html/classUnion__coll__graph.png b/docs/doxygen/html/classUnion__coll__graph.png new file mode 100644 index 00000000..1c8218bb Binary files /dev/null and b/docs/doxygen/html/classUnion__coll__graph.png differ diff --git a/docs/doxygen/html/classUnion__inherit__graph.map b/docs/doxygen/html/classUnion__inherit__graph.map new file mode 100644 index 00000000..0a835f0a --- /dev/null +++ b/docs/doxygen/html/classUnion__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/classUnion__inherit__graph.md5 b/docs/doxygen/html/classUnion__inherit__graph.md5 new file mode 100644 index 00000000..b07d3252 --- /dev/null +++ b/docs/doxygen/html/classUnion__inherit__graph.md5 @@ -0,0 +1 @@ +47f52e51ce3f11a9251cc3778b71cd81 \ No newline at end of file diff --git a/docs/doxygen/html/classUnion__inherit__graph.png b/docs/doxygen/html/classUnion__inherit__graph.png new file mode 100644 index 00000000..1c8218bb Binary files /dev/null and b/docs/doxygen/html/classUnion__inherit__graph.png differ diff --git a/docs/doxygen/html/classVec2T-members.html b/docs/doxygen/html/classVec2T-members.html new file mode 100644 index 00000000..f80b0cfc --- /dev/null +++ b/docs/doxygen/html/classVec2T-members.html @@ -0,0 +1,101 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Vec2T< T > Member List
+
+
+ +

This is the complete list of members for Vec2T< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
dot(const Vec2T &a_other) const noexceptVec2T< T >inline
infinity() noexceptVec2T< T >inlinestatic
length() const noexceptVec2T< T >inline
length2() const noexceptVec2T< T >inline
max() noexceptVec2T< T >inlinestatic
min() noexceptVec2T< T >inlinestatic
one() noexceptVec2T< T >inlinestatic
operator*(const T &s) const noexceptVec2T< T >inline
operator*=(const T &s) noexceptVec2T< T >inline
operator+(const Vec2T &a_other) const noexceptVec2T< T >inline
operator+=(const Vec2T &a_other) noexceptVec2T< T >inline
operator-(const Vec2T &a_other) const noexceptVec2T< T >inline
operator-() const noexceptVec2T< T >inline
operator-=(const Vec2T &a_other) noexceptVec2T< T >inline
operator/(const T &s) const noexceptVec2T< T >inline
operator/=(const T &s) noexceptVec2T< T >inline
operator=(const Vec2T &a_other) noexceptVec2T< T >inline
Vec2T()Vec2T< T >inline
Vec2T(const Vec2T &u)Vec2T< T >inline
Vec2T(const T &a_x, const T &a_y)Vec2T< T >inline
xVec2T< T >
yVec2T< T >
zero() noexceptVec2T< T >inlinestatic
~Vec2T()=defaultVec2T< T >
+ + + + diff --git a/docs/doxygen/html/classVec2T.html b/docs/doxygen/html/classVec2T.html new file mode 100644 index 00000000..b2bb6b79 --- /dev/null +++ b/docs/doxygen/html/classVec2T.html @@ -0,0 +1,702 @@ + + + + + + + +EBGeometry: Vec2T< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

Two-dimensional vector class with arithmetic operators. + More...

+ +

#include <EBGeometry_Vec.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Vec2T ()
 Default constructor. Sets the vector to the zero vector.
 
 Vec2T (const Vec2T &u)
 Copy constructor. More...
 
 Vec2T (const T &a_x, const T &a_y)
 Full constructor. More...
 
~Vec2T ()=default
 Destructor (does nothing)
 
Vec2T< T > & operator= (const Vec2T &a_other) noexcept
 Assignment operator. Sets this.x = a_other.x and this.y = a_other.y. More...
 
Vec2T< T > operator+ (const Vec2T &a_other) const noexcept
 Addition operator. More...
 
Vec2T< T > operator- (const Vec2T &a_other) const noexcept
 Subtraction operator. More...
 
+Vec2T< T > operator- () const noexcept
 Negation operator. Returns a new Vec2T<T> with negated components.
 
Vec2T< T > operator* (const T &s) const noexcept
 Multiplication operator. More...
 
Vec2T< T > operator/ (const T &s) const noexcept
 Division operator. More...
 
Vec2T< T > & operator+= (const Vec2T &a_other) noexcept
 Addition operator. More...
 
Vec2T< T > & operator-= (const Vec2T &a_other) noexcept
 Subtraction operator. More...
 
Vec2T< T > & operator*= (const T &s) noexcept
 Multiplication operator. More...
 
Vec2T< T > & operator/= (const T &s) noexcept
 Division operator operator. More...
 
dot (const Vec2T &a_other) const noexcept
 Dot product operator. More...
 
length () const noexcept
 Compute length of vector. More...
 
length2 () const noexcept
 Compute square of vector. More...
 
+ + + + + + + + + + + + + + + + +

+Static Public Member Functions

+static constexpr Vec2T< T > zero () noexcept
 Return av vector with x = y = 0.
 
+static constexpr Vec2T< T > one () noexcept
 Return av vector with x = y = 1.
 
+static constexpr Vec2T< T > min () noexcept
 Return minimum possible representative vector.
 
+static constexpr Vec2T< T > max () noexcept
 Return maximum possible representative vector.
 
+static constexpr Vec2T< T > infinity () noexcept
 Return a vector with inf components.
 
+ + + + + + + +

+Public Attributes

+T x
 First component in the vector.
 
+T y
 Second component in the vector.
 
+

Detailed Description

+

template<class T>
+class Vec2T< T >

+ +

Two-dimensional vector class with arithmetic operators.

+

The class has a public-only interface. To change it's components one can call the member functions, or set components directly, e.g. vec.x = 5.0

Note
Vec2T is a templated class primarily used with DCEL grids.
+

Constructor & Destructor Documentation

+ +

◆ Vec2T() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T >::Vec2T (const Vec2T< T > & u)
+
+inline
+
+ +

Copy constructor.

+
Parameters
+ + +
[in]uOther vector
+
+
+

Sets *this = u

+ +
+
+ +

◆ Vec2T() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
Vec2T< T >::Vec2T (const T & a_x,
const T & a_y 
)
+
+inline
+
+ +

Full constructor.

+
Parameters
+ + + +
[in]a_xFirst vector component
[in]a_ySecond vector component
+
+
+

Sets this->x = a_x and this->y = a_y

+ +
+
+

Member Function Documentation

+ +

◆ dot()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Vec2T< T >::dot (const Vec2T< T > & a_other) const
+
+inlinenoexcept
+
+ +

Dot product operator.

+
Parameters
+ + +
[in]a_otherother vector
+
+
+

Returns the dot product, i.e. this->x*a_other.x + this->y+a_other.y

+ +
+
+ +

◆ length()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
T Vec2T< T >::length () const
+
+inlinenoexcept
+
+ +

Compute length of vector.

+
Returns
Returns length of vector, i.e. sqrt[(this->x)*(this->x) + (this->y)*(this->y)]
+ +
+
+ +

◆ length2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
T Vec2T< T >::length2 () const
+
+inlinenoexcept
+
+ +

Compute square of vector.

+
Returns
Returns length of vector, i.e. (this->x)*(this->x) + (this->y)*(this->y)
+ +
+
+ +

◆ operator*()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > Vec2T< T >::operator* (const T & s) const
+
+inlinenoexcept
+
+ +

Multiplication operator.

+
Parameters
+ + +
[in]sScalar to be multiplied
+
+
+

Returns a new Vec2T<T> with components x = s*this->x (and same for y)

+ +
+
+ +

◆ operator*=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > & Vec2T< T >::operator*= (const T & s)
+
+inlinenoexcept
+
+ +

Multiplication operator.

+
Parameters
+ + +
[in]sScalar to multiply by
+
+
+

Returns (*this) with components this->x = s*this->x (and same for y)

+ +
+
+ +

◆ operator+()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > Vec2T< T >::operator+ (const Vec2T< T > & a_other) const
+
+inlinenoexcept
+
+ +

Addition operator.

+
Parameters
+ + +
[in]a_otherOther vector
+
+
+

Returns a new object with component x = this->x + a_other.x (same for y-component)

+ +
+
+ +

◆ operator+=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > & Vec2T< T >::operator+= (const Vec2T< T > & a_other)
+
+inlinenoexcept
+
+ +

Addition operator.

+
Parameters
+ + +
[in]a_otherOther vector to add
+
+
+

Returns (*this) with components this->x = this->x + a_other.x (and same for y)

+ +
+
+ +

◆ operator-()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > Vec2T< T >::operator- (const Vec2T< T > & a_other) const
+
+inlinenoexcept
+
+ +

Subtraction operator.

+
Parameters
+ + +
[in]a_otherOther vector
+
+
+

Returns a new object with component x = this->x - a_other.x (same for y-component)

+ +
+
+ +

◆ operator-=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > & Vec2T< T >::operator-= (const Vec2T< T > & a_other)
+
+inlinenoexcept
+
+ +

Subtraction operator.

+
Parameters
+ + +
[in]a_otherOther vector to subtract
+
+
+

Returns (*this) with components this->x = this->x - a_other.x (and same for y)

+ +
+
+ +

◆ operator/()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > Vec2T< T >::operator/ (const T & s) const
+
+inlinenoexcept
+
+ +

Division operator.

+
Parameters
+ + +
[in]sScalar to be multiplied
+
+
+

Returns a new Vec2T<T> with components x = (1/s)*this->x (and same for y)

+ +
+
+ +

◆ operator/=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > & Vec2T< T >::operator/= (const T & s)
+
+inlinenoexcept
+
+ +

Division operator operator.

+
Parameters
+ + +
[in]sScalar to divide by
+
+
+

Returns (*this) with components this->x = (1/s)*this->x (and same for y)

+ +
+
+ +

◆ operator=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec2T< T > & Vec2T< T >::operator= (const Vec2T< T > & a_other)
+
+inlinenoexcept
+
+ +

Assignment operator. Sets this.x = a_other.x and this.y = a_other.y.

+
Parameters
+ + +
[in]a_otherOther vector
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classVec3T-members.html b/docs/doxygen/html/classVec3T-members.html new file mode 100644 index 00000000..a81beba0 --- /dev/null +++ b/docs/doxygen/html/classVec3T-members.html @@ -0,0 +1,113 @@ + + + + + + + +EBGeometry: Member List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Vec3T< T > Member List
+
+
+ +

This is the complete list of members for Vec3T< T >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cross(const Vec3T< T > &u) const noexceptVec3T< T >inline
dot(const Vec3T< T > &u) const noexceptVec3T< T >inline
infinity() noexceptVec3T< T >inlinestatic
length() const noexceptVec3T< T >inline
length2() const noexceptVec3T< T >inline
max() noexceptVec3T< T >inlinestatic
max(const Vec3T< T > &u) noexceptVec3T< T >inline
maxDir(const bool a_doAbs) const noexceptVec3T< T >inline
min() noexceptVec3T< T >inlinestatic
min(const Vec3T< T > &u) noexceptVec3T< T >inline
one() noexceptVec3T< T >inlinestatic
operator*(const T &s) const noexceptVec3T< T >inline
operator*(const Vec3T< T > &s) const noexceptVec3T< T >inline
operator*=(const T &s) noexceptVec3T< T >inline
operator+(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator+=(const Vec3T< T > &u) noexceptVec3T< T >inline
operator-(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator-() const noexceptVec3T< T >inline
operator-=(const Vec3T< T > &u) noexceptVec3T< T >inline
operator/(const T &s) const noexceptVec3T< T >inline
operator/(const Vec3T< T > &v) const noexceptVec3T< T >inline
operator/=(const T &s) noexceptVec3T< T >inline
operator<(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator<=(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator=(const Vec3T< T > &u) noexceptVec3T< T >inline
operator==(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator>(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator>=(const Vec3T< T > &u) const noexceptVec3T< T >inline
operator[](int i) noexceptVec3T< T >inline
operator[](int i) const noexceptVec3T< T >inline
Vec3T()Vec3T< T >inline
Vec3T(const Vec3T< T > &a_u)Vec3T< T >inline
Vec3T(const T &a_x, const T &a_y, const T &a_z)Vec3T< T >inline
XVec3T< T >protected
zero() noexceptVec3T< T >inlinestatic
~Vec3T()=defaultVec3T< T >
+ + + + diff --git a/docs/doxygen/html/classVec3T.html b/docs/doxygen/html/classVec3T.html new file mode 100644 index 00000000..ee6ba797 --- /dev/null +++ b/docs/doxygen/html/classVec3T.html @@ -0,0 +1,1218 @@ + + + + + + + +EBGeometry: Vec3T< T > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

Three-dimensional vector class with arithmetic operators. + More...

+ +

#include <EBGeometry_Vec.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Vec3T ()
 Default constructor. Sets the vector to the zero vector.
 
 Vec3T (const Vec3T< T > &a_u)
 Copy constructor. More...
 
 Vec3T (const T &a_x, const T &a_y, const T &a_z)
 Full constructor. More...
 
~Vec3T ()=default
 Destructor (does nothing)
 
T & operator[] (int i) noexcept
 Return component in vector. (i=0 => x and so on) More...
 
const T & operator[] (int i) const noexcept
 Return non-modifiable component in vector. (i=0 => x and so on) More...
 
bool operator== (const Vec3T< T > &u) const noexcept
 Comparison operator. Returns true if all components are the same. More...
 
bool operator< (const Vec3T< T > &u) const noexcept
 "Smaller than" operator. More...
 
bool operator> (const Vec3T< T > &u) const noexcept
 "Greater than" operator. More...
 
bool operator<= (const Vec3T< T > &u) const noexcept
 "Smaller or equal to" operator. More...
 
bool operator>= (const Vec3T< T > &u) const noexcept
 "Greater or equal to" operator. More...
 
Vec3T< T > & operator= (const Vec3T< T > &u) noexcept
 Assignment operator. Sets components equal to the argument vector's components. More...
 
Vec3T< T > operator+ (const Vec3T< T > &u) const noexcept
 Addition operator. Returns a new vector with added compoments. More...
 
Vec3T< T > operator- (const Vec3T< T > &u) const noexcept
 Subtraction operator. Returns a new vector with subtracted compoments. More...
 
+Vec3T< T > operator- () const noexcept
 Negation operator. Returns a vector with negated components.
 
Vec3T< T > operator* (const T &s) const noexcept
 Multiplication operator. Returns a vector with scalar multiplied components. More...
 
Vec3T< T > operator* (const Vec3T< T > &s) const noexcept
 Component-wise multiplication operator. More...
 
Vec3T< T > operator/ (const T &s) const noexcept
 Division operator. Returns a vector with scalar divided components. More...
 
Vec3T< T > operator/ (const Vec3T< T > &v) const noexcept
 Component-wise division operator. More...
 
Vec3T< T > & operator+= (const Vec3T< T > &u) noexcept
 Vector addition operator. More...
 
Vec3T< T > & operator-= (const Vec3T< T > &u) noexcept
 Vector subtraction operator. More...
 
Vec3T< T > & operator*= (const T &s) noexcept
 Vector multiplication operator. More...
 
Vec3T< T > & operator/= (const T &s) noexcept
 Vector division operator. More...
 
Vec3T< T > min (const Vec3T< T > &u) noexcept
 Vector minimum function. Returns a new vector with componentwise minimums. More...
 
Vec3T< T > max (const Vec3T< T > &u) noexcept
 Vector maximum function. Returns a new vector with componentwise maximums. More...
 
Vec3T< T > cross (const Vec3T< T > &u) const noexcept
 Vector cross product. More...
 
dot (const Vec3T< T > &u) const noexcept
 Vector dot product. More...
 
int maxDir (const bool a_doAbs) const noexcept
 Return the direction which has the largest component (can be absolute) More...
 
length () const noexcept
 Compute vector length. More...
 
length2 () const noexcept
 Compute vector length squared. More...
 
+ + + + + + + + + + + + + + + + +

+Static Public Member Functions

+static constexpr Vec3T< T > zero () noexcept
 Return av vector with x = y = z = 0.
 
+static constexpr Vec3T< T > one () noexcept
 Return av vector with x = y = z = 1.
 
+static constexpr Vec3T< T > min () noexcept
 Return a vector with minimum representable components.
 
+static constexpr Vec3T< T > max () noexcept
 Return a vector with maximum representable components.
 
+static constexpr Vec3T< T > infinity () noexcept
 Return a vector with inf components.
 
+ + + + +

+Protected Attributes

+T X [3]
 Vector components.
 
+

Detailed Description

+

template<class T>
+class Vec3T< T >

+ +

Three-dimensional vector class with arithmetic operators.

+

The class has a public-only interface. To change it's components one can call the member functions, or set components directly, e.g. vec.x = 5.0

Note
Vec3T is a templated class primarily used with DCEL grids. It is always 3D, i.e. independent of Chombo configuration settings. This lets one use DCEL functionality even though the simulation might only be 2D.
+

Constructor & Destructor Documentation

+ +

◆ Vec3T() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T >::Vec3T (const Vec3T< T > & a_u)
+
+inline
+
+ +

Copy constructor.

+
Parameters
+ + +
[in]a_uOther vector
+
+
+

Sets *this = u

+ +
+
+ +

◆ Vec3T() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Vec3T< T >::Vec3T (const T & a_x,
const T & a_y,
const T & a_z 
)
+
+inline
+
+ +

Full constructor.

+
Parameters
+ + + + +
[in]a_xFirst vector component
[in]a_ySecond vector component
[in]a_zThird vector component
+
+
+

Sets this->x = a_x, this->y = a_y, and this->z = a_z

+ +
+
+

Member Function Documentation

+ +

◆ cross()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::cross (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

Vector cross product.

+
Parameters
+ + +
[in]uOther vector
+
+
+
Returns
Returns the cross product between (*this) and u
+ +
+
+ +

◆ dot()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T Vec3T< T >::dot (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

Vector dot product.

+
Parameters
+ + +
[in]uOther vector
+
+
+
Returns
Returns the dot product between (*this) and u
+ +
+
+ +

◆ length()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
T Vec3T< T >::length () const
+
+inlinenoexcept
+
+ +

Compute vector length.

+
Returns
Returns the vector length, i.e. sqrt(X[0]*X[0] + X[1]*X[1] + Y[0]*Y[0])
+ +
+
+ +

◆ length2()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
T Vec3T< T >::length2 () const
+
+inlinenoexcept
+
+ +

Compute vector length squared.

+
Returns
Returns the vector length squared, i.e. (X[0]*X[0] + X[1]*X[1] + Y[0]*Y[0])
+ +
+
+ +

◆ max()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::max (const Vec3T< T > & u)
+
+inlinenoexcept
+
+ +

Vector maximum function. Returns a new vector with componentwise maximums.

+
Parameters
+ + +
[in]uOther vector
+
+
+
Returns
Returns a new vector with X[0] = std::minmax->X[0], u.X[0]) (and same for the other components)
+ +
+
+ +

◆ maxDir()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
int Vec3T< T >::maxDir (const bool a_doAbs) const
+
+inlinenoexcept
+
+ +

Return the direction which has the largest component (can be absolute)

+
Parameters
+ + +
[in]a_doAbsIf true, evaluate component magnitudes rather than values.
+
+
+
Returns
Direction with the biggest component
+ +
+
+ +

◆ min()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::min (const Vec3T< T > & u)
+
+inlinenoexcept
+
+ +

Vector minimum function. Returns a new vector with componentwise minimums.

+
Parameters
+ + +
[in]uOther vector
+
+
+
Returns
Returns a new vector with X[0] = std::min(this->X[0], u.X[0]) (and same for the other components)
+ +
+
+ +

◆ operator*() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::operator* (const T & s) const
+
+inlinenoexcept
+
+ +

Multiplication operator. Returns a vector with scalar multiplied components.

+
Parameters
+ + +
[in]sScalar to multiply by
+
+
+
Returns
Returns a new vector with X[i] = this->X[i] * s
+ +
+
+ +

◆ operator*() [2/2]

+ +
+
+
+template<class T>
+ + + + + +
+ + + + + + + + +
Vec3T<T> Vec3T< T >::operator* (const Vec3T< T > & s) const
+
+inlinenoexcept
+
+ +

Component-wise multiplication operator.

+
Parameters
+ + +
[in]sScalar to multiply by
+
+
+
Returns
Returns a new vector with X[i] = this->X[i] * s[i] for each component.
+ +
+
+ +

◆ operator*=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > & Vec3T< T >::operator*= (const T & s)
+
+inlinenoexcept
+
+ +

Vector multiplication operator.

+
Parameters
+ + +
[in]sScalar to multiply by
+
+
+
Returns
Returns (*this) with multiplied compoments, e.g. this->X[0] = this->X[0] * s
+ +
+
+ +

◆ operator+()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::operator+ (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

Addition operator. Returns a new vector with added compoments.

+
Returns
Returns a new vector with x = this->x - u.x and so on.
+
Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator+=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > & Vec3T< T >::operator+= (const Vec3T< T > & u)
+
+inlinenoexcept
+
+ +

Vector addition operator.

+
Parameters
+ + +
[in]uVector to add
+
+
+
Returns
Returns (*this) with incremented compoments, e.g. this->X[0] = this->X[0] + u.X[0]
+ +
+
+ +

◆ operator-()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::operator- (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

Subtraction operator. Returns a new vector with subtracted compoments.

+
Returns
Returns a new vector with x = this->x - u.x and so on.
+
Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator-=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > & Vec3T< T >::operator-= (const Vec3T< T > & u)
+
+inlinenoexcept
+
+ +

Vector subtraction operator.

+
Parameters
+ + +
[in]uVector to subtraction
+
+
+
Returns
Returns (*this) with subtracted compoments, e.g. this->X[0] = this->X[0] - u.X[0]
+ +
+
+ +

◆ operator/() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::operator/ (const T & s) const
+
+inlinenoexcept
+
+ +

Division operator. Returns a vector with scalar divided components.

+
Parameters
+ + +
[in]sScalar to divided by
+
+
+
Returns
Returns a new vector with X[i] = this->X[i] / s
+ +
+
+ +

◆ operator/() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > Vec3T< T >::operator/ (const Vec3T< T > & v) const
+
+inlinenoexcept
+
+ +

Component-wise division operator.

+
Parameters
+ + +
[in]vOther vector
+
+
+
Returns
Returns a new vector with X[i] = this->X[i]/v[i] for each component.
+ +
+
+ +

◆ operator/=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > & Vec3T< T >::operator/= (const T & s)
+
+inlinenoexcept
+
+ +

Vector division operator.

+
Parameters
+ + +
[in]sScalar to divide by
+
+
+
Returns
Returns (*this) with multiplied compoments, e.g. this->X[0] = this->X[0] / s
+ +
+
+ +

◆ operator<()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Vec3T< T >::operator< (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

"Smaller than" operator.

+

Returns true if this->x < u.x AND this->y < u.y AND this->z < u.z and false otherwise

Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator<=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Vec3T< T >::operator<= (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

"Smaller or equal to" operator.

+

Returns true if this->x <= u.x AND this->y <= u.y AND this->z <= u.z

Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
Vec3T< T > & Vec3T< T >::operator= (const Vec3T< T > & u)
+
+inlinenoexcept
+
+ +

Assignment operator. Sets components equal to the argument vector's components.

+
Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator==()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Vec3T< T >::operator== (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

Comparison operator. Returns true if all components are the same.

+
Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator>()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Vec3T< T >::operator> (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

"Greater than" operator.

+

Returns true if this->x > u.x AND this->y > u.y AND this->z > u.z

Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator>=()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
bool Vec3T< T >::operator>= (const Vec3T< T > & u) const
+
+inlinenoexcept
+
+ +

"Greater or equal to" operator.

+

Returns true if this->x >= u.x AND this->y >= u.y AND this->z >= u.z

Parameters
+ + +
[in]uOther vector
+
+
+ +
+
+ +

◆ operator[]() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
T & Vec3T< T >::operator[] (int i)
+
+inlinenoexcept
+
+ +

Return component in vector. (i=0 => x and so on)

+
Parameters
+ + +
[in]iIndex. Must be < 3
+
+
+ +
+
+ +

◆ operator[]() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + +
const T & Vec3T< T >::operator[] (int i) const
+
+inlinenoexcept
+
+ +

Return non-modifiable component in vector. (i=0 => x and so on)

+
Parameters
+ + +
[in]iIndex. Must be < 3
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/doxygen/html/classes.html b/docs/doxygen/html/classes.html new file mode 100644 index 00000000..a11b6b84 --- /dev/null +++ b/docs/doxygen/html/classes.html @@ -0,0 +1,104 @@ + + + + + + + +EBGeometry: Class Index + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
a | b | e | f | l | m | n | p | r | s | t | u | v
+ + + + + + + + + + + + + + +
  a  
+
  f  
+
  n  
+
  s  
+
UnionBVH   
  v  
+
AABBT (BoundingVolumes)   FaceT (Dcel)   NodeT (BVH)   ScaleOp   
  b  
+
  l  
+
  p  
+
SignedDistanceFunction   Vec2T   
SphereSDF   Vec3T   
BoundingSphereT (BoundingVolumes)   LinearBVH (BVH)   PLY (Dcel::Parser)   
  t  
+
VertexT (Dcel)   
  e  
+
LinearNodeT (BVH)   Polygon2D (Dcel)   
  m  
+
  r  
+
TransformOp   
EdgeIteratorT (Dcel)   TranslateOp   
EdgeT (Dcel)   MeshT (Dcel)   RotateOp   
  u  
+
Union   
+
a | b | e | f | l | m | n | p | r | s | t | u | v
+
+ + + + diff --git a/docs/doxygen/html/closed.png b/docs/doxygen/html/closed.png new file mode 100644 index 00000000..98cc2c90 Binary files /dev/null and b/docs/doxygen/html/closed.png differ diff --git a/docs/doxygen/html/dir_74389ed8173ad57b461b9d623a1f3867.html b/docs/doxygen/html/dir_74389ed8173ad57b461b9d623a1f3867.html new file mode 100644 index 00000000..ffb030e9 --- /dev/null +++ b/docs/doxygen/html/dir_74389ed8173ad57b461b9d623a1f3867.html @@ -0,0 +1,181 @@ + + + + + + + +EBGeometry: Source Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Source Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  EBGeometry_AnalyticDistanceFunctions.hpp [code]
 Declaration of various analytic distance functions.
 
file  EBGeometry_BoundingVolumes.hpp [code]
 Declaration of a various bounding volumes used for bounding volume hierarchy.
 
file  EBGeometry_BoundingVolumesImplem.hpp [code]
 Implementation of EBGeometry_BoundingVolumes.hpp.
 
file  EBGeometry_BVH.hpp [code]
 Declaration of a bounding volume hierarchy (BVH) class.
 
file  EBGeometry_BVHImplem.hpp [code]
 Implementation of EBGeometry_BVH.hpp.
 
file  EBGeometry_Dcel.hpp [code]
 Namespace documentation.
 
file  EBGeometry_DcelBVH.hpp [code]
 File which contains partitioners and lambdas for enclosing dcel_face in bounding volume heirarchies.
 
file  EBGeometry_DcelEdge.hpp [code]
 Declaration of a half-edge class for use in DCEL descriptions of polygon tesselations.
 
file  EBGeometry_DcelEdgeImplem.hpp [code]
 Implementation of EBGeometry_DcelEdge.hpp.
 
file  EBGeometry_DcelFace.hpp [code]
 Declaration of a polygon face class for use in DCEL descriptions of polygon tesselations.
 
file  EBGeometry_DcelFaceImplem.hpp [code]
 Implementation of EBGeometry_DcelFace.hpp.
 
file  EBGeometry_DcelIterator.hpp [code]
 Declaration of iterators for DCEL surface Tesselations.
 
file  EBGeometry_DcelIteratorImplem.hpp [code]
 Implementation of EBGeometry_DcelIterator.hpp.
 
file  EBGeometry_DcelMesh.hpp [code]
 Declaration of a mesh class which stores a DCEL mesh (with signed distance functions)
 
file  EBGeometry_DcelMeshImplem.hpp [code]
 Implementation of EBGeometry_DcelMesh.hpp.
 
file  EBGeometry_DcelParser.hpp [code]
 Declaration of utilities for passing data into DCEL structures.
 
file  EBGeometry_DcelParserImplem.hpp [code]
 Implementation of EBGeometry_DcelParser.hpp.
 
file  EBGeometry_DcelPolygon2D.hpp [code]
 Declaration of a two-dimensional polygon class for embedding 3D polygon faces.
 
file  EBGeometry_DcelPolygon2DImplem.hpp [code]
 Implementation of DcelPolygon.hpp.
 
file  EBGeometry_DcelVertex.hpp [code]
 Declaration of a vertex class for use in DCEL descriptions of polygon tesselations.
 
file  EBGeometry_DcelVertexImplem.hpp [code]
 Implementation of EBGeometry_DcelVertex.hpp.
 
file  EBGeometry_NamespaceFooter.hpp [code]
 Name space footer.
 
file  EBGeometry_NamespaceHeader.hpp [code]
 Name space header.
 
file  EBGeometry_SignedDistanceFunction.hpp [code]
 Abstract base class for representing a signed distance function.
 
file  EBGeometry_SignedDistanceFunctionImplem.hpp [code]
 Implementation of EBGeometry_SignedDistanceFunctionImplem.hpp.
 
file  EBGeometry_TransformOps.hpp [code]
 Declaration of transformation operators for signed distance fields.
 
file  EBGeometry_TransformOpsImplem.hpp [code]
 Implementation of EBGeometry_TransformOps.hpp.
 
file  EBGeometry_Union.hpp [code]
 Declaration of a union operator for creating multi-object scenes.
 
file  EBGeometry_UnionBVH.hpp [code]
 Declaration of a union operator for creating multi-object scenes.
 
file  EBGeometry_UnionBVHImplem.hpp [code]
 Implementation of EBGeometry_UnionBVH.hpp.
 
file  EBGeometry_UnionImplem.hpp [code]
 Implementation of EBGeometry_Union.hpp.
 
file  EBGeometry_Vec.hpp [code]
 Declaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools.
 
file  EBGeometry_VecImplem.hpp [code]
 Implementation of EBGeometry_Vec.hpp.
 
+
+ + + + diff --git a/docs/doxygen/html/doc.png b/docs/doxygen/html/doc.png new file mode 100644 index 00000000..17edabff Binary files /dev/null and b/docs/doxygen/html/doc.png differ diff --git a/docs/doxygen/html/doxygen.css b/docs/doxygen/html/doxygen.css new file mode 100644 index 00000000..4f1ab919 --- /dev/null +++ b/docs/doxygen/html/doxygen.css @@ -0,0 +1,1596 @@ +/* The standard CSS for doxygen 1.8.13 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + + +/* @end */ diff --git a/docs/doxygen/html/doxygen.png b/docs/doxygen/html/doxygen.png new file mode 100644 index 00000000..3ff17d80 Binary files /dev/null and b/docs/doxygen/html/doxygen.png differ diff --git a/docs/doxygen/html/dynsections.js b/docs/doxygen/html/dynsections.js new file mode 100644 index 00000000..85e18369 --- /dev/null +++ b/docs/doxygen/html/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +EBGeometry: File List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 12]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  Source
 EBGeometry_AnalyticDistanceFunctions.hppDeclaration of various analytic distance functions
 EBGeometry_BoundingVolumes.hppDeclaration of a various bounding volumes used for bounding volume hierarchy
 EBGeometry_BoundingVolumesImplem.hppImplementation of EBGeometry_BoundingVolumes.hpp
 EBGeometry_BVH.hppDeclaration of a bounding volume hierarchy (BVH) class
 EBGeometry_BVHImplem.hppImplementation of EBGeometry_BVH.hpp
 EBGeometry_Dcel.hppNamespace documentation
 EBGeometry_DcelBVH.hppFile which contains partitioners and lambdas for enclosing dcel_face in bounding volume heirarchies
 EBGeometry_DcelEdge.hppDeclaration of a half-edge class for use in DCEL descriptions of polygon tesselations
 EBGeometry_DcelEdgeImplem.hppImplementation of EBGeometry_DcelEdge.hpp
 EBGeometry_DcelFace.hppDeclaration of a polygon face class for use in DCEL descriptions of polygon tesselations
 EBGeometry_DcelFaceImplem.hppImplementation of EBGeometry_DcelFace.hpp
 EBGeometry_DcelIterator.hppDeclaration of iterators for DCEL surface Tesselations
 EBGeometry_DcelIteratorImplem.hppImplementation of EBGeometry_DcelIterator.hpp
 EBGeometry_DcelMesh.hppDeclaration of a mesh class which stores a DCEL mesh (with signed distance functions)
 EBGeometry_DcelMeshImplem.hppImplementation of EBGeometry_DcelMesh.hpp
 EBGeometry_DcelParser.hppDeclaration of utilities for passing data into DCEL structures
 EBGeometry_DcelParserImplem.hppImplementation of EBGeometry_DcelParser.hpp
 EBGeometry_DcelPolygon2D.hppDeclaration of a two-dimensional polygon class for embedding 3D polygon faces
 EBGeometry_DcelPolygon2DImplem.hppImplementation of DcelPolygon.hpp
 EBGeometry_DcelVertex.hppDeclaration of a vertex class for use in DCEL descriptions of polygon tesselations
 EBGeometry_DcelVertexImplem.hppImplementation of EBGeometry_DcelVertex.hpp
 EBGeometry_NamespaceFooter.hppName space footer
 EBGeometry_NamespaceHeader.hppName space header
 EBGeometry_SignedDistanceFunction.hppAbstract base class for representing a signed distance function
 EBGeometry_SignedDistanceFunctionImplem.hppImplementation of EBGeometry_SignedDistanceFunctionImplem.hpp
 EBGeometry_TransformOps.hppDeclaration of transformation operators for signed distance fields
 EBGeometry_TransformOpsImplem.hppImplementation of EBGeometry_TransformOps.hpp
 EBGeometry_Union.hppDeclaration of a union operator for creating multi-object scenes
 EBGeometry_UnionBVH.hppDeclaration of a union operator for creating multi-object scenes
 EBGeometry_UnionBVHImplem.hppImplementation of EBGeometry_UnionBVH.hpp
 EBGeometry_UnionImplem.hppImplementation of EBGeometry_Union.hpp
 EBGeometry_Vec.hppDeclaration of 2D and 3D point/vector classes with templated precision. Used with DCEL tools
 EBGeometry_VecImplem.hppImplementation of EBGeometry_Vec.hpp
 EBGeometry.hpp
+
+
+ + + + diff --git a/docs/doxygen/html/folderclosed.png b/docs/doxygen/html/folderclosed.png new file mode 100644 index 00000000..bb8ab35e Binary files /dev/null and b/docs/doxygen/html/folderclosed.png differ diff --git a/docs/doxygen/html/folderopen.png b/docs/doxygen/html/folderopen.png new file mode 100644 index 00000000..d6c7f676 Binary files /dev/null and b/docs/doxygen/html/folderopen.png differ diff --git a/docs/doxygen/html/functions.html b/docs/doxygen/html/functions.html new file mode 100644 index 00000000..af3a3910 --- /dev/null +++ b/docs/doxygen/html/functions.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+
+ + + + diff --git a/docs/doxygen/html/functions_0x7e.html b/docs/doxygen/html/functions_0x7e.html new file mode 100644 index 00000000..904b4c19 --- /dev/null +++ b/docs/doxygen/html/functions_0x7e.html @@ -0,0 +1,134 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- ~ -

+
+ + + + diff --git a/docs/doxygen/html/functions_b.html b/docs/doxygen/html/functions_b.html new file mode 100644 index 00000000..620c390a --- /dev/null +++ b/docs/doxygen/html/functions_b.html @@ -0,0 +1,93 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- b -

+
+ + + + diff --git a/docs/doxygen/html/functions_c.html b/docs/doxygen/html/functions_c.html new file mode 100644 index 00000000..a4e0ee91 --- /dev/null +++ b/docs/doxygen/html/functions_c.html @@ -0,0 +1,102 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- c -

+
+ + + + diff --git a/docs/doxygen/html/functions_d.html b/docs/doxygen/html/functions_d.html new file mode 100644 index 00000000..9c2941f3 --- /dev/null +++ b/docs/doxygen/html/functions_d.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- d -

+
+ + + + diff --git a/docs/doxygen/html/functions_e.html b/docs/doxygen/html/functions_e.html new file mode 100644 index 00000000..d9a22eb6 --- /dev/null +++ b/docs/doxygen/html/functions_e.html @@ -0,0 +1,101 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- e -

+
+ + + + diff --git a/docs/doxygen/html/functions_enum.html b/docs/doxygen/html/functions_enum.html new file mode 100644 index 00000000..e95c8b2a --- /dev/null +++ b/docs/doxygen/html/functions_enum.html @@ -0,0 +1,87 @@ + + + + + + + +EBGeometry: Class Members - Enumerations + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/doxygen/html/functions_f.html b/docs/doxygen/html/functions_f.html new file mode 100644 index 00000000..2545d6e6 --- /dev/null +++ b/docs/doxygen/html/functions_f.html @@ -0,0 +1,95 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- f -

+
+ + + + diff --git a/docs/doxygen/html/functions_func.html b/docs/doxygen/html/functions_func.html new file mode 100644 index 00000000..39bcbd90 --- /dev/null +++ b/docs/doxygen/html/functions_func.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_0x7e.html b/docs/doxygen/html/functions_func_0x7e.html new file mode 100644 index 00000000..b36f8549 --- /dev/null +++ b/docs/doxygen/html/functions_func_0x7e.html @@ -0,0 +1,134 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- ~ -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_b.html b/docs/doxygen/html/functions_func_b.html new file mode 100644 index 00000000..d0f5a129 --- /dev/null +++ b/docs/doxygen/html/functions_func_b.html @@ -0,0 +1,83 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- b -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_c.html b/docs/doxygen/html/functions_func_c.html new file mode 100644 index 00000000..bd0f4edc --- /dev/null +++ b/docs/doxygen/html/functions_func_c.html @@ -0,0 +1,102 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- c -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_d.html b/docs/doxygen/html/functions_func_d.html new file mode 100644 index 00000000..7f38181d --- /dev/null +++ b/docs/doxygen/html/functions_func_d.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- d -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_e.html b/docs/doxygen/html/functions_func_e.html new file mode 100644 index 00000000..20e2040b --- /dev/null +++ b/docs/doxygen/html/functions_func_e.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- e -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_f.html b/docs/doxygen/html/functions_func_f.html new file mode 100644 index 00000000..94491078 --- /dev/null +++ b/docs/doxygen/html/functions_func_f.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- f -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_g.html b/docs/doxygen/html/functions_func_g.html new file mode 100644 index 00000000..c4dd5ff3 --- /dev/null +++ b/docs/doxygen/html/functions_func_g.html @@ -0,0 +1,202 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- g -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_i.html b/docs/doxygen/html/functions_func_i.html new file mode 100644 index 00000000..82f1cd3b --- /dev/null +++ b/docs/doxygen/html/functions_func_i.html @@ -0,0 +1,109 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- i -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_l.html b/docs/doxygen/html/functions_func_l.html new file mode 100644 index 00000000..b4c34fc9 --- /dev/null +++ b/docs/doxygen/html/functions_func_l.html @@ -0,0 +1,88 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- l -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_m.html b/docs/doxygen/html/functions_func_m.html new file mode 100644 index 00000000..5494e2cf --- /dev/null +++ b/docs/doxygen/html/functions_func_m.html @@ -0,0 +1,88 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- m -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_n.html b/docs/doxygen/html/functions_func_n.html new file mode 100644 index 00000000..e8671f21 --- /dev/null +++ b/docs/doxygen/html/functions_func_n.html @@ -0,0 +1,82 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- n -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_o.html b/docs/doxygen/html/functions_func_o.html new file mode 100644 index 00000000..6f8a163d --- /dev/null +++ b/docs/doxygen/html/functions_func_o.html @@ -0,0 +1,141 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- o -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_p.html b/docs/doxygen/html/functions_func_p.html new file mode 100644 index 00000000..e5a4d986 --- /dev/null +++ b/docs/doxygen/html/functions_func_p.html @@ -0,0 +1,99 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- p -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_r.html b/docs/doxygen/html/functions_func_r.html new file mode 100644 index 00000000..94e89727 --- /dev/null +++ b/docs/doxygen/html/functions_func_r.html @@ -0,0 +1,112 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- r -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_s.html b/docs/doxygen/html/functions_func_s.html new file mode 100644 index 00000000..87cedcb6 --- /dev/null +++ b/docs/doxygen/html/functions_func_s.html @@ -0,0 +1,162 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- s -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_t.html b/docs/doxygen/html/functions_func_t.html new file mode 100644 index 00000000..397d203d --- /dev/null +++ b/docs/doxygen/html/functions_func_t.html @@ -0,0 +1,95 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- t -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_u.html b/docs/doxygen/html/functions_func_u.html new file mode 100644 index 00000000..4fe361c2 --- /dev/null +++ b/docs/doxygen/html/functions_func_u.html @@ -0,0 +1,86 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- u -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_v.html b/docs/doxygen/html/functions_func_v.html new file mode 100644 index 00000000..5e03d2fd --- /dev/null +++ b/docs/doxygen/html/functions_func_v.html @@ -0,0 +1,83 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- v -

+
+ + + + diff --git a/docs/doxygen/html/functions_func_z.html b/docs/doxygen/html/functions_func_z.html new file mode 100644 index 00000000..32b20f62 --- /dev/null +++ b/docs/doxygen/html/functions_func_z.html @@ -0,0 +1,78 @@ + + + + + + + +EBGeometry: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- z -

+
+ + + + diff --git a/docs/doxygen/html/functions_g.html b/docs/doxygen/html/functions_g.html new file mode 100644 index 00000000..fa930473 --- /dev/null +++ b/docs/doxygen/html/functions_g.html @@ -0,0 +1,202 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- g -

+
+ + + + diff --git a/docs/doxygen/html/functions_i.html b/docs/doxygen/html/functions_i.html new file mode 100644 index 00000000..1b73ec08 --- /dev/null +++ b/docs/doxygen/html/functions_i.html @@ -0,0 +1,115 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- i -

+
+ + + + diff --git a/docs/doxygen/html/functions_l.html b/docs/doxygen/html/functions_l.html new file mode 100644 index 00000000..193d92db --- /dev/null +++ b/docs/doxygen/html/functions_l.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- l -

+
+ + + + diff --git a/docs/doxygen/html/functions_m.html b/docs/doxygen/html/functions_m.html new file mode 100644 index 00000000..64a2985c --- /dev/null +++ b/docs/doxygen/html/functions_m.html @@ -0,0 +1,246 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- m -

+
+ + + + diff --git a/docs/doxygen/html/functions_n.html b/docs/doxygen/html/functions_n.html new file mode 100644 index 00000000..1378aeb6 --- /dev/null +++ b/docs/doxygen/html/functions_n.html @@ -0,0 +1,88 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- n -

+
+ + + + diff --git a/docs/doxygen/html/functions_o.html b/docs/doxygen/html/functions_o.html new file mode 100644 index 00000000..cbc2fca1 --- /dev/null +++ b/docs/doxygen/html/functions_o.html @@ -0,0 +1,141 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- o -

+
+ + + + diff --git a/docs/doxygen/html/functions_p.html b/docs/doxygen/html/functions_p.html new file mode 100644 index 00000000..93fcc379 --- /dev/null +++ b/docs/doxygen/html/functions_p.html @@ -0,0 +1,106 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- p -

+
+ + + + diff --git a/docs/doxygen/html/functions_r.html b/docs/doxygen/html/functions_r.html new file mode 100644 index 00000000..110def4b --- /dev/null +++ b/docs/doxygen/html/functions_r.html @@ -0,0 +1,112 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- r -

+
+ + + + diff --git a/docs/doxygen/html/functions_s.html b/docs/doxygen/html/functions_s.html new file mode 100644 index 00000000..2d9ceeee --- /dev/null +++ b/docs/doxygen/html/functions_s.html @@ -0,0 +1,175 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- s -

+
+ + + + diff --git a/docs/doxygen/html/functions_t.html b/docs/doxygen/html/functions_t.html new file mode 100644 index 00000000..c960a6d7 --- /dev/null +++ b/docs/doxygen/html/functions_t.html @@ -0,0 +1,95 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- t -

+
+ + + + diff --git a/docs/doxygen/html/functions_type.html b/docs/doxygen/html/functions_type.html new file mode 100644 index 00000000..ced4b8e5 --- /dev/null +++ b/docs/doxygen/html/functions_type.html @@ -0,0 +1,210 @@ + + + + + + + +EBGeometry: Class Members - Typedefs + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- b -

+ + +

- e -

+ + +

- f -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- s -

+ + +

- v -

+
+ + + + diff --git a/docs/doxygen/html/functions_u.html b/docs/doxygen/html/functions_u.html new file mode 100644 index 00000000..cfe447c5 --- /dev/null +++ b/docs/doxygen/html/functions_u.html @@ -0,0 +1,86 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- u -

+
+ + + + diff --git a/docs/doxygen/html/functions_v.html b/docs/doxygen/html/functions_v.html new file mode 100644 index 00000000..64ee2fe3 --- /dev/null +++ b/docs/doxygen/html/functions_v.html @@ -0,0 +1,116 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/docs/doxygen/html/functions_vars.html b/docs/doxygen/html/functions_vars.html new file mode 100644 index 00000000..ebf37405 --- /dev/null +++ b/docs/doxygen/html/functions_vars.html @@ -0,0 +1,245 @@ + + + + + + + +EBGeometry: Class Members - Variables + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- m -

+ + +

- x -

+ + +

- y -

+
+ + + + diff --git a/docs/doxygen/html/functions_x.html b/docs/doxygen/html/functions_x.html new file mode 100644 index 00000000..1c04a1bf --- /dev/null +++ b/docs/doxygen/html/functions_x.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- x -

+
+ + + + diff --git a/docs/doxygen/html/functions_y.html b/docs/doxygen/html/functions_y.html new file mode 100644 index 00000000..e27d06ea --- /dev/null +++ b/docs/doxygen/html/functions_y.html @@ -0,0 +1,77 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- y -

+
+ + + + diff --git a/docs/doxygen/html/functions_z.html b/docs/doxygen/html/functions_z.html new file mode 100644 index 00000000..bca04304 --- /dev/null +++ b/docs/doxygen/html/functions_z.html @@ -0,0 +1,78 @@ + + + + + + + +EBGeometry: Class Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- z -

+
+ + + + diff --git a/docs/doxygen/html/globals.html b/docs/doxygen/html/globals.html new file mode 100644 index 00000000..f0b65b85 --- /dev/null +++ b/docs/doxygen/html/globals.html @@ -0,0 +1,89 @@ + + + + + + + +EBGeometry: File Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented file members with links to the documentation:
+
+ + + + diff --git a/docs/doxygen/html/globals_func.html b/docs/doxygen/html/globals_func.html new file mode 100644 index 00000000..e0a64feb --- /dev/null +++ b/docs/doxygen/html/globals_func.html @@ -0,0 +1,89 @@ + + + + + + + +EBGeometry: File Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + + + + + diff --git a/docs/doxygen/html/graph_legend.html b/docs/doxygen/html/graph_legend.html new file mode 100644 index 00000000..b9e7eb0a --- /dev/null +++ b/docs/doxygen/html/graph_legend.html @@ -0,0 +1,103 @@ + + + + + + + +EBGeometry: Graph Legend + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
class Invisible { };
/*! Truncated class, inheritance relation is hidden */
class Truncated : public Invisible { };
/* Class not documented with doxygen comments */
class Undocumented { };
/*! Class that is inherited using public inheritance */
class PublicBase : public Truncated { };
/*! A template class */
template<class T> class Templ { };
/*! Class that is inherited using protected inheritance */
class ProtectedBase { };
/*! Class that is inherited using private inheritance */
class PrivateBase { };
/*! Class that is used by the Inherited class */
class Used { };
/*! Super class that inherits a number of other classes */
class Inherited : public PublicBase,
protected ProtectedBase,
private PrivateBase,
public Undocumented,
public Templ<int>
{
private:
Used *m_usedClass;
};

This will result in the following graph:

+
+ +
+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+ + + + diff --git a/docs/doxygen/html/graph_legend.md5 b/docs/doxygen/html/graph_legend.md5 new file mode 100644 index 00000000..a06ed050 --- /dev/null +++ b/docs/doxygen/html/graph_legend.md5 @@ -0,0 +1 @@ +387ff8eb65306fa251338d3c9bd7bfff \ No newline at end of file diff --git a/docs/doxygen/html/graph_legend.png b/docs/doxygen/html/graph_legend.png new file mode 100644 index 00000000..81788d8b Binary files /dev/null and b/docs/doxygen/html/graph_legend.png differ diff --git a/docs/doxygen/html/hierarchy.html b/docs/doxygen/html/hierarchy.html new file mode 100644 index 00000000..865e3984 --- /dev/null +++ b/docs/doxygen/html/hierarchy.html @@ -0,0 +1,102 @@ + + + + + + + +EBGeometry: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + + + + + + + + + + + + + + + + + + +
 CBoundingVolumes::AABBT< T >Axis-aligned bounding box as bounding volume
 CBoundingVolumes::BoundingSphereT< T >Class which encloses a set of points using a bounding sphere
 CDcel::EdgeIteratorT< T >Class which can iterate through edges and vertices around a DCEL polygon face
 CDcel::EdgeT< T >Class which represents a half-edge in a double-edge connected list (DCEL)
 CDcel::FaceT< T >Class which represents a polygon face in a double-edge connected list (DCEL)
 CBVH::LinearBVH< T, P, BV, K >Forward declare linear BVH class
 CBVH::LinearNodeT< T, P, BV, K >Forward declare linear node class
 CDcel::MeshT< T >Mesh class which stores a full DCEL mesh (with signed distance functions)
 CBVH::NodeT< T, P, BV, K >Forward declare the BVH node since it is needed for the polymorphic lambdas
 CDcel::Parser::PLY< T >Class for generation a Dcel::MeshT<T> from the Stanford PLY file format
 CDcel::Polygon2D< T >Class for embedding a DCEL polygon face into 2D
 CSignedDistanceFunction< T >Abstract representation of a signed distance function
 CSphereSDF< T >Signed distance field for sphere
 CUnion< T >Distance function union. Computes the signed distance to the closest object of N non-overlapping objects
 CUnionBVH< T, BV, K >Distance function union using BVHs. Computes the signed distance to the closest object of N non-overlapping objects
 CTransformOp< T >Base class for transformation operators
 CRotateOp< T >Rotation operator. Can scale an input point
 CScaleOp< T >Scale operator. Can also be used as a reflection operator
 CTranslateOp< T >Translation operator. Can translate an input point
 CVec2T< T >Two-dimensional vector class with arithmetic operators
 CVec3T< T >Three-dimensional vector class with arithmetic operators
 CDcel::VertexT< T >Class which represents a vertex node in a double-edge connected list (DCEL)
+
+
+ + + + diff --git a/docs/doxygen/html/index.html b/docs/doxygen/html/index.html new file mode 100644 index 00000000..666cbc64 --- /dev/null +++ b/docs/doxygen/html/index.html @@ -0,0 +1,108 @@ + + + + + + + +EBGeometry: EBGeometry + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ + +
+

A compact code for computing signed distance functions to watertight and orientable surface grids. Can be used with embedded-boundary (EB) codes like Chombo or AMReX.

+

The tesselations must consist of planar polygons (not necessarily triangles). Internally, the surface mesh is stored in a doubly-connected edge list (DCEL), i.e. a half-edge data structure. On watertight and orientable grids, the distance to any feature (facet, edge, vertex) is well defined, and can naively be computed in various ways:

+
    +
  • Directly, by iterating through all facets.
  • +
  • With conventional bounding volume hierarchies (BVHs).
  • +
  • With compact (linearized) BVHs.
  • +
+

The BVHs in EBGeometry are not limited to facets. Users can also embed entire objects (e.g., analytic functions) in the BVHs, e.g. the BVH accelerator can be used for a packed sphere geometry. BVHs can also be nested so that the BVH accelerator is used to embed objects that are themselves described by a BVH. For example, a scene consisting of many objects described by surface grids can be embedded as a BVH-of-BVH type of scene.

+
+ +
+

In addition, EBGeometry provides standard operators for signed distance fields like rotations, translations, and scalings. Multi-object scenes can be constructed with conventional unions, or with BVH-enabled unions (which can be orders of magnitudes faster).

+

Requirements

+
    +
  • A C++ compiler which supports C++14.
  • +
  • Watertight and orientable surfaces (only PLY files currently supported).
  • +
+

Basic usage

+

EBGeometry is a header-only library in C++. To use it, simply make EBGeometry.hpp visible to your code and include it.

+

To clone the code do

git clone git@github.com:rmrsk/EBGeometry.git
+

Various examples are given in the Examples folder. To run one of the examples, navigate to the example and compile and run it. E.g.,

cd Examples/Basic
+g++ -O3 -std=c++14 main.cpp
+./a.out porsche.ply
+

All the examples take the following steps that are specific to EBGeometry:

+
    +
  1. Parse a surface mesh into a DCEL mesh object.
  2. +
  3. Partition the DCEL mesh object in a bounding volume hierarchy.
  4. +
  5. Create direct and BVH-accelerated signed distance functions and compute the distance to the mesh.
  6. +
+

More complex examples that use Chombo or AMReX will also include application-specific code.

+

Advanced usage

+

For more advanced usage, users can supply their own file parsers (only PLY files are currently supported), provide their own bounding volumes, or their own BVH partitioners. EBGeometry is not too strict about these things, and uses rigorous templating for ensuring that the EBGeometry functionality can be extended.

+

License

+

See LICENSE and Copyright.txt for redistribution rights.

+
+ + + + diff --git a/docs/doxygen/html/inherit_graph_0.map b/docs/doxygen/html/inherit_graph_0.map new file mode 100644 index 00000000..b4dedd67 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_0.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_0.md5 b/docs/doxygen/html/inherit_graph_0.md5 new file mode 100644 index 00000000..66859dc3 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_0.md5 @@ -0,0 +1 @@ +358f150712e93f8ed75d247b53133afa \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_0.png b/docs/doxygen/html/inherit_graph_0.png new file mode 100644 index 00000000..4a06a503 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_0.png differ diff --git a/docs/doxygen/html/inherit_graph_1.map b/docs/doxygen/html/inherit_graph_1.map new file mode 100644 index 00000000..dc64c945 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_1.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_1.md5 b/docs/doxygen/html/inherit_graph_1.md5 new file mode 100644 index 00000000..375b1367 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_1.md5 @@ -0,0 +1 @@ +4fd0aaa72e030487c820dba0b510f876 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_1.png b/docs/doxygen/html/inherit_graph_1.png new file mode 100644 index 00000000..e9fd8749 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_1.png differ diff --git a/docs/doxygen/html/inherit_graph_10.map b/docs/doxygen/html/inherit_graph_10.map new file mode 100644 index 00000000..a99dec89 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_10.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_10.md5 b/docs/doxygen/html/inherit_graph_10.md5 new file mode 100644 index 00000000..9309620d --- /dev/null +++ b/docs/doxygen/html/inherit_graph_10.md5 @@ -0,0 +1 @@ +43d41a81a40fcb8ff5a042a2e9e02e17 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_10.png b/docs/doxygen/html/inherit_graph_10.png new file mode 100644 index 00000000..ae6c793e Binary files /dev/null and b/docs/doxygen/html/inherit_graph_10.png differ diff --git a/docs/doxygen/html/inherit_graph_11.map b/docs/doxygen/html/inherit_graph_11.map new file mode 100644 index 00000000..be654f16 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_11.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_11.md5 b/docs/doxygen/html/inherit_graph_11.md5 new file mode 100644 index 00000000..40c71fd1 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_11.md5 @@ -0,0 +1 @@ +0b24af8c6ce0a837ce583121c0fb7e4a \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_11.png b/docs/doxygen/html/inherit_graph_11.png new file mode 100644 index 00000000..5046a3d1 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_11.png differ diff --git a/docs/doxygen/html/inherit_graph_12.map b/docs/doxygen/html/inherit_graph_12.map new file mode 100644 index 00000000..ce827cbf --- /dev/null +++ b/docs/doxygen/html/inherit_graph_12.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/doxygen/html/inherit_graph_12.md5 b/docs/doxygen/html/inherit_graph_12.md5 new file mode 100644 index 00000000..4346aa02 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_12.md5 @@ -0,0 +1 @@ +850c9ebf766ca97dca0b785b4b3bbac9 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_12.png b/docs/doxygen/html/inherit_graph_12.png new file mode 100644 index 00000000..82fcb3db Binary files /dev/null and b/docs/doxygen/html/inherit_graph_12.png differ diff --git a/docs/doxygen/html/inherit_graph_13.map b/docs/doxygen/html/inherit_graph_13.map new file mode 100644 index 00000000..53bcd80b --- /dev/null +++ b/docs/doxygen/html/inherit_graph_13.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/doxygen/html/inherit_graph_13.md5 b/docs/doxygen/html/inherit_graph_13.md5 new file mode 100644 index 00000000..165db25f --- /dev/null +++ b/docs/doxygen/html/inherit_graph_13.md5 @@ -0,0 +1 @@ +c020a20be658342bd84bbeba6c48ec72 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_13.png b/docs/doxygen/html/inherit_graph_13.png new file mode 100644 index 00000000..86aefa88 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_13.png differ diff --git a/docs/doxygen/html/inherit_graph_14.map b/docs/doxygen/html/inherit_graph_14.map new file mode 100644 index 00000000..73c496e4 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_14.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_14.md5 b/docs/doxygen/html/inherit_graph_14.md5 new file mode 100644 index 00000000..34714ba9 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_14.md5 @@ -0,0 +1 @@ +4b1ad4277032ee10bd1e09dc18025928 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_14.png b/docs/doxygen/html/inherit_graph_14.png new file mode 100644 index 00000000..f976379f Binary files /dev/null and b/docs/doxygen/html/inherit_graph_14.png differ diff --git a/docs/doxygen/html/inherit_graph_15.map b/docs/doxygen/html/inherit_graph_15.map new file mode 100644 index 00000000..10a50426 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_15.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_15.md5 b/docs/doxygen/html/inherit_graph_15.md5 new file mode 100644 index 00000000..7a9ba823 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_15.md5 @@ -0,0 +1 @@ +819711adce0d6cbdf8dcdfbdd9ec768d \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_15.png b/docs/doxygen/html/inherit_graph_15.png new file mode 100644 index 00000000..f5c2e7d3 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_15.png differ diff --git a/docs/doxygen/html/inherit_graph_2.map b/docs/doxygen/html/inherit_graph_2.map new file mode 100644 index 00000000..344288f8 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_2.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_2.md5 b/docs/doxygen/html/inherit_graph_2.md5 new file mode 100644 index 00000000..22da6fbb --- /dev/null +++ b/docs/doxygen/html/inherit_graph_2.md5 @@ -0,0 +1 @@ +efd7a7e9b5773a391be51d168865227f \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_2.png b/docs/doxygen/html/inherit_graph_2.png new file mode 100644 index 00000000..0e7d8bd8 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_2.png differ diff --git a/docs/doxygen/html/inherit_graph_3.map b/docs/doxygen/html/inherit_graph_3.map new file mode 100644 index 00000000..10f8308d --- /dev/null +++ b/docs/doxygen/html/inherit_graph_3.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_3.md5 b/docs/doxygen/html/inherit_graph_3.md5 new file mode 100644 index 00000000..c4365123 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_3.md5 @@ -0,0 +1 @@ +efbcaf19d0f897984ba524ca28fabeea \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_3.png b/docs/doxygen/html/inherit_graph_3.png new file mode 100644 index 00000000..c3d91264 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_3.png differ diff --git a/docs/doxygen/html/inherit_graph_4.map b/docs/doxygen/html/inherit_graph_4.map new file mode 100644 index 00000000..04b90790 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_4.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_4.md5 b/docs/doxygen/html/inherit_graph_4.md5 new file mode 100644 index 00000000..507cfcf8 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_4.md5 @@ -0,0 +1 @@ +b9d2eacf0f5bfd6994b4e74df13fb79d \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_4.png b/docs/doxygen/html/inherit_graph_4.png new file mode 100644 index 00000000..5a14a2bb Binary files /dev/null and b/docs/doxygen/html/inherit_graph_4.png differ diff --git a/docs/doxygen/html/inherit_graph_5.map b/docs/doxygen/html/inherit_graph_5.map new file mode 100644 index 00000000..5b502e8a --- /dev/null +++ b/docs/doxygen/html/inherit_graph_5.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_5.md5 b/docs/doxygen/html/inherit_graph_5.md5 new file mode 100644 index 00000000..73ad32ee --- /dev/null +++ b/docs/doxygen/html/inherit_graph_5.md5 @@ -0,0 +1 @@ +ba17b088c9fe2d5ead6fb0cf46963c67 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_5.png b/docs/doxygen/html/inherit_graph_5.png new file mode 100644 index 00000000..0dd61a93 Binary files /dev/null and b/docs/doxygen/html/inherit_graph_5.png differ diff --git a/docs/doxygen/html/inherit_graph_6.map b/docs/doxygen/html/inherit_graph_6.map new file mode 100644 index 00000000..dad7ca3e --- /dev/null +++ b/docs/doxygen/html/inherit_graph_6.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_6.md5 b/docs/doxygen/html/inherit_graph_6.md5 new file mode 100644 index 00000000..b05fb6d4 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_6.md5 @@ -0,0 +1 @@ +f4f177dfddca8e1b7fb18c750267cf43 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_6.png b/docs/doxygen/html/inherit_graph_6.png new file mode 100644 index 00000000..06def14f Binary files /dev/null and b/docs/doxygen/html/inherit_graph_6.png differ diff --git a/docs/doxygen/html/inherit_graph_7.map b/docs/doxygen/html/inherit_graph_7.map new file mode 100644 index 00000000..68d2565a --- /dev/null +++ b/docs/doxygen/html/inherit_graph_7.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_7.md5 b/docs/doxygen/html/inherit_graph_7.md5 new file mode 100644 index 00000000..44d870e3 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_7.md5 @@ -0,0 +1 @@ +7a7609383812314f7236b294db2df820 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_7.png b/docs/doxygen/html/inherit_graph_7.png new file mode 100644 index 00000000..4301311d Binary files /dev/null and b/docs/doxygen/html/inherit_graph_7.png differ diff --git a/docs/doxygen/html/inherit_graph_8.map b/docs/doxygen/html/inherit_graph_8.map new file mode 100644 index 00000000..ad846c32 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_8.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_8.md5 b/docs/doxygen/html/inherit_graph_8.md5 new file mode 100644 index 00000000..784aa2ee --- /dev/null +++ b/docs/doxygen/html/inherit_graph_8.md5 @@ -0,0 +1 @@ +9e7138e9542372568fa3e728b2a0562c \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_8.png b/docs/doxygen/html/inherit_graph_8.png new file mode 100644 index 00000000..59215f2d Binary files /dev/null and b/docs/doxygen/html/inherit_graph_8.png differ diff --git a/docs/doxygen/html/inherit_graph_9.map b/docs/doxygen/html/inherit_graph_9.map new file mode 100644 index 00000000..41cbb3b6 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_9.map @@ -0,0 +1,3 @@ + + + diff --git a/docs/doxygen/html/inherit_graph_9.md5 b/docs/doxygen/html/inherit_graph_9.md5 new file mode 100644 index 00000000..290acf09 --- /dev/null +++ b/docs/doxygen/html/inherit_graph_9.md5 @@ -0,0 +1 @@ +868c5add16c2f0579f9f4275831ed027 \ No newline at end of file diff --git a/docs/doxygen/html/inherit_graph_9.png b/docs/doxygen/html/inherit_graph_9.png new file mode 100644 index 00000000..5e66bc0b Binary files /dev/null and b/docs/doxygen/html/inherit_graph_9.png differ diff --git a/docs/doxygen/html/inherits.html b/docs/doxygen/html/inherits.html new file mode 100644 index 00000000..132ed015 --- /dev/null +++ b/docs/doxygen/html/inherits.html @@ -0,0 +1,164 @@ + + + + + + + +EBGeometry: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + +
+ + + + + + +
+ + + +
+ + + +
+
+ + + + diff --git a/docs/doxygen/html/jquery.js b/docs/doxygen/html/jquery.js new file mode 100644 index 00000000..f5343eda --- /dev/null +++ b/docs/doxygen/html/jquery.js @@ -0,0 +1,87 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + + +
+ +
+
BVH Namespace Reference
+
+
+ +

Namespace for various bounding volume heirarchy (BVH) functionality. +More...

+
+ + + + + + + + + + +

+Classes

class  LinearBVH
 Forward declare linear BVH class. More...
 
class  LinearNodeT
 Forward declare linear node class. More...
 
class  NodeT
 Forward declare the BVH node since it is needed for the polymorphic lambdas. More...
 
+ + + + + + + + + + + + + + + + + +

+Typedefs

+template<class P >
using PrimitiveListT = std::vector< std::shared_ptr< const P > >
 Alias to cut down on typing.
 
template<class T , class P , class BV , int K>
using StopFunctionT = std::function< bool(const NodeT< T, P, BV, K > &a_node)>
 Stop function for deciding when a BVH node can't be divided into sub-volumes. More...
 
template<class P , int K>
using PartitionerT = std::function< std::array< PrimitiveListT< P >, K >(const PrimitiveListT< P > &a_primitives)>
 Polymorphic partitioner for splitting a list of primitives into K new lists of primitives. More...
 
template<class P , class BV >
using BVConstructorT = std::function< BV(const std::shared_ptr< const P > &a_primitive)>
 Constructor method for creating bounding volumes from a list of primitives. More...
 
+ + + + + + + +

+Enumerations

enum  NodeType : bool { Regular, +Leaf + }
 Enum for determining if a BVH node is a leaf or a regular node (only leaf nodes contain data)
 
enum  Prune { Ordered, +Ordered2, +Unordered, +Unordered2 + }
 Typename for identifying algorithms used in subtree pruning.
 
+

Detailed Description

+

Namespace for various bounding volume heirarchy (BVH) functionality.

+

Typedef Documentation

+ +

◆ BVConstructorT

+ +
+
+
+template<class P , class BV >
+ + + + +
using BVH::BVConstructorT = typedef std::function<BV(const std::shared_ptr<const P>& a_primitive)>
+
+ +

Constructor method for creating bounding volumes from a list of primitives.

+
Parameters
+ + +
[in]a_primitivesList of primitives.
+
+
+
Returns
Returns a new bounding volumes which is guaranteed to enclose all the input primitives.
+ +
+
+ +

◆ PartitionerT

+ +
+
+
+template<class P , int K>
+ + + + +
using BVH::PartitionerT = typedef std::function<std::array<PrimitiveListT<P>, K>(const PrimitiveListT<P>& a_primitives)>
+
+ +

Polymorphic partitioner for splitting a list of primitives into K new lists of primitives.

+
Parameters
+ + +
[in]a_primitivesList of primitives to be subdivided into sub-bounding volumes.
+
+
+
Returns
Returns a list (std::array) of new primitives which make up the new bounding volumes.
+ +
+
+ +

◆ StopFunctionT

+ +
+
+
+template<class T , class P , class BV , int K>
+ + + + +
using BVH::StopFunctionT = typedef std::function<bool(const NodeT<T, P, BV, K>& a_node)>
+
+ +

Stop function for deciding when a BVH node can't be divided into sub-volumes.

+
Parameters
+ + +
[in]a_nodeBVH node
+
+
+
Returns
True if the node can't be divided into subvolumes and false otherwise.
+ +
+
+ + + + + diff --git a/docs/doxygen/html/namespaceBoundingVolumes.html b/docs/doxygen/html/namespaceBoundingVolumes.html new file mode 100644 index 00000000..9e632047 --- /dev/null +++ b/docs/doxygen/html/namespaceBoundingVolumes.html @@ -0,0 +1,300 @@ + + + + + + + +EBGeometry: BoundingVolumes Namespace Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
BoundingVolumes Namespace Reference
+
+
+ +

Namespace for encapsulating various bounding volumes for usage with BVHs. +More...

+ + + + + + + + +

+Classes

class  AABBT
 Axis-aligned bounding box as bounding volume. More...
 
class  BoundingSphereT
 Class which encloses a set of points using a bounding sphere. More...
 
+ + + + + + + + + + + + + + + + + +

+Functions

template<class T >
bool intersects (const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
 Intersection method for testing if two bounding spheres overlap. More...
 
template<class T >
bool intersects (const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept
 Intersection method for testing if two bounding boxes overlap. More...
 
template<class T >
getOverlappingVolume (const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept
 Compute the overlapping volume between two bounding spheres. More...
 
template<class T >
getOverlappingVolume (const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept
 Compute the overlapping volume between two bounding boxes. More...
 
+

Detailed Description

+

Namespace for encapsulating various bounding volumes for usage with BVHs.

+

Function Documentation

+ +

◆ getOverlappingVolume() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T BoundingVolumes::getOverlappingVolume (const BoundingSphereT< T > & a_u,
const BoundingSphereT< T > & a_v 
)
+
+noexcept
+
+ +

Compute the overlapping volume between two bounding spheres.

+
Parameters
+ + + +
[in]a_uOne bounding sphere
[in]a_vThe other bounding sphere
+
+
+ +
+
+ +

◆ getOverlappingVolume() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
T BoundingVolumes::getOverlappingVolume (const AABBT< T > & a_u,
const AABBT< T > & a_v 
)
+
+noexcept
+
+ +

Compute the overlapping volume between two bounding boxes.

+
Parameters
+ + + +
[in]a_uOne bounding box
[in]a_vThe other bounding box
+
+
+ +
+
+ +

◆ intersects() [1/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool BoundingVolumes::intersects (const BoundingSphereT< T > & a_u,
const BoundingSphereT< T > & a_v 
)
+
+noexcept
+
+ +

Intersection method for testing if two bounding spheres overlap.

+
Parameters
+ + + +
[in]a_uOne bounding sphere
[in]a_vThe other bounding sphere
+
+
+ +
+
+ +

◆ intersects() [2/2]

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool BoundingVolumes::intersects (const AABBT< T > & a_u,
const AABBT< T > & a_v 
)
+
+noexcept
+
+ +

Intersection method for testing if two bounding boxes overlap.

+
Parameters
+ + + +
[in]a_uOne bounding box
[in]a_vThe other bounding box
+
+
+ +
+
+
+ + + + diff --git a/docs/doxygen/html/namespaceDcel.html b/docs/doxygen/html/namespaceDcel.html new file mode 100644 index 00000000..dc2f24b4 --- /dev/null +++ b/docs/doxygen/html/namespaceDcel.html @@ -0,0 +1,246 @@ + + + + + + + +EBGeometry: Dcel Namespace Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
Dcel Namespace Reference
+
+
+ +

Namespace containing various double-connected edge list (DCEL) functionality. +More...

+ + + + + +

+Namespaces

 Parser
 Namespace which encapsulates possible file parsers for building DCEL meshes.
 
+ + + + + + + + + + + + + + + + + + + +

+Classes

class  EdgeIteratorT
 Class which can iterate through edges and vertices around a DCEL polygon face. More...
 
class  EdgeT
 Class which represents a half-edge in a double-edge connected list (DCEL). More...
 
class  FaceT
 Class which represents a polygon face in a double-edge connected list (DCEL). More...
 
class  MeshT
 Mesh class which stores a full DCEL mesh (with signed distance functions) More...
 
class  Polygon2D
 Class for embedding a DCEL polygon face into 2D. More...
 
class  VertexT
 Class which represents a vertex node in a double-edge connected list (DCEL). More...
 
+ + + + + +

+Typedefs

+template<class T >
using PrimitiveList = std::vector< std::shared_ptr< const Dcel::FaceT< T > > >
 Alias for which primitives are used in the BVH. For DCEL meshes the primitive is a polygon face.
 
+ + + + + + + + + + + + + + + + + + + + +

+Variables

+constexpr int primitivesPerLeafNode = 1
 This is the lowest number of a primitives that a BVH node is allowed to enclose.
 
template<class T , class BV >
BVH::BVConstructorT< FaceT< T >, BV > defaultBVConstructor
 Bounding volume constructor for a DCEL face. More...
 
template<class T , class BV , int K>
BVH::StopFunctionT< T, FaceT< T >, BV, K > defaultStopFunction
 Default stop function. This function terminates the division process if a BVH node has only one primitive. More...
 
template<class T , int K>
BVH::PartitionerT< FaceT< T >, K > spatialSplitPartitioner
 Default partitioner function for subdividing into K sub-volumes. More...
 
template<class T , int K>
BVH::PartitionerT< FaceT< T >, K > spatialSplitBinaryPartitioner
 Binary partitioner based on spatial splits. More...
 
+

Detailed Description

+

Namespace containing various double-connected edge list (DCEL) functionality.

+

Variable Documentation

+ +

◆ defaultBVConstructor

+ +
+
+
+template<class T , class BV >
+ + + + +
BVH::BVConstructorT<FaceT<T>, BV> Dcel::defaultBVConstructor
+
+Initial value:
= [](const std::shared_ptr<const FaceT<T> >& a_primitive){
return BV(a_primitive->getAllVertexCoordinates());
}
+

Bounding volume constructor for a DCEL face.

+

With BVHs and DCEL, the object to be bounded is the polygon face (e.g., triangle). We assume that our BV constructor can enclose points, so we return an object that encloses all the vertices of the polygon.

Parameters
+ + +
[in]a_primitivePrimitive (facet) to be bounded.
+
+
+
Returns
Returns a bounding volume which encloses the input face.
+ +
+
+ +

◆ defaultStopFunction

+ +
+
+
+template<class T , class BV , int K>
+ + + + +
BVH::StopFunctionT<T, FaceT<T>, BV, K> Dcel::defaultStopFunction
+
+Initial value:
= [](const BVH::NodeT<T, FaceT<T>, BV, K>& a_node){
const auto& primitives = a_node.getPrimitives();
const int numPrims = primitives.size();
return numPrims <= primitivesPerLeafNode || numPrims < K;
}
Forward declare the BVH node since it is needed for the polymorphic lambdas.
Definition: EBGeometry_BVH.hpp:35
+
constexpr int primitivesPerLeafNode
This is the lowest number of a primitives that a BVH node is allowed to enclose.
Definition: EBGeometry_DcelBVH.hpp:34
+
+

Default stop function. This function terminates the division process if a BVH node has only one primitive.

+

In this function, BVH::NodeT<T, FaceT<T>, BVH > is a BVH node. The interpretation of the parameters are: T is the precision, FaceT<T> is the primitive type in the BVH tree, and BV is the bounding volume type.

Parameters
+ + +
[in]a_nodeBounding volume hierarchy node.
+
+
+
Returns
Returns true if the bounding volume shouldn't be split more and false otherwise.
+ +
+
+ +

◆ spatialSplitBinaryPartitioner

+ +
+
+
+template<class T , int K>
+ + + + +
BVH::PartitionerT<FaceT<T>, K> Dcel::spatialSplitBinaryPartitioner
+
+ +

Binary partitioner based on spatial splits.

+
Parameters
+ + +
[in]a_primitivesList of primitives to partition into sub-bounding volumes
+
+
+

This is a partitioner that calls the spatialSplitPartitioner in order to recursively subdivided volumes into 2^K subvolumes.

+ +
+
+ +

◆ spatialSplitPartitioner

+ +
+
+
+template<class T , int K>
+ + + + +
BVH::PartitionerT<FaceT<T>, K> Dcel::spatialSplitPartitioner
+
+ +

Default partitioner function for subdividing into K sub-volumes.

+
Parameters
+ + +
[in]a_primitivesList of primitives to partition into sub-bounding volumes
+
+
+

This is a very stupid partitioner which splits into equal chunks along the longest coordinate.

+ +
+
+
+ + + + diff --git a/docs/doxygen/html/namespaceDcel_1_1Parser.html b/docs/doxygen/html/namespaceDcel_1_1Parser.html new file mode 100644 index 00000000..37147a04 --- /dev/null +++ b/docs/doxygen/html/namespaceDcel_1_1Parser.html @@ -0,0 +1,92 @@ + + + + + + + +EBGeometry: Dcel::Parser Namespace Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
Dcel::Parser Namespace Reference
+
+
+ +

Namespace which encapsulates possible file parsers for building DCEL meshes. +More...

+ + + + + +

+Classes

class  PLY
 Class for generation a Dcel::MeshT<T> from the Stanford PLY file format. More...
 
+

Detailed Description

+

Namespace which encapsulates possible file parsers for building DCEL meshes.

+
+ + + + diff --git a/docs/doxygen/html/namespaceEBGeometry.html b/docs/doxygen/html/namespaceEBGeometry.html new file mode 100644 index 00000000..4565e664 --- /dev/null +++ b/docs/doxygen/html/namespaceEBGeometry.html @@ -0,0 +1,79 @@ + + + + + + + +EBGeometry: EBGeometry Namespace Reference + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EBGeometry Namespace Reference
+
+
+ +

Name space for all of EBGeometry. +More...

+

Detailed Description

+

Name space for all of EBGeometry.

+
+ + + + diff --git a/docs/doxygen/html/namespacemembers.html b/docs/doxygen/html/namespacemembers.html new file mode 100644 index 00000000..eda9c6d0 --- /dev/null +++ b/docs/doxygen/html/namespacemembers.html @@ -0,0 +1,114 @@ + + + + + + + +EBGeometry: Namespace Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented namespace members with links to the namespaces they belong to:
    +
  • BVConstructorT +: BVH +
  • +
  • defaultBVConstructor +: Dcel +
  • +
  • defaultStopFunction +: Dcel +
  • +
  • getOverlappingVolume() +: BoundingVolumes +
  • +
  • intersects() +: BoundingVolumes +
  • +
  • NodeType +: BVH +
  • +
  • PartitionerT +: BVH +
  • +
  • PrimitiveList +: Dcel +
  • +
  • PrimitiveListT +: BVH +
  • +
  • primitivesPerLeafNode +: Dcel +
  • +
  • Prune +: BVH +
  • +
  • spatialSplitBinaryPartitioner +: Dcel +
  • +
  • spatialSplitPartitioner +: Dcel +
  • +
  • StopFunctionT +: BVH +
  • +
+
+ + + + diff --git a/docs/doxygen/html/namespacemembers_enum.html b/docs/doxygen/html/namespacemembers_enum.html new file mode 100644 index 00000000..89552195 --- /dev/null +++ b/docs/doxygen/html/namespacemembers_enum.html @@ -0,0 +1,78 @@ + + + + + + + +EBGeometry: Namespace Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
    +
  • NodeType +: BVH +
  • +
  • Prune +: BVH +
  • +
+
+ + + + diff --git a/docs/doxygen/html/namespacemembers_func.html b/docs/doxygen/html/namespacemembers_func.html new file mode 100644 index 00000000..63f2b37b --- /dev/null +++ b/docs/doxygen/html/namespacemembers_func.html @@ -0,0 +1,78 @@ + + + + + + + +EBGeometry: Namespace Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/docs/doxygen/html/namespacemembers_type.html b/docs/doxygen/html/namespacemembers_type.html new file mode 100644 index 00000000..4db17b4b --- /dev/null +++ b/docs/doxygen/html/namespacemembers_type.html @@ -0,0 +1,87 @@ + + + + + + + +EBGeometry: Namespace Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
    +
  • BVConstructorT +: BVH +
  • +
  • PartitionerT +: BVH +
  • +
  • PrimitiveList +: Dcel +
  • +
  • PrimitiveListT +: BVH +
  • +
  • StopFunctionT +: BVH +
  • +
+
+ + + + diff --git a/docs/doxygen/html/namespacemembers_vars.html b/docs/doxygen/html/namespacemembers_vars.html new file mode 100644 index 00000000..2bd4be70 --- /dev/null +++ b/docs/doxygen/html/namespacemembers_vars.html @@ -0,0 +1,87 @@ + + + + + + + +EBGeometry: Namespace Members + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
    +
  • defaultBVConstructor +: Dcel +
  • +
  • defaultStopFunction +: Dcel +
  • +
  • primitivesPerLeafNode +: Dcel +
  • +
  • spatialSplitBinaryPartitioner +: Dcel +
  • +
  • spatialSplitPartitioner +: Dcel +
  • +
+
+ + + + diff --git a/docs/doxygen/html/namespaces.html b/docs/doxygen/html/namespaces.html new file mode 100644 index 00000000..73a3ad14 --- /dev/null +++ b/docs/doxygen/html/namespaces.html @@ -0,0 +1,83 @@ + + + + + + + +EBGeometry: Namespace List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Namespace List
+
+
+
Here is a list of all documented namespaces with brief descriptions:
+
[detail level 12]
+ + + + + +
 NBoundingVolumesNamespace for encapsulating various bounding volumes for usage with BVHs
 NBVHNamespace for various bounding volume heirarchy (BVH) functionality
 NDcelNamespace containing various double-connected edge list (DCEL) functionality
 NParserNamespace which encapsulates possible file parsers for building DCEL meshes
 NEBGeometryName space for all of EBGeometry
+
+
+ + + + diff --git a/docs/doxygen/html/nav_f.png b/docs/doxygen/html/nav_f.png new file mode 100644 index 00000000..72a58a52 Binary files /dev/null and b/docs/doxygen/html/nav_f.png differ diff --git a/docs/doxygen/html/nav_g.png b/docs/doxygen/html/nav_g.png new file mode 100644 index 00000000..2093a237 Binary files /dev/null and b/docs/doxygen/html/nav_g.png differ diff --git a/docs/doxygen/html/nav_h.png b/docs/doxygen/html/nav_h.png new file mode 100644 index 00000000..33389b10 Binary files /dev/null and b/docs/doxygen/html/nav_h.png differ diff --git a/docs/doxygen/html/open.png b/docs/doxygen/html/open.png new file mode 100644 index 00000000..30f75c7e Binary files /dev/null and b/docs/doxygen/html/open.png differ diff --git a/docs/doxygen/html/pages.html b/docs/doxygen/html/pages.html new file mode 100644 index 00000000..e07726a2 --- /dev/null +++ b/docs/doxygen/html/pages.html @@ -0,0 +1,79 @@ + + + + + + + +EBGeometry: Related Pages + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Related Pages
+
+
+
Here is a list of all related documentation pages:
+ + +
 Todo List
+
+
+ + + + diff --git a/docs/doxygen/html/search/all_0.html b/docs/doxygen/html/search/all_0.html new file mode 100644 index 00000000..f25360b7 --- /dev/null +++ b/docs/doxygen/html/search/all_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_0.js b/docs/doxygen/html/search/all_0.js new file mode 100644 index 00000000..3cc677cb --- /dev/null +++ b/docs/doxygen/html/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['aabbt',['AABBT',['../classBoundingVolumes_1_1AABBT.html',1,'BoundingVolumes::AABBT< T >'],['../classBoundingVolumes_1_1AABBT.html#a180558daace1d1fb990f9e197eaec02d',1,'BoundingVolumes::AABBT::AABBT()'],['../classBoundingVolumes_1_1AABBT.html#a28d34a1b4467d329bd50e3561b1e705a',1,'BoundingVolumes::AABBT::AABBT(const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)'],['../classBoundingVolumes_1_1AABBT.html#af69dd29c29d40b1f550118cde9479f15',1,'BoundingVolumes::AABBT::AABBT(const AABBT &a_other)'],['../classBoundingVolumes_1_1AABBT.html#a08ddef449ffd740163b584c8ccd6f395',1,'BoundingVolumes::AABBT::AABBT(const std::vector< AABBT< T > > &a_others)'],['../classBoundingVolumes_1_1AABBT.html#ab58be0cf4a32b502fdd1aedb7ba11587',1,'BoundingVolumes::AABBT::AABBT(const std::vector< Vec3T< P > > &a_points)']]], + ['addface',['addFace',['../classDcel_1_1VertexT.html#a032c39370f08bbc27f3da35ee0873409',1,'Dcel::VertexT']]] +]; diff --git a/docs/doxygen/html/search/all_1.html b/docs/doxygen/html/search/all_1.html new file mode 100644 index 00000000..b13f0f7f --- /dev/null +++ b/docs/doxygen/html/search/all_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_1.js b/docs/doxygen/html/search/all_1.js new file mode 100644 index 00000000..22600666 --- /dev/null +++ b/docs/doxygen/html/search/all_1.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['boundingspheret',['BoundingSphereT',['../classBoundingVolumes_1_1BoundingSphereT.html',1,'BoundingVolumes::BoundingSphereT< T >'],['../classBoundingVolumes_1_1BoundingSphereT.html#a5616a743d8b53b11533ef47b3da281aa',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT()'],['../classBoundingVolumes_1_1BoundingSphereT.html#a9e81ed0ce76489225f5dbd57ed1abc8f',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const Vec3T< T > &a_center, const T &a_radius)'],['../classBoundingVolumes_1_1BoundingSphereT.html#af9cd8b7e77ed36178073be298efd27f0',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const std::vector< BoundingSphereT< T > > &a_otherSpheres)'],['../classBoundingVolumes_1_1BoundingSphereT.html#afd5a1632d9ceef8a4fa3af59e562c7f8',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const BoundingSphereT &a_other)'],['../classBoundingVolumes_1_1BoundingSphereT.html#a88655edd39b6276b9bb58eb9bd6af82d',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg=BoundingVolumeAlgorithm::Ritter)']]], + ['boundingvolumealgorithm',['BoundingVolumeAlgorithm',['../classBoundingVolumes_1_1BoundingSphereT.html#ae98cd00c8e45c93a0fc4fbabec63b007',1,'BoundingVolumes::BoundingSphereT']]], + ['boundingvolumes',['BoundingVolumes',['../namespaceBoundingVolumes.html',1,'']]], + ['buildernode',['BuilderNode',['../classUnionBVH.html#a9fd434576440274a81c0251962d7ff7e',1,'UnionBVH']]], + ['buildritter',['buildRitter',['../classBoundingVolumes_1_1BoundingSphereT.html#abea0326be2d1843f3ad7c6de1ebe2418',1,'BoundingVolumes::BoundingSphereT']]], + ['buildtree',['buildTree',['../classUnionBVH.html#a97769f4c449610b681a70b93c99a40ca',1,'UnionBVH']]], + ['bvconstructor',['BVConstructor',['../classBVH_1_1NodeT.html#a2340f2466ed5b6eebab4bdc72004858e',1,'BVH::NodeT::BVConstructor()'],['../classUnionBVH.html#a09561e026cd6a7da1a7dbdbad5eea2c2',1,'UnionBVH::BVConstructor()']]], + ['bvconstructort',['BVConstructorT',['../namespaceBVH.html#a245702d7eff40cdaedb5dff68c25a88a',1,'BVH']]], + ['bvh',['BVH',['../namespaceBVH.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/all_10.html b/docs/doxygen/html/search/all_10.html new file mode 100644 index 00000000..d1345a1f --- /dev/null +++ b/docs/doxygen/html/search/all_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_10.js b/docs/doxygen/html/search/all_10.js new file mode 100644 index 00000000..05ae0820 --- /dev/null +++ b/docs/doxygen/html/search/all_10.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['union',['Union',['../classUnion.html',1,'Union< T >'],['../classUnion.html#a2dea7d7ed6d5456f87feff0e02c99453',1,'Union::Union()=delete'],['../classUnion.html#a7f1a9e850f8965dc35e221b23a55e451',1,'Union::Union(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)']]], + ['unionbvh',['UnionBVH',['../classUnionBVH.html',1,'UnionBVH< T, BV, K >'],['../classUnionBVH.html#aa2d9a2e95e58a0d7dfb2b92283626cac',1,'UnionBVH::UnionBVH()=delete'],['../classUnionBVH.html#a6a0a50fcddc59dbb1c9b9444b0fce117',1,'UnionBVH::UnionBVH(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)'],['../classUnionBVH.html#a9eb2c19a0fdc645e068c09398d3dd0f3',1,'UnionBVH::UnionBVH(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign, const BVConstructor &a_bvConstructor)']]], + ['unsigneddistance2',['unsignedDistance2',['../classDcel_1_1EdgeT.html#a50345997f00af679875fda510b3e0607',1,'Dcel::EdgeT::unsignedDistance2()'],['../classDcel_1_1FaceT.html#a2915506b12c361eb4a25cba80638cb7d',1,'Dcel::FaceT::unsignedDistance2()'],['../classDcel_1_1VertexT.html#a552b7d88dfe80c76561b5a002ddc176b',1,'Dcel::VertexT::unsignedDistance2()'],['../classSignedDistanceFunction.html#a2a3e72186725a4e931db0f8d4895bcb8',1,'SignedDistanceFunction::unsignedDistance2()']]] +]; diff --git a/docs/doxygen/html/search/all_11.html b/docs/doxygen/html/search/all_11.html new file mode 100644 index 00000000..2be8b711 --- /dev/null +++ b/docs/doxygen/html/search/all_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_11.js b/docs/doxygen/html/search/all_11.js new file mode 100644 index 00000000..dfe9a6cb --- /dev/null +++ b/docs/doxygen/html/search/all_11.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['vec2',['Vec2',['../classDcel_1_1Polygon2D.html#ab70ec33cb6418fa0204f0d951dfd01fb',1,'Dcel::Polygon2D']]], + ['vec2t',['Vec2T',['../classVec2T.html',1,'Vec2T< T >'],['../classVec2T.html#a4aa6e0bd3922abd84449278429a03418',1,'Vec2T::Vec2T()'],['../classVec2T.html#a15e8a7710ad0a1de03a34660ae54e96e',1,'Vec2T::Vec2T(const Vec2T &u)'],['../classVec2T.html#a0721d6450bab8361f76ee63826f9e8f4',1,'Vec2T::Vec2T(const T &a_x, const T &a_y)']]], + ['vec3',['Vec3',['../classBoundingVolumes_1_1BoundingSphereT.html#ad89ed315255abcde216e9ca1de3068ab',1,'BoundingVolumes::BoundingSphereT::Vec3()'],['../classBoundingVolumes_1_1AABBT.html#aa968c6b21a7f02e1cbfc03d26c7e67b4',1,'BoundingVolumes::AABBT::Vec3()'],['../classBVH_1_1NodeT.html#a6fbb4308c5c55ee170c5f992df7ae1d0',1,'BVH::NodeT::Vec3()'],['../classBVH_1_1LinearNodeT.html#a073e87d51d44b4cc243c8f90690247a6',1,'BVH::LinearNodeT::Vec3()'],['../classBVH_1_1LinearBVH.html#a13b0083e8b7ff1a5e170d39d69e6a15a',1,'BVH::LinearBVH::Vec3()'],['../classDcel_1_1EdgeT.html#a93b8679cea557c419af44385ca6d356a',1,'Dcel::EdgeT::Vec3()'],['../classDcel_1_1FaceT.html#ade9c182834ec6f18a0e17b8140308db2',1,'Dcel::FaceT::Vec3()'],['../classDcel_1_1MeshT.html#a646c5d8f66b3079bca35fe4186493627',1,'Dcel::MeshT::Vec3()'],['../classDcel_1_1Polygon2D.html#a46e9686210f09464e8f5ad13300717b9',1,'Dcel::Polygon2D::Vec3()'],['../classDcel_1_1VertexT.html#a6e073dc7426756edef5594816be6e7c7',1,'Dcel::VertexT::Vec3()']]], + ['vec3t',['Vec3T',['../classVec3T.html',1,'Vec3T< T >'],['../classVec3T.html#a919b1cabc678f8d71763e03fab500334',1,'Vec3T::Vec3T()'],['../classVec3T.html#ab328767434f527b25c110dc83a0cb7ee',1,'Vec3T::Vec3T(const Vec3T< T > &a_u)'],['../classVec3T.html#acc3573bc8c3232eb14a22ca833cbce30',1,'Vec3T::Vec3T(const T &a_x, const T &a_y, const T &a_z)']]], + ['vertex',['Vertex',['../classDcel_1_1EdgeT.html#a2409bc47d421bbea1c091fb6b15da271',1,'Dcel::EdgeT::Vertex()'],['../classDcel_1_1FaceT.html#acf33f51e5402ed6bf811521b138121b9',1,'Dcel::FaceT::Vertex()'],['../classDcel_1_1EdgeIteratorT.html#a4ca07f27da7faf50db5dbd1f20bbcafb',1,'Dcel::EdgeIteratorT::Vertex()'],['../classDcel_1_1MeshT.html#a58b357c4ad94f4a4b813ed7ebf01cd05',1,'Dcel::MeshT::Vertex()'],['../classDcel_1_1Parser_1_1PLY.html#acbecc13804a702a6bf2687d9bf5d7989',1,'Dcel::Parser::PLY::Vertex()'],['../classDcel_1_1VertexT.html#a2c8a221a9f03e9bafa891bd0759b4f8f',1,'Dcel::VertexT::Vertex()']]], + ['vertexnormalweight',['VertexNormalWeight',['../classDcel_1_1MeshT.html#a0cd3a02853cf4fcc34a0816368ed4dc0',1,'Dcel::MeshT']]], + ['vertexptr',['VertexPtr',['../classDcel_1_1EdgeT.html#ab4ba57cfc6b2f90da43096eea87bb284',1,'Dcel::EdgeT::VertexPtr()'],['../classDcel_1_1FaceT.html#a9c22745bf7351c3bfba27d5816a50deb',1,'Dcel::FaceT::VertexPtr()'],['../classDcel_1_1EdgeIteratorT.html#ac6f7324622a089d17c5b66eb0be679f0',1,'Dcel::EdgeIteratorT::VertexPtr()'],['../classDcel_1_1MeshT.html#a1e0abeadcb51e679b0dd9a36e2ee08c7',1,'Dcel::MeshT::VertexPtr()'],['../classDcel_1_1VertexT.html#aa7d02695a42762b98a66c559e6d3d849',1,'Dcel::VertexT::VertexPtr()']]], + ['vertext',['VertexT',['../classDcel_1_1VertexT.html',1,'Dcel::VertexT< T >'],['../classDcel_1_1VertexT.html#ab93f0a7a59fa9d78d89d1b0e97451ce7',1,'Dcel::VertexT::VertexT()'],['../classDcel_1_1VertexT.html#ade01d01c6a145c31c6f46dccc902cfae',1,'Dcel::VertexT::VertexT(const Vec3 &a_position)'],['../classDcel_1_1VertexT.html#a90d3c97e605b8084667a85ddfb4ba8bc',1,'Dcel::VertexT::VertexT(const Vec3 &a_position, const Vec3 &a_normal)'],['../classDcel_1_1VertexT.html#ac904e9902633915706d81122e72aa847',1,'Dcel::VertexT::VertexT(const Vertex &a_otherVertex)']]] +]; diff --git a/docs/doxygen/html/search/all_12.html b/docs/doxygen/html/search/all_12.html new file mode 100644 index 00000000..13c52637 --- /dev/null +++ b/docs/doxygen/html/search/all_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_12.js b/docs/doxygen/html/search/all_12.js new file mode 100644 index 00000000..a27555a4 --- /dev/null +++ b/docs/doxygen/html/search/all_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x',['X',['../classVec3T.html#a0643a9f9a68edf5d4656f2e613c9624f',1,'Vec3T::X()'],['../classVec2T.html#a66ea295b52114b22de1f76cce1aa7f51',1,'Vec2T::x()']]] +]; diff --git a/docs/doxygen/html/search/all_13.html b/docs/doxygen/html/search/all_13.html new file mode 100644 index 00000000..b4a8bca6 --- /dev/null +++ b/docs/doxygen/html/search/all_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_13.js b/docs/doxygen/html/search/all_13.js new file mode 100644 index 00000000..c7b08612 --- /dev/null +++ b/docs/doxygen/html/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['y',['y',['../classVec2T.html#a71ce5251d618a6dbd4e0e7a0f867b6cf',1,'Vec2T']]] +]; diff --git a/docs/doxygen/html/search/all_14.html b/docs/doxygen/html/search/all_14.html new file mode 100644 index 00000000..fb4d0ecc --- /dev/null +++ b/docs/doxygen/html/search/all_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_14.js b/docs/doxygen/html/search/all_14.js new file mode 100644 index 00000000..8a59d13a --- /dev/null +++ b/docs/doxygen/html/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['zero',['zero',['../classVec2T.html#a3c243787a7817ce09946691cdf14d0e0',1,'Vec2T::zero()'],['../classVec3T.html#af438ba5c8990b07e566bf7e48dcbcfb2',1,'Vec3T::zero()']]] +]; diff --git a/docs/doxygen/html/search/all_15.html b/docs/doxygen/html/search/all_15.html new file mode 100644 index 00000000..8afe9a03 --- /dev/null +++ b/docs/doxygen/html/search/all_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_15.js b/docs/doxygen/html/search/all_15.js new file mode 100644 index 00000000..12468fb6 --- /dev/null +++ b/docs/doxygen/html/search/all_15.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['_7eaabbt',['~AABBT',['../classBoundingVolumes_1_1AABBT.html#af0a2f67ce6f85f947849d199e6dee1aa',1,'BoundingVolumes::AABBT']]], + ['_7eboundingspheret',['~BoundingSphereT',['../classBoundingVolumes_1_1BoundingSphereT.html#a4495da5774e14f97c0e7579b37cfd60e',1,'BoundingVolumes::BoundingSphereT']]], + ['_7eedget',['~EdgeT',['../classDcel_1_1EdgeT.html#a94083c72ec137f822fcb08fb600ddd87',1,'Dcel::EdgeT']]], + ['_7efacet',['~FaceT',['../classDcel_1_1FaceT.html#a56988526e98a2626c644117e9298fd4b',1,'Dcel::FaceT']]], + ['_7elinearbvh',['~LinearBVH',['../classBVH_1_1LinearBVH.html#a39a98014b81061b35604422cfab5c9b7',1,'BVH::LinearBVH']]], + ['_7elinearnodet',['~LinearNodeT',['../classBVH_1_1LinearNodeT.html#a4b5dd392397794113ad3b5bb2ed5003a',1,'BVH::LinearNodeT']]], + ['_7emesht',['~MeshT',['../classDcel_1_1MeshT.html#a51da8ad54b3cfe69a695221f73bd97b2',1,'Dcel::MeshT']]], + ['_7enodet',['~NodeT',['../classBVH_1_1NodeT.html#a5bc328f2381b6babe37496758ea4b583',1,'BVH::NodeT']]], + ['_7epolygon2d',['~Polygon2D',['../classDcel_1_1Polygon2D.html#a0c605c847f830faf8a9f4fbc7a5c5a12',1,'Dcel::Polygon2D']]], + ['_7erotateop',['~RotateOp',['../classRotateOp.html#aaa12091fe7937f5ed7e2d35e0632337b',1,'RotateOp']]], + ['_7escaleop',['~ScaleOp',['../classScaleOp.html#ab9fc71d00d7e0e339562edcaa2e3fc9a',1,'ScaleOp']]], + ['_7esigneddistancefunction',['~SignedDistanceFunction',['../classSignedDistanceFunction.html#ab47b289bd8351d7f323938c91b2bb92b',1,'SignedDistanceFunction']]], + ['_7espheresdf',['~SphereSDF',['../classSphereSDF.html#ab5980286d17bb9da7425b4d9d4045850',1,'SphereSDF']]], + ['_7etransformop',['~TransformOp',['../classTransformOp.html#a556cc7f5bbe70ce148a0791b883eb58c',1,'TransformOp']]], + ['_7etranslateop',['~TranslateOp',['../classTranslateOp.html#ad96b4ec0f30fb98dbd684afef1bfff03',1,'TranslateOp']]], + ['_7eunion',['~Union',['../classUnion.html#a5c4f15da1b35f6f6643d49ed18faa386',1,'Union']]], + ['_7eunionbvh',['~UnionBVH',['../classUnionBVH.html#aac0a1f16ad0a273e72c8bcd15b80f336',1,'UnionBVH']]], + ['_7evec2t',['~Vec2T',['../classVec2T.html#a15a9bac13b94b58f0907443bc551dbee',1,'Vec2T']]], + ['_7evec3t',['~Vec3T',['../classVec3T.html#a505fc5de8e213d1fc8e0df5f3b7a3dc7',1,'Vec3T']]], + ['_7evertext',['~VertexT',['../classDcel_1_1VertexT.html#ab0a8e0aa0960f68177e115b897283a1c',1,'Dcel::VertexT']]] +]; diff --git a/docs/doxygen/html/search/all_2.html b/docs/doxygen/html/search/all_2.html new file mode 100644 index 00000000..9543c57b --- /dev/null +++ b/docs/doxygen/html/search/all_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_2.js b/docs/doxygen/html/search/all_2.js new file mode 100644 index 00000000..d4ad4ffb --- /dev/null +++ b/docs/doxygen/html/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['computeandstoreedges',['computeAndStoreEdges',['../classDcel_1_1FaceT.html#a5e913d5cdebb6b95c43e6e0fdc2e3589',1,'Dcel::FaceT']]], + ['computearea',['computeArea',['../classDcel_1_1FaceT.html#a3a3bfa74a7c07252a2a904206678bb66',1,'Dcel::FaceT']]], + ['computecentroid',['computeCentroid',['../classDcel_1_1FaceT.html#a7aded1c77a78a38115e5388311ed25b0',1,'Dcel::FaceT']]], + ['computeedgelength',['computeEdgeLength',['../classDcel_1_1EdgeT.html#abddfe200f9af04cf49362d4ed1e8d37b',1,'Dcel::EdgeT']]], + ['computenormal',['computeNormal',['../classDcel_1_1EdgeT.html#ad78566030a7781469035cc4b6ed3393b',1,'Dcel::EdgeT::computeNormal()'],['../classDcel_1_1FaceT.html#a574abc710dd63e88503d4011f27adf89',1,'Dcel::FaceT::computeNormal()']]], + ['computepolygon2d',['computePolygon2D',['../classDcel_1_1FaceT.html#a863d94c15412e535ca62f9cd52eead5f',1,'Dcel::FaceT']]], + ['computevertexnormalangleweighted',['computeVertexNormalAngleWeighted',['../classDcel_1_1VertexT.html#aa9e66780ec134afe94d9e5a8221fdc0e',1,'Dcel::VertexT::computeVertexNormalAngleWeighted() noexcept'],['../classDcel_1_1VertexT.html#aea793773eec08852108d3bd5c4eea5a9',1,'Dcel::VertexT::computeVertexNormalAngleWeighted(const std::vector< FacePtr > &a_faces) noexcept']]], + ['computevertexnormalaverage',['computeVertexNormalAverage',['../classDcel_1_1VertexT.html#adb439515e1814e3fdd9d040b9c1b22df',1,'Dcel::VertexT::computeVertexNormalAverage() noexcept'],['../classDcel_1_1VertexT.html#a6faffb2c5038d62c2f7866736ebe7393',1,'Dcel::VertexT::computeVertexNormalAverage(const std::vector< FacePtr > &a_faces) noexcept']]], + ['cross',['cross',['../classVec3T.html#af628d2d42a93200a929bd54a1fe8353f',1,'Vec3T']]] +]; diff --git a/docs/doxygen/html/search/all_3.html b/docs/doxygen/html/search/all_3.html new file mode 100644 index 00000000..03405c0f --- /dev/null +++ b/docs/doxygen/html/search/all_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_3.js b/docs/doxygen/html/search/all_3.js new file mode 100644 index 00000000..55562d65 --- /dev/null +++ b/docs/doxygen/html/search/all_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['dcel',['Dcel',['../namespaceDcel.html',1,'']]], + ['defaultbvconstructor',['defaultBVConstructor',['../namespaceDcel.html#a628449c42ce3f2784ca018f2a3c88a11',1,'Dcel']]], + ['defaultstopfunction',['defaultStopFunction',['../namespaceDcel.html#a45e9f2554a8d9ea01164cd51f787f989',1,'Dcel']]], + ['define',['define',['../classBoundingVolumes_1_1BoundingSphereT.html#aac21650a7d3f65081483512064cbcfa8',1,'BoundingVolumes::BoundingSphereT::define()'],['../classBoundingVolumes_1_1AABBT.html#a5ff57720a5d6511642ce39a09a7b7663',1,'BoundingVolumes::AABBT::define()'],['../classDcel_1_1EdgeT.html#aa3257bd5d35041860b10e882e68b2c14',1,'Dcel::EdgeT::define()'],['../classDcel_1_1FaceT.html#a44b70fa51382ef625d110bbad64b7442',1,'Dcel::FaceT::define()'],['../classDcel_1_1MeshT.html#af65f5fc459d586ba3b6bd0711b0951f5',1,'Dcel::MeshT::define()'],['../classDcel_1_1VertexT.html#a20a894d436707a4205501bbc5cd72323',1,'Dcel::VertexT::define()']]], + ['directsigneddistance',['DirectSignedDistance',['../classDcel_1_1MeshT.html#ada074ff3b1a612e46098f4ba6ca0bda2',1,'Dcel::MeshT']]], + ['directsigneddistance2',['DirectSignedDistance2',['../classDcel_1_1MeshT.html#ac00a6da46649246a3a2db70b29bb2407',1,'Dcel::MeshT']]], + ['dot',['dot',['../classVec2T.html#ab7ed0195847b7a1037051402967780a3',1,'Vec2T::dot()'],['../classVec3T.html#ab4bebdfbdc863826a1a7e86cad130ff8',1,'Vec3T::dot()']]], + ['parser',['Parser',['../namespaceDcel_1_1Parser.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/all_4.html b/docs/doxygen/html/search/all_4.html new file mode 100644 index 00000000..8e1f4b9c --- /dev/null +++ b/docs/doxygen/html/search/all_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_4.js b/docs/doxygen/html/search/all_4.js new file mode 100644 index 00000000..df888d83 --- /dev/null +++ b/docs/doxygen/html/search/all_4.js @@ -0,0 +1,43 @@ +var searchData= +[ + ['ebgeometry',['EBGeometry',['../namespaceEBGeometry.html',1,'']]], + ['ebgeometry_5fanalyticdistancefunctions_2ehpp',['EBGeometry_AnalyticDistanceFunctions.hpp',['../EBGeometry__AnalyticDistanceFunctions_8hpp.html',1,'']]], + ['ebgeometry_5fboundingvolumes_2ehpp',['EBGeometry_BoundingVolumes.hpp',['../EBGeometry__BoundingVolumes_8hpp.html',1,'']]], + ['ebgeometry_5fboundingvolumesimplem_2ehpp',['EBGeometry_BoundingVolumesImplem.hpp',['../EBGeometry__BoundingVolumesImplem_8hpp.html',1,'']]], + ['ebgeometry_5fbvh_2ehpp',['EBGeometry_BVH.hpp',['../EBGeometry__BVH_8hpp.html',1,'']]], + ['ebgeometry_5fbvhimplem_2ehpp',['EBGeometry_BVHImplem.hpp',['../EBGeometry__BVHImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcel_2ehpp',['EBGeometry_Dcel.hpp',['../EBGeometry__Dcel_8hpp.html',1,'']]], + ['ebgeometry_5fdcelbvh_2ehpp',['EBGeometry_DcelBVH.hpp',['../EBGeometry__DcelBVH_8hpp.html',1,'']]], + ['ebgeometry_5fdceledge_2ehpp',['EBGeometry_DcelEdge.hpp',['../EBGeometry__DcelEdge_8hpp.html',1,'']]], + ['ebgeometry_5fdceledgeimplem_2ehpp',['EBGeometry_DcelEdgeImplem.hpp',['../EBGeometry__DcelEdgeImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelface_2ehpp',['EBGeometry_DcelFace.hpp',['../EBGeometry__DcelFace_8hpp.html',1,'']]], + ['ebgeometry_5fdcelfaceimplem_2ehpp',['EBGeometry_DcelFaceImplem.hpp',['../EBGeometry__DcelFaceImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdceliterator_2ehpp',['EBGeometry_DcelIterator.hpp',['../EBGeometry__DcelIterator_8hpp.html',1,'']]], + ['ebgeometry_5fdceliteratorimplem_2ehpp',['EBGeometry_DcelIteratorImplem.hpp',['../EBGeometry__DcelIteratorImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelmesh_2ehpp',['EBGeometry_DcelMesh.hpp',['../EBGeometry__DcelMesh_8hpp.html',1,'']]], + ['ebgeometry_5fdcelmeshimplem_2ehpp',['EBGeometry_DcelMeshImplem.hpp',['../EBGeometry__DcelMeshImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelparser_2ehpp',['EBGeometry_DcelParser.hpp',['../EBGeometry__DcelParser_8hpp.html',1,'']]], + ['ebgeometry_5fdcelparserimplem_2ehpp',['EBGeometry_DcelParserImplem.hpp',['../EBGeometry__DcelParserImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelpolygon2d_2ehpp',['EBGeometry_DcelPolygon2D.hpp',['../EBGeometry__DcelPolygon2D_8hpp.html',1,'']]], + ['ebgeometry_5fdcelpolygon2dimplem_2ehpp',['EBGeometry_DcelPolygon2DImplem.hpp',['../EBGeometry__DcelPolygon2DImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelvertex_2ehpp',['EBGeometry_DcelVertex.hpp',['../EBGeometry__DcelVertex_8hpp.html',1,'']]], + ['ebgeometry_5fdcelverteximplem_2ehpp',['EBGeometry_DcelVertexImplem.hpp',['../EBGeometry__DcelVertexImplem_8hpp.html',1,'']]], + ['ebgeometry_5fnamespacefooter_2ehpp',['EBGeometry_NamespaceFooter.hpp',['../EBGeometry__NamespaceFooter_8hpp.html',1,'']]], + ['ebgeometry_5fnamespaceheader_2ehpp',['EBGeometry_NamespaceHeader.hpp',['../EBGeometry__NamespaceHeader_8hpp.html',1,'']]], + ['ebgeometry_5fsigneddistancefunction_2ehpp',['EBGeometry_SignedDistanceFunction.hpp',['../EBGeometry__SignedDistanceFunction_8hpp.html',1,'']]], + ['ebgeometry_5fsigneddistancefunctionimplem_2ehpp',['EBGeometry_SignedDistanceFunctionImplem.hpp',['../EBGeometry__SignedDistanceFunctionImplem_8hpp.html',1,'']]], + ['ebgeometry_5ftransformops_2ehpp',['EBGeometry_TransformOps.hpp',['../EBGeometry__TransformOps_8hpp.html',1,'']]], + ['ebgeometry_5ftransformopsimplem_2ehpp',['EBGeometry_TransformOpsImplem.hpp',['../EBGeometry__TransformOpsImplem_8hpp.html',1,'']]], + ['ebgeometry_5funion_2ehpp',['EBGeometry_Union.hpp',['../EBGeometry__Union_8hpp.html',1,'']]], + ['ebgeometry_5funionbvh_2ehpp',['EBGeometry_UnionBVH.hpp',['../EBGeometry__UnionBVH_8hpp.html',1,'']]], + ['ebgeometry_5funionbvhimplem_2ehpp',['EBGeometry_UnionBVHImplem.hpp',['../EBGeometry__UnionBVHImplem_8hpp.html',1,'']]], + ['ebgeometry_5funionimplem_2ehpp',['EBGeometry_UnionImplem.hpp',['../EBGeometry__UnionImplem_8hpp.html',1,'']]], + ['ebgeometry_5fvec_2ehpp',['EBGeometry_Vec.hpp',['../EBGeometry__Vec_8hpp.html',1,'']]], + ['ebgeometry_5fvecimplem_2ehpp',['EBGeometry_VecImplem.hpp',['../EBGeometry__VecImplem_8hpp.html',1,'']]], + ['edge',['Edge',['../classDcel_1_1EdgeT.html#a00184663a9d069d2c7a7e0a970f71fd5',1,'Dcel::EdgeT::Edge()'],['../classDcel_1_1FaceT.html#a32a6b328d61bd2739fd840b892833c41',1,'Dcel::FaceT::Edge()'],['../classDcel_1_1EdgeIteratorT.html#ab65ac3b39da5eeb9e3e795f62647ac0b',1,'Dcel::EdgeIteratorT::Edge()'],['../classDcel_1_1MeshT.html#a94f5c42e6f80fd948ebbc294d948ffab',1,'Dcel::MeshT::Edge()'],['../classDcel_1_1Parser_1_1PLY.html#af3741c96a8a8434780665641912ff1d4',1,'Dcel::Parser::PLY::Edge()'],['../classDcel_1_1VertexT.html#abe1079747424916a164ec68b46333fc3',1,'Dcel::VertexT::Edge()']]], + ['edgeiterator',['EdgeIterator',['../classDcel_1_1EdgeT.html#ad55f43bd1061c5ab99c80005861d5bcf',1,'Dcel::EdgeT::EdgeIterator()'],['../classDcel_1_1FaceT.html#afcd6f529cb59cd3dc358d6da52de54a1',1,'Dcel::FaceT::EdgeIterator()'],['../classDcel_1_1Parser_1_1PLY.html#aa0a9888ee0a1539928e6c1ffdda299a8',1,'Dcel::Parser::PLY::EdgeIterator()'],['../classDcel_1_1VertexT.html#abf182ec635351e107cd474df25b6ba73',1,'Dcel::VertexT::EdgeIterator()']]], + ['edgeiteratort',['EdgeIteratorT',['../classDcel_1_1EdgeIteratorT.html',1,'Dcel::EdgeIteratorT< T >'],['../classDcel_1_1EdgeIteratorT.html#a20ff352f5f61ce6297e82d5be43377ce',1,'Dcel::EdgeIteratorT::EdgeIteratorT()=delete'],['../classDcel_1_1EdgeIteratorT.html#aefe8b41b1b21825922096a45ce645149',1,'Dcel::EdgeIteratorT::EdgeIteratorT(Face &a_face)'],['../classDcel_1_1EdgeIteratorT.html#a1e47d3f1320c6ce4f37e1772ed936451',1,'Dcel::EdgeIteratorT::EdgeIteratorT(const Face &a_face)'],['../classDcel_1_1EdgeIteratorT.html#a0041cf8e8c4dcdda12a514aa64e295f7',1,'Dcel::EdgeIteratorT::EdgeIteratorT(Vertex &a_vertex)'],['../classDcel_1_1EdgeIteratorT.html#abda0210d73dd861142c8e23b4d589bd0',1,'Dcel::EdgeIteratorT::EdgeIteratorT(const Vertex &a_vertex)']]], + ['edgeptr',['EdgePtr',['../classDcel_1_1EdgeT.html#af525f4228d820f6b8b23fc02d937e4c8',1,'Dcel::EdgeT::EdgePtr()'],['../classDcel_1_1FaceT.html#a0f3448c4cf108341e48029b8040c7cec',1,'Dcel::FaceT::EdgePtr()'],['../classDcel_1_1EdgeIteratorT.html#a75d19cf89d4ac007483aa8124482513b',1,'Dcel::EdgeIteratorT::EdgePtr()'],['../classDcel_1_1MeshT.html#ab2b035530536a8bc56e40aab455f24e3',1,'Dcel::MeshT::EdgePtr()'],['../classDcel_1_1VertexT.html#a7c049a24ac43b9750578e4f4ed543831',1,'Dcel::VertexT::EdgePtr()']]], + ['edget',['EdgeT',['../classDcel_1_1EdgeT.html',1,'Dcel::EdgeT< T >'],['../classDcel_1_1EdgeT.html#a2a9682fd036374aad598a50fe54b2c1f',1,'Dcel::EdgeT::EdgeT()'],['../classDcel_1_1EdgeT.html#abe96b4404fa1961df79ffa618a7e8633',1,'Dcel::EdgeT::EdgeT(const Edge &a_otherEdge)'],['../classDcel_1_1EdgeT.html#a639b427e60ede1948f8344a41b9bfc32',1,'Dcel::EdgeT::EdgeT(const VertexPtr &a_vertex)']]], + ['ebgeometry',['EBGeometry',['../index.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/all_5.html b/docs/doxygen/html/search/all_5.html new file mode 100644 index 00000000..89a879ea --- /dev/null +++ b/docs/doxygen/html/search/all_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_5.js b/docs/doxygen/html/search/all_5.js new file mode 100644 index 00000000..958e4454 --- /dev/null +++ b/docs/doxygen/html/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['face',['Face',['../classDcel_1_1EdgeT.html#a46456b8f418abc6f09154e8e0d398e37',1,'Dcel::EdgeT::Face()'],['../classDcel_1_1FaceT.html#a01d61241adc3c536c364084740b8c6da',1,'Dcel::FaceT::Face()'],['../classDcel_1_1EdgeIteratorT.html#a59cc24c2a7a6a12c5c60bc04b0ac7497',1,'Dcel::EdgeIteratorT::Face()'],['../classDcel_1_1MeshT.html#ac1fcce96c65811660619af9eb32589f9',1,'Dcel::MeshT::Face()'],['../classDcel_1_1Parser_1_1PLY.html#ac67854dee5613f4e877e8caddb4580f3',1,'Dcel::Parser::PLY::Face()'],['../classDcel_1_1VertexT.html#a455510a8591a4e0f235b2049deb96e08',1,'Dcel::VertexT::Face()']]], + ['faceptr',['FacePtr',['../classDcel_1_1EdgeT.html#a97dd9849ea4a21223095f852e48e36e8',1,'Dcel::EdgeT::FacePtr()'],['../classDcel_1_1FaceT.html#a4c7f99f7e30983c04a9d0b2f7ca40736',1,'Dcel::FaceT::FacePtr()'],['../classDcel_1_1EdgeIteratorT.html#a99deb9b82e268cf8fd1f7c0b94fea339',1,'Dcel::EdgeIteratorT::FacePtr()'],['../classDcel_1_1MeshT.html#a6c71642a9e6b36f9d6ab6027035625f0',1,'Dcel::MeshT::FacePtr()'],['../classDcel_1_1VertexT.html#a5acb4c66c49319683c71f52e56ad8e8a',1,'Dcel::VertexT::FacePtr()']]], + ['facet',['FaceT',['../classDcel_1_1FaceT.html',1,'Dcel::FaceT< T >'],['../classDcel_1_1FaceT.html#ad26587e282563bc4e8c6559b2551627f',1,'Dcel::FaceT::FaceT()'],['../classDcel_1_1FaceT.html#a9111394950a9fb2f8b918423416c83bd',1,'Dcel::FaceT::FaceT(const EdgePtr &a_edge)'],['../classDcel_1_1FaceT.html#a0c318a29cae34ba4105235fd55d22b39',1,'Dcel::FaceT::FaceT(const Face &a_otherFace)']]], + ['flattentree',['flattenTree',['../classBVH_1_1NodeT.html#a926e3990022ab28821d3f51e5fead023',1,'BVH::NodeT::flattenTree()'],['../classBVH_1_1NodeT.html#a14f014426b00ad7989af328fa369bca8',1,'BVH::NodeT::flattenTree(std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, std::vector< std::shared_ptr< const P > > &a_sortedPrimitives, unsigned long &a_offset) const noexcept']]] +]; diff --git a/docs/doxygen/html/search/all_6.html b/docs/doxygen/html/search/all_6.html new file mode 100644 index 00000000..6afac066 --- /dev/null +++ b/docs/doxygen/html/search/all_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_6.js b/docs/doxygen/html/search/all_6.js new file mode 100644 index 00000000..be02dd5c --- /dev/null +++ b/docs/doxygen/html/search/all_6.js @@ -0,0 +1,40 @@ +var searchData= +[ + ['gathervertices',['gatherVertices',['../classDcel_1_1FaceT.html#aba1c0e341f18097112fd55465cc00eeb',1,'Dcel::FaceT']]], + ['getallvertexcoordinates',['getAllVertexCoordinates',['../classDcel_1_1FaceT.html#a17f38028d7bd3150feb22484e601f557',1,'Dcel::FaceT::getAllVertexCoordinates()'],['../classDcel_1_1MeshT.html#a597a38ed9f3e3a2a33f2d1211da322f3',1,'Dcel::MeshT::getAllVertexCoordinates()']]], + ['getarea',['getArea',['../classBoundingVolumes_1_1BoundingSphereT.html#a303fd50d1b8d27c7014c50ba0867a0b3',1,'BoundingVolumes::BoundingSphereT::getArea()'],['../classBoundingVolumes_1_1AABBT.html#ae2f3ba3dde664cccd7c46b0ef4f087d6',1,'BoundingVolumes::AABBT::getArea()'],['../classDcel_1_1FaceT.html#aeddb2fe440acd3dadc6160be390127fe',1,'Dcel::FaceT::getArea() noexcept'],['../classDcel_1_1FaceT.html#ab5352c13f01b1d2ec8fbd630d4c01083',1,'Dcel::FaceT::getArea() const noexcept']]], + ['getboundingvolume',['getBoundingVolume',['../classBVH_1_1NodeT.html#a02cba4dcb065ebfaeea7e4d251b89d04',1,'BVH::NodeT::getBoundingVolume()'],['../classBVH_1_1LinearNodeT.html#a152b12723c86f8fcb7522562cd97cd67',1,'BVH::LinearNodeT::getBoundingVolume()']]], + ['getcenter',['getCenter',['../classSphereSDF.html#a82922ae162a9b96279cc4d0d866b303d',1,'SphereSDF::getCenter() const noexcept'],['../classSphereSDF.html#a4f3a9220bfe2fc817131f655ce6f30cd',1,'SphereSDF::getCenter() noexcept']]], + ['getcentroid',['getCentroid',['../classBoundingVolumes_1_1BoundingSphereT.html#ac3adb87ea4da98d70375e5806e8dfdc5',1,'BoundingVolumes::BoundingSphereT::getCentroid() noexcept'],['../classBoundingVolumes_1_1BoundingSphereT.html#a62e38a048c7aacd79aec8dcc251e3a65',1,'BoundingVolumes::BoundingSphereT::getCentroid() const noexcept'],['../classBoundingVolumes_1_1AABBT.html#a7c98cb4cec1eb672755c9c469ca44990',1,'BoundingVolumes::AABBT::getCentroid()'],['../classDcel_1_1FaceT.html#a1b9c15538b2d7840a11b30f5e236c2a9',1,'Dcel::FaceT::getCentroid() noexcept'],['../classDcel_1_1FaceT.html#af2bf6614093074f450b2e0e5ea58682a',1,'Dcel::FaceT::getCentroid() const noexcept'],['../classDcel_1_1FaceT.html#a43e5b9aebe8736a42568ae0e6fbb6db3',1,'Dcel::FaceT::getCentroid(const int a_dir) noexcept'],['../classDcel_1_1FaceT.html#ac835d260a630e303babd7f87eb7d5a1a',1,'Dcel::FaceT::getCentroid(const int a_dir) const noexcept']]], + ['getchildoffsets',['getChildOffsets',['../classBVH_1_1LinearNodeT.html#af08feacbaa148425a896c196b0b6d1da',1,'BVH::LinearNodeT']]], + ['getdepth',['getDepth',['../classBVH_1_1NodeT.html#a158041a671c970da921446050e95f474',1,'BVH::NodeT']]], + ['getdistance',['getDistance',['../classBoundingVolumes_1_1BoundingSphereT.html#a06ec858b7349e6a926ad476990c774cb',1,'BoundingVolumes::BoundingSphereT::getDistance()'],['../classBoundingVolumes_1_1AABBT.html#ad883975a0926c0755a978283137f378f',1,'BoundingVolumes::AABBT::getDistance()']]], + ['getdistance2',['getDistance2',['../classBoundingVolumes_1_1BoundingSphereT.html#aee81818917225b65b6c3b661e268e66f',1,'BoundingVolumes::BoundingSphereT::getDistance2()'],['../classBoundingVolumes_1_1AABBT.html#a2196f1cf735ccf5d1f5c1ee8dcb449dd',1,'BoundingVolumes::AABBT::getDistance2()']]], + ['getdistancetoboundingvolume',['getDistanceToBoundingVolume',['../classBVH_1_1NodeT.html#a8da9f78078b0a579868d026bd61a2947',1,'BVH::NodeT::getDistanceToBoundingVolume()'],['../classBVH_1_1LinearNodeT.html#a2bf5b1c514a20754d527b17e1c664630',1,'BVH::LinearNodeT::getDistanceToBoundingVolume()']]], + ['getdistancetoboundingvolume2',['getDistanceToBoundingVolume2',['../classBVH_1_1NodeT.html#a06708a2711fd354a3c382da664cfe154',1,'BVH::NodeT::getDistanceToBoundingVolume2()'],['../classBVH_1_1LinearNodeT.html#a3e85605a1f0986b8440964ed0dbe90f6',1,'BVH::LinearNodeT::getDistanceToBoundingVolume2()']]], + ['getdistancetoprimitives',['getDistanceToPrimitives',['../classBVH_1_1NodeT.html#a61dc7040d57f0a69984548eb4804244b',1,'BVH::NodeT::getDistanceToPrimitives()'],['../classBVH_1_1LinearNodeT.html#a1a0a50ba8c1c0601f12ae02857246b1f',1,'BVH::LinearNodeT::getDistanceToPrimitives()']]], + ['getedges',['getEdges',['../classDcel_1_1MeshT.html#a3c6566eab929cc4108213959fa25777e',1,'Dcel::MeshT::getEdges() noexcept'],['../classDcel_1_1MeshT.html#a3440c0836148040bfd6cc679f047ec5b',1,'Dcel::MeshT::getEdges() const noexcept']]], + ['getface',['getFace',['../classDcel_1_1EdgeT.html#a522de398f834c68701e4a44f2c9ba972',1,'Dcel::EdgeT::getFace() noexcept'],['../classDcel_1_1EdgeT.html#a3966ae6b38b26c618cfb56bd5adb8b54',1,'Dcel::EdgeT::getFace() const noexcept']]], + ['getfaces',['getFaces',['../classDcel_1_1MeshT.html#a348cffec1fa223f131819abad1c89338',1,'Dcel::MeshT::getFaces() noexcept'],['../classDcel_1_1MeshT.html#afe1bd52d15af160f691bdd83305c84c7',1,'Dcel::MeshT::getFaces() const noexcept'],['../classDcel_1_1VertexT.html#a1d365de69778aa4bb35f80c936e95251',1,'Dcel::VertexT::getFaces() noexcept'],['../classDcel_1_1VertexT.html#aa73d20542e46c20afba1f14cd061f126',1,'Dcel::VertexT::getFaces() const noexcept']]], + ['gethalfedge',['getHalfEdge',['../classDcel_1_1FaceT.html#a121a02750336ee4050bfd5db8f9328b4',1,'Dcel::FaceT::getHalfEdge() noexcept'],['../classDcel_1_1FaceT.html#a1b273c8c0157f7ec9604424a2b073db3',1,'Dcel::FaceT::getHalfEdge() const noexcept']]], + ['gethighcorner',['getHighCorner',['../classBoundingVolumes_1_1AABBT.html#a2ecaeccecdb8882051516409e5749ef9',1,'BoundingVolumes::AABBT::getHighCorner() noexcept'],['../classBoundingVolumes_1_1AABBT.html#aef8dcd08ea8726cdcd3d361d33c4d554',1,'BoundingVolumes::AABBT::getHighCorner() const noexcept']]], + ['gethighestcoordinate',['getHighestCoordinate',['../classDcel_1_1FaceT.html#ad712b8dec98d77e631e1c7a920424d1f',1,'Dcel::FaceT']]], + ['getlowcorner',['getLowCorner',['../classBoundingVolumes_1_1AABBT.html#a6368509e66a2b5691272f273fe96f670',1,'BoundingVolumes::AABBT::getLowCorner() noexcept'],['../classBoundingVolumes_1_1AABBT.html#a937cfc6cbbbd457f872370c1c4d5e81e',1,'BoundingVolumes::AABBT::getLowCorner() const noexcept']]], + ['getnextedge',['getNextEdge',['../classDcel_1_1EdgeT.html#a1c865581d60a3e89e91d1d8db56fc2d1',1,'Dcel::EdgeT::getNextEdge() noexcept'],['../classDcel_1_1EdgeT.html#a6b50d3dd8ab3e2cda28819f6e4be9769',1,'Dcel::EdgeT::getNextEdge() const noexcept']]], + ['getnodetype',['getNodeType',['../classBVH_1_1NodeT.html#a7b9e3a8bfa35f604298634da102a0ce4',1,'BVH::NodeT']]], + ['getnormal',['getNormal',['../classDcel_1_1EdgeT.html#a3caca2b8e0d73531566218a7febe24d8',1,'Dcel::EdgeT::getNormal() noexcept'],['../classDcel_1_1EdgeT.html#a60b8b2acf41484ff0c521310cece56a3',1,'Dcel::EdgeT::getNormal() const noexcept'],['../classDcel_1_1FaceT.html#a0e6079ca8d45b2e2090bd6202c7a679e',1,'Dcel::FaceT::getNormal() noexcept'],['../classDcel_1_1FaceT.html#adff3ebb9eba8d500e21fed65b32ea8fb',1,'Dcel::FaceT::getNormal() const noexcept'],['../classDcel_1_1VertexT.html#a11d1c90ccfa44b5ea121223bd86214c9',1,'Dcel::VertexT::getNormal() noexcept'],['../classDcel_1_1VertexT.html#a6d2d15dff96e192dff0254d40e1927b7',1,'Dcel::VertexT::getNormal() const noexcept']]], + ['getnumprimitives',['getNumPrimitives',['../classBVH_1_1LinearNodeT.html#a245e67b6824cadf1733c3c9176259106',1,'BVH::LinearNodeT']]], + ['getothervertex',['getOtherVertex',['../classDcel_1_1EdgeT.html#aaa6ae21b177a7661ba61ad2b63ed47f3',1,'Dcel::EdgeT::getOtherVertex() noexcept'],['../classDcel_1_1EdgeT.html#ac2b40be7e45425caaf85b13b50bd89a0',1,'Dcel::EdgeT::getOtherVertex() const noexcept']]], + ['getoutgoingedge',['getOutgoingEdge',['../classDcel_1_1VertexT.html#ae310f38b6e5b9bb4bae4633117a26708',1,'Dcel::VertexT::getOutgoingEdge() noexcept'],['../classDcel_1_1VertexT.html#ab726cf7028c0b9de7eaff211d9ca34aa',1,'Dcel::VertexT::getOutgoingEdge() const noexcept']]], + ['getoverlappingvolume',['getOverlappingVolume',['../classBoundingVolumes_1_1BoundingSphereT.html#a4581b87c7a3ccd3b58168bfdae9436cb',1,'BoundingVolumes::BoundingSphereT::getOverlappingVolume()'],['../classBoundingVolumes_1_1AABBT.html#ae65563ac6f3851f8fb05e0c98613fc0d',1,'BoundingVolumes::AABBT::getOverlappingVolume()'],['../namespaceBoundingVolumes.html#a4f159289c317e02beedb4b38136ad692',1,'BoundingVolumes::getOverlappingVolume(const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept'],['../namespaceBoundingVolumes.html#ae5716e39e88aaeec0c204f453cac2acd',1,'BoundingVolumes::getOverlappingVolume(const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept']]], + ['getpairedge',['getPairEdge',['../classDcel_1_1EdgeT.html#a1a076a12b7e269aecd77172b1d4c57e1',1,'Dcel::EdgeT::getPairEdge() noexcept'],['../classDcel_1_1EdgeT.html#a46f28f7da631e2d0f7f3139d1167b392',1,'Dcel::EdgeT::getPairEdge() const noexcept']]], + ['getposition',['getPosition',['../classDcel_1_1VertexT.html#af3ecf093a2fc7fd0f728d463ccacb8ce',1,'Dcel::VertexT::getPosition() noexcept'],['../classDcel_1_1VertexT.html#a7a4c3e499c6f7e529cc556eecf94f3fe',1,'Dcel::VertexT::getPosition() const noexcept']]], + ['getpreviousedge',['getPreviousEdge',['../classDcel_1_1EdgeT.html#ad97e2996c4559b8977d807a5627d5251',1,'Dcel::EdgeT::getPreviousEdge() noexcept'],['../classDcel_1_1EdgeT.html#ae4baac4bda30dfa3827ea87f2f72481f',1,'Dcel::EdgeT::getPreviousEdge() const noexcept']]], + ['getprimitives',['getPrimitives',['../classBVH_1_1NodeT.html#a2e0c1e030162a2dc049acb4debd4d9f2',1,'BVH::NodeT::getPrimitives() const noexcept'],['../classBVH_1_1NodeT.html#adce9d9c6bd4ab3d613bef232353774f3',1,'BVH::NodeT::getPrimitives() noexcept']]], + ['getprimitivesoffset',['getPrimitivesOffset',['../classBVH_1_1LinearNodeT.html#a8cfca65bd808adc8eb2793e7d7aabcd3',1,'BVH::LinearNodeT']]], + ['getradius',['getRadius',['../classSphereSDF.html#a2cdc1f42f3de4c0ca017571910fbe72c',1,'SphereSDF::getRadius() const noexcept'],['../classSphereSDF.html#a09245289037ae77adf204160c0d5b9cc',1,'SphereSDF::getRadius() noexcept'],['../classBoundingVolumes_1_1BoundingSphereT.html#a8c4f10492e97aa460b1207f384e1c081',1,'BoundingVolumes::BoundingSphereT::getRadius() noexcept'],['../classBoundingVolumes_1_1BoundingSphereT.html#affac2a4ac0cefaada01c5532eb13f26a',1,'BoundingVolumes::BoundingSphereT::getRadius() const noexcept']]], + ['getsmallestcoordinate',['getSmallestCoordinate',['../classDcel_1_1FaceT.html#a8eb0b35ecb5de2601dc9f7ff0d2cac0d',1,'Dcel::FaceT']]], + ['getvertex',['getVertex',['../classDcel_1_1EdgeT.html#a44193130714264f57d80e7bfc8264662',1,'Dcel::EdgeT::getVertex() noexcept'],['../classDcel_1_1EdgeT.html#afa36dc535018588ba2238c5f42a9abd8',1,'Dcel::EdgeT::getVertex() const noexcept']]], + ['getvertices',['getVertices',['../classDcel_1_1MeshT.html#a0ccf0a5a707dbad79b3578a401449e9c',1,'Dcel::MeshT::getVertices() noexcept'],['../classDcel_1_1MeshT.html#a579860225cb9fc926fea4856563bef08',1,'Dcel::MeshT::getVertices() const noexcept']]], + ['getvolume',['getVolume',['../classBoundingVolumes_1_1BoundingSphereT.html#a44e0069495c19069fced07aab8e614c6',1,'BoundingVolumes::BoundingSphereT::getVolume()'],['../classBoundingVolumes_1_1AABBT.html#ac5b8f2caa8afe1177f3d2924fbc3f7a5',1,'BoundingVolumes::AABBT::getVolume()']]] +]; diff --git a/docs/doxygen/html/search/all_7.html b/docs/doxygen/html/search/all_7.html new file mode 100644 index 00000000..de191077 --- /dev/null +++ b/docs/doxygen/html/search/all_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_7.js b/docs/doxygen/html/search/all_7.js new file mode 100644 index 00000000..6a34b22e --- /dev/null +++ b/docs/doxygen/html/search/all_7.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['incrementwarning',['incrementWarning',['../classDcel_1_1MeshT.html#ae13801eefa60ad08ff1da0df1da34784',1,'Dcel::MeshT']]], + ['infinity',['infinity',['../classVec2T.html#a28b453ff4fd4ede74e401454b67f73d6',1,'Vec2T::infinity()'],['../classVec3T.html#ad88913a21fd56327b28092c2e39ebc3e',1,'Vec3T::infinity()']]], + ['insertnode',['insertNode',['../classBVH_1_1NodeT.html#a8113c8dfa5ab6dc3cf931c5c8fdd6ddb',1,'BVH::NodeT']]], + ['insertnodes',['insertNodes',['../classBVH_1_1NodeT.html#a75a7b385ec12897c1ade331ee24d9b74',1,'BVH::NodeT']]], + ['insideoutsidealgorithm',['InsideOutsideAlgorithm',['../classDcel_1_1Polygon2D.html#a1ec8170036eb8dd1cedbe1b4d31024b4',1,'Dcel::Polygon2D']]], + ['intersects',['intersects',['../classBoundingVolumes_1_1BoundingSphereT.html#a90baad0c400aac7645a7e8c1ab13096a',1,'BoundingVolumes::BoundingSphereT::intersects()'],['../classBoundingVolumes_1_1AABBT.html#a87d160a3e05082e34e37d8b4472bad7d',1,'BoundingVolumes::AABBT::intersects()'],['../namespaceBoundingVolumes.html#af35f33c5f319a466550d9ad1040beced',1,'BoundingVolumes::intersects(const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept'],['../namespaceBoundingVolumes.html#a5c360ccd42017c01acbe1caf2cfd1efe',1,'BoundingVolumes::intersects(const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept']]], + ['isleaf',['isLeaf',['../classBVH_1_1LinearNodeT.html#aba361834e3d013725a92ec4b45633584',1,'BVH::LinearNodeT']]], + ['ispointinside',['isPointInside',['../classDcel_1_1Polygon2D.html#ade475a82be10cbacf382016e85316853',1,'Dcel::Polygon2D']]], + ['ispointinsideface',['isPointInsideFace',['../classDcel_1_1FaceT.html#a628d1734a63636a528fe2f7019bc4dd8',1,'Dcel::FaceT']]], + ['ispointinsidepolygoncrossingnumber',['isPointInsidePolygonCrossingNumber',['../classDcel_1_1Polygon2D.html#aa1edee7ad8913b35663792624e914aad',1,'Dcel::Polygon2D']]], + ['ispointinsidepolygonsubtend',['isPointInsidePolygonSubtend',['../classDcel_1_1Polygon2D.html#a8a6a32defe11ad15996e286aa76d4428',1,'Dcel::Polygon2D']]], + ['ispointinsidepolygonwindingnumber',['isPointInsidePolygonWindingNumber',['../classDcel_1_1Polygon2D.html#ad4d6b51a54f6a9c89812a5bcbc0e1902',1,'Dcel::Polygon2D']]], + ['iterationmode',['IterationMode',['../classDcel_1_1EdgeIteratorT.html#ad6b36e4ef39214ccd75966a6ecd82682',1,'Dcel::EdgeIteratorT']]] +]; diff --git a/docs/doxygen/html/search/all_8.html b/docs/doxygen/html/search/all_8.html new file mode 100644 index 00000000..11e27cdb --- /dev/null +++ b/docs/doxygen/html/search/all_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_8.js b/docs/doxygen/html/search/all_8.js new file mode 100644 index 00000000..102d2e1c --- /dev/null +++ b/docs/doxygen/html/search/all_8.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['length',['length',['../classVec2T.html#ad7965b8d549a5f9d08cab43760dab56b',1,'Vec2T::length()'],['../classVec3T.html#a93c868b181e24a4f74702a8b8a36f815',1,'Vec3T::length()']]], + ['length2',['length2',['../classVec2T.html#a9beb3ae1b8b76926f8864686cb6a2ace',1,'Vec2T::length2()'],['../classVec3T.html#aaed89aee434cfa0abd86fe33bff49b4e',1,'Vec3T::length2()']]], + ['linearbvh',['LinearBVH',['../classBVH_1_1LinearBVH.html',1,'BVH::LinearBVH< T, P, BV, K >'],['../classBVH_1_1LinearBVH.html#af071dcad6741be1314c0b39512d2f142',1,'BVH::LinearBVH::LinearBVH()=delete'],['../classBVH_1_1LinearBVH.html#a82e767c16424e19c5dfbe671dd111e32',1,'BVH::LinearBVH::LinearBVH(const std::vector< LinearNode > &a_linearNodes, const PrimitiveList &a_primitives)']]], + ['linearnode',['LinearNode',['../classBVH_1_1LinearBVH.html#ad8c5e4f84138090dbd408a075dc91896',1,'BVH::LinearBVH::LinearNode()'],['../classUnionBVH.html#a25cac5a9dc5396299f06399434ebe212',1,'UnionBVH::LinearNode()']]], + ['linearnodet',['LinearNodeT',['../classBVH_1_1LinearNodeT.html',1,'BVH::LinearNodeT< T, P, BV, K >'],['../classBVH_1_1LinearNodeT.html#ae7dbdb102840eb271dadea2f25aa6f8b',1,'BVH::LinearNodeT::LinearNodeT()']]] +]; diff --git a/docs/doxygen/html/search/all_9.html b/docs/doxygen/html/search/all_9.html new file mode 100644 index 00000000..f8abbbe5 --- /dev/null +++ b/docs/doxygen/html/search/all_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_9.js b/docs/doxygen/html/search/all_9.js new file mode 100644 index 00000000..584aa1ea --- /dev/null +++ b/docs/doxygen/html/search/all_9.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['m_5falgorithm',['m_algorithm',['../classDcel_1_1MeshT.html#aaa5bdf8df02aa8bcff84203467f86fbe',1,'Dcel::MeshT']]], + ['m_5farea',['m_area',['../classDcel_1_1FaceT.html#a572c463c60afb896c8cec667c964631f',1,'Dcel::FaceT']]], + ['m_5faxis',['m_axis',['../classRotateOp.html#ae0f4b6879b2b86506b4a528d7e627255',1,'RotateOp']]], + ['m_5fboundingvolume',['m_boundingVolume',['../classBVH_1_1NodeT.html#a7f8720f2ab03ee9e81de114c479cb2e5',1,'BVH::NodeT::m_boundingVolume()'],['../classBVH_1_1LinearNodeT.html#acef96b811ea69cd649fda35da082b361',1,'BVH::LinearNodeT::m_boundingVolume()']]], + ['m_5fcenter',['m_center',['../classSphereSDF.html#ab3caacb26a72b3ada01f09a248f5cb83',1,'SphereSDF::m_center()'],['../classBoundingVolumes_1_1BoundingSphereT.html#ad65d5be68c4028651d959dc8b88fe944',1,'BoundingVolumes::BoundingSphereT::m_center()']]], + ['m_5fcentroid',['m_centroid',['../classDcel_1_1FaceT.html#a9a85e2c47be9ac4bbfe8620bc0773d6d',1,'Dcel::FaceT']]], + ['m_5fchildoffsets',['m_childOffsets',['../classBVH_1_1LinearNodeT.html#a2a160d04d0bea69de7eb949fd9d56dda',1,'BVH::LinearNodeT']]], + ['m_5fchildren',['m_children',['../classBVH_1_1NodeT.html#a35da0576176a01c9c441f0f2b899ca33',1,'BVH::NodeT']]], + ['m_5fcosangle',['m_cosAngle',['../classRotateOp.html#a8eed86f336946618f1964056405b9ac4',1,'RotateOp']]], + ['m_5fcuredge',['m_curEdge',['../classDcel_1_1EdgeIteratorT.html#afcebe87fbd158d212d7ba0a6b01efa8c',1,'Dcel::EdgeIteratorT']]], + ['m_5fdepth',['m_depth',['../classBVH_1_1NodeT.html#a8b924aa0aa13630167f69a7b19038e7e',1,'BVH::NodeT']]], + ['m_5fdistancefunctions',['m_distanceFunctions',['../classUnion.html#a5d2f543272ab5fe25f6f5945ad1ef27f',1,'Union::m_distanceFunctions()'],['../classUnionBVH.html#a026a103a13d0b04bedb6dabd50e4da69',1,'UnionBVH::m_distanceFunctions()']]], + ['m_5fedges',['m_edges',['../classDcel_1_1FaceT.html#a9228b5f27e1aa5c9eea36a7c27462e6c',1,'Dcel::FaceT::m_edges()'],['../classDcel_1_1MeshT.html#a3325cb09037fa32255aa1a8a5536e473',1,'Dcel::MeshT::m_edges()']]], + ['m_5fface',['m_face',['../classDcel_1_1EdgeT.html#a47aaa6dbeeb6a56f1c7b6d73b2119761',1,'Dcel::EdgeT']]], + ['m_5ffaces',['m_faces',['../classDcel_1_1MeshT.html#a17e08b2ee4b5b7b1dc3df974e792ca5f',1,'Dcel::MeshT::m_faces()'],['../classDcel_1_1VertexT.html#ad0a8f9c1015b62c891ad2d877d6b8802',1,'Dcel::VertexT::m_faces()']]], + ['m_5fflipinside',['m_flipInside',['../classSphereSDF.html#a9a32a668648c166b41c5d1c3981c9579',1,'SphereSDF']]], + ['m_5fflipsign',['m_flipSign',['../classUnion.html#a53b9705419030572836a540e7fa3752f',1,'Union::m_flipSign()'],['../classUnionBVH.html#a0782d93bd0a7bff7580a99e6fef285c7',1,'UnionBVH::m_flipSign()']]], + ['m_5ffullloop',['m_fullLoop',['../classDcel_1_1EdgeIteratorT.html#a39560da0f4479c53ed27c38bdfab7c21',1,'Dcel::EdgeIteratorT']]], + ['m_5fhalfedge',['m_halfEdge',['../classDcel_1_1FaceT.html#afe66c3d93bb0ea04d9a0d263b2927bd3',1,'Dcel::FaceT']]], + ['m_5fhicorner',['m_hiCorner',['../classBoundingVolumes_1_1AABBT.html#a35f9498191e406b3f48f7454bfdf0cf7',1,'BoundingVolumes::AABBT']]], + ['m_5finvlen2',['m_invLen2',['../classDcel_1_1EdgeT.html#a3689615754e3bdafb12109d5b82183a7',1,'Dcel::EdgeT']]], + ['m_5fisgood',['m_isGood',['../classUnionBVH.html#a2c3a008bd61f225a83c959f2280b9649',1,'UnionBVH']]], + ['m_5fitermode',['m_iterMode',['../classDcel_1_1EdgeIteratorT.html#aa0c8a35a18d668927dd966ddd9620ce5',1,'Dcel::EdgeIteratorT']]], + ['m_5flinearnodes',['m_linearNodes',['../classBVH_1_1LinearBVH.html#aa6b833445964d75b5b560ece4548a044',1,'BVH::LinearBVH']]], + ['m_5flocorner',['m_loCorner',['../classBoundingVolumes_1_1AABBT.html#a5cbd0ee374c62951aa58644bc09f70cf',1,'BoundingVolumes::AABBT']]], + ['m_5fnextedge',['m_nextEdge',['../classDcel_1_1EdgeT.html#a26de8e8184c0a6656a2cee2af1bc0230',1,'Dcel::EdgeT']]], + ['m_5fnodetype',['m_nodeType',['../classBVH_1_1NodeT.html#a1e8922fc8cfca32763a7fcb85d9a9508',1,'BVH::NodeT']]], + ['m_5fnormal',['m_normal',['../classDcel_1_1EdgeT.html#af44c33f8b5b0a3d45cd4a83e6fde4db5',1,'Dcel::EdgeT::m_normal()'],['../classDcel_1_1FaceT.html#a886ee24ddf3dae99b836b39183a412ba',1,'Dcel::FaceT::m_normal()'],['../classDcel_1_1VertexT.html#a509216af6d1d2ca84d1d774b4a6c7659',1,'Dcel::VertexT::m_normal()']]], + ['m_5fnumprimitives',['m_numPrimitives',['../classBVH_1_1LinearNodeT.html#a59a4aff1eeac58606f4854e334e10a17',1,'BVH::LinearNodeT']]], + ['m_5foutgoingedge',['m_outgoingEdge',['../classDcel_1_1VertexT.html#ab02281ef4c214c2ea5567dae97864846',1,'Dcel::VertexT']]], + ['m_5fpairedge',['m_pairEdge',['../classDcel_1_1EdgeT.html#a5c3bc15e1360b931231cac396493f5b6',1,'Dcel::EdgeT']]], + ['m_5fparent',['m_parent',['../classBVH_1_1NodeT.html#abf7f5d4808d0662f2ee0ae07a4bcddca',1,'BVH::NodeT']]], + ['m_5fpoly2',['m_poly2',['../classDcel_1_1FaceT.html#a77edb4eca91bcd6fb47ce3574c11b840',1,'Dcel::FaceT']]], + ['m_5fpoly2algorithm',['m_poly2Algorithm',['../classDcel_1_1FaceT.html#acc53b6246f9d5d57777789aad6084d14',1,'Dcel::FaceT']]], + ['m_5fposition',['m_position',['../classDcel_1_1VertexT.html#a1980e54dcfd5cefdebac129580028015',1,'Dcel::VertexT']]], + ['m_5fpreviousedge',['m_previousEdge',['../classDcel_1_1EdgeT.html#a77d21fbad704f8aa84aeddeaff1532fd',1,'Dcel::EdgeT']]], + ['m_5fprimitives',['m_primitives',['../classBVH_1_1NodeT.html#abcdc79254bc8b9d227a70e1ad15ff35e',1,'BVH::NodeT::m_primitives()'],['../classBVH_1_1LinearBVH.html#a82d8ebdc93553c7b02fe4da77329a4c2',1,'BVH::LinearBVH::m_primitives()']]], + ['m_5fprimitivesoffset',['m_primitivesOffset',['../classBVH_1_1LinearNodeT.html#a05efc0076443c7131187adfadaad81ea',1,'BVH::LinearNodeT']]], + ['m_5fradius',['m_radius',['../classSphereSDF.html#ac4b0f786ea2b53530512ce3fa4e7bdbd',1,'SphereSDF::m_radius()'],['../classBoundingVolumes_1_1BoundingSphereT.html#adb424c867ed93cf5fdb62afe07a96a05',1,'BoundingVolumes::BoundingSphereT::m_radius()']]], + ['m_5frootnode',['m_rootNode',['../classUnionBVH.html#ad59be4f96e0f020c28f4677dcb94a004',1,'UnionBVH']]], + ['m_5fscale',['m_scale',['../classScaleOp.html#aa9cdfff381b10970fd51eeb7e3e83188',1,'ScaleOp']]], + ['m_5fsinangle',['m_sinAngle',['../classRotateOp.html#ab0f3316357239d07fb1da64b7298d53f',1,'RotateOp']]], + ['m_5fstartedge',['m_startEdge',['../classDcel_1_1EdgeIteratorT.html#a39c525d750868014457cdf06a40455bd',1,'Dcel::EdgeIteratorT']]], + ['m_5ftransformops',['m_transformOps',['../classSignedDistanceFunction.html#af61e5e2ece6add9d2bcf8e5aa8cf2844',1,'SignedDistanceFunction']]], + ['m_5ftranslation',['m_translation',['../classTranslateOp.html#a35f16c6a9cf4c03edffa19d86e73d27a',1,'TranslateOp']]], + ['m_5fvertex',['m_vertex',['../classDcel_1_1EdgeT.html#a30813ecada33723cc466e0cd1d24abd4',1,'Dcel::EdgeT']]], + ['m_5fvertices',['m_vertices',['../classDcel_1_1MeshT.html#a4263fd9ebba22b96e12ee9f046eca089',1,'Dcel::MeshT']]], + ['m_5fx2x1',['m_x2x1',['../classDcel_1_1EdgeT.html#af70e7b85effe62dd804638984b15695a',1,'Dcel::EdgeT']]], + ['max',['max',['../classVec2T.html#a1211175344f9ee8bc0fd4ac2589799d8',1,'Vec2T::max()'],['../classVec3T.html#af06b99bd905435060149a61a13f61546',1,'Vec3T::max() noexcept'],['../classVec3T.html#ac126bbdaeff79e475327887bfa8aa62c',1,'Vec3T::max(const Vec3T< T > &u) noexcept'],['../EBGeometry__Vec_8hpp.html#a71f0bc32c9be501cf01a1b6c715dc0a9',1,'max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a71f0bc32c9be501cf01a1b6c715dc0a9',1,'max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp']]], + ['maxdir',['maxDir',['../classVec3T.html#a292391c1f72ca66e100e7e70512ff9b1',1,'Vec3T']]], + ['mesh',['Mesh',['../classDcel_1_1MeshT.html#abe9db973f4510ccb36e20ecfa9223926',1,'Dcel::MeshT::Mesh()'],['../classDcel_1_1Parser_1_1PLY.html#a047f135a59b43a0fb84f3629a790bba4',1,'Dcel::Parser::PLY::Mesh()']]], + ['mesht',['MeshT',['../classDcel_1_1MeshT.html',1,'Dcel::MeshT< T >'],['../classDcel_1_1MeshT.html#a4eae06529761d8aff54e945eb0a3ba91',1,'Dcel::MeshT::MeshT()'],['../classDcel_1_1MeshT.html#aa055e10c62778ba629b3f9c849338e03',1,'Dcel::MeshT::MeshT(const Mesh &a_otherMesh)=delete'],['../classDcel_1_1MeshT.html#a7468e3630893d64a71a7c2347496576b',1,'Dcel::MeshT::MeshT(std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices)']]], + ['min',['min',['../classVec2T.html#aca5161a674a3546a8c9d5543537548a3',1,'Vec2T::min()'],['../classVec3T.html#a4f27fdac2e6ac4feffe148bb8857f8bc',1,'Vec3T::min() noexcept'],['../classVec3T.html#ad0a0c9754ef8df1fa28abdaa01c246c4',1,'Vec3T::min(const Vec3T< T > &u) noexcept'],['../EBGeometry__Vec_8hpp.html#a291f01622695ab94c0092c3af0a1f3ca',1,'min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a291f01622695ab94c0092c3af0a1f3ca',1,'min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp']]] +]; diff --git a/docs/doxygen/html/search/all_a.html b/docs/doxygen/html/search/all_a.html new file mode 100644 index 00000000..9601fcee --- /dev/null +++ b/docs/doxygen/html/search/all_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_a.js b/docs/doxygen/html/search/all_a.js new file mode 100644 index 00000000..85356439 --- /dev/null +++ b/docs/doxygen/html/search/all_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['node',['Node',['../classBVH_1_1NodeT.html#ac52d9b56f082002c7f8be91062c40ff8',1,'BVH::NodeT']]], + ['nodeptr',['NodePtr',['../classBVH_1_1NodeT.html#a008f5c2c53adb1f5730d8478b48529b1',1,'BVH::NodeT']]], + ['nodet',['NodeT',['../classBVH_1_1NodeT.html',1,'BVH::NodeT< T, P, BV, K >'],['../classBVH_1_1NodeT.html#a960d0972bec81cf782b36e57f87da1f1',1,'BVH::NodeT::NodeT()'],['../classBVH_1_1NodeT.html#a8867e5e1c47d12eff7a468b2e240f16b',1,'BVH::NodeT::NodeT(const NodePtr &a_parent)'],['../classBVH_1_1NodeT.html#a6da86ccc8e4a0c556cd67ca59af983dc',1,'BVH::NodeT::NodeT(const std::vector< std::shared_ptr< P > > &a_primitives)'],['../classBVH_1_1NodeT.html#a6312ce04f70c2e1a860ce380298909b6',1,'BVH::NodeT::NodeT(const std::vector< std::shared_ptr< const P > > &a_primitives)']]], + ['nodetype',['NodeType',['../namespaceBVH.html#a7613f83a60cfae9aba31861110bd9e54',1,'BVH']]], + ['normalizenormalvector',['normalizeNormalVector',['../classDcel_1_1EdgeT.html#aae9ee7375ce72ddf5ef375fb18863e8f',1,'Dcel::EdgeT::normalizeNormalVector()'],['../classDcel_1_1FaceT.html#aae0f6ac54d41666fa4b6182c65e5e444',1,'Dcel::FaceT::normalizeNormalVector()'],['../classDcel_1_1VertexT.html#a5926f14833074dfa2acf28a3e5c36f46',1,'Dcel::VertexT::normalizeNormalVector()']]] +]; diff --git a/docs/doxygen/html/search/all_b.html b/docs/doxygen/html/search/all_b.html new file mode 100644 index 00000000..0814e4e0 --- /dev/null +++ b/docs/doxygen/html/search/all_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_b.js b/docs/doxygen/html/search/all_b.js new file mode 100644 index 00000000..bcd81563 --- /dev/null +++ b/docs/doxygen/html/search/all_b.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['ok',['ok',['../classDcel_1_1EdgeIteratorT.html#a92bfca2d072bbf54c7be751f8fc4c098',1,'Dcel::EdgeIteratorT']]], + ['one',['one',['../classVec2T.html#a9103ce94a3efa9e85cb732fb68af744e',1,'Vec2T::one()'],['../classVec3T.html#a82237dfeed4017e952c893817afc3827',1,'Vec3T::one()']]], + ['operator_28_29',['operator()',['../classDcel_1_1EdgeIteratorT.html#a56e7dcbaf6f74f6c05b1eb9105d203ad',1,'Dcel::EdgeIteratorT::operator()() noexcept'],['../classDcel_1_1EdgeIteratorT.html#a2e4afdda5a3eb033dc293fefc23edaa6',1,'Dcel::EdgeIteratorT::operator()() const noexcept']]], + ['operator_2a',['operator*',['../classVec2T.html#a1047f21e704d25c4bc5980cd13c00e1c',1,'Vec2T::operator*()'],['../classVec3T.html#aa4768276707889db34a716e9e476b9f1',1,'Vec3T::operator*(const T &s) const noexcept'],['../classVec3T.html#a579db6fb2bed30b3f024d1a017d7a124',1,'Vec3T::operator*(const Vec3T< T > &s) const noexcept'],['../EBGeometry__Vec_8hpp.html#a011c551978bb37db35ea3520fb23bd00',1,'operator*(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__Vec_8hpp.html#affba8fd8ad3fc6110fbba33be5ad6187',1,'operator*(const T &s, const Vec3T< T > &u) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a011c551978bb37db35ea3520fb23bd00',1,'operator*(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a3ed4fdd9b9d6b180e982733b4c7efc8e',1,'operator*(const T &s, const Vec3T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp']]], + ['operator_2a_3d',['operator*=',['../classVec2T.html#ad7525f66bf0c609e79e1d2590af6be0c',1,'Vec2T::operator*=()'],['../classVec3T.html#a0448e51b7f785b14df47092929cb73a3',1,'Vec3T::operator*=()']]], + ['operator_2b',['operator+',['../classVec2T.html#a0ea1e944e722dfdc3a37ebd7ef922eea',1,'Vec2T::operator+()'],['../classVec3T.html#af1ab895de89a1a3143f58d2ce5d78bc2',1,'Vec3T::operator+()']]], + ['operator_2b_2b',['operator++',['../classDcel_1_1EdgeIteratorT.html#ae8dc40da0743b61725062646144b8f32',1,'Dcel::EdgeIteratorT']]], + ['operator_2b_3d',['operator+=',['../classVec2T.html#a6f5fbfd88dc2eac09f17fb999c76e5b0',1,'Vec2T::operator+=()'],['../classVec3T.html#a7d06c56d8579d8b3695f43f62544f999',1,'Vec3T::operator+=()']]], + ['operator_2d',['operator-',['../classVec2T.html#a788b057579c3c92068e15595d7781734',1,'Vec2T::operator-(const Vec2T &a_other) const noexcept'],['../classVec2T.html#aa8176b9c1a1331f1b0358188cd04883f',1,'Vec2T::operator-() const noexcept'],['../classVec3T.html#ac00a70e55a93ecd8c60d29a129f8fbf3',1,'Vec3T::operator-(const Vec3T< T > &u) const noexcept'],['../classVec3T.html#a2d32936bb5a9ddc22152d301723bc3e0',1,'Vec3T::operator-() const noexcept']]], + ['operator_2d_3d',['operator-=',['../classVec2T.html#a6c98f1e7b2bb5479e3616fbda7124313',1,'Vec2T::operator-=()'],['../classVec3T.html#a8a580094450e167248f4ee089027fa40',1,'Vec3T::operator-=()']]], + ['operator_2f',['operator/',['../classVec2T.html#a3cc96a6930ed713df486d177490e1e5c',1,'Vec2T::operator/()'],['../classVec3T.html#acc5973c1c82e51c597b47ba39870f528',1,'Vec3T::operator/(const T &s) const noexcept'],['../classVec3T.html#a3c48111d27fb16cc3304e7aa2b4603fc',1,'Vec3T::operator/(const Vec3T< T > &v) const noexcept'],['../EBGeometry__Vec_8hpp.html#a519f71e021376fe40b7d2f6e451fba02',1,'operator/(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__Vec_8hpp.html#aeeeedd62e251ff33f2e37286e391a0f8',1,'operator/(const T &s, const Vec3T< T > &u) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a519f71e021376fe40b7d2f6e451fba02',1,'operator/(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a317d1a610a2d042d5b41f1fde72d8779',1,'operator/(const T &s, const Vec3T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp']]], + ['operator_2f_3d',['operator/=',['../classVec2T.html#a84e4a2ee2d84fbb42c84d0638ff929f8',1,'Vec2T::operator/=()'],['../classVec3T.html#a9446e83162d3daee6133d12b354a3a41',1,'Vec3T::operator/=()']]], + ['operator_3c',['operator<',['../classVec3T.html#aba830919c5020bb060f39fe9df6b7ca1',1,'Vec3T']]], + ['operator_3c_3d',['operator<=',['../classVec3T.html#a266a34a83b9f23a391151be45a4e39f8',1,'Vec3T']]], + ['operator_3d',['operator=',['../classVec2T.html#ab44f1c41a9a73757430403ea47e1ff33',1,'Vec2T::operator=()'],['../classVec3T.html#a34681a81b55b4e7ae818e01b5f27a3e0',1,'Vec3T::operator=()']]], + ['operator_3d_3d',['operator==',['../classVec3T.html#a715546682c26647643148a80087c4ab4',1,'Vec3T']]], + ['operator_3e',['operator>',['../classVec3T.html#af99810068907e4935ac38bc397ba1102',1,'Vec3T']]], + ['operator_3e_3d',['operator>=',['../classVec3T.html#a3296f8319642088e08bd2d3e253fcd64',1,'Vec3T']]], + ['operator_5b_5d',['operator[]',['../classVec3T.html#a098a19968b6c7b0b76c2572e5236a71a',1,'Vec3T::operator[](int i) noexcept'],['../classVec3T.html#ad09224c5f7e142059d75772c0cbd1990',1,'Vec3T::operator[](int i) const noexcept']]] +]; diff --git a/docs/doxygen/html/search/all_c.html b/docs/doxygen/html/search/all_c.html new file mode 100644 index 00000000..da08c387 --- /dev/null +++ b/docs/doxygen/html/search/all_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_c.js b/docs/doxygen/html/search/all_c.js new file mode 100644 index 00000000..593c7f81 --- /dev/null +++ b/docs/doxygen/html/search/all_c.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['partitioner',['Partitioner',['../classBVH_1_1NodeT.html#a3bb028655b8b961fa35109af1c14f281',1,'BVH::NodeT']]], + ['partitionert',['PartitionerT',['../namespaceBVH.html#a7c33d54da9893d506709b2ca96b76f55',1,'BVH']]], + ['ply',['PLY',['../classDcel_1_1Parser_1_1PLY.html',1,'Dcel::Parser']]], + ['polygon2d',['Polygon2D',['../classDcel_1_1Polygon2D.html',1,'Dcel::Polygon2D< T >'],['../classDcel_1_1Polygon2D.html#a241e98b67756178d5b8d028b6264a6c2',1,'Dcel::Polygon2D::Polygon2D()=delete'],['../classDcel_1_1Polygon2D.html#adcd7eb98f174260e21d0185deb44d628',1,'Dcel::Polygon2D::Polygon2D(const Vec3 &a_normal, const std::vector< Vec3 > &a_points)']]], + ['primitivelist',['PrimitiveList',['../classBVH_1_1NodeT.html#a19cce6e7fbe85eccb4a3718dd69f49b7',1,'BVH::NodeT::PrimitiveList()'],['../classBVH_1_1LinearBVH.html#a94ee5da1670e2ef85eeabf7cf6a2da92',1,'BVH::LinearBVH::PrimitiveList()'],['../namespaceDcel.html#a69f60bf0111d66715bf4f7a8e22645e6',1,'Dcel::PrimitiveList()']]], + ['primitivelistt',['PrimitiveListT',['../namespaceBVH.html#aa1e753bda451b85cd5b948722a2ad7c7',1,'BVH']]], + ['primitivesperleafnode',['primitivesPerLeafNode',['../namespaceDcel.html#a4db11eb50441e7c4e6c3ae796a202024',1,'Dcel']]], + ['printwarnings',['printWarnings',['../classDcel_1_1MeshT.html#a7115bea1b9d776a5f9c82a1e4fe852a0',1,'Dcel::MeshT']]], + ['projectpointintofaceplane',['projectPointIntoFacePlane',['../classDcel_1_1FaceT.html#af4116b8f72e0dfb797f79cd4f27a71e8',1,'Dcel::FaceT']]], + ['projectpointtoedge',['projectPointToEdge',['../classDcel_1_1EdgeT.html#ab937dca20cefcae4083b3cf873d83265',1,'Dcel::EdgeT']]], + ['prune',['Prune',['../namespaceBVH.html#a3ddb7b34ac1deb3baed2f32d9eacbe5b',1,'BVH']]], + ['pruneordered',['pruneOrdered',['../classBVH_1_1NodeT.html#a3aa6e9109897a573a46714278e0a79c6',1,'BVH::NodeT::pruneOrdered(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#ac4a3be457d66d2673f717f203e60fc08',1,'BVH::NodeT::pruneOrdered(T &a_closest, const Vec3 &a_point) const noexcept']]], + ['pruneordered2',['pruneOrdered2',['../classBVH_1_1NodeT.html#acb7fec40e06e97fcd42ec75169603e8b',1,'BVH::NodeT::pruneOrdered2(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#a2887ad51251739359602dde8db6a5998',1,'BVH::NodeT::pruneOrdered2(T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexcept'],['../classBVH_1_1LinearNodeT.html#a5479cd8a3503d16bb3f09273971df24a',1,'BVH::LinearNodeT::pruneOrdered2()']]], + ['pruneunordered',['pruneUnordered',['../classBVH_1_1NodeT.html#a27cfc030a9b7f9b0341e94dc6733b511',1,'BVH::NodeT::pruneUnordered(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#ad252aa451ca983750dfa0c24344253b2',1,'BVH::NodeT::pruneUnordered(T &a_closest, const Vec3 &a_point) const noexcept']]], + ['pruneunordered2',['pruneUnordered2',['../classBVH_1_1NodeT.html#aafa2f1f4f4f58296531723e9a6d7d13a',1,'BVH::NodeT::pruneUnordered2(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#a1079cba9ac1f114ad2cbc6cdea2eae49',1,'BVH::NodeT::pruneUnordered2(T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexcept']]] +]; diff --git a/docs/doxygen/html/search/all_d.html b/docs/doxygen/html/search/all_d.html new file mode 100644 index 00000000..9986c9cb --- /dev/null +++ b/docs/doxygen/html/search/all_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_d.js b/docs/doxygen/html/search/all_d.js new file mode 100644 index 00000000..879bbb3b --- /dev/null +++ b/docs/doxygen/html/search/all_d.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['readascii',['readASCII',['../classDcel_1_1Parser_1_1PLY.html#aaf13b770fe4d9cfc4e419af7418fc35c',1,'Dcel::Parser::PLY::readASCII(const std::string a_filename)'],['../classDcel_1_1Parser_1_1PLY.html#a280f083c1901248de1c69321783ad9d1',1,'Dcel::Parser::PLY::readASCII(Mesh &a_mesh, const std::string a_filename)']]], + ['readfacesascii',['readFacesASCII',['../classDcel_1_1Parser_1_1PLY.html#ae54284d1c7c18a584bd14678763a58e7',1,'Dcel::Parser::PLY']]], + ['readheaderascii',['readHeaderASCII',['../classDcel_1_1Parser_1_1PLY.html#aa8741e334f6c350e1269a42ee1022e57',1,'Dcel::Parser::PLY']]], + ['readverticesascii',['readVerticesASCII',['../classDcel_1_1Parser_1_1PLY.html#a755c28a17a836a05af31991a87212df0',1,'Dcel::Parser::PLY']]], + ['reconcile',['reconcile',['../classDcel_1_1EdgeT.html#ac4aaf294fd41c84ef2f7f54a8024e6dd',1,'Dcel::EdgeT::reconcile()'],['../classDcel_1_1FaceT.html#aaf3f8b92ca4393391ea213b0ecfe19bd',1,'Dcel::FaceT::reconcile()'],['../classDcel_1_1MeshT.html#a98d80b5f83b9d6ff55d0d0da34d0b422',1,'Dcel::MeshT::reconcile()']]], + ['reconcileedges',['reconcileEdges',['../classDcel_1_1MeshT.html#a33f6506c1daf9946d1f21117c0ab89d5',1,'Dcel::MeshT']]], + ['reconcilefaces',['reconcileFaces',['../classDcel_1_1MeshT.html#a5e31ae8b95c9ee725e205d8ae4fd35dc',1,'Dcel::MeshT']]], + ['reconcilepairedges',['reconcilePairEdges',['../classDcel_1_1Parser_1_1PLY.html#afaceb1664b12f30599fe68faba6ca725',1,'Dcel::Parser::PLY']]], + ['reconcilevertices',['reconcileVertices',['../classDcel_1_1MeshT.html#ad2b65aa214d51ecd438bc876e7255290',1,'Dcel::MeshT']]], + ['reset',['reset',['../classDcel_1_1EdgeIteratorT.html#ab1bc6f043869340ee1e1358e4289b8dd',1,'Dcel::EdgeIteratorT']]], + ['rotate',['rotate',['../classSignedDistanceFunction.html#ae8de697f4d0966290342bcf6383585ef',1,'SignedDistanceFunction']]], + ['rotateop',['RotateOp',['../classRotateOp.html',1,'RotateOp< T >'],['../classRotateOp.html#afac8d44cae4c9109c96d2c1ae47a1dc2',1,'RotateOp::RotateOp()'],['../classRotateOp.html#a018f0a465bfaf271958ac975eb24b5bb',1,'RotateOp::RotateOp(const T a_angle, const int a_axis) noexcept']]] +]; diff --git a/docs/doxygen/html/search/all_e.html b/docs/doxygen/html/search/all_e.html new file mode 100644 index 00000000..9fa42bba --- /dev/null +++ b/docs/doxygen/html/search/all_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_e.js b/docs/doxygen/html/search/all_e.js new file mode 100644 index 00000000..509b5bd5 --- /dev/null +++ b/docs/doxygen/html/search/all_e.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['sanitycheck',['sanityCheck',['../classDcel_1_1MeshT.html#a1814ba63c6e0d7a007ee78c24d6ea159',1,'Dcel::MeshT']]], + ['scale',['scale',['../classSignedDistanceFunction.html#a7855565ecca2d35de173161ecfbf19ae',1,'SignedDistanceFunction']]], + ['scaleop',['ScaleOp',['../classScaleOp.html',1,'ScaleOp< T >'],['../classScaleOp.html#aaa6d5841955e1b0a883bbcb5fdcbddc6',1,'ScaleOp::ScaleOp()'],['../classScaleOp.html#ab556ea0d0521a8a153e2406b1255014e',1,'ScaleOp::ScaleOp(const Vec3T< T > &a_scale)']]], + ['sdf',['SDF',['../classUnion.html#a9e9d1d95ae54fa471c6f29e778239021',1,'Union::SDF()'],['../classUnionBVH.html#a5d1d64d7cabf1000fc1a804d06e103cc',1,'UnionBVH::SDF()']]], + ['sdflist',['SDFList',['../classUnionBVH.html#ac23ace50239fbe00130df2a7e42af995',1,'UnionBVH']]], + ['searchalgorithm',['SearchAlgorithm',['../classDcel_1_1MeshT.html#abb4c3bb7a52804bb041c133f30151399',1,'Dcel::MeshT']]], + ['setboundingvolume',['setBoundingVolume',['../classBVH_1_1LinearNodeT.html#a03e3dd1c74bf9e66ed692130b49c2e0f',1,'BVH::LinearNodeT']]], + ['setchildoffset',['setChildOffset',['../classBVH_1_1LinearNodeT.html#a3a972ef5ea9abc6e2ead9f453e233e2f',1,'BVH::LinearNodeT']]], + ['setdepth',['setDepth',['../classBVH_1_1NodeT.html#abdff7fdbe3694e2aeb788261175077cc',1,'BVH::NodeT']]], + ['setedge',['setEdge',['../classDcel_1_1VertexT.html#a4ac13c49c61857ea7d0990212b43ca41',1,'Dcel::VertexT']]], + ['setface',['setFace',['../classDcel_1_1EdgeT.html#adb65dd99901ed730354b17c59e46e1fb',1,'Dcel::EdgeT']]], + ['sethalfedge',['setHalfEdge',['../classDcel_1_1FaceT.html#a2680477d0a6c8b2187230170522fe3a5',1,'Dcel::FaceT']]], + ['setinsideoutsidealgorithm',['setInsideOutsideAlgorithm',['../classDcel_1_1FaceT.html#a12b6dc8412276137532a63c292e4b6fe',1,'Dcel::FaceT::setInsideOutsideAlgorithm()'],['../classDcel_1_1MeshT.html#a1e46a744a2526e451229e2f2e4830ca5',1,'Dcel::MeshT::setInsideOutsideAlgorithm()']]], + ['setnextedge',['setNextEdge',['../classDcel_1_1EdgeT.html#aeeda5324a62f1d8b6e50d788907526bf',1,'Dcel::EdgeT']]], + ['setnodetype',['setNodeType',['../classBVH_1_1NodeT.html#a964bd054b57fce2fec50505a65f6bacd',1,'BVH::NodeT']]], + ['setnormal',['setNormal',['../classDcel_1_1VertexT.html#a3bffe6c4f0d0766cdd7a4bb3a6050cb4',1,'Dcel::VertexT']]], + ['setnumprimitives',['setNumPrimitives',['../classBVH_1_1LinearNodeT.html#a1a91e5f540da1b1bb85224db94cd53d8',1,'BVH::LinearNodeT']]], + ['setpairedge',['setPairEdge',['../classDcel_1_1EdgeT.html#ab9ef2366cf1d411444caf81d5159a3e1',1,'Dcel::EdgeT']]], + ['setparent',['setParent',['../classBVH_1_1NodeT.html#a92db0ab2d61c76469600478fddd04edc',1,'BVH::NodeT']]], + ['setposition',['setPosition',['../classDcel_1_1VertexT.html#a9c7d9a23275e5e3165eb8c6018b55a7e',1,'Dcel::VertexT']]], + ['setpreviousedge',['setPreviousEdge',['../classDcel_1_1EdgeT.html#af5aa7f27fe95ba4331259b4de927bb37',1,'Dcel::EdgeT']]], + ['setprimitives',['setPrimitives',['../classBVH_1_1NodeT.html#a2c9c3d3a83b3c1895c8f89b2bbd62e81',1,'BVH::NodeT']]], + ['setprimitivesoffset',['setPrimitivesOffset',['../classBVH_1_1LinearNodeT.html#ace68df1290bd44623c694e6b7ebdec6e',1,'BVH::LinearNodeT']]], + ['setsearchalgorithm',['setSearchAlgorithm',['../classDcel_1_1MeshT.html#abc7a2bd7632be06c0ad9cf49816d262f',1,'Dcel::MeshT']]], + ['settoregularnode',['setToRegularNode',['../classBVH_1_1NodeT.html#a8f9c409918d61b0d0ad3dd6e2b692443',1,'BVH::NodeT']]], + ['setvertex',['setVertex',['../classDcel_1_1EdgeT.html#a2611a8e0ae581ab8822f677d6d69edbd',1,'Dcel::EdgeT']]], + ['signeddistance',['signedDistance',['../classSphereSDF.html#a9b0c5f0b1af2c4b62bee1c873e0158e8',1,'SphereSDF::signedDistance()'],['../classBVH_1_1NodeT.html#aef7148b18296dce60853b5966c9f1e0d',1,'BVH::NodeT::signedDistance()'],['../classBVH_1_1LinearBVH.html#a383c6289251cf75ad9c4ed11cfb832ab',1,'BVH::LinearBVH::signedDistance()'],['../classDcel_1_1EdgeT.html#adba2d72aed5f510997d06c2bc9e6e96c',1,'Dcel::EdgeT::signedDistance()'],['../classDcel_1_1FaceT.html#a8ac718b0c9af797d34efcda43f38b6c0',1,'Dcel::FaceT::signedDistance()'],['../classDcel_1_1MeshT.html#aa6f614aa0d93c3345c10150168347497',1,'Dcel::MeshT::signedDistance(const Vec3 &a_x0) const noexcept'],['../classDcel_1_1MeshT.html#a4fa40378fbd4c31cd50e77da70ef30fd',1,'Dcel::MeshT::signedDistance(const Vec3 &a_x0, SearchAlgorithm a_algorithm) const noexcept'],['../classDcel_1_1VertexT.html#afce7ba8e2bbf81b158b43af2576c4dda',1,'Dcel::VertexT::signedDistance()'],['../classSignedDistanceFunction.html#af5912280ca51dc21a2d6949a30ec7d21',1,'SignedDistanceFunction::signedDistance()'],['../classUnion.html#a08beffd354ca261e3d31bcb453951810',1,'Union::signedDistance()'],['../classUnionBVH.html#a9681fdc161e2e077a33caaddb78fb4ba',1,'UnionBVH::signedDistance()']]], + ['signeddistancefunction',['SignedDistanceFunction',['../classSignedDistanceFunction.html',1,'SignedDistanceFunction< T >'],['../classSignedDistanceFunction.html#abfeeff9b3901e03ec6b73317dc9a722e',1,'SignedDistanceFunction::SignedDistanceFunction()']]], + ['spatialsplitbinarypartitioner',['spatialSplitBinaryPartitioner',['../namespaceDcel.html#a08217ffcd4cfc6f58a3b0b3f780fc611',1,'Dcel']]], + ['spatialsplitpartitioner',['spatialSplitPartitioner',['../namespaceDcel.html#ab4f869248e23d47bb01ad06c76288fef',1,'Dcel']]], + ['spheresdf',['SphereSDF',['../classSphereSDF.html',1,'SphereSDF< T >'],['../classSphereSDF.html#a87b40869b91424d85692216a3268289b',1,'SphereSDF::SphereSDF()'],['../classSphereSDF.html#a3e555062b1b20c1729a9f4ab6136add4',1,'SphereSDF::SphereSDF(const Vec3T< T > &a_center, const T &a_radius, const bool a_flipInside)'],['../classSphereSDF.html#a2c25f14a19fcb910cd4d48af7123185a',1,'SphereSDF::SphereSDF(const SphereSDF &a_other)']]], + ['stopfunction',['StopFunction',['../classBVH_1_1NodeT.html#acbe56195affc439febe8aca84db308e3',1,'BVH::NodeT']]], + ['stopfunctiont',['StopFunctionT',['../namespaceBVH.html#afef1c5979c34a11d23b756cc09654bf9',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/all_f.html b/docs/doxygen/html/search/all_f.html new file mode 100644 index 00000000..6ecfc0ed --- /dev/null +++ b/docs/doxygen/html/search/all_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/all_f.js b/docs/doxygen/html/search/all_f.js new file mode 100644 index 00000000..11d85fcd --- /dev/null +++ b/docs/doxygen/html/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['todo_20list',['Todo List',['../todo.html',1,'']]], + ['topdownsortandpartitionprimitives',['topDownSortAndPartitionPrimitives',['../classBVH_1_1NodeT.html#acae5a575fa8b236de984fdd41e04c038',1,'BVH::NodeT']]], + ['transform',['transform',['../classTransformOp.html#a61c1920daa9f55fd2ea9095cbcfa18b8',1,'TransformOp::transform()'],['../classTranslateOp.html#a16941d9e52b02d39f9c92f6b23f61af6',1,'TranslateOp::transform()'],['../classScaleOp.html#ac09e64516daa1b75111bd36dedfeeda9',1,'ScaleOp::transform()'],['../classRotateOp.html#aaffc25806ef6b9d7ea6651aa2bb9767c',1,'RotateOp::transform()']]], + ['transformop',['TransformOp',['../classTransformOp.html',1,'TransformOp< T >'],['../classTransformOp.html#ab904cbdd373ca07e08b254163331b3b4',1,'TransformOp::TransformOp()']]], + ['transformpoint',['transformPoint',['../classSignedDistanceFunction.html#af186f98f9ea4ac96fccb4add4ebf196d',1,'SignedDistanceFunction']]], + ['translate',['translate',['../classSignedDistanceFunction.html#add71ebc2e7f3fb5e85766898413482e7',1,'SignedDistanceFunction']]], + ['translateop',['TranslateOp',['../classTranslateOp.html',1,'TranslateOp< T >'],['../classTranslateOp.html#ab20f5a272d6cd34bf98fc23523913fc9',1,'TranslateOp::TranslateOp()'],['../classTranslateOp.html#ac646a47f26119d8316533c91f3043864',1,'TranslateOp::TranslateOp(const Vec3T< T > &a_translation)']]] +]; diff --git a/docs/doxygen/html/search/classes_0.html b/docs/doxygen/html/search/classes_0.html new file mode 100644 index 00000000..1c3e406a --- /dev/null +++ b/docs/doxygen/html/search/classes_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_0.js b/docs/doxygen/html/search/classes_0.js new file mode 100644 index 00000000..7ca32fd9 --- /dev/null +++ b/docs/doxygen/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['aabbt',['AABBT',['../classBoundingVolumes_1_1AABBT.html',1,'BoundingVolumes']]] +]; diff --git a/docs/doxygen/html/search/classes_1.html b/docs/doxygen/html/search/classes_1.html new file mode 100644 index 00000000..a8e70695 --- /dev/null +++ b/docs/doxygen/html/search/classes_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_1.js b/docs/doxygen/html/search/classes_1.js new file mode 100644 index 00000000..bdbe1ce6 --- /dev/null +++ b/docs/doxygen/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['boundingspheret',['BoundingSphereT',['../classBoundingVolumes_1_1BoundingSphereT.html',1,'BoundingVolumes']]] +]; diff --git a/docs/doxygen/html/search/classes_2.html b/docs/doxygen/html/search/classes_2.html new file mode 100644 index 00000000..5c09c969 --- /dev/null +++ b/docs/doxygen/html/search/classes_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_2.js b/docs/doxygen/html/search/classes_2.js new file mode 100644 index 00000000..d2a0b3be --- /dev/null +++ b/docs/doxygen/html/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['edgeiteratort',['EdgeIteratorT',['../classDcel_1_1EdgeIteratorT.html',1,'Dcel']]], + ['edget',['EdgeT',['../classDcel_1_1EdgeT.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/classes_3.html b/docs/doxygen/html/search/classes_3.html new file mode 100644 index 00000000..5faaeba8 --- /dev/null +++ b/docs/doxygen/html/search/classes_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_3.js b/docs/doxygen/html/search/classes_3.js new file mode 100644 index 00000000..1132aacc --- /dev/null +++ b/docs/doxygen/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['facet',['FaceT',['../classDcel_1_1FaceT.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/classes_4.html b/docs/doxygen/html/search/classes_4.html new file mode 100644 index 00000000..b3f11bc7 --- /dev/null +++ b/docs/doxygen/html/search/classes_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_4.js b/docs/doxygen/html/search/classes_4.js new file mode 100644 index 00000000..cf957b19 --- /dev/null +++ b/docs/doxygen/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['linearbvh',['LinearBVH',['../classBVH_1_1LinearBVH.html',1,'BVH']]], + ['linearnodet',['LinearNodeT',['../classBVH_1_1LinearNodeT.html',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/classes_5.html b/docs/doxygen/html/search/classes_5.html new file mode 100644 index 00000000..952ace6f --- /dev/null +++ b/docs/doxygen/html/search/classes_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_5.js b/docs/doxygen/html/search/classes_5.js new file mode 100644 index 00000000..bf7af1d2 --- /dev/null +++ b/docs/doxygen/html/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mesht',['MeshT',['../classDcel_1_1MeshT.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/classes_6.html b/docs/doxygen/html/search/classes_6.html new file mode 100644 index 00000000..75eef9f4 --- /dev/null +++ b/docs/doxygen/html/search/classes_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_6.js b/docs/doxygen/html/search/classes_6.js new file mode 100644 index 00000000..3b8bd80d --- /dev/null +++ b/docs/doxygen/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nodet',['NodeT',['../classBVH_1_1NodeT.html',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/classes_7.html b/docs/doxygen/html/search/classes_7.html new file mode 100644 index 00000000..745f5f28 --- /dev/null +++ b/docs/doxygen/html/search/classes_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_7.js b/docs/doxygen/html/search/classes_7.js new file mode 100644 index 00000000..92a7cca3 --- /dev/null +++ b/docs/doxygen/html/search/classes_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ply',['PLY',['../classDcel_1_1Parser_1_1PLY.html',1,'Dcel::Parser']]], + ['polygon2d',['Polygon2D',['../classDcel_1_1Polygon2D.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/classes_8.html b/docs/doxygen/html/search/classes_8.html new file mode 100644 index 00000000..5a443d9d --- /dev/null +++ b/docs/doxygen/html/search/classes_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_8.js b/docs/doxygen/html/search/classes_8.js new file mode 100644 index 00000000..0e6ea017 --- /dev/null +++ b/docs/doxygen/html/search/classes_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['rotateop',['RotateOp',['../classRotateOp.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/classes_9.html b/docs/doxygen/html/search/classes_9.html new file mode 100644 index 00000000..9cb55be4 --- /dev/null +++ b/docs/doxygen/html/search/classes_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_9.js b/docs/doxygen/html/search/classes_9.js new file mode 100644 index 00000000..79b28e87 --- /dev/null +++ b/docs/doxygen/html/search/classes_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['scaleop',['ScaleOp',['../classScaleOp.html',1,'']]], + ['signeddistancefunction',['SignedDistanceFunction',['../classSignedDistanceFunction.html',1,'']]], + ['spheresdf',['SphereSDF',['../classSphereSDF.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/classes_a.html b/docs/doxygen/html/search/classes_a.html new file mode 100644 index 00000000..54940d78 --- /dev/null +++ b/docs/doxygen/html/search/classes_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_a.js b/docs/doxygen/html/search/classes_a.js new file mode 100644 index 00000000..9a8d096b --- /dev/null +++ b/docs/doxygen/html/search/classes_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['transformop',['TransformOp',['../classTransformOp.html',1,'']]], + ['translateop',['TranslateOp',['../classTranslateOp.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/classes_b.html b/docs/doxygen/html/search/classes_b.html new file mode 100644 index 00000000..6071ae04 --- /dev/null +++ b/docs/doxygen/html/search/classes_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_b.js b/docs/doxygen/html/search/classes_b.js new file mode 100644 index 00000000..a42f7510 --- /dev/null +++ b/docs/doxygen/html/search/classes_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['union',['Union',['../classUnion.html',1,'']]], + ['unionbvh',['UnionBVH',['../classUnionBVH.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/classes_c.html b/docs/doxygen/html/search/classes_c.html new file mode 100644 index 00000000..6cf1d008 --- /dev/null +++ b/docs/doxygen/html/search/classes_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/classes_c.js b/docs/doxygen/html/search/classes_c.js new file mode 100644 index 00000000..ed3bfa97 --- /dev/null +++ b/docs/doxygen/html/search/classes_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['vec2t',['Vec2T',['../classVec2T.html',1,'']]], + ['vec3t',['Vec3T',['../classVec3T.html',1,'']]], + ['vertext',['VertexT',['../classDcel_1_1VertexT.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/close.png b/docs/doxygen/html/search/close.png new file mode 100644 index 00000000..9342d3df Binary files /dev/null and b/docs/doxygen/html/search/close.png differ diff --git a/docs/doxygen/html/search/enums_0.html b/docs/doxygen/html/search/enums_0.html new file mode 100644 index 00000000..ee343ac0 --- /dev/null +++ b/docs/doxygen/html/search/enums_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/enums_0.js b/docs/doxygen/html/search/enums_0.js new file mode 100644 index 00000000..5c4d2bc5 --- /dev/null +++ b/docs/doxygen/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['boundingvolumealgorithm',['BoundingVolumeAlgorithm',['../classBoundingVolumes_1_1BoundingSphereT.html#ae98cd00c8e45c93a0fc4fbabec63b007',1,'BoundingVolumes::BoundingSphereT']]] +]; diff --git a/docs/doxygen/html/search/enums_1.html b/docs/doxygen/html/search/enums_1.html new file mode 100644 index 00000000..3fd210a0 --- /dev/null +++ b/docs/doxygen/html/search/enums_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/enums_1.js b/docs/doxygen/html/search/enums_1.js new file mode 100644 index 00000000..67a750d0 --- /dev/null +++ b/docs/doxygen/html/search/enums_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['insideoutsidealgorithm',['InsideOutsideAlgorithm',['../classDcel_1_1Polygon2D.html#a1ec8170036eb8dd1cedbe1b4d31024b4',1,'Dcel::Polygon2D']]], + ['iterationmode',['IterationMode',['../classDcel_1_1EdgeIteratorT.html#ad6b36e4ef39214ccd75966a6ecd82682',1,'Dcel::EdgeIteratorT']]] +]; diff --git a/docs/doxygen/html/search/enums_2.html b/docs/doxygen/html/search/enums_2.html new file mode 100644 index 00000000..a042e520 --- /dev/null +++ b/docs/doxygen/html/search/enums_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/enums_2.js b/docs/doxygen/html/search/enums_2.js new file mode 100644 index 00000000..67332a38 --- /dev/null +++ b/docs/doxygen/html/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nodetype',['NodeType',['../namespaceBVH.html#a7613f83a60cfae9aba31861110bd9e54',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/enums_3.html b/docs/doxygen/html/search/enums_3.html new file mode 100644 index 00000000..265e0cb9 --- /dev/null +++ b/docs/doxygen/html/search/enums_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/enums_3.js b/docs/doxygen/html/search/enums_3.js new file mode 100644 index 00000000..333bc853 --- /dev/null +++ b/docs/doxygen/html/search/enums_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['prune',['Prune',['../namespaceBVH.html#a3ddb7b34ac1deb3baed2f32d9eacbe5b',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/enums_4.html b/docs/doxygen/html/search/enums_4.html new file mode 100644 index 00000000..97ee07fb --- /dev/null +++ b/docs/doxygen/html/search/enums_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/enums_4.js b/docs/doxygen/html/search/enums_4.js new file mode 100644 index 00000000..8ddb3fd4 --- /dev/null +++ b/docs/doxygen/html/search/enums_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['searchalgorithm',['SearchAlgorithm',['../classDcel_1_1MeshT.html#abb4c3bb7a52804bb041c133f30151399',1,'Dcel::MeshT']]] +]; diff --git a/docs/doxygen/html/search/enums_5.html b/docs/doxygen/html/search/enums_5.html new file mode 100644 index 00000000..f837d25f --- /dev/null +++ b/docs/doxygen/html/search/enums_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/enums_5.js b/docs/doxygen/html/search/enums_5.js new file mode 100644 index 00000000..7f5c214e --- /dev/null +++ b/docs/doxygen/html/search/enums_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vertexnormalweight',['VertexNormalWeight',['../classDcel_1_1MeshT.html#a0cd3a02853cf4fcc34a0816368ed4dc0',1,'Dcel::MeshT']]] +]; diff --git a/docs/doxygen/html/search/files_0.html b/docs/doxygen/html/search/files_0.html new file mode 100644 index 00000000..4f272b83 --- /dev/null +++ b/docs/doxygen/html/search/files_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/files_0.js b/docs/doxygen/html/search/files_0.js new file mode 100644 index 00000000..2381b3fe --- /dev/null +++ b/docs/doxygen/html/search/files_0.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['ebgeometry_5fanalyticdistancefunctions_2ehpp',['EBGeometry_AnalyticDistanceFunctions.hpp',['../EBGeometry__AnalyticDistanceFunctions_8hpp.html',1,'']]], + ['ebgeometry_5fboundingvolumes_2ehpp',['EBGeometry_BoundingVolumes.hpp',['../EBGeometry__BoundingVolumes_8hpp.html',1,'']]], + ['ebgeometry_5fboundingvolumesimplem_2ehpp',['EBGeometry_BoundingVolumesImplem.hpp',['../EBGeometry__BoundingVolumesImplem_8hpp.html',1,'']]], + ['ebgeometry_5fbvh_2ehpp',['EBGeometry_BVH.hpp',['../EBGeometry__BVH_8hpp.html',1,'']]], + ['ebgeometry_5fbvhimplem_2ehpp',['EBGeometry_BVHImplem.hpp',['../EBGeometry__BVHImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcel_2ehpp',['EBGeometry_Dcel.hpp',['../EBGeometry__Dcel_8hpp.html',1,'']]], + ['ebgeometry_5fdcelbvh_2ehpp',['EBGeometry_DcelBVH.hpp',['../EBGeometry__DcelBVH_8hpp.html',1,'']]], + ['ebgeometry_5fdceledge_2ehpp',['EBGeometry_DcelEdge.hpp',['../EBGeometry__DcelEdge_8hpp.html',1,'']]], + ['ebgeometry_5fdceledgeimplem_2ehpp',['EBGeometry_DcelEdgeImplem.hpp',['../EBGeometry__DcelEdgeImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelface_2ehpp',['EBGeometry_DcelFace.hpp',['../EBGeometry__DcelFace_8hpp.html',1,'']]], + ['ebgeometry_5fdcelfaceimplem_2ehpp',['EBGeometry_DcelFaceImplem.hpp',['../EBGeometry__DcelFaceImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdceliterator_2ehpp',['EBGeometry_DcelIterator.hpp',['../EBGeometry__DcelIterator_8hpp.html',1,'']]], + ['ebgeometry_5fdceliteratorimplem_2ehpp',['EBGeometry_DcelIteratorImplem.hpp',['../EBGeometry__DcelIteratorImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelmesh_2ehpp',['EBGeometry_DcelMesh.hpp',['../EBGeometry__DcelMesh_8hpp.html',1,'']]], + ['ebgeometry_5fdcelmeshimplem_2ehpp',['EBGeometry_DcelMeshImplem.hpp',['../EBGeometry__DcelMeshImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelparser_2ehpp',['EBGeometry_DcelParser.hpp',['../EBGeometry__DcelParser_8hpp.html',1,'']]], + ['ebgeometry_5fdcelparserimplem_2ehpp',['EBGeometry_DcelParserImplem.hpp',['../EBGeometry__DcelParserImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelpolygon2d_2ehpp',['EBGeometry_DcelPolygon2D.hpp',['../EBGeometry__DcelPolygon2D_8hpp.html',1,'']]], + ['ebgeometry_5fdcelpolygon2dimplem_2ehpp',['EBGeometry_DcelPolygon2DImplem.hpp',['../EBGeometry__DcelPolygon2DImplem_8hpp.html',1,'']]], + ['ebgeometry_5fdcelvertex_2ehpp',['EBGeometry_DcelVertex.hpp',['../EBGeometry__DcelVertex_8hpp.html',1,'']]], + ['ebgeometry_5fdcelverteximplem_2ehpp',['EBGeometry_DcelVertexImplem.hpp',['../EBGeometry__DcelVertexImplem_8hpp.html',1,'']]], + ['ebgeometry_5fnamespacefooter_2ehpp',['EBGeometry_NamespaceFooter.hpp',['../EBGeometry__NamespaceFooter_8hpp.html',1,'']]], + ['ebgeometry_5fnamespaceheader_2ehpp',['EBGeometry_NamespaceHeader.hpp',['../EBGeometry__NamespaceHeader_8hpp.html',1,'']]], + ['ebgeometry_5fsigneddistancefunction_2ehpp',['EBGeometry_SignedDistanceFunction.hpp',['../EBGeometry__SignedDistanceFunction_8hpp.html',1,'']]], + ['ebgeometry_5fsigneddistancefunctionimplem_2ehpp',['EBGeometry_SignedDistanceFunctionImplem.hpp',['../EBGeometry__SignedDistanceFunctionImplem_8hpp.html',1,'']]], + ['ebgeometry_5ftransformops_2ehpp',['EBGeometry_TransformOps.hpp',['../EBGeometry__TransformOps_8hpp.html',1,'']]], + ['ebgeometry_5ftransformopsimplem_2ehpp',['EBGeometry_TransformOpsImplem.hpp',['../EBGeometry__TransformOpsImplem_8hpp.html',1,'']]], + ['ebgeometry_5funion_2ehpp',['EBGeometry_Union.hpp',['../EBGeometry__Union_8hpp.html',1,'']]], + ['ebgeometry_5funionbvh_2ehpp',['EBGeometry_UnionBVH.hpp',['../EBGeometry__UnionBVH_8hpp.html',1,'']]], + ['ebgeometry_5funionbvhimplem_2ehpp',['EBGeometry_UnionBVHImplem.hpp',['../EBGeometry__UnionBVHImplem_8hpp.html',1,'']]], + ['ebgeometry_5funionimplem_2ehpp',['EBGeometry_UnionImplem.hpp',['../EBGeometry__UnionImplem_8hpp.html',1,'']]], + ['ebgeometry_5fvec_2ehpp',['EBGeometry_Vec.hpp',['../EBGeometry__Vec_8hpp.html',1,'']]], + ['ebgeometry_5fvecimplem_2ehpp',['EBGeometry_VecImplem.hpp',['../EBGeometry__VecImplem_8hpp.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/functions_0.html b/docs/doxygen/html/search/functions_0.html new file mode 100644 index 00000000..4e6d87d1 --- /dev/null +++ b/docs/doxygen/html/search/functions_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_0.js b/docs/doxygen/html/search/functions_0.js new file mode 100644 index 00000000..70958a3c --- /dev/null +++ b/docs/doxygen/html/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['aabbt',['AABBT',['../classBoundingVolumes_1_1AABBT.html#a180558daace1d1fb990f9e197eaec02d',1,'BoundingVolumes::AABBT::AABBT()'],['../classBoundingVolumes_1_1AABBT.html#a28d34a1b4467d329bd50e3561b1e705a',1,'BoundingVolumes::AABBT::AABBT(const Vec3T< T > &a_lo, const Vec3T< T > &a_hi)'],['../classBoundingVolumes_1_1AABBT.html#af69dd29c29d40b1f550118cde9479f15',1,'BoundingVolumes::AABBT::AABBT(const AABBT &a_other)'],['../classBoundingVolumes_1_1AABBT.html#a08ddef449ffd740163b584c8ccd6f395',1,'BoundingVolumes::AABBT::AABBT(const std::vector< AABBT< T > > &a_others)'],['../classBoundingVolumes_1_1AABBT.html#ab58be0cf4a32b502fdd1aedb7ba11587',1,'BoundingVolumes::AABBT::AABBT(const std::vector< Vec3T< P > > &a_points)']]], + ['addface',['addFace',['../classDcel_1_1VertexT.html#a032c39370f08bbc27f3da35ee0873409',1,'Dcel::VertexT']]] +]; diff --git a/docs/doxygen/html/search/functions_1.html b/docs/doxygen/html/search/functions_1.html new file mode 100644 index 00000000..b343e2db --- /dev/null +++ b/docs/doxygen/html/search/functions_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_1.js b/docs/doxygen/html/search/functions_1.js new file mode 100644 index 00000000..c174215e --- /dev/null +++ b/docs/doxygen/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['boundingspheret',['BoundingSphereT',['../classBoundingVolumes_1_1BoundingSphereT.html#a5616a743d8b53b11533ef47b3da281aa',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT()'],['../classBoundingVolumes_1_1BoundingSphereT.html#a9e81ed0ce76489225f5dbd57ed1abc8f',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const Vec3T< T > &a_center, const T &a_radius)'],['../classBoundingVolumes_1_1BoundingSphereT.html#af9cd8b7e77ed36178073be298efd27f0',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const std::vector< BoundingSphereT< T > > &a_otherSpheres)'],['../classBoundingVolumes_1_1BoundingSphereT.html#afd5a1632d9ceef8a4fa3af59e562c7f8',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const BoundingSphereT &a_other)'],['../classBoundingVolumes_1_1BoundingSphereT.html#a88655edd39b6276b9bb58eb9bd6af82d',1,'BoundingVolumes::BoundingSphereT::BoundingSphereT(const std::vector< Vec3T< P > > &a_points, const BoundingVolumeAlgorithm &a_alg=BoundingVolumeAlgorithm::Ritter)']]], + ['buildritter',['buildRitter',['../classBoundingVolumes_1_1BoundingSphereT.html#abea0326be2d1843f3ad7c6de1ebe2418',1,'BoundingVolumes::BoundingSphereT']]], + ['buildtree',['buildTree',['../classUnionBVH.html#a97769f4c449610b681a70b93c99a40ca',1,'UnionBVH']]] +]; diff --git a/docs/doxygen/html/search/functions_10.html b/docs/doxygen/html/search/functions_10.html new file mode 100644 index 00000000..72bc1ea1 --- /dev/null +++ b/docs/doxygen/html/search/functions_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_10.js b/docs/doxygen/html/search/functions_10.js new file mode 100644 index 00000000..978d96da --- /dev/null +++ b/docs/doxygen/html/search/functions_10.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['union',['Union',['../classUnion.html#a2dea7d7ed6d5456f87feff0e02c99453',1,'Union::Union()=delete'],['../classUnion.html#a7f1a9e850f8965dc35e221b23a55e451',1,'Union::Union(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)']]], + ['unionbvh',['UnionBVH',['../classUnionBVH.html#aa2d9a2e95e58a0d7dfb2b92283626cac',1,'UnionBVH::UnionBVH()=delete'],['../classUnionBVH.html#a6a0a50fcddc59dbb1c9b9444b0fce117',1,'UnionBVH::UnionBVH(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign)'],['../classUnionBVH.html#a9eb2c19a0fdc645e068c09398d3dd0f3',1,'UnionBVH::UnionBVH(const std::vector< std::shared_ptr< SDF > > &a_distanceFunctions, const bool a_flipSign, const BVConstructor &a_bvConstructor)']]], + ['unsigneddistance2',['unsignedDistance2',['../classDcel_1_1EdgeT.html#a50345997f00af679875fda510b3e0607',1,'Dcel::EdgeT::unsignedDistance2()'],['../classDcel_1_1FaceT.html#a2915506b12c361eb4a25cba80638cb7d',1,'Dcel::FaceT::unsignedDistance2()'],['../classDcel_1_1VertexT.html#a552b7d88dfe80c76561b5a002ddc176b',1,'Dcel::VertexT::unsignedDistance2()'],['../classSignedDistanceFunction.html#a2a3e72186725a4e931db0f8d4895bcb8',1,'SignedDistanceFunction::unsignedDistance2()']]] +]; diff --git a/docs/doxygen/html/search/functions_11.html b/docs/doxygen/html/search/functions_11.html new file mode 100644 index 00000000..6948a615 --- /dev/null +++ b/docs/doxygen/html/search/functions_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_11.js b/docs/doxygen/html/search/functions_11.js new file mode 100644 index 00000000..171286e4 --- /dev/null +++ b/docs/doxygen/html/search/functions_11.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['vec2t',['Vec2T',['../classVec2T.html#a4aa6e0bd3922abd84449278429a03418',1,'Vec2T::Vec2T()'],['../classVec2T.html#a15e8a7710ad0a1de03a34660ae54e96e',1,'Vec2T::Vec2T(const Vec2T &u)'],['../classVec2T.html#a0721d6450bab8361f76ee63826f9e8f4',1,'Vec2T::Vec2T(const T &a_x, const T &a_y)']]], + ['vec3t',['Vec3T',['../classVec3T.html#a919b1cabc678f8d71763e03fab500334',1,'Vec3T::Vec3T()'],['../classVec3T.html#ab328767434f527b25c110dc83a0cb7ee',1,'Vec3T::Vec3T(const Vec3T< T > &a_u)'],['../classVec3T.html#acc3573bc8c3232eb14a22ca833cbce30',1,'Vec3T::Vec3T(const T &a_x, const T &a_y, const T &a_z)']]], + ['vertext',['VertexT',['../classDcel_1_1VertexT.html#ab93f0a7a59fa9d78d89d1b0e97451ce7',1,'Dcel::VertexT::VertexT()'],['../classDcel_1_1VertexT.html#ade01d01c6a145c31c6f46dccc902cfae',1,'Dcel::VertexT::VertexT(const Vec3 &a_position)'],['../classDcel_1_1VertexT.html#a90d3c97e605b8084667a85ddfb4ba8bc',1,'Dcel::VertexT::VertexT(const Vec3 &a_position, const Vec3 &a_normal)'],['../classDcel_1_1VertexT.html#ac904e9902633915706d81122e72aa847',1,'Dcel::VertexT::VertexT(const Vertex &a_otherVertex)']]] +]; diff --git a/docs/doxygen/html/search/functions_12.html b/docs/doxygen/html/search/functions_12.html new file mode 100644 index 00000000..3df84892 --- /dev/null +++ b/docs/doxygen/html/search/functions_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_12.js b/docs/doxygen/html/search/functions_12.js new file mode 100644 index 00000000..8a59d13a --- /dev/null +++ b/docs/doxygen/html/search/functions_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['zero',['zero',['../classVec2T.html#a3c243787a7817ce09946691cdf14d0e0',1,'Vec2T::zero()'],['../classVec3T.html#af438ba5c8990b07e566bf7e48dcbcfb2',1,'Vec3T::zero()']]] +]; diff --git a/docs/doxygen/html/search/functions_13.html b/docs/doxygen/html/search/functions_13.html new file mode 100644 index 00000000..febf8e03 --- /dev/null +++ b/docs/doxygen/html/search/functions_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_13.js b/docs/doxygen/html/search/functions_13.js new file mode 100644 index 00000000..12468fb6 --- /dev/null +++ b/docs/doxygen/html/search/functions_13.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['_7eaabbt',['~AABBT',['../classBoundingVolumes_1_1AABBT.html#af0a2f67ce6f85f947849d199e6dee1aa',1,'BoundingVolumes::AABBT']]], + ['_7eboundingspheret',['~BoundingSphereT',['../classBoundingVolumes_1_1BoundingSphereT.html#a4495da5774e14f97c0e7579b37cfd60e',1,'BoundingVolumes::BoundingSphereT']]], + ['_7eedget',['~EdgeT',['../classDcel_1_1EdgeT.html#a94083c72ec137f822fcb08fb600ddd87',1,'Dcel::EdgeT']]], + ['_7efacet',['~FaceT',['../classDcel_1_1FaceT.html#a56988526e98a2626c644117e9298fd4b',1,'Dcel::FaceT']]], + ['_7elinearbvh',['~LinearBVH',['../classBVH_1_1LinearBVH.html#a39a98014b81061b35604422cfab5c9b7',1,'BVH::LinearBVH']]], + ['_7elinearnodet',['~LinearNodeT',['../classBVH_1_1LinearNodeT.html#a4b5dd392397794113ad3b5bb2ed5003a',1,'BVH::LinearNodeT']]], + ['_7emesht',['~MeshT',['../classDcel_1_1MeshT.html#a51da8ad54b3cfe69a695221f73bd97b2',1,'Dcel::MeshT']]], + ['_7enodet',['~NodeT',['../classBVH_1_1NodeT.html#a5bc328f2381b6babe37496758ea4b583',1,'BVH::NodeT']]], + ['_7epolygon2d',['~Polygon2D',['../classDcel_1_1Polygon2D.html#a0c605c847f830faf8a9f4fbc7a5c5a12',1,'Dcel::Polygon2D']]], + ['_7erotateop',['~RotateOp',['../classRotateOp.html#aaa12091fe7937f5ed7e2d35e0632337b',1,'RotateOp']]], + ['_7escaleop',['~ScaleOp',['../classScaleOp.html#ab9fc71d00d7e0e339562edcaa2e3fc9a',1,'ScaleOp']]], + ['_7esigneddistancefunction',['~SignedDistanceFunction',['../classSignedDistanceFunction.html#ab47b289bd8351d7f323938c91b2bb92b',1,'SignedDistanceFunction']]], + ['_7espheresdf',['~SphereSDF',['../classSphereSDF.html#ab5980286d17bb9da7425b4d9d4045850',1,'SphereSDF']]], + ['_7etransformop',['~TransformOp',['../classTransformOp.html#a556cc7f5bbe70ce148a0791b883eb58c',1,'TransformOp']]], + ['_7etranslateop',['~TranslateOp',['../classTranslateOp.html#ad96b4ec0f30fb98dbd684afef1bfff03',1,'TranslateOp']]], + ['_7eunion',['~Union',['../classUnion.html#a5c4f15da1b35f6f6643d49ed18faa386',1,'Union']]], + ['_7eunionbvh',['~UnionBVH',['../classUnionBVH.html#aac0a1f16ad0a273e72c8bcd15b80f336',1,'UnionBVH']]], + ['_7evec2t',['~Vec2T',['../classVec2T.html#a15a9bac13b94b58f0907443bc551dbee',1,'Vec2T']]], + ['_7evec3t',['~Vec3T',['../classVec3T.html#a505fc5de8e213d1fc8e0df5f3b7a3dc7',1,'Vec3T']]], + ['_7evertext',['~VertexT',['../classDcel_1_1VertexT.html#ab0a8e0aa0960f68177e115b897283a1c',1,'Dcel::VertexT']]] +]; diff --git a/docs/doxygen/html/search/functions_2.html b/docs/doxygen/html/search/functions_2.html new file mode 100644 index 00000000..ecce2f31 --- /dev/null +++ b/docs/doxygen/html/search/functions_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_2.js b/docs/doxygen/html/search/functions_2.js new file mode 100644 index 00000000..d4ad4ffb --- /dev/null +++ b/docs/doxygen/html/search/functions_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['computeandstoreedges',['computeAndStoreEdges',['../classDcel_1_1FaceT.html#a5e913d5cdebb6b95c43e6e0fdc2e3589',1,'Dcel::FaceT']]], + ['computearea',['computeArea',['../classDcel_1_1FaceT.html#a3a3bfa74a7c07252a2a904206678bb66',1,'Dcel::FaceT']]], + ['computecentroid',['computeCentroid',['../classDcel_1_1FaceT.html#a7aded1c77a78a38115e5388311ed25b0',1,'Dcel::FaceT']]], + ['computeedgelength',['computeEdgeLength',['../classDcel_1_1EdgeT.html#abddfe200f9af04cf49362d4ed1e8d37b',1,'Dcel::EdgeT']]], + ['computenormal',['computeNormal',['../classDcel_1_1EdgeT.html#ad78566030a7781469035cc4b6ed3393b',1,'Dcel::EdgeT::computeNormal()'],['../classDcel_1_1FaceT.html#a574abc710dd63e88503d4011f27adf89',1,'Dcel::FaceT::computeNormal()']]], + ['computepolygon2d',['computePolygon2D',['../classDcel_1_1FaceT.html#a863d94c15412e535ca62f9cd52eead5f',1,'Dcel::FaceT']]], + ['computevertexnormalangleweighted',['computeVertexNormalAngleWeighted',['../classDcel_1_1VertexT.html#aa9e66780ec134afe94d9e5a8221fdc0e',1,'Dcel::VertexT::computeVertexNormalAngleWeighted() noexcept'],['../classDcel_1_1VertexT.html#aea793773eec08852108d3bd5c4eea5a9',1,'Dcel::VertexT::computeVertexNormalAngleWeighted(const std::vector< FacePtr > &a_faces) noexcept']]], + ['computevertexnormalaverage',['computeVertexNormalAverage',['../classDcel_1_1VertexT.html#adb439515e1814e3fdd9d040b9c1b22df',1,'Dcel::VertexT::computeVertexNormalAverage() noexcept'],['../classDcel_1_1VertexT.html#a6faffb2c5038d62c2f7866736ebe7393',1,'Dcel::VertexT::computeVertexNormalAverage(const std::vector< FacePtr > &a_faces) noexcept']]], + ['cross',['cross',['../classVec3T.html#af628d2d42a93200a929bd54a1fe8353f',1,'Vec3T']]] +]; diff --git a/docs/doxygen/html/search/functions_3.html b/docs/doxygen/html/search/functions_3.html new file mode 100644 index 00000000..15f06abd --- /dev/null +++ b/docs/doxygen/html/search/functions_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_3.js b/docs/doxygen/html/search/functions_3.js new file mode 100644 index 00000000..b096db6b --- /dev/null +++ b/docs/doxygen/html/search/functions_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['define',['define',['../classBoundingVolumes_1_1BoundingSphereT.html#aac21650a7d3f65081483512064cbcfa8',1,'BoundingVolumes::BoundingSphereT::define()'],['../classBoundingVolumes_1_1AABBT.html#a5ff57720a5d6511642ce39a09a7b7663',1,'BoundingVolumes::AABBT::define()'],['../classDcel_1_1EdgeT.html#aa3257bd5d35041860b10e882e68b2c14',1,'Dcel::EdgeT::define()'],['../classDcel_1_1FaceT.html#a44b70fa51382ef625d110bbad64b7442',1,'Dcel::FaceT::define()'],['../classDcel_1_1MeshT.html#af65f5fc459d586ba3b6bd0711b0951f5',1,'Dcel::MeshT::define()'],['../classDcel_1_1VertexT.html#a20a894d436707a4205501bbc5cd72323',1,'Dcel::VertexT::define()']]], + ['directsigneddistance',['DirectSignedDistance',['../classDcel_1_1MeshT.html#ada074ff3b1a612e46098f4ba6ca0bda2',1,'Dcel::MeshT']]], + ['directsigneddistance2',['DirectSignedDistance2',['../classDcel_1_1MeshT.html#ac00a6da46649246a3a2db70b29bb2407',1,'Dcel::MeshT']]], + ['dot',['dot',['../classVec2T.html#ab7ed0195847b7a1037051402967780a3',1,'Vec2T::dot()'],['../classVec3T.html#ab4bebdfbdc863826a1a7e86cad130ff8',1,'Vec3T::dot()']]] +]; diff --git a/docs/doxygen/html/search/functions_4.html b/docs/doxygen/html/search/functions_4.html new file mode 100644 index 00000000..8985ff27 --- /dev/null +++ b/docs/doxygen/html/search/functions_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_4.js b/docs/doxygen/html/search/functions_4.js new file mode 100644 index 00000000..d8b99b55 --- /dev/null +++ b/docs/doxygen/html/search/functions_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['edgeiteratort',['EdgeIteratorT',['../classDcel_1_1EdgeIteratorT.html#a20ff352f5f61ce6297e82d5be43377ce',1,'Dcel::EdgeIteratorT::EdgeIteratorT()=delete'],['../classDcel_1_1EdgeIteratorT.html#aefe8b41b1b21825922096a45ce645149',1,'Dcel::EdgeIteratorT::EdgeIteratorT(Face &a_face)'],['../classDcel_1_1EdgeIteratorT.html#a1e47d3f1320c6ce4f37e1772ed936451',1,'Dcel::EdgeIteratorT::EdgeIteratorT(const Face &a_face)'],['../classDcel_1_1EdgeIteratorT.html#a0041cf8e8c4dcdda12a514aa64e295f7',1,'Dcel::EdgeIteratorT::EdgeIteratorT(Vertex &a_vertex)'],['../classDcel_1_1EdgeIteratorT.html#abda0210d73dd861142c8e23b4d589bd0',1,'Dcel::EdgeIteratorT::EdgeIteratorT(const Vertex &a_vertex)']]], + ['edget',['EdgeT',['../classDcel_1_1EdgeT.html#a2a9682fd036374aad598a50fe54b2c1f',1,'Dcel::EdgeT::EdgeT()'],['../classDcel_1_1EdgeT.html#abe96b4404fa1961df79ffa618a7e8633',1,'Dcel::EdgeT::EdgeT(const Edge &a_otherEdge)'],['../classDcel_1_1EdgeT.html#a639b427e60ede1948f8344a41b9bfc32',1,'Dcel::EdgeT::EdgeT(const VertexPtr &a_vertex)']]] +]; diff --git a/docs/doxygen/html/search/functions_5.html b/docs/doxygen/html/search/functions_5.html new file mode 100644 index 00000000..03149184 --- /dev/null +++ b/docs/doxygen/html/search/functions_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_5.js b/docs/doxygen/html/search/functions_5.js new file mode 100644 index 00000000..405ca998 --- /dev/null +++ b/docs/doxygen/html/search/functions_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['facet',['FaceT',['../classDcel_1_1FaceT.html#ad26587e282563bc4e8c6559b2551627f',1,'Dcel::FaceT::FaceT()'],['../classDcel_1_1FaceT.html#a9111394950a9fb2f8b918423416c83bd',1,'Dcel::FaceT::FaceT(const EdgePtr &a_edge)'],['../classDcel_1_1FaceT.html#a0c318a29cae34ba4105235fd55d22b39',1,'Dcel::FaceT::FaceT(const Face &a_otherFace)']]], + ['flattentree',['flattenTree',['../classBVH_1_1NodeT.html#a926e3990022ab28821d3f51e5fead023',1,'BVH::NodeT::flattenTree()'],['../classBVH_1_1NodeT.html#a14f014426b00ad7989af328fa369bca8',1,'BVH::NodeT::flattenTree(std::vector< LinearNodeT< T, P, BV, K > > &a_linearNodes, std::vector< std::shared_ptr< const P > > &a_sortedPrimitives, unsigned long &a_offset) const noexcept']]] +]; diff --git a/docs/doxygen/html/search/functions_6.html b/docs/doxygen/html/search/functions_6.html new file mode 100644 index 00000000..c5061236 --- /dev/null +++ b/docs/doxygen/html/search/functions_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_6.js b/docs/doxygen/html/search/functions_6.js new file mode 100644 index 00000000..be02dd5c --- /dev/null +++ b/docs/doxygen/html/search/functions_6.js @@ -0,0 +1,40 @@ +var searchData= +[ + ['gathervertices',['gatherVertices',['../classDcel_1_1FaceT.html#aba1c0e341f18097112fd55465cc00eeb',1,'Dcel::FaceT']]], + ['getallvertexcoordinates',['getAllVertexCoordinates',['../classDcel_1_1FaceT.html#a17f38028d7bd3150feb22484e601f557',1,'Dcel::FaceT::getAllVertexCoordinates()'],['../classDcel_1_1MeshT.html#a597a38ed9f3e3a2a33f2d1211da322f3',1,'Dcel::MeshT::getAllVertexCoordinates()']]], + ['getarea',['getArea',['../classBoundingVolumes_1_1BoundingSphereT.html#a303fd50d1b8d27c7014c50ba0867a0b3',1,'BoundingVolumes::BoundingSphereT::getArea()'],['../classBoundingVolumes_1_1AABBT.html#ae2f3ba3dde664cccd7c46b0ef4f087d6',1,'BoundingVolumes::AABBT::getArea()'],['../classDcel_1_1FaceT.html#aeddb2fe440acd3dadc6160be390127fe',1,'Dcel::FaceT::getArea() noexcept'],['../classDcel_1_1FaceT.html#ab5352c13f01b1d2ec8fbd630d4c01083',1,'Dcel::FaceT::getArea() const noexcept']]], + ['getboundingvolume',['getBoundingVolume',['../classBVH_1_1NodeT.html#a02cba4dcb065ebfaeea7e4d251b89d04',1,'BVH::NodeT::getBoundingVolume()'],['../classBVH_1_1LinearNodeT.html#a152b12723c86f8fcb7522562cd97cd67',1,'BVH::LinearNodeT::getBoundingVolume()']]], + ['getcenter',['getCenter',['../classSphereSDF.html#a82922ae162a9b96279cc4d0d866b303d',1,'SphereSDF::getCenter() const noexcept'],['../classSphereSDF.html#a4f3a9220bfe2fc817131f655ce6f30cd',1,'SphereSDF::getCenter() noexcept']]], + ['getcentroid',['getCentroid',['../classBoundingVolumes_1_1BoundingSphereT.html#ac3adb87ea4da98d70375e5806e8dfdc5',1,'BoundingVolumes::BoundingSphereT::getCentroid() noexcept'],['../classBoundingVolumes_1_1BoundingSphereT.html#a62e38a048c7aacd79aec8dcc251e3a65',1,'BoundingVolumes::BoundingSphereT::getCentroid() const noexcept'],['../classBoundingVolumes_1_1AABBT.html#a7c98cb4cec1eb672755c9c469ca44990',1,'BoundingVolumes::AABBT::getCentroid()'],['../classDcel_1_1FaceT.html#a1b9c15538b2d7840a11b30f5e236c2a9',1,'Dcel::FaceT::getCentroid() noexcept'],['../classDcel_1_1FaceT.html#af2bf6614093074f450b2e0e5ea58682a',1,'Dcel::FaceT::getCentroid() const noexcept'],['../classDcel_1_1FaceT.html#a43e5b9aebe8736a42568ae0e6fbb6db3',1,'Dcel::FaceT::getCentroid(const int a_dir) noexcept'],['../classDcel_1_1FaceT.html#ac835d260a630e303babd7f87eb7d5a1a',1,'Dcel::FaceT::getCentroid(const int a_dir) const noexcept']]], + ['getchildoffsets',['getChildOffsets',['../classBVH_1_1LinearNodeT.html#af08feacbaa148425a896c196b0b6d1da',1,'BVH::LinearNodeT']]], + ['getdepth',['getDepth',['../classBVH_1_1NodeT.html#a158041a671c970da921446050e95f474',1,'BVH::NodeT']]], + ['getdistance',['getDistance',['../classBoundingVolumes_1_1BoundingSphereT.html#a06ec858b7349e6a926ad476990c774cb',1,'BoundingVolumes::BoundingSphereT::getDistance()'],['../classBoundingVolumes_1_1AABBT.html#ad883975a0926c0755a978283137f378f',1,'BoundingVolumes::AABBT::getDistance()']]], + ['getdistance2',['getDistance2',['../classBoundingVolumes_1_1BoundingSphereT.html#aee81818917225b65b6c3b661e268e66f',1,'BoundingVolumes::BoundingSphereT::getDistance2()'],['../classBoundingVolumes_1_1AABBT.html#a2196f1cf735ccf5d1f5c1ee8dcb449dd',1,'BoundingVolumes::AABBT::getDistance2()']]], + ['getdistancetoboundingvolume',['getDistanceToBoundingVolume',['../classBVH_1_1NodeT.html#a8da9f78078b0a579868d026bd61a2947',1,'BVH::NodeT::getDistanceToBoundingVolume()'],['../classBVH_1_1LinearNodeT.html#a2bf5b1c514a20754d527b17e1c664630',1,'BVH::LinearNodeT::getDistanceToBoundingVolume()']]], + ['getdistancetoboundingvolume2',['getDistanceToBoundingVolume2',['../classBVH_1_1NodeT.html#a06708a2711fd354a3c382da664cfe154',1,'BVH::NodeT::getDistanceToBoundingVolume2()'],['../classBVH_1_1LinearNodeT.html#a3e85605a1f0986b8440964ed0dbe90f6',1,'BVH::LinearNodeT::getDistanceToBoundingVolume2()']]], + ['getdistancetoprimitives',['getDistanceToPrimitives',['../classBVH_1_1NodeT.html#a61dc7040d57f0a69984548eb4804244b',1,'BVH::NodeT::getDistanceToPrimitives()'],['../classBVH_1_1LinearNodeT.html#a1a0a50ba8c1c0601f12ae02857246b1f',1,'BVH::LinearNodeT::getDistanceToPrimitives()']]], + ['getedges',['getEdges',['../classDcel_1_1MeshT.html#a3c6566eab929cc4108213959fa25777e',1,'Dcel::MeshT::getEdges() noexcept'],['../classDcel_1_1MeshT.html#a3440c0836148040bfd6cc679f047ec5b',1,'Dcel::MeshT::getEdges() const noexcept']]], + ['getface',['getFace',['../classDcel_1_1EdgeT.html#a522de398f834c68701e4a44f2c9ba972',1,'Dcel::EdgeT::getFace() noexcept'],['../classDcel_1_1EdgeT.html#a3966ae6b38b26c618cfb56bd5adb8b54',1,'Dcel::EdgeT::getFace() const noexcept']]], + ['getfaces',['getFaces',['../classDcel_1_1MeshT.html#a348cffec1fa223f131819abad1c89338',1,'Dcel::MeshT::getFaces() noexcept'],['../classDcel_1_1MeshT.html#afe1bd52d15af160f691bdd83305c84c7',1,'Dcel::MeshT::getFaces() const noexcept'],['../classDcel_1_1VertexT.html#a1d365de69778aa4bb35f80c936e95251',1,'Dcel::VertexT::getFaces() noexcept'],['../classDcel_1_1VertexT.html#aa73d20542e46c20afba1f14cd061f126',1,'Dcel::VertexT::getFaces() const noexcept']]], + ['gethalfedge',['getHalfEdge',['../classDcel_1_1FaceT.html#a121a02750336ee4050bfd5db8f9328b4',1,'Dcel::FaceT::getHalfEdge() noexcept'],['../classDcel_1_1FaceT.html#a1b273c8c0157f7ec9604424a2b073db3',1,'Dcel::FaceT::getHalfEdge() const noexcept']]], + ['gethighcorner',['getHighCorner',['../classBoundingVolumes_1_1AABBT.html#a2ecaeccecdb8882051516409e5749ef9',1,'BoundingVolumes::AABBT::getHighCorner() noexcept'],['../classBoundingVolumes_1_1AABBT.html#aef8dcd08ea8726cdcd3d361d33c4d554',1,'BoundingVolumes::AABBT::getHighCorner() const noexcept']]], + ['gethighestcoordinate',['getHighestCoordinate',['../classDcel_1_1FaceT.html#ad712b8dec98d77e631e1c7a920424d1f',1,'Dcel::FaceT']]], + ['getlowcorner',['getLowCorner',['../classBoundingVolumes_1_1AABBT.html#a6368509e66a2b5691272f273fe96f670',1,'BoundingVolumes::AABBT::getLowCorner() noexcept'],['../classBoundingVolumes_1_1AABBT.html#a937cfc6cbbbd457f872370c1c4d5e81e',1,'BoundingVolumes::AABBT::getLowCorner() const noexcept']]], + ['getnextedge',['getNextEdge',['../classDcel_1_1EdgeT.html#a1c865581d60a3e89e91d1d8db56fc2d1',1,'Dcel::EdgeT::getNextEdge() noexcept'],['../classDcel_1_1EdgeT.html#a6b50d3dd8ab3e2cda28819f6e4be9769',1,'Dcel::EdgeT::getNextEdge() const noexcept']]], + ['getnodetype',['getNodeType',['../classBVH_1_1NodeT.html#a7b9e3a8bfa35f604298634da102a0ce4',1,'BVH::NodeT']]], + ['getnormal',['getNormal',['../classDcel_1_1EdgeT.html#a3caca2b8e0d73531566218a7febe24d8',1,'Dcel::EdgeT::getNormal() noexcept'],['../classDcel_1_1EdgeT.html#a60b8b2acf41484ff0c521310cece56a3',1,'Dcel::EdgeT::getNormal() const noexcept'],['../classDcel_1_1FaceT.html#a0e6079ca8d45b2e2090bd6202c7a679e',1,'Dcel::FaceT::getNormal() noexcept'],['../classDcel_1_1FaceT.html#adff3ebb9eba8d500e21fed65b32ea8fb',1,'Dcel::FaceT::getNormal() const noexcept'],['../classDcel_1_1VertexT.html#a11d1c90ccfa44b5ea121223bd86214c9',1,'Dcel::VertexT::getNormal() noexcept'],['../classDcel_1_1VertexT.html#a6d2d15dff96e192dff0254d40e1927b7',1,'Dcel::VertexT::getNormal() const noexcept']]], + ['getnumprimitives',['getNumPrimitives',['../classBVH_1_1LinearNodeT.html#a245e67b6824cadf1733c3c9176259106',1,'BVH::LinearNodeT']]], + ['getothervertex',['getOtherVertex',['../classDcel_1_1EdgeT.html#aaa6ae21b177a7661ba61ad2b63ed47f3',1,'Dcel::EdgeT::getOtherVertex() noexcept'],['../classDcel_1_1EdgeT.html#ac2b40be7e45425caaf85b13b50bd89a0',1,'Dcel::EdgeT::getOtherVertex() const noexcept']]], + ['getoutgoingedge',['getOutgoingEdge',['../classDcel_1_1VertexT.html#ae310f38b6e5b9bb4bae4633117a26708',1,'Dcel::VertexT::getOutgoingEdge() noexcept'],['../classDcel_1_1VertexT.html#ab726cf7028c0b9de7eaff211d9ca34aa',1,'Dcel::VertexT::getOutgoingEdge() const noexcept']]], + ['getoverlappingvolume',['getOverlappingVolume',['../classBoundingVolumes_1_1BoundingSphereT.html#a4581b87c7a3ccd3b58168bfdae9436cb',1,'BoundingVolumes::BoundingSphereT::getOverlappingVolume()'],['../classBoundingVolumes_1_1AABBT.html#ae65563ac6f3851f8fb05e0c98613fc0d',1,'BoundingVolumes::AABBT::getOverlappingVolume()'],['../namespaceBoundingVolumes.html#a4f159289c317e02beedb4b38136ad692',1,'BoundingVolumes::getOverlappingVolume(const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept'],['../namespaceBoundingVolumes.html#ae5716e39e88aaeec0c204f453cac2acd',1,'BoundingVolumes::getOverlappingVolume(const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept']]], + ['getpairedge',['getPairEdge',['../classDcel_1_1EdgeT.html#a1a076a12b7e269aecd77172b1d4c57e1',1,'Dcel::EdgeT::getPairEdge() noexcept'],['../classDcel_1_1EdgeT.html#a46f28f7da631e2d0f7f3139d1167b392',1,'Dcel::EdgeT::getPairEdge() const noexcept']]], + ['getposition',['getPosition',['../classDcel_1_1VertexT.html#af3ecf093a2fc7fd0f728d463ccacb8ce',1,'Dcel::VertexT::getPosition() noexcept'],['../classDcel_1_1VertexT.html#a7a4c3e499c6f7e529cc556eecf94f3fe',1,'Dcel::VertexT::getPosition() const noexcept']]], + ['getpreviousedge',['getPreviousEdge',['../classDcel_1_1EdgeT.html#ad97e2996c4559b8977d807a5627d5251',1,'Dcel::EdgeT::getPreviousEdge() noexcept'],['../classDcel_1_1EdgeT.html#ae4baac4bda30dfa3827ea87f2f72481f',1,'Dcel::EdgeT::getPreviousEdge() const noexcept']]], + ['getprimitives',['getPrimitives',['../classBVH_1_1NodeT.html#a2e0c1e030162a2dc049acb4debd4d9f2',1,'BVH::NodeT::getPrimitives() const noexcept'],['../classBVH_1_1NodeT.html#adce9d9c6bd4ab3d613bef232353774f3',1,'BVH::NodeT::getPrimitives() noexcept']]], + ['getprimitivesoffset',['getPrimitivesOffset',['../classBVH_1_1LinearNodeT.html#a8cfca65bd808adc8eb2793e7d7aabcd3',1,'BVH::LinearNodeT']]], + ['getradius',['getRadius',['../classSphereSDF.html#a2cdc1f42f3de4c0ca017571910fbe72c',1,'SphereSDF::getRadius() const noexcept'],['../classSphereSDF.html#a09245289037ae77adf204160c0d5b9cc',1,'SphereSDF::getRadius() noexcept'],['../classBoundingVolumes_1_1BoundingSphereT.html#a8c4f10492e97aa460b1207f384e1c081',1,'BoundingVolumes::BoundingSphereT::getRadius() noexcept'],['../classBoundingVolumes_1_1BoundingSphereT.html#affac2a4ac0cefaada01c5532eb13f26a',1,'BoundingVolumes::BoundingSphereT::getRadius() const noexcept']]], + ['getsmallestcoordinate',['getSmallestCoordinate',['../classDcel_1_1FaceT.html#a8eb0b35ecb5de2601dc9f7ff0d2cac0d',1,'Dcel::FaceT']]], + ['getvertex',['getVertex',['../classDcel_1_1EdgeT.html#a44193130714264f57d80e7bfc8264662',1,'Dcel::EdgeT::getVertex() noexcept'],['../classDcel_1_1EdgeT.html#afa36dc535018588ba2238c5f42a9abd8',1,'Dcel::EdgeT::getVertex() const noexcept']]], + ['getvertices',['getVertices',['../classDcel_1_1MeshT.html#a0ccf0a5a707dbad79b3578a401449e9c',1,'Dcel::MeshT::getVertices() noexcept'],['../classDcel_1_1MeshT.html#a579860225cb9fc926fea4856563bef08',1,'Dcel::MeshT::getVertices() const noexcept']]], + ['getvolume',['getVolume',['../classBoundingVolumes_1_1BoundingSphereT.html#a44e0069495c19069fced07aab8e614c6',1,'BoundingVolumes::BoundingSphereT::getVolume()'],['../classBoundingVolumes_1_1AABBT.html#ac5b8f2caa8afe1177f3d2924fbc3f7a5',1,'BoundingVolumes::AABBT::getVolume()']]] +]; diff --git a/docs/doxygen/html/search/functions_7.html b/docs/doxygen/html/search/functions_7.html new file mode 100644 index 00000000..83a7b84b --- /dev/null +++ b/docs/doxygen/html/search/functions_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_7.js b/docs/doxygen/html/search/functions_7.js new file mode 100644 index 00000000..a81e3106 --- /dev/null +++ b/docs/doxygen/html/search/functions_7.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['incrementwarning',['incrementWarning',['../classDcel_1_1MeshT.html#ae13801eefa60ad08ff1da0df1da34784',1,'Dcel::MeshT']]], + ['infinity',['infinity',['../classVec2T.html#a28b453ff4fd4ede74e401454b67f73d6',1,'Vec2T::infinity()'],['../classVec3T.html#ad88913a21fd56327b28092c2e39ebc3e',1,'Vec3T::infinity()']]], + ['insertnode',['insertNode',['../classBVH_1_1NodeT.html#a8113c8dfa5ab6dc3cf931c5c8fdd6ddb',1,'BVH::NodeT']]], + ['insertnodes',['insertNodes',['../classBVH_1_1NodeT.html#a75a7b385ec12897c1ade331ee24d9b74',1,'BVH::NodeT']]], + ['intersects',['intersects',['../classBoundingVolumes_1_1BoundingSphereT.html#a90baad0c400aac7645a7e8c1ab13096a',1,'BoundingVolumes::BoundingSphereT::intersects()'],['../classBoundingVolumes_1_1AABBT.html#a87d160a3e05082e34e37d8b4472bad7d',1,'BoundingVolumes::AABBT::intersects()'],['../namespaceBoundingVolumes.html#af35f33c5f319a466550d9ad1040beced',1,'BoundingVolumes::intersects(const BoundingSphereT< T > &a_u, const BoundingSphereT< T > &a_v) noexcept'],['../namespaceBoundingVolumes.html#a5c360ccd42017c01acbe1caf2cfd1efe',1,'BoundingVolumes::intersects(const AABBT< T > &a_u, const AABBT< T > &a_v) noexcept']]], + ['isleaf',['isLeaf',['../classBVH_1_1LinearNodeT.html#aba361834e3d013725a92ec4b45633584',1,'BVH::LinearNodeT']]], + ['ispointinside',['isPointInside',['../classDcel_1_1Polygon2D.html#ade475a82be10cbacf382016e85316853',1,'Dcel::Polygon2D']]], + ['ispointinsideface',['isPointInsideFace',['../classDcel_1_1FaceT.html#a628d1734a63636a528fe2f7019bc4dd8',1,'Dcel::FaceT']]], + ['ispointinsidepolygoncrossingnumber',['isPointInsidePolygonCrossingNumber',['../classDcel_1_1Polygon2D.html#aa1edee7ad8913b35663792624e914aad',1,'Dcel::Polygon2D']]], + ['ispointinsidepolygonsubtend',['isPointInsidePolygonSubtend',['../classDcel_1_1Polygon2D.html#a8a6a32defe11ad15996e286aa76d4428',1,'Dcel::Polygon2D']]], + ['ispointinsidepolygonwindingnumber',['isPointInsidePolygonWindingNumber',['../classDcel_1_1Polygon2D.html#ad4d6b51a54f6a9c89812a5bcbc0e1902',1,'Dcel::Polygon2D']]] +]; diff --git a/docs/doxygen/html/search/functions_8.html b/docs/doxygen/html/search/functions_8.html new file mode 100644 index 00000000..b55f0e65 --- /dev/null +++ b/docs/doxygen/html/search/functions_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_8.js b/docs/doxygen/html/search/functions_8.js new file mode 100644 index 00000000..78583f47 --- /dev/null +++ b/docs/doxygen/html/search/functions_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['length',['length',['../classVec2T.html#ad7965b8d549a5f9d08cab43760dab56b',1,'Vec2T::length()'],['../classVec3T.html#a93c868b181e24a4f74702a8b8a36f815',1,'Vec3T::length()']]], + ['length2',['length2',['../classVec2T.html#a9beb3ae1b8b76926f8864686cb6a2ace',1,'Vec2T::length2()'],['../classVec3T.html#aaed89aee434cfa0abd86fe33bff49b4e',1,'Vec3T::length2()']]], + ['linearbvh',['LinearBVH',['../classBVH_1_1LinearBVH.html#af071dcad6741be1314c0b39512d2f142',1,'BVH::LinearBVH::LinearBVH()=delete'],['../classBVH_1_1LinearBVH.html#a82e767c16424e19c5dfbe671dd111e32',1,'BVH::LinearBVH::LinearBVH(const std::vector< LinearNode > &a_linearNodes, const PrimitiveList &a_primitives)']]], + ['linearnodet',['LinearNodeT',['../classBVH_1_1LinearNodeT.html#ae7dbdb102840eb271dadea2f25aa6f8b',1,'BVH::LinearNodeT']]] +]; diff --git a/docs/doxygen/html/search/functions_9.html b/docs/doxygen/html/search/functions_9.html new file mode 100644 index 00000000..c73f07bb --- /dev/null +++ b/docs/doxygen/html/search/functions_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_9.js b/docs/doxygen/html/search/functions_9.js new file mode 100644 index 00000000..e9156792 --- /dev/null +++ b/docs/doxygen/html/search/functions_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['max',['max',['../classVec2T.html#a1211175344f9ee8bc0fd4ac2589799d8',1,'Vec2T::max()'],['../classVec3T.html#af06b99bd905435060149a61a13f61546',1,'Vec3T::max() noexcept'],['../classVec3T.html#ac126bbdaeff79e475327887bfa8aa62c',1,'Vec3T::max(const Vec3T< T > &u) noexcept'],['../EBGeometry__Vec_8hpp.html#a71f0bc32c9be501cf01a1b6c715dc0a9',1,'max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a71f0bc32c9be501cf01a1b6c715dc0a9',1,'max(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp']]], + ['maxdir',['maxDir',['../classVec3T.html#a292391c1f72ca66e100e7e70512ff9b1',1,'Vec3T']]], + ['mesht',['MeshT',['../classDcel_1_1MeshT.html#a4eae06529761d8aff54e945eb0a3ba91',1,'Dcel::MeshT::MeshT()'],['../classDcel_1_1MeshT.html#aa055e10c62778ba629b3f9c849338e03',1,'Dcel::MeshT::MeshT(const Mesh &a_otherMesh)=delete'],['../classDcel_1_1MeshT.html#a7468e3630893d64a71a7c2347496576b',1,'Dcel::MeshT::MeshT(std::vector< FacePtr > &a_faces, std::vector< EdgePtr > &a_edges, std::vector< VertexPtr > &a_vertices)']]], + ['min',['min',['../classVec2T.html#aca5161a674a3546a8c9d5543537548a3',1,'Vec2T::min()'],['../classVec3T.html#a4f27fdac2e6ac4feffe148bb8857f8bc',1,'Vec3T::min() noexcept'],['../classVec3T.html#ad0a0c9754ef8df1fa28abdaa01c246c4',1,'Vec3T::min(const Vec3T< T > &u) noexcept'],['../EBGeometry__Vec_8hpp.html#a291f01622695ab94c0092c3af0a1f3ca',1,'min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a291f01622695ab94c0092c3af0a1f3ca',1,'min(const Vec3T< T > &u, const Vec3T< T > &v) noexcept: EBGeometry_VecImplem.hpp']]] +]; diff --git a/docs/doxygen/html/search/functions_a.html b/docs/doxygen/html/search/functions_a.html new file mode 100644 index 00000000..f10ad638 --- /dev/null +++ b/docs/doxygen/html/search/functions_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_a.js b/docs/doxygen/html/search/functions_a.js new file mode 100644 index 00000000..062185fe --- /dev/null +++ b/docs/doxygen/html/search/functions_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['nodet',['NodeT',['../classBVH_1_1NodeT.html#a960d0972bec81cf782b36e57f87da1f1',1,'BVH::NodeT::NodeT()'],['../classBVH_1_1NodeT.html#a8867e5e1c47d12eff7a468b2e240f16b',1,'BVH::NodeT::NodeT(const NodePtr &a_parent)'],['../classBVH_1_1NodeT.html#a6da86ccc8e4a0c556cd67ca59af983dc',1,'BVH::NodeT::NodeT(const std::vector< std::shared_ptr< P > > &a_primitives)'],['../classBVH_1_1NodeT.html#a6312ce04f70c2e1a860ce380298909b6',1,'BVH::NodeT::NodeT(const std::vector< std::shared_ptr< const P > > &a_primitives)']]], + ['normalizenormalvector',['normalizeNormalVector',['../classDcel_1_1EdgeT.html#aae9ee7375ce72ddf5ef375fb18863e8f',1,'Dcel::EdgeT::normalizeNormalVector()'],['../classDcel_1_1FaceT.html#aae0f6ac54d41666fa4b6182c65e5e444',1,'Dcel::FaceT::normalizeNormalVector()'],['../classDcel_1_1VertexT.html#a5926f14833074dfa2acf28a3e5c36f46',1,'Dcel::VertexT::normalizeNormalVector()']]] +]; diff --git a/docs/doxygen/html/search/functions_b.html b/docs/doxygen/html/search/functions_b.html new file mode 100644 index 00000000..172ea1b3 --- /dev/null +++ b/docs/doxygen/html/search/functions_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_b.js b/docs/doxygen/html/search/functions_b.js new file mode 100644 index 00000000..bcd81563 --- /dev/null +++ b/docs/doxygen/html/search/functions_b.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['ok',['ok',['../classDcel_1_1EdgeIteratorT.html#a92bfca2d072bbf54c7be751f8fc4c098',1,'Dcel::EdgeIteratorT']]], + ['one',['one',['../classVec2T.html#a9103ce94a3efa9e85cb732fb68af744e',1,'Vec2T::one()'],['../classVec3T.html#a82237dfeed4017e952c893817afc3827',1,'Vec3T::one()']]], + ['operator_28_29',['operator()',['../classDcel_1_1EdgeIteratorT.html#a56e7dcbaf6f74f6c05b1eb9105d203ad',1,'Dcel::EdgeIteratorT::operator()() noexcept'],['../classDcel_1_1EdgeIteratorT.html#a2e4afdda5a3eb033dc293fefc23edaa6',1,'Dcel::EdgeIteratorT::operator()() const noexcept']]], + ['operator_2a',['operator*',['../classVec2T.html#a1047f21e704d25c4bc5980cd13c00e1c',1,'Vec2T::operator*()'],['../classVec3T.html#aa4768276707889db34a716e9e476b9f1',1,'Vec3T::operator*(const T &s) const noexcept'],['../classVec3T.html#a579db6fb2bed30b3f024d1a017d7a124',1,'Vec3T::operator*(const Vec3T< T > &s) const noexcept'],['../EBGeometry__Vec_8hpp.html#a011c551978bb37db35ea3520fb23bd00',1,'operator*(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__Vec_8hpp.html#affba8fd8ad3fc6110fbba33be5ad6187',1,'operator*(const T &s, const Vec3T< T > &u) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a011c551978bb37db35ea3520fb23bd00',1,'operator*(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a3ed4fdd9b9d6b180e982733b4c7efc8e',1,'operator*(const T &s, const Vec3T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp']]], + ['operator_2a_3d',['operator*=',['../classVec2T.html#ad7525f66bf0c609e79e1d2590af6be0c',1,'Vec2T::operator*=()'],['../classVec3T.html#a0448e51b7f785b14df47092929cb73a3',1,'Vec3T::operator*=()']]], + ['operator_2b',['operator+',['../classVec2T.html#a0ea1e944e722dfdc3a37ebd7ef922eea',1,'Vec2T::operator+()'],['../classVec3T.html#af1ab895de89a1a3143f58d2ce5d78bc2',1,'Vec3T::operator+()']]], + ['operator_2b_2b',['operator++',['../classDcel_1_1EdgeIteratorT.html#ae8dc40da0743b61725062646144b8f32',1,'Dcel::EdgeIteratorT']]], + ['operator_2b_3d',['operator+=',['../classVec2T.html#a6f5fbfd88dc2eac09f17fb999c76e5b0',1,'Vec2T::operator+=()'],['../classVec3T.html#a7d06c56d8579d8b3695f43f62544f999',1,'Vec3T::operator+=()']]], + ['operator_2d',['operator-',['../classVec2T.html#a788b057579c3c92068e15595d7781734',1,'Vec2T::operator-(const Vec2T &a_other) const noexcept'],['../classVec2T.html#aa8176b9c1a1331f1b0358188cd04883f',1,'Vec2T::operator-() const noexcept'],['../classVec3T.html#ac00a70e55a93ecd8c60d29a129f8fbf3',1,'Vec3T::operator-(const Vec3T< T > &u) const noexcept'],['../classVec3T.html#a2d32936bb5a9ddc22152d301723bc3e0',1,'Vec3T::operator-() const noexcept']]], + ['operator_2d_3d',['operator-=',['../classVec2T.html#a6c98f1e7b2bb5479e3616fbda7124313',1,'Vec2T::operator-=()'],['../classVec3T.html#a8a580094450e167248f4ee089027fa40',1,'Vec3T::operator-=()']]], + ['operator_2f',['operator/',['../classVec2T.html#a3cc96a6930ed713df486d177490e1e5c',1,'Vec2T::operator/()'],['../classVec3T.html#acc5973c1c82e51c597b47ba39870f528',1,'Vec3T::operator/(const T &s) const noexcept'],['../classVec3T.html#a3c48111d27fb16cc3304e7aa2b4603fc',1,'Vec3T::operator/(const Vec3T< T > &v) const noexcept'],['../EBGeometry__Vec_8hpp.html#a519f71e021376fe40b7d2f6e451fba02',1,'operator/(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__Vec_8hpp.html#aeeeedd62e251ff33f2e37286e391a0f8',1,'operator/(const T &s, const Vec3T< T > &u) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a519f71e021376fe40b7d2f6e451fba02',1,'operator/(const T &s, const Vec2T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp'],['../EBGeometry__VecImplem_8hpp.html#a317d1a610a2d042d5b41f1fde72d8779',1,'operator/(const T &s, const Vec3T< T > &a_other) noexcept: EBGeometry_VecImplem.hpp']]], + ['operator_2f_3d',['operator/=',['../classVec2T.html#a84e4a2ee2d84fbb42c84d0638ff929f8',1,'Vec2T::operator/=()'],['../classVec3T.html#a9446e83162d3daee6133d12b354a3a41',1,'Vec3T::operator/=()']]], + ['operator_3c',['operator<',['../classVec3T.html#aba830919c5020bb060f39fe9df6b7ca1',1,'Vec3T']]], + ['operator_3c_3d',['operator<=',['../classVec3T.html#a266a34a83b9f23a391151be45a4e39f8',1,'Vec3T']]], + ['operator_3d',['operator=',['../classVec2T.html#ab44f1c41a9a73757430403ea47e1ff33',1,'Vec2T::operator=()'],['../classVec3T.html#a34681a81b55b4e7ae818e01b5f27a3e0',1,'Vec3T::operator=()']]], + ['operator_3d_3d',['operator==',['../classVec3T.html#a715546682c26647643148a80087c4ab4',1,'Vec3T']]], + ['operator_3e',['operator>',['../classVec3T.html#af99810068907e4935ac38bc397ba1102',1,'Vec3T']]], + ['operator_3e_3d',['operator>=',['../classVec3T.html#a3296f8319642088e08bd2d3e253fcd64',1,'Vec3T']]], + ['operator_5b_5d',['operator[]',['../classVec3T.html#a098a19968b6c7b0b76c2572e5236a71a',1,'Vec3T::operator[](int i) noexcept'],['../classVec3T.html#ad09224c5f7e142059d75772c0cbd1990',1,'Vec3T::operator[](int i) const noexcept']]] +]; diff --git a/docs/doxygen/html/search/functions_c.html b/docs/doxygen/html/search/functions_c.html new file mode 100644 index 00000000..99492ba8 --- /dev/null +++ b/docs/doxygen/html/search/functions_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_c.js b/docs/doxygen/html/search/functions_c.js new file mode 100644 index 00000000..18445fe2 --- /dev/null +++ b/docs/doxygen/html/search/functions_c.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['polygon2d',['Polygon2D',['../classDcel_1_1Polygon2D.html#a241e98b67756178d5b8d028b6264a6c2',1,'Dcel::Polygon2D::Polygon2D()=delete'],['../classDcel_1_1Polygon2D.html#adcd7eb98f174260e21d0185deb44d628',1,'Dcel::Polygon2D::Polygon2D(const Vec3 &a_normal, const std::vector< Vec3 > &a_points)']]], + ['printwarnings',['printWarnings',['../classDcel_1_1MeshT.html#a7115bea1b9d776a5f9c82a1e4fe852a0',1,'Dcel::MeshT']]], + ['projectpointintofaceplane',['projectPointIntoFacePlane',['../classDcel_1_1FaceT.html#af4116b8f72e0dfb797f79cd4f27a71e8',1,'Dcel::FaceT']]], + ['projectpointtoedge',['projectPointToEdge',['../classDcel_1_1EdgeT.html#ab937dca20cefcae4083b3cf873d83265',1,'Dcel::EdgeT']]], + ['pruneordered',['pruneOrdered',['../classBVH_1_1NodeT.html#a3aa6e9109897a573a46714278e0a79c6',1,'BVH::NodeT::pruneOrdered(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#ac4a3be457d66d2673f717f203e60fc08',1,'BVH::NodeT::pruneOrdered(T &a_closest, const Vec3 &a_point) const noexcept']]], + ['pruneordered2',['pruneOrdered2',['../classBVH_1_1NodeT.html#acb7fec40e06e97fcd42ec75169603e8b',1,'BVH::NodeT::pruneOrdered2(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#a2887ad51251739359602dde8db6a5998',1,'BVH::NodeT::pruneOrdered2(T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexcept'],['../classBVH_1_1LinearNodeT.html#a5479cd8a3503d16bb3f09273971df24a',1,'BVH::LinearNodeT::pruneOrdered2()']]], + ['pruneunordered',['pruneUnordered',['../classBVH_1_1NodeT.html#a27cfc030a9b7f9b0341e94dc6733b511',1,'BVH::NodeT::pruneUnordered(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#ad252aa451ca983750dfa0c24344253b2',1,'BVH::NodeT::pruneUnordered(T &a_closest, const Vec3 &a_point) const noexcept']]], + ['pruneunordered2',['pruneUnordered2',['../classBVH_1_1NodeT.html#aafa2f1f4f4f58296531723e9a6d7d13a',1,'BVH::NodeT::pruneUnordered2(const Vec3 &a_point) const noexcept'],['../classBVH_1_1NodeT.html#a1079cba9ac1f114ad2cbc6cdea2eae49',1,'BVH::NodeT::pruneUnordered2(T &a_minDist2, std::shared_ptr< const P > &a_closest, const Vec3 &a_point) const noexcept']]] +]; diff --git a/docs/doxygen/html/search/functions_d.html b/docs/doxygen/html/search/functions_d.html new file mode 100644 index 00000000..5be9eccb --- /dev/null +++ b/docs/doxygen/html/search/functions_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_d.js b/docs/doxygen/html/search/functions_d.js new file mode 100644 index 00000000..ea7170cc --- /dev/null +++ b/docs/doxygen/html/search/functions_d.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['readascii',['readASCII',['../classDcel_1_1Parser_1_1PLY.html#aaf13b770fe4d9cfc4e419af7418fc35c',1,'Dcel::Parser::PLY::readASCII(const std::string a_filename)'],['../classDcel_1_1Parser_1_1PLY.html#a280f083c1901248de1c69321783ad9d1',1,'Dcel::Parser::PLY::readASCII(Mesh &a_mesh, const std::string a_filename)']]], + ['readfacesascii',['readFacesASCII',['../classDcel_1_1Parser_1_1PLY.html#ae54284d1c7c18a584bd14678763a58e7',1,'Dcel::Parser::PLY']]], + ['readheaderascii',['readHeaderASCII',['../classDcel_1_1Parser_1_1PLY.html#aa8741e334f6c350e1269a42ee1022e57',1,'Dcel::Parser::PLY']]], + ['readverticesascii',['readVerticesASCII',['../classDcel_1_1Parser_1_1PLY.html#a755c28a17a836a05af31991a87212df0',1,'Dcel::Parser::PLY']]], + ['reconcile',['reconcile',['../classDcel_1_1EdgeT.html#ac4aaf294fd41c84ef2f7f54a8024e6dd',1,'Dcel::EdgeT::reconcile()'],['../classDcel_1_1FaceT.html#aaf3f8b92ca4393391ea213b0ecfe19bd',1,'Dcel::FaceT::reconcile()'],['../classDcel_1_1MeshT.html#a98d80b5f83b9d6ff55d0d0da34d0b422',1,'Dcel::MeshT::reconcile()']]], + ['reconcileedges',['reconcileEdges',['../classDcel_1_1MeshT.html#a33f6506c1daf9946d1f21117c0ab89d5',1,'Dcel::MeshT']]], + ['reconcilefaces',['reconcileFaces',['../classDcel_1_1MeshT.html#a5e31ae8b95c9ee725e205d8ae4fd35dc',1,'Dcel::MeshT']]], + ['reconcilepairedges',['reconcilePairEdges',['../classDcel_1_1Parser_1_1PLY.html#afaceb1664b12f30599fe68faba6ca725',1,'Dcel::Parser::PLY']]], + ['reconcilevertices',['reconcileVertices',['../classDcel_1_1MeshT.html#ad2b65aa214d51ecd438bc876e7255290',1,'Dcel::MeshT']]], + ['reset',['reset',['../classDcel_1_1EdgeIteratorT.html#ab1bc6f043869340ee1e1358e4289b8dd',1,'Dcel::EdgeIteratorT']]], + ['rotate',['rotate',['../classSignedDistanceFunction.html#ae8de697f4d0966290342bcf6383585ef',1,'SignedDistanceFunction']]], + ['rotateop',['RotateOp',['../classRotateOp.html#afac8d44cae4c9109c96d2c1ae47a1dc2',1,'RotateOp::RotateOp()'],['../classRotateOp.html#a018f0a465bfaf271958ac975eb24b5bb',1,'RotateOp::RotateOp(const T a_angle, const int a_axis) noexcept']]] +]; diff --git a/docs/doxygen/html/search/functions_e.html b/docs/doxygen/html/search/functions_e.html new file mode 100644 index 00000000..e256cb63 --- /dev/null +++ b/docs/doxygen/html/search/functions_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_e.js b/docs/doxygen/html/search/functions_e.js new file mode 100644 index 00000000..7f7dc8b9 --- /dev/null +++ b/docs/doxygen/html/search/functions_e.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['sanitycheck',['sanityCheck',['../classDcel_1_1MeshT.html#a1814ba63c6e0d7a007ee78c24d6ea159',1,'Dcel::MeshT']]], + ['scale',['scale',['../classSignedDistanceFunction.html#a7855565ecca2d35de173161ecfbf19ae',1,'SignedDistanceFunction']]], + ['scaleop',['ScaleOp',['../classScaleOp.html#aaa6d5841955e1b0a883bbcb5fdcbddc6',1,'ScaleOp::ScaleOp()'],['../classScaleOp.html#ab556ea0d0521a8a153e2406b1255014e',1,'ScaleOp::ScaleOp(const Vec3T< T > &a_scale)']]], + ['setboundingvolume',['setBoundingVolume',['../classBVH_1_1LinearNodeT.html#a03e3dd1c74bf9e66ed692130b49c2e0f',1,'BVH::LinearNodeT']]], + ['setchildoffset',['setChildOffset',['../classBVH_1_1LinearNodeT.html#a3a972ef5ea9abc6e2ead9f453e233e2f',1,'BVH::LinearNodeT']]], + ['setdepth',['setDepth',['../classBVH_1_1NodeT.html#abdff7fdbe3694e2aeb788261175077cc',1,'BVH::NodeT']]], + ['setedge',['setEdge',['../classDcel_1_1VertexT.html#a4ac13c49c61857ea7d0990212b43ca41',1,'Dcel::VertexT']]], + ['setface',['setFace',['../classDcel_1_1EdgeT.html#adb65dd99901ed730354b17c59e46e1fb',1,'Dcel::EdgeT']]], + ['sethalfedge',['setHalfEdge',['../classDcel_1_1FaceT.html#a2680477d0a6c8b2187230170522fe3a5',1,'Dcel::FaceT']]], + ['setinsideoutsidealgorithm',['setInsideOutsideAlgorithm',['../classDcel_1_1FaceT.html#a12b6dc8412276137532a63c292e4b6fe',1,'Dcel::FaceT::setInsideOutsideAlgorithm()'],['../classDcel_1_1MeshT.html#a1e46a744a2526e451229e2f2e4830ca5',1,'Dcel::MeshT::setInsideOutsideAlgorithm()']]], + ['setnextedge',['setNextEdge',['../classDcel_1_1EdgeT.html#aeeda5324a62f1d8b6e50d788907526bf',1,'Dcel::EdgeT']]], + ['setnodetype',['setNodeType',['../classBVH_1_1NodeT.html#a964bd054b57fce2fec50505a65f6bacd',1,'BVH::NodeT']]], + ['setnormal',['setNormal',['../classDcel_1_1VertexT.html#a3bffe6c4f0d0766cdd7a4bb3a6050cb4',1,'Dcel::VertexT']]], + ['setnumprimitives',['setNumPrimitives',['../classBVH_1_1LinearNodeT.html#a1a91e5f540da1b1bb85224db94cd53d8',1,'BVH::LinearNodeT']]], + ['setpairedge',['setPairEdge',['../classDcel_1_1EdgeT.html#ab9ef2366cf1d411444caf81d5159a3e1',1,'Dcel::EdgeT']]], + ['setparent',['setParent',['../classBVH_1_1NodeT.html#a92db0ab2d61c76469600478fddd04edc',1,'BVH::NodeT']]], + ['setposition',['setPosition',['../classDcel_1_1VertexT.html#a9c7d9a23275e5e3165eb8c6018b55a7e',1,'Dcel::VertexT']]], + ['setpreviousedge',['setPreviousEdge',['../classDcel_1_1EdgeT.html#af5aa7f27fe95ba4331259b4de927bb37',1,'Dcel::EdgeT']]], + ['setprimitives',['setPrimitives',['../classBVH_1_1NodeT.html#a2c9c3d3a83b3c1895c8f89b2bbd62e81',1,'BVH::NodeT']]], + ['setprimitivesoffset',['setPrimitivesOffset',['../classBVH_1_1LinearNodeT.html#ace68df1290bd44623c694e6b7ebdec6e',1,'BVH::LinearNodeT']]], + ['setsearchalgorithm',['setSearchAlgorithm',['../classDcel_1_1MeshT.html#abc7a2bd7632be06c0ad9cf49816d262f',1,'Dcel::MeshT']]], + ['settoregularnode',['setToRegularNode',['../classBVH_1_1NodeT.html#a8f9c409918d61b0d0ad3dd6e2b692443',1,'BVH::NodeT']]], + ['setvertex',['setVertex',['../classDcel_1_1EdgeT.html#a2611a8e0ae581ab8822f677d6d69edbd',1,'Dcel::EdgeT']]], + ['signeddistance',['signedDistance',['../classSphereSDF.html#a9b0c5f0b1af2c4b62bee1c873e0158e8',1,'SphereSDF::signedDistance()'],['../classBVH_1_1NodeT.html#aef7148b18296dce60853b5966c9f1e0d',1,'BVH::NodeT::signedDistance()'],['../classBVH_1_1LinearBVH.html#a383c6289251cf75ad9c4ed11cfb832ab',1,'BVH::LinearBVH::signedDistance()'],['../classDcel_1_1EdgeT.html#adba2d72aed5f510997d06c2bc9e6e96c',1,'Dcel::EdgeT::signedDistance()'],['../classDcel_1_1FaceT.html#a8ac718b0c9af797d34efcda43f38b6c0',1,'Dcel::FaceT::signedDistance()'],['../classDcel_1_1MeshT.html#aa6f614aa0d93c3345c10150168347497',1,'Dcel::MeshT::signedDistance(const Vec3 &a_x0) const noexcept'],['../classDcel_1_1MeshT.html#a4fa40378fbd4c31cd50e77da70ef30fd',1,'Dcel::MeshT::signedDistance(const Vec3 &a_x0, SearchAlgorithm a_algorithm) const noexcept'],['../classDcel_1_1VertexT.html#afce7ba8e2bbf81b158b43af2576c4dda',1,'Dcel::VertexT::signedDistance()'],['../classSignedDistanceFunction.html#af5912280ca51dc21a2d6949a30ec7d21',1,'SignedDistanceFunction::signedDistance()'],['../classUnion.html#a08beffd354ca261e3d31bcb453951810',1,'Union::signedDistance()'],['../classUnionBVH.html#a9681fdc161e2e077a33caaddb78fb4ba',1,'UnionBVH::signedDistance()']]], + ['signeddistancefunction',['SignedDistanceFunction',['../classSignedDistanceFunction.html#abfeeff9b3901e03ec6b73317dc9a722e',1,'SignedDistanceFunction']]], + ['spheresdf',['SphereSDF',['../classSphereSDF.html#a87b40869b91424d85692216a3268289b',1,'SphereSDF::SphereSDF()'],['../classSphereSDF.html#a3e555062b1b20c1729a9f4ab6136add4',1,'SphereSDF::SphereSDF(const Vec3T< T > &a_center, const T &a_radius, const bool a_flipInside)'],['../classSphereSDF.html#a2c25f14a19fcb910cd4d48af7123185a',1,'SphereSDF::SphereSDF(const SphereSDF &a_other)']]] +]; diff --git a/docs/doxygen/html/search/functions_f.html b/docs/doxygen/html/search/functions_f.html new file mode 100644 index 00000000..424126cd --- /dev/null +++ b/docs/doxygen/html/search/functions_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/functions_f.js b/docs/doxygen/html/search/functions_f.js new file mode 100644 index 00000000..83ad9eaa --- /dev/null +++ b/docs/doxygen/html/search/functions_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['topdownsortandpartitionprimitives',['topDownSortAndPartitionPrimitives',['../classBVH_1_1NodeT.html#acae5a575fa8b236de984fdd41e04c038',1,'BVH::NodeT']]], + ['transform',['transform',['../classTransformOp.html#a61c1920daa9f55fd2ea9095cbcfa18b8',1,'TransformOp::transform()'],['../classTranslateOp.html#a16941d9e52b02d39f9c92f6b23f61af6',1,'TranslateOp::transform()'],['../classScaleOp.html#ac09e64516daa1b75111bd36dedfeeda9',1,'ScaleOp::transform()'],['../classRotateOp.html#aaffc25806ef6b9d7ea6651aa2bb9767c',1,'RotateOp::transform()']]], + ['transformop',['TransformOp',['../classTransformOp.html#ab904cbdd373ca07e08b254163331b3b4',1,'TransformOp']]], + ['transformpoint',['transformPoint',['../classSignedDistanceFunction.html#af186f98f9ea4ac96fccb4add4ebf196d',1,'SignedDistanceFunction']]], + ['translate',['translate',['../classSignedDistanceFunction.html#add71ebc2e7f3fb5e85766898413482e7',1,'SignedDistanceFunction']]], + ['translateop',['TranslateOp',['../classTranslateOp.html#ab20f5a272d6cd34bf98fc23523913fc9',1,'TranslateOp::TranslateOp()'],['../classTranslateOp.html#ac646a47f26119d8316533c91f3043864',1,'TranslateOp::TranslateOp(const Vec3T< T > &a_translation)']]] +]; diff --git a/docs/doxygen/html/search/mag_sel.png b/docs/doxygen/html/search/mag_sel.png new file mode 100644 index 00000000..81f6040a Binary files /dev/null and b/docs/doxygen/html/search/mag_sel.png differ diff --git a/docs/doxygen/html/search/namespaces_0.html b/docs/doxygen/html/search/namespaces_0.html new file mode 100644 index 00000000..605ac452 --- /dev/null +++ b/docs/doxygen/html/search/namespaces_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/namespaces_0.js b/docs/doxygen/html/search/namespaces_0.js new file mode 100644 index 00000000..c56c3376 --- /dev/null +++ b/docs/doxygen/html/search/namespaces_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['boundingvolumes',['BoundingVolumes',['../namespaceBoundingVolumes.html',1,'']]], + ['bvh',['BVH',['../namespaceBVH.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/namespaces_1.html b/docs/doxygen/html/search/namespaces_1.html new file mode 100644 index 00000000..f093550a --- /dev/null +++ b/docs/doxygen/html/search/namespaces_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/namespaces_1.js b/docs/doxygen/html/search/namespaces_1.js new file mode 100644 index 00000000..8756a4cf --- /dev/null +++ b/docs/doxygen/html/search/namespaces_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dcel',['Dcel',['../namespaceDcel.html',1,'']]], + ['parser',['Parser',['../namespaceDcel_1_1Parser.html',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/namespaces_2.html b/docs/doxygen/html/search/namespaces_2.html new file mode 100644 index 00000000..1a1cbe16 --- /dev/null +++ b/docs/doxygen/html/search/namespaces_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/namespaces_2.js b/docs/doxygen/html/search/namespaces_2.js new file mode 100644 index 00000000..c2008210 --- /dev/null +++ b/docs/doxygen/html/search/namespaces_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ebgeometry',['EBGeometry',['../namespaceEBGeometry.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/nomatches.html b/docs/doxygen/html/search/nomatches.html new file mode 100644 index 00000000..b1ded27e --- /dev/null +++ b/docs/doxygen/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/docs/doxygen/html/search/pages_0.html b/docs/doxygen/html/search/pages_0.html new file mode 100644 index 00000000..4955b9e4 --- /dev/null +++ b/docs/doxygen/html/search/pages_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/pages_0.js b/docs/doxygen/html/search/pages_0.js new file mode 100644 index 00000000..b34782fb --- /dev/null +++ b/docs/doxygen/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ebgeometry',['EBGeometry',['../index.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/pages_1.html b/docs/doxygen/html/search/pages_1.html new file mode 100644 index 00000000..aedb14ee --- /dev/null +++ b/docs/doxygen/html/search/pages_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/pages_1.js b/docs/doxygen/html/search/pages_1.js new file mode 100644 index 00000000..441b2dec --- /dev/null +++ b/docs/doxygen/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['todo_20list',['Todo List',['../todo.html',1,'']]] +]; diff --git a/docs/doxygen/html/search/search.css b/docs/doxygen/html/search/search.css new file mode 100644 index 00000000..3cf9df94 --- /dev/null +++ b/docs/doxygen/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/doxygen/html/search/search.js b/docs/doxygen/html/search/search.js new file mode 100644 index 00000000..dedce3bf --- /dev/null +++ b/docs/doxygen/html/search/search.js @@ -0,0 +1,791 @@ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_0.js b/docs/doxygen/html/search/typedefs_0.js new file mode 100644 index 00000000..43faf326 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['buildernode',['BuilderNode',['../classUnionBVH.html#a9fd434576440274a81c0251962d7ff7e',1,'UnionBVH']]], + ['bvconstructor',['BVConstructor',['../classBVH_1_1NodeT.html#a2340f2466ed5b6eebab4bdc72004858e',1,'BVH::NodeT::BVConstructor()'],['../classUnionBVH.html#a09561e026cd6a7da1a7dbdbad5eea2c2',1,'UnionBVH::BVConstructor()']]], + ['bvconstructort',['BVConstructorT',['../namespaceBVH.html#a245702d7eff40cdaedb5dff68c25a88a',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/typedefs_1.html b/docs/doxygen/html/search/typedefs_1.html new file mode 100644 index 00000000..b77c5338 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_1.js b/docs/doxygen/html/search/typedefs_1.js new file mode 100644 index 00000000..30f75221 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['edge',['Edge',['../classDcel_1_1EdgeT.html#a00184663a9d069d2c7a7e0a970f71fd5',1,'Dcel::EdgeT::Edge()'],['../classDcel_1_1FaceT.html#a32a6b328d61bd2739fd840b892833c41',1,'Dcel::FaceT::Edge()'],['../classDcel_1_1EdgeIteratorT.html#ab65ac3b39da5eeb9e3e795f62647ac0b',1,'Dcel::EdgeIteratorT::Edge()'],['../classDcel_1_1MeshT.html#a94f5c42e6f80fd948ebbc294d948ffab',1,'Dcel::MeshT::Edge()'],['../classDcel_1_1Parser_1_1PLY.html#af3741c96a8a8434780665641912ff1d4',1,'Dcel::Parser::PLY::Edge()'],['../classDcel_1_1VertexT.html#abe1079747424916a164ec68b46333fc3',1,'Dcel::VertexT::Edge()']]], + ['edgeiterator',['EdgeIterator',['../classDcel_1_1EdgeT.html#ad55f43bd1061c5ab99c80005861d5bcf',1,'Dcel::EdgeT::EdgeIterator()'],['../classDcel_1_1FaceT.html#afcd6f529cb59cd3dc358d6da52de54a1',1,'Dcel::FaceT::EdgeIterator()'],['../classDcel_1_1Parser_1_1PLY.html#aa0a9888ee0a1539928e6c1ffdda299a8',1,'Dcel::Parser::PLY::EdgeIterator()'],['../classDcel_1_1VertexT.html#abf182ec635351e107cd474df25b6ba73',1,'Dcel::VertexT::EdgeIterator()']]], + ['edgeptr',['EdgePtr',['../classDcel_1_1EdgeT.html#af525f4228d820f6b8b23fc02d937e4c8',1,'Dcel::EdgeT::EdgePtr()'],['../classDcel_1_1FaceT.html#a0f3448c4cf108341e48029b8040c7cec',1,'Dcel::FaceT::EdgePtr()'],['../classDcel_1_1EdgeIteratorT.html#a75d19cf89d4ac007483aa8124482513b',1,'Dcel::EdgeIteratorT::EdgePtr()'],['../classDcel_1_1MeshT.html#ab2b035530536a8bc56e40aab455f24e3',1,'Dcel::MeshT::EdgePtr()'],['../classDcel_1_1VertexT.html#a7c049a24ac43b9750578e4f4ed543831',1,'Dcel::VertexT::EdgePtr()']]] +]; diff --git a/docs/doxygen/html/search/typedefs_2.html b/docs/doxygen/html/search/typedefs_2.html new file mode 100644 index 00000000..076311dc --- /dev/null +++ b/docs/doxygen/html/search/typedefs_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_2.js b/docs/doxygen/html/search/typedefs_2.js new file mode 100644 index 00000000..eb069ddf --- /dev/null +++ b/docs/doxygen/html/search/typedefs_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['face',['Face',['../classDcel_1_1EdgeT.html#a46456b8f418abc6f09154e8e0d398e37',1,'Dcel::EdgeT::Face()'],['../classDcel_1_1FaceT.html#a01d61241adc3c536c364084740b8c6da',1,'Dcel::FaceT::Face()'],['../classDcel_1_1EdgeIteratorT.html#a59cc24c2a7a6a12c5c60bc04b0ac7497',1,'Dcel::EdgeIteratorT::Face()'],['../classDcel_1_1MeshT.html#ac1fcce96c65811660619af9eb32589f9',1,'Dcel::MeshT::Face()'],['../classDcel_1_1Parser_1_1PLY.html#ac67854dee5613f4e877e8caddb4580f3',1,'Dcel::Parser::PLY::Face()'],['../classDcel_1_1VertexT.html#a455510a8591a4e0f235b2049deb96e08',1,'Dcel::VertexT::Face()']]], + ['faceptr',['FacePtr',['../classDcel_1_1EdgeT.html#a97dd9849ea4a21223095f852e48e36e8',1,'Dcel::EdgeT::FacePtr()'],['../classDcel_1_1FaceT.html#a4c7f99f7e30983c04a9d0b2f7ca40736',1,'Dcel::FaceT::FacePtr()'],['../classDcel_1_1EdgeIteratorT.html#a99deb9b82e268cf8fd1f7c0b94fea339',1,'Dcel::EdgeIteratorT::FacePtr()'],['../classDcel_1_1MeshT.html#a6c71642a9e6b36f9d6ab6027035625f0',1,'Dcel::MeshT::FacePtr()'],['../classDcel_1_1VertexT.html#a5acb4c66c49319683c71f52e56ad8e8a',1,'Dcel::VertexT::FacePtr()']]] +]; diff --git a/docs/doxygen/html/search/typedefs_3.html b/docs/doxygen/html/search/typedefs_3.html new file mode 100644 index 00000000..a4a727ff --- /dev/null +++ b/docs/doxygen/html/search/typedefs_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_3.js b/docs/doxygen/html/search/typedefs_3.js new file mode 100644 index 00000000..9c24102c --- /dev/null +++ b/docs/doxygen/html/search/typedefs_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['linearnode',['LinearNode',['../classBVH_1_1LinearBVH.html#ad8c5e4f84138090dbd408a075dc91896',1,'BVH::LinearBVH::LinearNode()'],['../classUnionBVH.html#a25cac5a9dc5396299f06399434ebe212',1,'UnionBVH::LinearNode()']]] +]; diff --git a/docs/doxygen/html/search/typedefs_4.html b/docs/doxygen/html/search/typedefs_4.html new file mode 100644 index 00000000..be033cd1 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_4.js b/docs/doxygen/html/search/typedefs_4.js new file mode 100644 index 00000000..3f5329e2 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mesh',['Mesh',['../classDcel_1_1MeshT.html#abe9db973f4510ccb36e20ecfa9223926',1,'Dcel::MeshT::Mesh()'],['../classDcel_1_1Parser_1_1PLY.html#a047f135a59b43a0fb84f3629a790bba4',1,'Dcel::Parser::PLY::Mesh()']]] +]; diff --git a/docs/doxygen/html/search/typedefs_5.html b/docs/doxygen/html/search/typedefs_5.html new file mode 100644 index 00000000..e10c325b --- /dev/null +++ b/docs/doxygen/html/search/typedefs_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_5.js b/docs/doxygen/html/search/typedefs_5.js new file mode 100644 index 00000000..8c9e82ca --- /dev/null +++ b/docs/doxygen/html/search/typedefs_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['node',['Node',['../classBVH_1_1NodeT.html#ac52d9b56f082002c7f8be91062c40ff8',1,'BVH::NodeT']]], + ['nodeptr',['NodePtr',['../classBVH_1_1NodeT.html#a008f5c2c53adb1f5730d8478b48529b1',1,'BVH::NodeT']]] +]; diff --git a/docs/doxygen/html/search/typedefs_6.html b/docs/doxygen/html/search/typedefs_6.html new file mode 100644 index 00000000..4e206e87 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_6.js b/docs/doxygen/html/search/typedefs_6.js new file mode 100644 index 00000000..40c8fbdb --- /dev/null +++ b/docs/doxygen/html/search/typedefs_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['partitioner',['Partitioner',['../classBVH_1_1NodeT.html#a3bb028655b8b961fa35109af1c14f281',1,'BVH::NodeT']]], + ['partitionert',['PartitionerT',['../namespaceBVH.html#a7c33d54da9893d506709b2ca96b76f55',1,'BVH']]], + ['primitivelist',['PrimitiveList',['../classBVH_1_1NodeT.html#a19cce6e7fbe85eccb4a3718dd69f49b7',1,'BVH::NodeT::PrimitiveList()'],['../classBVH_1_1LinearBVH.html#a94ee5da1670e2ef85eeabf7cf6a2da92',1,'BVH::LinearBVH::PrimitiveList()'],['../namespaceDcel.html#a69f60bf0111d66715bf4f7a8e22645e6',1,'Dcel::PrimitiveList()']]], + ['primitivelistt',['PrimitiveListT',['../namespaceBVH.html#aa1e753bda451b85cd5b948722a2ad7c7',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/typedefs_7.html b/docs/doxygen/html/search/typedefs_7.html new file mode 100644 index 00000000..cc182ee6 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_7.js b/docs/doxygen/html/search/typedefs_7.js new file mode 100644 index 00000000..c986dfc1 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['sdf',['SDF',['../classUnion.html#a9e9d1d95ae54fa471c6f29e778239021',1,'Union::SDF()'],['../classUnionBVH.html#a5d1d64d7cabf1000fc1a804d06e103cc',1,'UnionBVH::SDF()']]], + ['sdflist',['SDFList',['../classUnionBVH.html#ac23ace50239fbe00130df2a7e42af995',1,'UnionBVH']]], + ['stopfunction',['StopFunction',['../classBVH_1_1NodeT.html#acbe56195affc439febe8aca84db308e3',1,'BVH::NodeT']]], + ['stopfunctiont',['StopFunctionT',['../namespaceBVH.html#afef1c5979c34a11d23b756cc09654bf9',1,'BVH']]] +]; diff --git a/docs/doxygen/html/search/typedefs_8.html b/docs/doxygen/html/search/typedefs_8.html new file mode 100644 index 00000000..9379676b --- /dev/null +++ b/docs/doxygen/html/search/typedefs_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/typedefs_8.js b/docs/doxygen/html/search/typedefs_8.js new file mode 100644 index 00000000..5de6aa48 --- /dev/null +++ b/docs/doxygen/html/search/typedefs_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['vec2',['Vec2',['../classDcel_1_1Polygon2D.html#ab70ec33cb6418fa0204f0d951dfd01fb',1,'Dcel::Polygon2D']]], + ['vec3',['Vec3',['../classBoundingVolumes_1_1BoundingSphereT.html#ad89ed315255abcde216e9ca1de3068ab',1,'BoundingVolumes::BoundingSphereT::Vec3()'],['../classBoundingVolumes_1_1AABBT.html#aa968c6b21a7f02e1cbfc03d26c7e67b4',1,'BoundingVolumes::AABBT::Vec3()'],['../classBVH_1_1NodeT.html#a6fbb4308c5c55ee170c5f992df7ae1d0',1,'BVH::NodeT::Vec3()'],['../classBVH_1_1LinearNodeT.html#a073e87d51d44b4cc243c8f90690247a6',1,'BVH::LinearNodeT::Vec3()'],['../classBVH_1_1LinearBVH.html#a13b0083e8b7ff1a5e170d39d69e6a15a',1,'BVH::LinearBVH::Vec3()'],['../classDcel_1_1EdgeT.html#a93b8679cea557c419af44385ca6d356a',1,'Dcel::EdgeT::Vec3()'],['../classDcel_1_1FaceT.html#ade9c182834ec6f18a0e17b8140308db2',1,'Dcel::FaceT::Vec3()'],['../classDcel_1_1MeshT.html#a646c5d8f66b3079bca35fe4186493627',1,'Dcel::MeshT::Vec3()'],['../classDcel_1_1Polygon2D.html#a46e9686210f09464e8f5ad13300717b9',1,'Dcel::Polygon2D::Vec3()'],['../classDcel_1_1VertexT.html#a6e073dc7426756edef5594816be6e7c7',1,'Dcel::VertexT::Vec3()']]], + ['vertex',['Vertex',['../classDcel_1_1EdgeT.html#a2409bc47d421bbea1c091fb6b15da271',1,'Dcel::EdgeT::Vertex()'],['../classDcel_1_1FaceT.html#acf33f51e5402ed6bf811521b138121b9',1,'Dcel::FaceT::Vertex()'],['../classDcel_1_1EdgeIteratorT.html#a4ca07f27da7faf50db5dbd1f20bbcafb',1,'Dcel::EdgeIteratorT::Vertex()'],['../classDcel_1_1MeshT.html#a58b357c4ad94f4a4b813ed7ebf01cd05',1,'Dcel::MeshT::Vertex()'],['../classDcel_1_1Parser_1_1PLY.html#acbecc13804a702a6bf2687d9bf5d7989',1,'Dcel::Parser::PLY::Vertex()'],['../classDcel_1_1VertexT.html#a2c8a221a9f03e9bafa891bd0759b4f8f',1,'Dcel::VertexT::Vertex()']]], + ['vertexptr',['VertexPtr',['../classDcel_1_1EdgeT.html#ab4ba57cfc6b2f90da43096eea87bb284',1,'Dcel::EdgeT::VertexPtr()'],['../classDcel_1_1FaceT.html#a9c22745bf7351c3bfba27d5816a50deb',1,'Dcel::FaceT::VertexPtr()'],['../classDcel_1_1EdgeIteratorT.html#ac6f7324622a089d17c5b66eb0be679f0',1,'Dcel::EdgeIteratorT::VertexPtr()'],['../classDcel_1_1MeshT.html#a1e0abeadcb51e679b0dd9a36e2ee08c7',1,'Dcel::MeshT::VertexPtr()'],['../classDcel_1_1VertexT.html#aa7d02695a42762b98a66c559e6d3d849',1,'Dcel::VertexT::VertexPtr()']]] +]; diff --git a/docs/doxygen/html/search/variables_0.html b/docs/doxygen/html/search/variables_0.html new file mode 100644 index 00000000..74ce8072 --- /dev/null +++ b/docs/doxygen/html/search/variables_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/variables_0.js b/docs/doxygen/html/search/variables_0.js new file mode 100644 index 00000000..5ecb89ac --- /dev/null +++ b/docs/doxygen/html/search/variables_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['defaultbvconstructor',['defaultBVConstructor',['../namespaceDcel.html#a628449c42ce3f2784ca018f2a3c88a11',1,'Dcel']]], + ['defaultstopfunction',['defaultStopFunction',['../namespaceDcel.html#a45e9f2554a8d9ea01164cd51f787f989',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/variables_1.html b/docs/doxygen/html/search/variables_1.html new file mode 100644 index 00000000..84237b6e --- /dev/null +++ b/docs/doxygen/html/search/variables_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/variables_1.js b/docs/doxygen/html/search/variables_1.js new file mode 100644 index 00000000..6d270f0d --- /dev/null +++ b/docs/doxygen/html/search/variables_1.js @@ -0,0 +1,51 @@ +var searchData= +[ + ['m_5falgorithm',['m_algorithm',['../classDcel_1_1MeshT.html#aaa5bdf8df02aa8bcff84203467f86fbe',1,'Dcel::MeshT']]], + ['m_5farea',['m_area',['../classDcel_1_1FaceT.html#a572c463c60afb896c8cec667c964631f',1,'Dcel::FaceT']]], + ['m_5faxis',['m_axis',['../classRotateOp.html#ae0f4b6879b2b86506b4a528d7e627255',1,'RotateOp']]], + ['m_5fboundingvolume',['m_boundingVolume',['../classBVH_1_1NodeT.html#a7f8720f2ab03ee9e81de114c479cb2e5',1,'BVH::NodeT::m_boundingVolume()'],['../classBVH_1_1LinearNodeT.html#acef96b811ea69cd649fda35da082b361',1,'BVH::LinearNodeT::m_boundingVolume()']]], + ['m_5fcenter',['m_center',['../classSphereSDF.html#ab3caacb26a72b3ada01f09a248f5cb83',1,'SphereSDF::m_center()'],['../classBoundingVolumes_1_1BoundingSphereT.html#ad65d5be68c4028651d959dc8b88fe944',1,'BoundingVolumes::BoundingSphereT::m_center()']]], + ['m_5fcentroid',['m_centroid',['../classDcel_1_1FaceT.html#a9a85e2c47be9ac4bbfe8620bc0773d6d',1,'Dcel::FaceT']]], + ['m_5fchildoffsets',['m_childOffsets',['../classBVH_1_1LinearNodeT.html#a2a160d04d0bea69de7eb949fd9d56dda',1,'BVH::LinearNodeT']]], + ['m_5fchildren',['m_children',['../classBVH_1_1NodeT.html#a35da0576176a01c9c441f0f2b899ca33',1,'BVH::NodeT']]], + ['m_5fcosangle',['m_cosAngle',['../classRotateOp.html#a8eed86f336946618f1964056405b9ac4',1,'RotateOp']]], + ['m_5fcuredge',['m_curEdge',['../classDcel_1_1EdgeIteratorT.html#afcebe87fbd158d212d7ba0a6b01efa8c',1,'Dcel::EdgeIteratorT']]], + ['m_5fdepth',['m_depth',['../classBVH_1_1NodeT.html#a8b924aa0aa13630167f69a7b19038e7e',1,'BVH::NodeT']]], + ['m_5fdistancefunctions',['m_distanceFunctions',['../classUnion.html#a5d2f543272ab5fe25f6f5945ad1ef27f',1,'Union::m_distanceFunctions()'],['../classUnionBVH.html#a026a103a13d0b04bedb6dabd50e4da69',1,'UnionBVH::m_distanceFunctions()']]], + ['m_5fedges',['m_edges',['../classDcel_1_1FaceT.html#a9228b5f27e1aa5c9eea36a7c27462e6c',1,'Dcel::FaceT::m_edges()'],['../classDcel_1_1MeshT.html#a3325cb09037fa32255aa1a8a5536e473',1,'Dcel::MeshT::m_edges()']]], + ['m_5fface',['m_face',['../classDcel_1_1EdgeT.html#a47aaa6dbeeb6a56f1c7b6d73b2119761',1,'Dcel::EdgeT']]], + ['m_5ffaces',['m_faces',['../classDcel_1_1MeshT.html#a17e08b2ee4b5b7b1dc3df974e792ca5f',1,'Dcel::MeshT::m_faces()'],['../classDcel_1_1VertexT.html#ad0a8f9c1015b62c891ad2d877d6b8802',1,'Dcel::VertexT::m_faces()']]], + ['m_5fflipinside',['m_flipInside',['../classSphereSDF.html#a9a32a668648c166b41c5d1c3981c9579',1,'SphereSDF']]], + ['m_5fflipsign',['m_flipSign',['../classUnion.html#a53b9705419030572836a540e7fa3752f',1,'Union::m_flipSign()'],['../classUnionBVH.html#a0782d93bd0a7bff7580a99e6fef285c7',1,'UnionBVH::m_flipSign()']]], + ['m_5ffullloop',['m_fullLoop',['../classDcel_1_1EdgeIteratorT.html#a39560da0f4479c53ed27c38bdfab7c21',1,'Dcel::EdgeIteratorT']]], + ['m_5fhalfedge',['m_halfEdge',['../classDcel_1_1FaceT.html#afe66c3d93bb0ea04d9a0d263b2927bd3',1,'Dcel::FaceT']]], + ['m_5fhicorner',['m_hiCorner',['../classBoundingVolumes_1_1AABBT.html#a35f9498191e406b3f48f7454bfdf0cf7',1,'BoundingVolumes::AABBT']]], + ['m_5finvlen2',['m_invLen2',['../classDcel_1_1EdgeT.html#a3689615754e3bdafb12109d5b82183a7',1,'Dcel::EdgeT']]], + ['m_5fisgood',['m_isGood',['../classUnionBVH.html#a2c3a008bd61f225a83c959f2280b9649',1,'UnionBVH']]], + ['m_5fitermode',['m_iterMode',['../classDcel_1_1EdgeIteratorT.html#aa0c8a35a18d668927dd966ddd9620ce5',1,'Dcel::EdgeIteratorT']]], + ['m_5flinearnodes',['m_linearNodes',['../classBVH_1_1LinearBVH.html#aa6b833445964d75b5b560ece4548a044',1,'BVH::LinearBVH']]], + ['m_5flocorner',['m_loCorner',['../classBoundingVolumes_1_1AABBT.html#a5cbd0ee374c62951aa58644bc09f70cf',1,'BoundingVolumes::AABBT']]], + ['m_5fnextedge',['m_nextEdge',['../classDcel_1_1EdgeT.html#a26de8e8184c0a6656a2cee2af1bc0230',1,'Dcel::EdgeT']]], + ['m_5fnodetype',['m_nodeType',['../classBVH_1_1NodeT.html#a1e8922fc8cfca32763a7fcb85d9a9508',1,'BVH::NodeT']]], + ['m_5fnormal',['m_normal',['../classDcel_1_1EdgeT.html#af44c33f8b5b0a3d45cd4a83e6fde4db5',1,'Dcel::EdgeT::m_normal()'],['../classDcel_1_1FaceT.html#a886ee24ddf3dae99b836b39183a412ba',1,'Dcel::FaceT::m_normal()'],['../classDcel_1_1VertexT.html#a509216af6d1d2ca84d1d774b4a6c7659',1,'Dcel::VertexT::m_normal()']]], + ['m_5fnumprimitives',['m_numPrimitives',['../classBVH_1_1LinearNodeT.html#a59a4aff1eeac58606f4854e334e10a17',1,'BVH::LinearNodeT']]], + ['m_5foutgoingedge',['m_outgoingEdge',['../classDcel_1_1VertexT.html#ab02281ef4c214c2ea5567dae97864846',1,'Dcel::VertexT']]], + ['m_5fpairedge',['m_pairEdge',['../classDcel_1_1EdgeT.html#a5c3bc15e1360b931231cac396493f5b6',1,'Dcel::EdgeT']]], + ['m_5fparent',['m_parent',['../classBVH_1_1NodeT.html#abf7f5d4808d0662f2ee0ae07a4bcddca',1,'BVH::NodeT']]], + ['m_5fpoly2',['m_poly2',['../classDcel_1_1FaceT.html#a77edb4eca91bcd6fb47ce3574c11b840',1,'Dcel::FaceT']]], + ['m_5fpoly2algorithm',['m_poly2Algorithm',['../classDcel_1_1FaceT.html#acc53b6246f9d5d57777789aad6084d14',1,'Dcel::FaceT']]], + ['m_5fposition',['m_position',['../classDcel_1_1VertexT.html#a1980e54dcfd5cefdebac129580028015',1,'Dcel::VertexT']]], + ['m_5fpreviousedge',['m_previousEdge',['../classDcel_1_1EdgeT.html#a77d21fbad704f8aa84aeddeaff1532fd',1,'Dcel::EdgeT']]], + ['m_5fprimitives',['m_primitives',['../classBVH_1_1NodeT.html#abcdc79254bc8b9d227a70e1ad15ff35e',1,'BVH::NodeT::m_primitives()'],['../classBVH_1_1LinearBVH.html#a82d8ebdc93553c7b02fe4da77329a4c2',1,'BVH::LinearBVH::m_primitives()']]], + ['m_5fprimitivesoffset',['m_primitivesOffset',['../classBVH_1_1LinearNodeT.html#a05efc0076443c7131187adfadaad81ea',1,'BVH::LinearNodeT']]], + ['m_5fradius',['m_radius',['../classSphereSDF.html#ac4b0f786ea2b53530512ce3fa4e7bdbd',1,'SphereSDF::m_radius()'],['../classBoundingVolumes_1_1BoundingSphereT.html#adb424c867ed93cf5fdb62afe07a96a05',1,'BoundingVolumes::BoundingSphereT::m_radius()']]], + ['m_5frootnode',['m_rootNode',['../classUnionBVH.html#ad59be4f96e0f020c28f4677dcb94a004',1,'UnionBVH']]], + ['m_5fscale',['m_scale',['../classScaleOp.html#aa9cdfff381b10970fd51eeb7e3e83188',1,'ScaleOp']]], + ['m_5fsinangle',['m_sinAngle',['../classRotateOp.html#ab0f3316357239d07fb1da64b7298d53f',1,'RotateOp']]], + ['m_5fstartedge',['m_startEdge',['../classDcel_1_1EdgeIteratorT.html#a39c525d750868014457cdf06a40455bd',1,'Dcel::EdgeIteratorT']]], + ['m_5ftransformops',['m_transformOps',['../classSignedDistanceFunction.html#af61e5e2ece6add9d2bcf8e5aa8cf2844',1,'SignedDistanceFunction']]], + ['m_5ftranslation',['m_translation',['../classTranslateOp.html#a35f16c6a9cf4c03edffa19d86e73d27a',1,'TranslateOp']]], + ['m_5fvertex',['m_vertex',['../classDcel_1_1EdgeT.html#a30813ecada33723cc466e0cd1d24abd4',1,'Dcel::EdgeT']]], + ['m_5fvertices',['m_vertices',['../classDcel_1_1MeshT.html#a4263fd9ebba22b96e12ee9f046eca089',1,'Dcel::MeshT']]], + ['m_5fx2x1',['m_x2x1',['../classDcel_1_1EdgeT.html#af70e7b85effe62dd804638984b15695a',1,'Dcel::EdgeT']]] +]; diff --git a/docs/doxygen/html/search/variables_2.html b/docs/doxygen/html/search/variables_2.html new file mode 100644 index 00000000..5c9de1aa --- /dev/null +++ b/docs/doxygen/html/search/variables_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/variables_2.js b/docs/doxygen/html/search/variables_2.js new file mode 100644 index 00000000..8c50efb5 --- /dev/null +++ b/docs/doxygen/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['primitivesperleafnode',['primitivesPerLeafNode',['../namespaceDcel.html#a4db11eb50441e7c4e6c3ae796a202024',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/variables_3.html b/docs/doxygen/html/search/variables_3.html new file mode 100644 index 00000000..f95e34c6 --- /dev/null +++ b/docs/doxygen/html/search/variables_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/variables_3.js b/docs/doxygen/html/search/variables_3.js new file mode 100644 index 00000000..736a24b3 --- /dev/null +++ b/docs/doxygen/html/search/variables_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['spatialsplitbinarypartitioner',['spatialSplitBinaryPartitioner',['../namespaceDcel.html#a08217ffcd4cfc6f58a3b0b3f780fc611',1,'Dcel']]], + ['spatialsplitpartitioner',['spatialSplitPartitioner',['../namespaceDcel.html#ab4f869248e23d47bb01ad06c76288fef',1,'Dcel']]] +]; diff --git a/docs/doxygen/html/search/variables_4.html b/docs/doxygen/html/search/variables_4.html new file mode 100644 index 00000000..d7db285e --- /dev/null +++ b/docs/doxygen/html/search/variables_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/variables_4.js b/docs/doxygen/html/search/variables_4.js new file mode 100644 index 00000000..a27555a4 --- /dev/null +++ b/docs/doxygen/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x',['X',['../classVec3T.html#a0643a9f9a68edf5d4656f2e613c9624f',1,'Vec3T::X()'],['../classVec2T.html#a66ea295b52114b22de1f76cce1aa7f51',1,'Vec2T::x()']]] +]; diff --git a/docs/doxygen/html/search/variables_5.html b/docs/doxygen/html/search/variables_5.html new file mode 100644 index 00000000..7bbceeb0 --- /dev/null +++ b/docs/doxygen/html/search/variables_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/docs/doxygen/html/search/variables_5.js b/docs/doxygen/html/search/variables_5.js new file mode 100644 index 00000000..c7b08612 --- /dev/null +++ b/docs/doxygen/html/search/variables_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['y',['y',['../classVec2T.html#a71ce5251d618a6dbd4e0e7a0f867b6cf',1,'Vec2T']]] +]; diff --git a/docs/doxygen/html/splitbar.png b/docs/doxygen/html/splitbar.png new file mode 100644 index 00000000..fe895f2c Binary files /dev/null and b/docs/doxygen/html/splitbar.png differ diff --git a/docs/doxygen/html/sync_off.png b/docs/doxygen/html/sync_off.png new file mode 100644 index 00000000..3b443fc6 Binary files /dev/null and b/docs/doxygen/html/sync_off.png differ diff --git a/docs/doxygen/html/sync_on.png b/docs/doxygen/html/sync_on.png new file mode 100644 index 00000000..e08320fb Binary files /dev/null and b/docs/doxygen/html/sync_on.png differ diff --git a/docs/doxygen/html/tab_a.png b/docs/doxygen/html/tab_a.png new file mode 100644 index 00000000..3b725c41 Binary files /dev/null and b/docs/doxygen/html/tab_a.png differ diff --git a/docs/doxygen/html/tab_b.png b/docs/doxygen/html/tab_b.png new file mode 100644 index 00000000..e2b4a863 Binary files /dev/null and b/docs/doxygen/html/tab_b.png differ diff --git a/docs/doxygen/html/tab_h.png b/docs/doxygen/html/tab_h.png new file mode 100644 index 00000000..fd5cb705 Binary files /dev/null and b/docs/doxygen/html/tab_h.png differ diff --git a/docs/doxygen/html/tab_s.png b/docs/doxygen/html/tab_s.png new file mode 100644 index 00000000..ab478c95 Binary files /dev/null and b/docs/doxygen/html/tab_s.png differ diff --git a/docs/doxygen/html/tabs.css b/docs/doxygen/html/tabs.css new file mode 100644 index 00000000..bbde11ed --- /dev/null +++ b/docs/doxygen/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:transparent}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/docs/doxygen/html/todo.html b/docs/doxygen/html/todo.html new file mode 100644 index 00000000..b445e123 --- /dev/null +++ b/docs/doxygen/html/todo.html @@ -0,0 +1,80 @@ + + + + + + + +EBGeometry: Todo List + + + + + + + + + +
+
+ + + + + + +
+
EBGeometry +  1.0 +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Todo List
+
+
+
+
Class BVH::LinearNodeT< T, P, BV, K >
+
There's a minor optimization that can be made to the memory alignment, which is as follows: For a leaf node we never really need the m_childOffsets array, and for a regular node we never really need the m_primitivesOffset member. Moreover, m_childOffsets could be made into a K-1 sized array because we happen to know that the linearized hierarchy will store the first child node immediately after the regular node. We could shave off 16 bytes of storage, which would mean that a double-precision binary tree only takes up one word of CPU memory.
+
File EBGeometry_DcelEdgeImplem.hpp
+
Include m_face in constructors
+
+
+ + + + diff --git a/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp.tex b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp.tex new file mode 100644 index 00000000..76f0d967 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp.tex @@ -0,0 +1,38 @@ +\hypertarget{EBGeometry__AnalyticDistanceFunctions_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.hpp File Reference} +\label{EBGeometry__AnalyticDistanceFunctions_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp}} + + +Declaration of various analytic distance functions. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__AnalyticDistanceFunctions_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=245pt]{EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classSphereSDF}{Sphere\+S\+D\+F$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Signed distance field for sphere. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of various analytic distance functions. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.md5 new file mode 100644 index 00000000..a2c810cf --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +bf6106d9605692f53ae8ba3a94ac270a \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.pdf new file mode 100644 index 00000000..87605d44 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.md5 new file mode 100644 index 00000000..52066f7f --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.md5 @@ -0,0 +1 @@ +d70f9b7a3f936b212cce5305fbff8ea8 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.pdf new file mode 100644 index 00000000..36736f68 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__AnalyticDistanceFunctions_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp.tex new file mode 100644 index 00000000..636ea03e --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp.tex @@ -0,0 +1,37 @@ +\hypertarget{EBGeometry__BVHImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.hpp File Reference} +\label{EBGeometry__BVHImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__BVHImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=315pt]{EBGeometry__BVHImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceBVH}{B\+VH} +\begin{DoxyCompactList}\small\item\em Namespace for various bounding volume heirarchy (\hyperlink{namespaceBVH}{B\+VH}) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..1d11ec32 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +b793671991858b4fe403fca272941011 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..70eda872 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__incl.md5 new file mode 100644 index 00000000..f61caebd --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +4fde890d264fff7f58b19b12f5d072e1 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__incl.pdf new file mode 100644 index 00000000..6bb8ef52 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BVHImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BVH_8hpp.tex b/docs/doxygen/latex/EBGeometry__BVH_8hpp.tex new file mode 100644 index 00000000..2abf9eb0 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BVH_8hpp.tex @@ -0,0 +1,84 @@ +\hypertarget{EBGeometry__BVH_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+B\+VH.hpp File Reference} +\label{EBGeometry__BVH_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}} + + +Declaration of a bounding volume hierarchy (\hyperlink{namespaceBVH}{B\+VH}) class. + + +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$functional$>$}\newline +{\ttfamily \#include $<$queue$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__BVH_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__BVH_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+Node\+T$<$ T, P, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Forward declare the \hyperlink{namespaceBVH}{B\+VH} node since it is needed for the polymorphic lambdas. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+Node\+T$<$ T, P, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Forward declare linear node class. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1LinearBVH}{B\+V\+H\+::\+Linear\+B\+V\+H$<$ T, P, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Forward declare linear \hyperlink{namespaceBVH}{B\+VH} class. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+Node\+T$<$ T, P, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Forward declare the \hyperlink{namespaceBVH}{B\+VH} node since it is needed for the polymorphic lambdas. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+Node\+T$<$ T, P, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Forward declare linear node class. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1LinearBVH}{B\+V\+H\+::\+Linear\+B\+V\+H$<$ T, P, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Forward declare linear \hyperlink{namespaceBVH}{B\+VH} class. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceBVH}{B\+VH} +\begin{DoxyCompactList}\small\item\em Namespace for various bounding volume heirarchy (\hyperlink{namespaceBVH}{B\+VH}) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Typedefs} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}\label{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}} +{\footnotesize template$<$class P $>$ }\\using \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{B\+V\+H\+::\+Primitive\+ListT} = std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , class P , class BV , int K$>$ }\\using \hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{B\+V\+H\+::\+Stop\+FunctionT} = std\+::function$<$ bool(const NodeT$<$ T, P, BV, K $>$ \&a\+\_\+node)$>$ +\begin{DoxyCompactList}\small\item\em Stop function for deciding when a \hyperlink{namespaceBVH}{B\+VH} node can\textquotesingle{}t be divided into sub-\/volumes. \end{DoxyCompactList}\item +{\footnotesize template$<$class P , int K$>$ }\\using \hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT} = std\+::function$<$ std\+::array$<$ Primitive\+ListT$<$ P $>$, K $>$(const Primitive\+ListT$<$ P $>$ \&a\+\_\+primitives)$>$ +\begin{DoxyCompactList}\small\item\em Polymorphic partitioner for splitting a list of primitives into K new lists of primitives. \end{DoxyCompactList}\item +{\footnotesize template$<$class P , class BV $>$ }\\using \hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+H\+::\+B\+V\+ConstructorT} = std\+::function$<$ BV(const std\+::shared\+\_\+ptr$<$ const P $>$ \&a\+\_\+primitive)$>$ +\begin{DoxyCompactList}\small\item\em Constructor method for creating bounding volumes from a list of primitives. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Enumerations} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}\label{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}} +enum \hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{B\+V\+H\+::\+Node\+Type} \+: bool \{ {\bfseries Regular}, +{\bfseries Leaf} + \}\begin{DoxyCompactList}\small\item\em Enum for determining if a \hyperlink{namespaceBVH}{B\+VH} node is a leaf or a regular node (only leaf nodes contain data) \end{DoxyCompactList} +\item +\mbox{\Hypertarget{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}\label{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}} +enum \hyperlink{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}{B\+V\+H\+::\+Prune} \{ {\bfseries Ordered}, +{\bfseries Ordered2}, +{\bfseries Unordered}, +{\bfseries Unordered2} + \}\begin{DoxyCompactList}\small\item\em Typename for identifying algorithms used in subtree pruning. \end{DoxyCompactList} +\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a bounding volume hierarchy (\hyperlink{namespaceBVH}{B\+VH}) class. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__BVH_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__BVH_8hpp__dep__incl.md5 new file mode 100644 index 00000000..3a5e85b6 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BVH_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +64c3ebb8c67862100ea06c02db883982 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BVH_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__BVH_8hpp__dep__incl.pdf new file mode 100644 index 00000000..056c365d Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BVH_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BVH_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__BVH_8hpp__incl.md5 new file mode 100644 index 00000000..2fd78181 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BVH_8hpp__incl.md5 @@ -0,0 +1 @@ +6053e310009f47ce19e07725bdd5ac3c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BVH_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__BVH_8hpp__incl.pdf new file mode 100644 index 00000000..422149dc Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BVH_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp.tex new file mode 100644 index 00000000..19162baa --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp.tex @@ -0,0 +1,49 @@ +\hypertarget{EBGeometry__BoundingVolumesImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.hpp File Reference} +\label{EBGeometry__BoundingVolumesImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}. + + +{\ttfamily \#include $<$iostream$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__BoundingVolumesImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=232pt]{EBGeometry__BoundingVolumesImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceBoundingVolumes}{Bounding\+Volumes} +\begin{DoxyCompactList}\small\item\em Namespace for encapsulating various bounding volumes for usage with B\+V\+Hs. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Functions} +\begin{DoxyCompactItemize} +\item +{\footnotesize template$<$class T $>$ }\\bool \hyperlink{namespaceBoundingVolumes_af35f33c5f319a466550d9ad1040beced}{Bounding\+Volumes\+::intersects} (const Bounding\+SphereT$<$ T $>$ \&a\+\_\+u, const Bounding\+SphereT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Intersection method for testing if two bounding spheres overlap. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\bool \hyperlink{namespaceBoundingVolumes_a5c360ccd42017c01acbe1caf2cfd1efe}{Bounding\+Volumes\+::intersects} (const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+u, const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Intersection method for testing if two bounding boxes overlap. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\T \hyperlink{namespaceBoundingVolumes_a4f159289c317e02beedb4b38136ad692}{Bounding\+Volumes\+::get\+Overlapping\+Volume} (const Bounding\+SphereT$<$ T $>$ \&a\+\_\+u, const Bounding\+SphereT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between two bounding spheres. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\T \hyperlink{namespaceBoundingVolumes_ae5716e39e88aaeec0c204f453cac2acd}{Bounding\+Volumes\+::get\+Overlapping\+Volume} (const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+u, const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between two bounding boxes. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..ae98a7b0 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ba90c1a142ad4aeaa9aa522950e374ec \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..d39f67ee Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__incl.md5 new file mode 100644 index 00000000..2eb54a91 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +10fbb3a94eb7823722b3ea42772f64e1 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__incl.pdf new file mode 100644 index 00000000..28fccf14 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BoundingVolumesImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp.tex b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp.tex new file mode 100644 index 00000000..b8ad0162 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp.tex @@ -0,0 +1,57 @@ +\hypertarget{EBGeometry__BoundingVolumes_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Bounding\+Volumes.hpp File Reference} +\label{EBGeometry__BoundingVolumes_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}} + + +Declaration of a various bounding volumes used for bounding volume hierarchy. + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__BoundingVolumes_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=342pt]{EBGeometry__BoundingVolumes_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which encloses a set of points using a bounding sphere. \end{DoxyCompactList}\item +class \hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Axis-\/aligned bounding box as bounding volume. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceBoundingVolumes}{Bounding\+Volumes} +\begin{DoxyCompactList}\small\item\em Namespace for encapsulating various bounding volumes for usage with B\+V\+Hs. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Functions} +\begin{DoxyCompactItemize} +\item +{\footnotesize template$<$class T $>$ }\\bool \hyperlink{namespaceBoundingVolumes_af35f33c5f319a466550d9ad1040beced}{Bounding\+Volumes\+::intersects} (const Bounding\+SphereT$<$ T $>$ \&a\+\_\+u, const Bounding\+SphereT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Intersection method for testing if two bounding spheres overlap. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\bool \hyperlink{namespaceBoundingVolumes_a5c360ccd42017c01acbe1caf2cfd1efe}{Bounding\+Volumes\+::intersects} (const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+u, const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Intersection method for testing if two bounding boxes overlap. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\T \hyperlink{namespaceBoundingVolumes_a4f159289c317e02beedb4b38136ad692}{Bounding\+Volumes\+::get\+Overlapping\+Volume} (const Bounding\+SphereT$<$ T $>$ \&a\+\_\+u, const Bounding\+SphereT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between two bounding spheres. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\T \hyperlink{namespaceBoundingVolumes_ae5716e39e88aaeec0c204f453cac2acd}{Bounding\+Volumes\+::get\+Overlapping\+Volume} (const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+u, const A\+A\+B\+BT$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between two bounding boxes. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a various bounding volumes used for bounding volume hierarchy. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__dep__incl.md5 new file mode 100644 index 00000000..5b18434c --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +38a9f0dd7d2740ce515ecadc5cc208be \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__dep__incl.pdf new file mode 100644 index 00000000..aeb28aef Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__incl.md5 new file mode 100644 index 00000000..ed7a6095 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__incl.md5 @@ -0,0 +1 @@ +c27cec54281f5d340204a42fd7d8678e \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__incl.pdf new file mode 100644 index 00000000..3a2324fd Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__BoundingVolumes_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp.tex new file mode 100644 index 00000000..ed87aa27 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp.tex @@ -0,0 +1,58 @@ +\hypertarget{EBGeometry__DcelBVH_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+B\+VH.hpp File Reference} +\label{EBGeometry__DcelBVH_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+B\+V\+H.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+B\+V\+H.\+hpp}} + + +File which contains partitioners and lambdas for enclosing dcel\+\_\+face in bounding volume heirarchies. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+B\+V\+H.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelBVH_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=252pt]{EBGeometry__DcelBVH_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Typedefs} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceDcel_a69f60bf0111d66715bf4f7a8e22645e6}\label{namespaceDcel_a69f60bf0111d66715bf4f7a8e22645e6}} +{\footnotesize template$<$class T $>$ }\\using \hyperlink{namespaceDcel_a69f60bf0111d66715bf4f7a8e22645e6}{Dcel\+::\+Primitive\+List} = std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$ $>$ $>$ +\begin{DoxyCompactList}\small\item\em Alias for which primitives are used in the \hyperlink{namespaceBVH}{B\+VH}. For D\+C\+EL meshes the primitive is a polygon face. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Variables} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}\label{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}} +constexpr int \hyperlink{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}{Dcel\+::primitives\+Per\+Leaf\+Node} = 1 +\begin{DoxyCompactList}\small\item\em This is the lowest number of a primitives that a \hyperlink{namespaceBVH}{B\+VH} node is allowed to enclose. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , class BV $>$ }\\\hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+H\+::\+B\+V\+ConstructorT}$<$ FaceT$<$ T $>$, BV $>$ \hyperlink{namespaceDcel_a628449c42ce3f2784ca018f2a3c88a11}{Dcel\+::default\+B\+V\+Constructor} +\begin{DoxyCompactList}\small\item\em Bounding volume constructor for a D\+C\+EL face. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , class BV , int K$>$ }\\\hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{B\+V\+H\+::\+Stop\+FunctionT}$<$ T, FaceT$<$ T $>$, BV, K $>$ \hyperlink{namespaceDcel_a45e9f2554a8d9ea01164cd51f787f989}{Dcel\+::default\+Stop\+Function} +\begin{DoxyCompactList}\small\item\em Default stop function. This function terminates the division process if a \hyperlink{namespaceBVH}{B\+VH} node has only one primitive. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , int K$>$ }\\\hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT}$<$ FaceT$<$ T $>$, K $>$ \hyperlink{namespaceDcel_ab4f869248e23d47bb01ad06c76288fef}{Dcel\+::spatial\+Split\+Partitioner} +\begin{DoxyCompactList}\small\item\em Default partitioner function for subdividing into K sub-\/volumes. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , int K$>$ }\\\hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT}$<$ FaceT$<$ T $>$, K $>$ \hyperlink{namespaceDcel_a08217ffcd4cfc6f58a3b0b3f780fc611}{Dcel\+::spatial\+Split\+Binary\+Partitioner} +\begin{DoxyCompactList}\small\item\em Binary partitioner based on spatial splits. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +File which contains partitioners and lambdas for enclosing dcel\+\_\+face in bounding volume heirarchies. + +This file contains various useful \char`\"{}default\char`\"{} routines for determining how a D\+C\+EL mesh should be partitioned in a bounding volume hierarchy. This includes the required functions for 1) Constructing bounding volumes (default\+B\+V\+Constructor). 2) Stopping the sub-\/division process (default\+Stop\+Function) 3) Partitioning one bounding volume into subvolumes. These are the functions a) default\+Partition\+Function(...). This partitions the primitives into two half-\/spaces based on where the primitive centroids are located. b) partition\+Minimum\+Overlap(...). This splist the primitive list down the middle (ignoring centroids and element size) and selects the splitting direction where the sub-\/bounding volumes have the smallest overlap. 3) partition\+S\+AH(...). This implements the common \char`\"{}surface area heuristic\char`\"{} rule for constructing bounding volumes. \begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__dep__incl.md5 new file mode 100644 index 00000000..185e76fe --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +8dea9cb27fb69fc3551cf5b7305577df \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__dep__incl.pdf new file mode 100644 index 00000000..3d09590f Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__incl.md5 new file mode 100644 index 00000000..d73703d6 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__incl.md5 @@ -0,0 +1 @@ +e5f88fe47a67ff0e6c67c84f2bdec005 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__incl.pdf new file mode 100644 index 00000000..3e7cc377 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelBVH_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp.tex new file mode 100644 index 00000000..301800f1 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp.tex @@ -0,0 +1,42 @@ +\hypertarget{EBGeometry__DcelEdgeImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.hpp File Reference} +\label{EBGeometry__DcelEdgeImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelEdgeImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelEdgeImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} +\begin{DoxyRefDesc}{Todo} +\item[\hyperlink{todo__todo000002}{Todo}]Include m\+\_\+face in constructors \end{DoxyRefDesc} diff --git a/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..fb94f77d --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +42ae70f9b8fbcea4afabecf2e57b27e1 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..ed7db5f9 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__incl.md5 new file mode 100644 index 00000000..e8a66a68 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +f73c093edbf6522c5961899bdfc8f547 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__incl.pdf new file mode 100644 index 00000000..cf86ccfb Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelEdgeImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp.tex new file mode 100644 index 00000000..7b4adfd2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp.tex @@ -0,0 +1,54 @@ +\hypertarget{EBGeometry__DcelEdge_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Edge.hpp File Reference} +\label{EBGeometry__DcelEdge_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}} + + +Declaration of a half-\/edge class for use in D\+C\+EL descriptions of polygon tesselations. + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelEdge_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelEdge_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which can iterate through edges and vertices around a D\+C\+EL polygon face. \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a half-\/edge class for use in D\+C\+EL descriptions of polygon tesselations. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__dep__incl.md5 new file mode 100644 index 00000000..ef434bb1 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +675c3183f508026b1ac33270e10b6935 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__dep__incl.pdf new file mode 100644 index 00000000..77e37a5b Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__incl.md5 new file mode 100644 index 00000000..0f10df29 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__incl.md5 @@ -0,0 +1 @@ +6c44ecb9f75958702ff48a171ae9acf9 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__incl.pdf new file mode 100644 index 00000000..e7f57d06 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelEdge_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp.tex new file mode 100644 index 00000000..9b8bdb6f --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp.tex @@ -0,0 +1,38 @@ +\hypertarget{EBGeometry__DcelFaceImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.hpp File Reference} +\label{EBGeometry__DcelFaceImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelFaceImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelFaceImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..29401c08 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +969549b2baac5cf53a939cf889c237b3 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..ffd5af19 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__incl.md5 new file mode 100644 index 00000000..33ca98b0 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +dae834d55e2fbe956f347c904aa99c28 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__incl.pdf new file mode 100644 index 00000000..7b097bc7 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelFaceImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelFace_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp.tex new file mode 100644 index 00000000..b35bd780 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp.tex @@ -0,0 +1,56 @@ +\hypertarget{EBGeometry__DcelFace_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Face.hpp File Reference} +\label{EBGeometry__DcelFace_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp}} + + +Declaration of a polygon face class for use in D\+C\+EL descriptions of polygon tesselations. + + +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelFace_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelFace_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which can iterate through edges and vertices around a D\+C\+EL polygon face. \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a polygon face class for use in D\+C\+EL descriptions of polygon tesselations. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__dep__incl.md5 new file mode 100644 index 00000000..461be9a5 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +7eaed8be46b2012bc797f59b6581bd84 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__dep__incl.pdf new file mode 100644 index 00000000..21586bee Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__incl.md5 new file mode 100644 index 00000000..2e0591d0 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__incl.md5 @@ -0,0 +1 @@ +b6a1d88b56a349bdedef61ba386043f3 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__incl.pdf new file mode 100644 index 00000000..9cdba403 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelFace_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp.tex new file mode 100644 index 00000000..e1d96837 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp.tex @@ -0,0 +1,40 @@ +\hypertarget{EBGeometry__DcelIteratorImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.hpp File Reference} +\label{EBGeometry__DcelIteratorImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelIteratorImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelIteratorImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..34e261ac --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +a3f1e36a984201a9e080a6fc15a43a1d \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..7f609b4f Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__incl.md5 new file mode 100644 index 00000000..2f5da67a --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +4947ce512049e6df95210b3be958c146 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__incl.pdf new file mode 100644 index 00000000..56cf475e Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelIteratorImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp.tex new file mode 100644 index 00000000..aa741740 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp.tex @@ -0,0 +1,49 @@ +\hypertarget{EBGeometry__DcelIterator_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Iterator.hpp File Reference} +\label{EBGeometry__DcelIterator_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp}} + + +Declaration of iterators for D\+C\+EL surface Tesselations. + + +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelIterator_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelIterator_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which can iterate through edges and vertices around a D\+C\+EL polygon face. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of iterators for D\+C\+EL surface Tesselations. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__dep__incl.md5 new file mode 100644 index 00000000..2f08d7b2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +ed3fab6100f57d4110dd3f62a422ff1c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__dep__incl.pdf new file mode 100644 index 00000000..6c3480b9 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__incl.md5 new file mode 100644 index 00000000..8196b442 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__incl.md5 @@ -0,0 +1 @@ +18ddcf95a98bfc43af641dc2c35d8577 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__incl.pdf new file mode 100644 index 00000000..0cae9f41 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelIterator_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp.tex new file mode 100644 index 00000000..fad8b5c9 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp.tex @@ -0,0 +1,41 @@ +\hypertarget{EBGeometry__DcelMeshImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.hpp File Reference} +\label{EBGeometry__DcelMeshImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelMeshImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelMeshImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..59c859b8 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +cc536b11bcd5b670b7f0bc4742a6d29c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..968f3aef Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__incl.md5 new file mode 100644 index 00000000..10bbd672 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +df03638ea4090176faccce621045c254 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__incl.pdf new file mode 100644 index 00000000..b52ba64f Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelMeshImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp.tex new file mode 100644 index 00000000..665104aa --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp.tex @@ -0,0 +1,55 @@ +\hypertarget{EBGeometry__DcelMesh_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Mesh.hpp File Reference} +\label{EBGeometry__DcelMesh_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp}} + + +Declaration of a mesh class which stores a D\+C\+EL mesh (with signed distance functions) + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$functional$>$}\newline +{\ttfamily \#include $<$map$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelMesh_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelMesh_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2\+D$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class for embedding a D\+C\+EL polygon face into 2D. \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+Mesh\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Mesh class which stores a full D\+C\+EL mesh (with signed distance functions) \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a mesh class which stores a D\+C\+EL mesh (with signed distance functions) + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__dep__incl.md5 new file mode 100644 index 00000000..caa42605 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +00ab2c2a5ef9e9e076d2f78e316c5176 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__dep__incl.pdf new file mode 100644 index 00000000..1ad3c38e Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__incl.md5 new file mode 100644 index 00000000..09ea63dc --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__incl.md5 @@ -0,0 +1 @@ +97fea37f160902130550c9cdc994e4c1 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__incl.pdf new file mode 100644 index 00000000..631cabf2 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelMesh_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp.tex new file mode 100644 index 00000000..b9fe5dde --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp.tex @@ -0,0 +1,46 @@ +\hypertarget{EBGeometry__DcelParserImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.hpp File Reference} +\label{EBGeometry__DcelParserImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp}. + + +{\ttfamily \#include $<$iostream$>$}\newline +{\ttfamily \#include $<$fstream$>$}\newline +{\ttfamily \#include $<$iterator$>$}\newline +{\ttfamily \#include $<$sstream$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelParserImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=259pt]{EBGeometry__DcelParserImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..ae8d39e9 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +877a8c49bee38c1c291ca243ec80d5a6 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..051a2ae8 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__incl.md5 new file mode 100644 index 00000000..ead6d92d --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +27131b6445161ed42c50a53daa3c11c1 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__incl.pdf new file mode 100644 index 00000000..b8b1b258 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelParserImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelParser_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp.tex new file mode 100644 index 00000000..3e00c9a2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp.tex @@ -0,0 +1,51 @@ +\hypertarget{EBGeometry__DcelParser_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Parser.hpp File Reference} +\label{EBGeometry__DcelParser_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp}} + + +Declaration of utilities for passing data into D\+C\+EL structures. + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$map$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelParser_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelParser_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+L\+Y$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class for generation a Dcel\+::\+Mesh\+T$<$\+T$>$ from the Stanford \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} file format. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\item + \hyperlink{namespaceDcel_1_1Parser}{Dcel\+::\+Parser} +\begin{DoxyCompactList}\small\item\em Namespace which encapsulates possible file parsers for building D\+C\+EL meshes. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of utilities for passing data into D\+C\+EL structures. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__dep__incl.md5 new file mode 100644 index 00000000..3fb8e8c9 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +6bcf610bea58714e447ead3cac23a71d \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__dep__incl.pdf new file mode 100644 index 00000000..197eeb4b Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__incl.md5 new file mode 100644 index 00000000..305618c0 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__incl.md5 @@ -0,0 +1 @@ +0b571d75ccae11c61e7856f5f770c040 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__incl.pdf new file mode 100644 index 00000000..5e10afc8 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelParser_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp.tex new file mode 100644 index 00000000..cd9a8df4 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp.tex @@ -0,0 +1,38 @@ +\hypertarget{EBGeometry__DcelPolygon2DImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.hpp File Reference} +\label{EBGeometry__DcelPolygon2DImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp}} + + +Implementation of Dcel\+Polygon.\+hpp. + + +{\ttfamily \#include $<$iostream$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelPolygon2DImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of Dcel\+Polygon.\+hpp. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..2f92f44a --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +f588670d661d99d246c9832f331e7383 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..be27843e Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__incl.md5 new file mode 100644 index 00000000..449e5bc3 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +ff35fd32d7fd32e1288444f466a95673 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__incl.pdf new file mode 100644 index 00000000..2d9dd254 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelPolygon2DImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp.tex new file mode 100644 index 00000000..b766812d --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp.tex @@ -0,0 +1,45 @@ +\hypertarget{EBGeometry__DcelPolygon2D_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Polygon2D.hpp File Reference} +\label{EBGeometry__DcelPolygon2D_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp}} + + +Declaration of a two-\/dimensional polygon class for embedding 3D polygon faces. + + +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelPolygon2D_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelPolygon2D_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2\+D$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class for embedding a D\+C\+EL polygon face into 2D. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a two-\/dimensional polygon class for embedding 3D polygon faces. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__dep__incl.md5 new file mode 100644 index 00000000..251235dc --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +8f91aba7425ee049802a864707947b44 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__dep__incl.pdf new file mode 100644 index 00000000..3b896bcd Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__incl.md5 new file mode 100644 index 00000000..f0c149fd --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__incl.md5 @@ -0,0 +1 @@ +033736c751c75daaa7ec39c558dd04f3 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__incl.pdf new file mode 100644 index 00000000..557491a2 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelPolygon2D_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp.tex new file mode 100644 index 00000000..7df897a8 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp.tex @@ -0,0 +1,40 @@ +\hypertarget{EBGeometry__DcelVertexImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.hpp File Reference} +\label{EBGeometry__DcelVertexImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelVertexImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelVertexImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..44967ec2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +b5a4a4964814ee7a96beead74b2b5850 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..3badbb75 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__incl.md5 new file mode 100644 index 00000000..22d34856 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +d733e7169e6af7cb6b877c2a386c6bb2 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__incl.pdf new file mode 100644 index 00000000..b2d7cf21 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelVertexImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp.tex b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp.tex new file mode 100644 index 00000000..3e8bf56b --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp.tex @@ -0,0 +1,55 @@ +\hypertarget{EBGeometry__DcelVertex_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Vertex.hpp File Reference} +\label{EBGeometry__DcelVertex_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp}} + + +Declaration of a vertex class for use in D\+C\+EL descriptions of polygon tesselations. + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelVertex_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__DcelVertex_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which can iterate through edges and vertices around a D\+C\+EL polygon face. \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a vertex class for use in D\+C\+EL descriptions of polygon tesselations. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__dep__incl.md5 new file mode 100644 index 00000000..b9221ca6 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +151ec7a1c4ac3d8d7764fb8a9498140b \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__dep__incl.pdf new file mode 100644 index 00000000..21f0652c Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__incl.md5 new file mode 100644 index 00000000..f3f50b52 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__incl.md5 @@ -0,0 +1 @@ +f88d2d08848d8eb9d52e169929d8d49f \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__incl.pdf new file mode 100644 index 00000000..b2aaaebe Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__DcelVertex_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__Dcel_8hpp.tex b/docs/doxygen/latex/EBGeometry__Dcel_8hpp.tex new file mode 100644 index 00000000..7adf5df2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Dcel_8hpp.tex @@ -0,0 +1,36 @@ +\hypertarget{EBGeometry__Dcel_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Dcel.hpp File Reference} +\label{EBGeometry__Dcel_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Dcel.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Dcel.\+hpp}} + + +Namespace documentation. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Dcel.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__Dcel_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__Dcel_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel}{Dcel} +\begin{DoxyCompactList}\small\item\em Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Namespace documentation. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__Dcel_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__dep__incl.md5 new file mode 100644 index 00000000..df7b2866 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +39877f1b9e6f8b3855c605ee3137f3e8 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__Dcel_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__dep__incl.pdf new file mode 100644 index 00000000..c9e518a0 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__Dcel_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__incl.md5 new file mode 100644 index 00000000..ab1fad2d --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__incl.md5 @@ -0,0 +1 @@ +ddb699a6cc7b64f2144653ea9970a49c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__Dcel_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__incl.pdf new file mode 100644 index 00000000..b1c9b310 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__Dcel_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp.tex b/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp.tex new file mode 100644 index 00000000..2883b4b1 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp.tex @@ -0,0 +1,22 @@ +\hypertarget{EBGeometry__NamespaceFooter_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Namespace\+Footer.hpp File Reference} +\label{EBGeometry__NamespaceFooter_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp}} + + +Name space footer. + + +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__NamespaceFooter_8hpp__dep__incl} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Name space footer. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp__dep__incl.md5 new file mode 100644 index 00000000..85cc69b8 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +1156af2c1d0595a5841099e8c9c006c2 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp__dep__incl.pdf new file mode 100644 index 00000000..8cd4b47a Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__NamespaceFooter_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp.tex b/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp.tex new file mode 100644 index 00000000..a8a2078a --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp.tex @@ -0,0 +1,22 @@ +\hypertarget{EBGeometry__NamespaceHeader_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Namespace\+Header.hpp File Reference} +\label{EBGeometry__NamespaceHeader_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp}} + + +Name space header. + + +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__NamespaceHeader_8hpp__dep__incl} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Name space header. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp__dep__incl.md5 new file mode 100644 index 00000000..348f6fcd --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +8f13c72c8489f63d60aa783cca4a7f26 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp__dep__incl.pdf new file mode 100644 index 00000000..f81b223c Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__NamespaceHeader_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp.tex new file mode 100644 index 00000000..554b6283 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp.tex @@ -0,0 +1,32 @@ +\hypertarget{EBGeometry__SignedDistanceFunctionImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.hpp File Reference} +\label{EBGeometry__SignedDistanceFunctionImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__SignedDistanceFunctionImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..a769520b --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +0e029e55a2ea9921092e33778b4e612b \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..beb90414 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.md5 new file mode 100644 index 00000000..61ee3190 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +dbc9311f9c1cd983487e0f22ae1a2b1f \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.pdf new file mode 100644 index 00000000..52bb244f Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__SignedDistanceFunctionImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp.tex b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp.tex new file mode 100644 index 00000000..0ddbfdeb --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp.tex @@ -0,0 +1,40 @@ +\hypertarget{EBGeometry__SignedDistanceFunction_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.hpp File Reference} +\label{EBGeometry__SignedDistanceFunction_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp}} + + +Abstract base class for representing a signed distance function. + + +{\ttfamily \#include $<$memory$>$}\newline +{\ttfamily \#include $<$deque$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__SignedDistanceFunction_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__SignedDistanceFunction_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Abstract representation of a signed distance function. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Abstract base class for representing a signed distance function. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.md5 new file mode 100644 index 00000000..abfdfd51 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +30ab7cd400874142ca84b93e892c6d53 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.pdf new file mode 100644 index 00000000..3dabec74 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__incl.md5 new file mode 100644 index 00000000..bc3d0eb7 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__incl.md5 @@ -0,0 +1 @@ +f340bddcd0edd8beffd9dd9c0d2ff256 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__incl.pdf new file mode 100644 index 00000000..380f9bc2 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__SignedDistanceFunction_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp.tex new file mode 100644 index 00000000..190f9993 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp.tex @@ -0,0 +1,32 @@ +\hypertarget{EBGeometry__TransformOpsImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.hpp File Reference} +\label{EBGeometry__TransformOpsImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__TransformOpsImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__TransformOpsImplem_8hpp__dep__incl} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..22c7fe61 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +c031451a861d56ec63d1cd4fdab5d745 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..b26ef397 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__incl.md5 new file mode 100644 index 00000000..d5ab182e --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +a2dfbc1fd3dcfa3e948534387d438b9c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__incl.pdf new file mode 100644 index 00000000..fd15daaf Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__TransformOpsImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__TransformOps_8hpp.tex b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp.tex new file mode 100644 index 00000000..f3dafeff --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp.tex @@ -0,0 +1,44 @@ +\hypertarget{EBGeometry__TransformOps_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Transform\+Ops.hpp File Reference} +\label{EBGeometry__TransformOps_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}} + + +Declaration of transformation operators for signed distance fields. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__TransformOps_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__TransformOps_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classTransformOp}{Transform\+Op$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Base class for transformation operators. \end{DoxyCompactList}\item +class \hyperlink{classTranslateOp}{Translate\+Op$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Translation operator. Can translate an input point. \end{DoxyCompactList}\item +class \hyperlink{classScaleOp}{Scale\+Op$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Scale operator. Can also be used as a reflection operator. \end{DoxyCompactList}\item +class \hyperlink{classRotateOp}{Rotate\+Op$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Rotation operator. Can scale an input point. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of transformation operators for signed distance fields. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__dep__incl.md5 new file mode 100644 index 00000000..e6f9b63b --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +fddbde84c13d66ba2787de197522e550 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__dep__incl.pdf new file mode 100644 index 00000000..9e301563 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__incl.md5 new file mode 100644 index 00000000..72e8dbf2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__incl.md5 @@ -0,0 +1 @@ +6b51f6dc6d7657b47902ece665c579c5 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__incl.pdf new file mode 100644 index 00000000..bfb74e6d Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__TransformOps_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp.tex new file mode 100644 index 00000000..8b88a7be --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp.tex @@ -0,0 +1,32 @@ +\hypertarget{EBGeometry__UnionBVHImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.hpp File Reference} +\label{EBGeometry__UnionBVHImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__UnionBVHImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=289pt]{EBGeometry__UnionBVHImplem_8hpp__dep__incl} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..628391f7 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +15b24289b87b5c35b51fdac8be144c06 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..0237c22d Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__incl.md5 new file mode 100644 index 00000000..27408a26 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +8a19441b17e7a450f28b26b8fb39fad7 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__incl.pdf new file mode 100644 index 00000000..9e08cc62 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__UnionBVHImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp.tex b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp.tex new file mode 100644 index 00000000..467eee22 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp.tex @@ -0,0 +1,39 @@ +\hypertarget{EBGeometry__UnionBVH_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Union\+B\+VH.hpp File Reference} +\label{EBGeometry__UnionBVH_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp}} + + +Declaration of a union operator for creating multi-\/object scenes. + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__UnionBVH_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__UnionBVH_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classUnionBVH}{Union\+B\+V\+H$<$ T, B\+V, K $>$} +\begin{DoxyCompactList}\small\item\em Distance function union using B\+V\+Hs. Computes the signed distance to the closest object of N non-\/overlapping objects. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a union operator for creating multi-\/object scenes. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__dep__incl.md5 new file mode 100644 index 00000000..7b2a62cb --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +9b3ca11360dfcfc10eb96577fcc253cd \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__dep__incl.pdf new file mode 100644 index 00000000..847a8547 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__incl.md5 new file mode 100644 index 00000000..a7913d90 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__incl.md5 @@ -0,0 +1 @@ +3f4a82848de9ed660752d84a3496de35 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__incl.pdf new file mode 100644 index 00000000..b75855e5 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__UnionBVH_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp.tex new file mode 100644 index 00000000..69acef14 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp.tex @@ -0,0 +1,32 @@ +\hypertarget{EBGeometry__UnionImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Union\+Implem.hpp File Reference} +\label{EBGeometry__UnionImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp}. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Union.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__UnionImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=268pt]{EBGeometry__UnionImplem_8hpp__dep__incl} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..595e0293 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +5d026cb94036af9272bfea0687abd3a3 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..12456739 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__incl.md5 new file mode 100644 index 00000000..faba067e --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +a06516b18fe81a5ae70876a3d45467f2 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__incl.pdf new file mode 100644 index 00000000..74a8ba38 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__UnionImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__Union_8hpp.tex b/docs/doxygen/latex/EBGeometry__Union_8hpp.tex new file mode 100644 index 00000000..e9110ee1 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Union_8hpp.tex @@ -0,0 +1,39 @@ +\hypertarget{EBGeometry__Union_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Union.hpp File Reference} +\label{EBGeometry__Union_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Union.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Union.\+hpp}} + + +Declaration of a union operator for creating multi-\/object scenes. + + +{\ttfamily \#include $<$vector$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Union.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__Union_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__Union_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classUnion}{Union$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Distance function union. Computes the signed distance to the closest object of N non-\/overlapping objects. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of a union operator for creating multi-\/object scenes. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} diff --git a/docs/doxygen/latex/EBGeometry__Union_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__Union_8hpp__dep__incl.md5 new file mode 100644 index 00000000..01917a04 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Union_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +afa9741876bd09f91eba594cc0899816 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__Union_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__Union_8hpp__dep__incl.pdf new file mode 100644 index 00000000..a0ce1c44 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__Union_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__Union_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__Union_8hpp__incl.md5 new file mode 100644 index 00000000..7aaa3e62 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Union_8hpp__incl.md5 @@ -0,0 +1 @@ +c9837aaced9c0a8a43e77c6038997d16 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__Union_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__Union_8hpp__incl.pdf new file mode 100644 index 00000000..f953a622 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__Union_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__VecImplem_8hpp.tex b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp.tex new file mode 100644 index 00000000..134b2740 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp.tex @@ -0,0 +1,178 @@ +\hypertarget{EBGeometry__VecImplem_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Vec\+Implem.hpp File Reference} +\label{EBGeometry__VecImplem_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} + + +Implementation of \hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp}. + + +{\ttfamily \#include $<$math.\+h$>$}\newline +{\ttfamily \#include $<$algorithm$>$}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__VecImplem_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__VecImplem_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Functions} +\begin{DoxyCompactItemize} +\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{EBGeometry__VecImplem_8hpp_a011c551978bb37db35ea3520fb23bd00}{operator$\ast$} (const T \&s, const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator in the form s$\ast$\+Vec2T. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{EBGeometry__VecImplem_8hpp_a519f71e021376fe40b7d2f6e451fba02}{operator/} (const T \&s, const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Division operator in the form s$\ast$\+Vec2T. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__VecImplem_8hpp_a3ed4fdd9b9d6b180e982733b4c7efc8e}{operator$\ast$} (const T \&s, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__VecImplem_8hpp_a317d1a610a2d042d5b41f1fde72d8779}{operator/} (const T \&s, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Division operator. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__VecImplem_8hpp_a291f01622695ab94c0092c3af0a1f3ca}{min} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&v) noexcept +\begin{DoxyCompactList}\small\item\em Minimum fucntion. Returns new vector with component-\/wise minimums. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__VecImplem_8hpp_a71f0bc32c9be501cf01a1b6c715dc0a9}{max} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&v) noexcept +\begin{DoxyCompactList}\small\item\em Minimum fucntion. Returns new vector with component-\/wise minimums. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Implementation of \hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp}. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} + + +\subsection{Function Documentation} +\mbox{\Hypertarget{EBGeometry__VecImplem_8hpp_a71f0bc32c9be501cf01a1b6c715dc0a9}\label{EBGeometry__VecImplem_8hpp_a71f0bc32c9be501cf01a1b6c715dc0a9}} +\index{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}!max@{max}} +\index{max@{max}!E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} +\subsubsection{\texorpdfstring{max()}{max()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ max (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Minimum fucntion. Returns new vector with component-\/wise minimums. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\mbox{\tt in} & {\em v} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = std\+::max(u.\+X\mbox{[}0\mbox{]}, v.\+X\mbox{[}0\mbox{]}) and so on +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__VecImplem_8hpp_a291f01622695ab94c0092c3af0a1f3ca}\label{EBGeometry__VecImplem_8hpp_a291f01622695ab94c0092c3af0a1f3ca}} +\index{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}!min@{min}} +\index{min@{min}!E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} +\subsubsection{\texorpdfstring{min()}{min()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ min (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Minimum fucntion. Returns new vector with component-\/wise minimums. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\mbox{\tt in} & {\em v} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = std\+::min(u.\+X\mbox{[}0\mbox{]}, v.\+X\mbox{[}0\mbox{]}) and so on +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__VecImplem_8hpp_a011c551978bb37db35ea3520fb23bd00}\label{EBGeometry__VecImplem_8hpp_a011c551978bb37db35ea3520fb23bd00}} +\index{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$T$>$ operator$\ast$ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator in the form s$\ast$\+Vec2T. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Multiplication factor \\ +\hline +\mbox{\tt in} & {\em a\+\_\+other} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with components x = s$\ast$a\+\_\+other.x (and same for y) +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__VecImplem_8hpp_a3ed4fdd9b9d6b180e982733b4c7efc8e}\label{EBGeometry__VecImplem_8hpp_a3ed4fdd9b9d6b180e982733b4c7efc8e}} +\index{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ operator$\ast$ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Multiplication scalar \\ +\hline +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = s$\ast$X\mbox{[}0\mbox{]} and so on. +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__VecImplem_8hpp_a519f71e021376fe40b7d2f6e451fba02}\label{EBGeometry__VecImplem_8hpp_a519f71e021376fe40b7d2f6e451fba02}} +\index{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}!operator/@{operator/}} +\index{operator/@{operator/}!E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$T$>$ operator/ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator in the form s$\ast$\+Vec2T. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Division factor \\ +\hline +\mbox{\tt in} & {\em a\+\_\+other} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with components x = (1/s)$\ast$a\+\_\+other.x (and same for y) +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__VecImplem_8hpp_a317d1a610a2d042d5b41f1fde72d8779}\label{EBGeometry__VecImplem_8hpp_a317d1a610a2d042d5b41f1fde72d8779}} +\index{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}!operator/@{operator/}} +\index{operator/@{operator/}!E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp@{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ operator/ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Division scalar \\ +\hline +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = X\mbox{[}0\mbox{]}/s and so on. +\end{DoxyReturn} diff --git a/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__dep__incl.md5 new file mode 100644 index 00000000..50979128 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +6dbdef812065257dae63885346bb03c2 \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__dep__incl.pdf new file mode 100644 index 00000000..be75ca6c Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__incl.md5 new file mode 100644 index 00000000..a2af2341 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__incl.md5 @@ -0,0 +1 @@ +9f0f475feb53411da31a3255b4a5364c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__incl.pdf new file mode 100644 index 00000000..4b17e532 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__VecImplem_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__Vec_8hpp.tex b/docs/doxygen/latex/EBGeometry__Vec_8hpp.tex new file mode 100644 index 00000000..ad1bf9f2 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Vec_8hpp.tex @@ -0,0 +1,183 @@ +\hypertarget{EBGeometry__Vec_8hpp}{}\section{Source/\+E\+B\+Geometry\+\_\+\+Vec.hpp File Reference} +\label{EBGeometry__Vec_8hpp}\index{Source/\+E\+B\+Geometry\+\_\+\+Vec.\+hpp@{Source/\+E\+B\+Geometry\+\_\+\+Vec.\+hpp}} + + +Declaration of 2D and 3D point/vector classes with templated precision. Used with D\+C\+EL tools. + + +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp\char`\"{}}\newline +{\ttfamily \#include \char`\"{}E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp\char`\"{}}\newline +Include dependency graph for E\+B\+Geometry\+\_\+\+Vec.\+hpp\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__Vec_8hpp__incl} +\end{center} +\end{figure} +This graph shows which files directly or indirectly include this file\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{EBGeometry__Vec_8hpp__dep__incl} +\end{center} +\end{figure} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classVec2T}{Vec2\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Two-\/dimensional vector class with arithmetic operators. \end{DoxyCompactList}\item +class \hyperlink{classVec3T}{Vec3\+T$<$ T $>$} +\begin{DoxyCompactList}\small\item\em Three-\/dimensional vector class with arithmetic operators. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Functions} +\begin{DoxyCompactItemize} +\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{EBGeometry__Vec_8hpp_a011c551978bb37db35ea3520fb23bd00}{operator$\ast$} (const T \&s, const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator in the form s$\ast$\+Vec2T. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{EBGeometry__Vec_8hpp_a519f71e021376fe40b7d2f6e451fba02}{operator/} (const T \&s, const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Division operator in the form s$\ast$\+Vec2T. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__Vec_8hpp_affba8fd8ad3fc6110fbba33be5ad6187}{operator$\ast$} (const T \&s, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__Vec_8hpp_aeeeedd62e251ff33f2e37286e391a0f8}{operator/} (const T \&s, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Division operator. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__Vec_8hpp_a291f01622695ab94c0092c3af0a1f3ca}{min} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&v) noexcept +\begin{DoxyCompactList}\small\item\em Minimum fucntion. Returns new vector with component-\/wise minimums. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{EBGeometry__Vec_8hpp_a71f0bc32c9be501cf01a1b6c715dc0a9}{max} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&v) noexcept +\begin{DoxyCompactList}\small\item\em Minimum fucntion. Returns new vector with component-\/wise minimums. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Declaration of 2D and 3D point/vector classes with templated precision. Used with D\+C\+EL tools. + +\begin{DoxyAuthor}{Author} +Robert Marskar +\end{DoxyAuthor} + + +\subsection{Function Documentation} +\mbox{\Hypertarget{EBGeometry__Vec_8hpp_a71f0bc32c9be501cf01a1b6c715dc0a9}\label{EBGeometry__Vec_8hpp_a71f0bc32c9be501cf01a1b6c715dc0a9}} +\index{E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}!max@{max}} +\index{max@{max}!E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}} +\subsubsection{\texorpdfstring{max()}{max()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ max (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Minimum fucntion. Returns new vector with component-\/wise minimums. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\mbox{\tt in} & {\em v} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = std\+::max(u.\+X\mbox{[}0\mbox{]}, v.\+X\mbox{[}0\mbox{]}) and so on +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__Vec_8hpp_a291f01622695ab94c0092c3af0a1f3ca}\label{EBGeometry__Vec_8hpp_a291f01622695ab94c0092c3af0a1f3ca}} +\index{E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}!min@{min}} +\index{min@{min}!E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}} +\subsubsection{\texorpdfstring{min()}{min()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ min (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Minimum fucntion. Returns new vector with component-\/wise minimums. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\mbox{\tt in} & {\em v} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = std\+::min(u.\+X\mbox{[}0\mbox{]}, v.\+X\mbox{[}0\mbox{]}) and so on +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__Vec_8hpp_a011c551978bb37db35ea3520fb23bd00}\label{EBGeometry__Vec_8hpp_a011c551978bb37db35ea3520fb23bd00}} +\index{E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$T$>$ operator$\ast$ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator in the form s$\ast$\+Vec2T. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Multiplication factor \\ +\hline +\mbox{\tt in} & {\em a\+\_\+other} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with components x = s$\ast$a\+\_\+other.x (and same for y) +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__Vec_8hpp_affba8fd8ad3fc6110fbba33be5ad6187}\label{EBGeometry__Vec_8hpp_affba8fd8ad3fc6110fbba33be5ad6187}} +\index{E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ operator$\ast$ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Multiplication scalar \\ +\hline +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = s$\ast$X\mbox{[}0\mbox{]} and so on. +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__Vec_8hpp_a519f71e021376fe40b7d2f6e451fba02}\label{EBGeometry__Vec_8hpp_a519f71e021376fe40b7d2f6e451fba02}} +\index{E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}!operator/@{operator/}} +\index{operator/@{operator/}!E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$T$>$ operator/ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator in the form s$\ast$\+Vec2T. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Division factor \\ +\hline +\mbox{\tt in} & {\em a\+\_\+other} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with components x = (1/s)$\ast$a\+\_\+other.x (and same for y) +\end{DoxyReturn} +\mbox{\Hypertarget{EBGeometry__Vec_8hpp_aeeeedd62e251ff33f2e37286e391a0f8}\label{EBGeometry__Vec_8hpp_aeeeedd62e251ff33f2e37286e391a0f8}} +\index{E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}!operator/@{operator/}} +\index{operator/@{operator/}!E\+B\+Geometry\+\_\+\+Vec.\+hpp@{E\+B\+Geometry\+\_\+\+Vec.\+hpp}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ operator/ (\begin{DoxyParamCaption}\item[{const T \&}]{s, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Division scalar \\ +\hline +\mbox{\tt in} & {\em u} & Vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns new vector with components X\mbox{[}0\mbox{]} = X\mbox{[}0\mbox{]}/s and so on. +\end{DoxyReturn} diff --git a/docs/doxygen/latex/EBGeometry__Vec_8hpp__dep__incl.md5 b/docs/doxygen/latex/EBGeometry__Vec_8hpp__dep__incl.md5 new file mode 100644 index 00000000..c4b09f72 --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Vec_8hpp__dep__incl.md5 @@ -0,0 +1 @@ +0c325a9fb708ea525b5ad977930df4aa \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__Vec_8hpp__dep__incl.pdf b/docs/doxygen/latex/EBGeometry__Vec_8hpp__dep__incl.pdf new file mode 100644 index 00000000..608b641f Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__Vec_8hpp__dep__incl.pdf differ diff --git a/docs/doxygen/latex/EBGeometry__Vec_8hpp__incl.md5 b/docs/doxygen/latex/EBGeometry__Vec_8hpp__incl.md5 new file mode 100644 index 00000000..66793e3b --- /dev/null +++ b/docs/doxygen/latex/EBGeometry__Vec_8hpp__incl.md5 @@ -0,0 +1 @@ +7adbd98b0903fe8693e41ba437369e7c \ No newline at end of file diff --git a/docs/doxygen/latex/EBGeometry__Vec_8hpp__incl.pdf b/docs/doxygen/latex/EBGeometry__Vec_8hpp__incl.pdf new file mode 100644 index 00000000..2d47f6e5 Binary files /dev/null and b/docs/doxygen/latex/EBGeometry__Vec_8hpp__incl.pdf differ diff --git a/docs/doxygen/latex/Makefile b/docs/doxygen/latex/Makefile new file mode 100644 index 00000000..8cc3866f --- /dev/null +++ b/docs/doxygen/latex/Makefile @@ -0,0 +1,21 @@ +all: refman.pdf + +pdf: refman.pdf + +refman.pdf: clean refman.tex + pdflatex refman + makeindex refman.idx + pdflatex refman + latex_count=8 ; \ + while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + pdflatex refman ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + makeindex refman.idx + pdflatex refman + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf diff --git a/docs/doxygen/latex/annotated.tex b/docs/doxygen/latex/annotated.tex new file mode 100644 index 00000000..f6f847b1 --- /dev/null +++ b/docs/doxygen/latex/annotated.tex @@ -0,0 +1,25 @@ +\section{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$} \\*Axis-\/aligned bounding box as bounding volume }{\pageref{classBoundingVolumes_1_1AABBT}}{} +\item\contentsline{section}{\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$} \\*Class which encloses a set of points using a bounding sphere }{\pageref{classBoundingVolumes_1_1BoundingSphereT}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$} \\*Class which can iterate through edges and vertices around a D\+C\+EL polygon face }{\pageref{classDcel_1_1EdgeIteratorT}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+Edge\+T$<$ T $>$} \\*Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL) }{\pageref{classDcel_1_1EdgeT}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1FaceT}{Dcel\+::\+Face\+T$<$ T $>$} \\*Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL) }{\pageref{classDcel_1_1FaceT}}{} +\item\contentsline{section}{\hyperlink{classBVH_1_1LinearBVH}{B\+V\+H\+::\+Linear\+B\+V\+H$<$ T, P, B\+V, K $>$} \\*Forward declare linear \hyperlink{namespaceBVH}{B\+VH} class }{\pageref{classBVH_1_1LinearBVH}}{} +\item\contentsline{section}{\hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+Node\+T$<$ T, P, B\+V, K $>$} \\*Forward declare linear node class }{\pageref{classBVH_1_1LinearNodeT}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1MeshT}{Dcel\+::\+Mesh\+T$<$ T $>$} \\*Mesh class which stores a full D\+C\+EL mesh (with signed distance functions) }{\pageref{classDcel_1_1MeshT}}{} +\item\contentsline{section}{\hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+Node\+T$<$ T, P, B\+V, K $>$} \\*Forward declare the \hyperlink{namespaceBVH}{B\+VH} node since it is needed for the polymorphic lambdas }{\pageref{classBVH_1_1NodeT}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+L\+Y$<$ T $>$} \\*Class for generation a Dcel\+::\+Mesh\+T$<$\+T$>$ from the Stanford \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} file format }{\pageref{classDcel_1_1Parser_1_1PLY}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2\+D$<$ T $>$} \\*Class for embedding a D\+C\+EL polygon face into 2D }{\pageref{classDcel_1_1Polygon2D}}{} +\item\contentsline{section}{\hyperlink{classRotateOp}{Rotate\+Op$<$ T $>$} \\*Rotation operator. Can scale an input point }{\pageref{classRotateOp}}{} +\item\contentsline{section}{\hyperlink{classScaleOp}{Scale\+Op$<$ T $>$} \\*Scale operator. Can also be used as a reflection operator }{\pageref{classScaleOp}}{} +\item\contentsline{section}{\hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function$<$ T $>$} \\*Abstract representation of a signed distance function }{\pageref{classSignedDistanceFunction}}{} +\item\contentsline{section}{\hyperlink{classSphereSDF}{Sphere\+S\+D\+F$<$ T $>$} \\*Signed distance field for sphere }{\pageref{classSphereSDF}}{} +\item\contentsline{section}{\hyperlink{classTransformOp}{Transform\+Op$<$ T $>$} \\*Base class for transformation operators }{\pageref{classTransformOp}}{} +\item\contentsline{section}{\hyperlink{classTranslateOp}{Translate\+Op$<$ T $>$} \\*Translation operator. Can translate an input point }{\pageref{classTranslateOp}}{} +\item\contentsline{section}{\hyperlink{classUnion}{Union$<$ T $>$} \\*Distance function union. Computes the signed distance to the closest object of N non-\/overlapping objects }{\pageref{classUnion}}{} +\item\contentsline{section}{\hyperlink{classUnionBVH}{Union\+B\+V\+H$<$ T, B\+V, K $>$} \\*Distance function union using B\+V\+Hs. Computes the signed distance to the closest object of N non-\/overlapping objects }{\pageref{classUnionBVH}}{} +\item\contentsline{section}{\hyperlink{classVec2T}{Vec2\+T$<$ T $>$} \\*Two-\/dimensional vector class with arithmetic operators }{\pageref{classVec2T}}{} +\item\contentsline{section}{\hyperlink{classVec3T}{Vec3\+T$<$ T $>$} \\*Three-\/dimensional vector class with arithmetic operators }{\pageref{classVec3T}}{} +\item\contentsline{section}{\hyperlink{classDcel_1_1VertexT}{Dcel\+::\+Vertex\+T$<$ T $>$} \\*Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL) }{\pageref{classDcel_1_1VertexT}}{} +\end{DoxyCompactList} diff --git a/docs/doxygen/latex/classBVH_1_1LinearBVH.tex b/docs/doxygen/latex/classBVH_1_1LinearBVH.tex new file mode 100644 index 00000000..a0a901f5 --- /dev/null +++ b/docs/doxygen/latex/classBVH_1_1LinearBVH.tex @@ -0,0 +1,101 @@ +\hypertarget{classBVH_1_1LinearBVH}{}\section{B\+VH\+:\+:Linear\+B\+VH$<$ T, P, BV, K $>$ Class Template Reference} +\label{classBVH_1_1LinearBVH}\index{B\+V\+H\+::\+Linear\+B\+V\+H$<$ T, P, B\+V, K $>$@{B\+V\+H\+::\+Linear\+B\+V\+H$<$ T, P, B\+V, K $>$}} + + +Forward declare linear \hyperlink{namespaceBVH}{B\+VH} class. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_a13b0083e8b7ff1a5e170d39d69e6a15a}\label{classBVH_1_1LinearBVH_a13b0083e8b7ff1a5e170d39d69e6a15a}} +using \hyperlink{classBVH_1_1LinearBVH_a13b0083e8b7ff1a5e170d39d69e6a15a}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_ad8c5e4f84138090dbd408a075dc91896}\label{classBVH_1_1LinearBVH_ad8c5e4f84138090dbd408a075dc91896}} +using \hyperlink{classBVH_1_1LinearBVH_ad8c5e4f84138090dbd408a075dc91896}{Linear\+Node} = \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT}$<$ T, P, BV, K $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_a94ee5da1670e2ef85eeabf7cf6a2da92}\label{classBVH_1_1LinearBVH_a94ee5da1670e2ef85eeabf7cf6a2da92}} +using \hyperlink{classBVH_1_1LinearBVH_a94ee5da1670e2ef85eeabf7cf6a2da92}{Primitive\+List} = std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ +\begin{DoxyCompactList}\small\item\em List of primitives. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_af071dcad6741be1314c0b39512d2f142}\label{classBVH_1_1LinearBVH_af071dcad6741be1314c0b39512d2f142}} +\hyperlink{classBVH_1_1LinearBVH_af071dcad6741be1314c0b39512d2f142}{Linear\+B\+VH} ()=delete +\begin{DoxyCompactList}\small\item\em Disallowed. Use the full constructor please. \end{DoxyCompactList}\item +\hyperlink{classBVH_1_1LinearBVH_a82e767c16424e19c5dfbe671dd111e32}{Linear\+B\+VH} (const std\+::vector$<$ \hyperlink{classBVH_1_1LinearBVH_ad8c5e4f84138090dbd408a075dc91896}{Linear\+Node} $>$ \&a\+\_\+linear\+Nodes, const \hyperlink{classBVH_1_1LinearBVH_a94ee5da1670e2ef85eeabf7cf6a2da92}{Primitive\+List} \&a\+\_\+primitives) +\begin{DoxyCompactList}\small\item\em Full constructor. Associates the nodes and primitives. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_a39a98014b81061b35604422cfab5c9b7}\label{classBVH_1_1LinearBVH_a39a98014b81061b35604422cfab5c9b7}} +virtual \hyperlink{classBVH_1_1LinearBVH_a39a98014b81061b35604422cfab5c9b7}{$\sim$\+Linear\+B\+VH} () +\begin{DoxyCompactList}\small\item\em Destructor. Does nothing. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1LinearBVH_a383c6289251cf75ad9c4ed11cfb832ab}{signed\+Distance} (const \hyperlink{classBVH_1_1LinearBVH_a13b0083e8b7ff1a5e170d39d69e6a15a}{Vec3} \&a\+\_\+point, const \hyperlink{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}{Prune} a\+\_\+pruning=Prune\+::\+Ordered2) const noexcept +\begin{DoxyCompactList}\small\item\em Function which computes the signed distance. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_aa6b833445964d75b5b560ece4548a044}\label{classBVH_1_1LinearBVH_aa6b833445964d75b5b560ece4548a044}} +std\+::vector$<$ \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT}$<$ T, P, BV, K $>$ $>$ \hyperlink{classBVH_1_1LinearBVH_aa6b833445964d75b5b560ece4548a044}{m\+\_\+linear\+Nodes} +\begin{DoxyCompactList}\small\item\em List of linearly stored nodes. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearBVH_a82d8ebdc93553c7b02fe4da77329a4c2}\label{classBVH_1_1LinearBVH_a82d8ebdc93553c7b02fe4da77329a4c2}} +\hyperlink{classBVH_1_1LinearBVH_a94ee5da1670e2ef85eeabf7cf6a2da92}{Primitive\+List} \hyperlink{classBVH_1_1LinearBVH_a82d8ebdc93553c7b02fe4da77329a4c2}{m\+\_\+primitives} +\begin{DoxyCompactList}\small\item\em Global list of primitives. Note that this is A\+LL primitives, sorted so that \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT} can interface into it. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T, class P, class BV, int K$>$\newline +class B\+V\+H\+::\+Linear\+B\+V\+H$<$ T, P, B\+V, K $>$} + +Forward declare linear \hyperlink{namespaceBVH}{B\+VH} class. + +Linear root node for \hyperlink{namespaceBVH}{B\+VH} hierarchy. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classBVH_1_1LinearBVH_a82e767c16424e19c5dfbe671dd111e32}\label{classBVH_1_1LinearBVH_a82e767c16424e19c5dfbe671dd111e32}} +\index{B\+V\+H\+::\+Linear\+B\+VH@{B\+V\+H\+::\+Linear\+B\+VH}!Linear\+B\+VH@{Linear\+B\+VH}} +\index{Linear\+B\+VH@{Linear\+B\+VH}!B\+V\+H\+::\+Linear\+B\+VH@{B\+V\+H\+::\+Linear\+B\+VH}} +\subsubsection{\texorpdfstring{Linear\+B\+V\+H()}{LinearBVH()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +\hyperlink{classBVH_1_1LinearBVH}{B\+V\+H\+::\+Linear\+B\+VH}$<$ T, P, BV, K $>$\+::\hyperlink{classBVH_1_1LinearBVH}{Linear\+B\+VH} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classBVH_1_1LinearBVH_ad8c5e4f84138090dbd408a075dc91896}{Linear\+Node} $>$ \&}]{a\+\_\+linear\+Nodes, }\item[{const \hyperlink{classBVH_1_1LinearBVH_a94ee5da1670e2ef85eeabf7cf6a2da92}{Primitive\+List} \&}]{a\+\_\+primitives }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full constructor. Associates the nodes and primitives. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+linear\+Nodes} & Linearized \hyperlink{namespaceBVH}{B\+VH} nodes. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+primitives} & Primitives. \\ +\hline +\end{DoxyParams} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classBVH_1_1LinearBVH_a383c6289251cf75ad9c4ed11cfb832ab}\label{classBVH_1_1LinearBVH_a383c6289251cf75ad9c4ed11cfb832ab}} +\index{B\+V\+H\+::\+Linear\+B\+VH@{B\+V\+H\+::\+Linear\+B\+VH}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!B\+V\+H\+::\+Linear\+B\+VH@{B\+V\+H\+::\+Linear\+B\+VH}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1LinearBVH}{B\+V\+H\+::\+Linear\+B\+VH}$<$ T, P, BV, K $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1LinearBVH_a13b0083e8b7ff1a5e170d39d69e6a15a}{Vec3} \&}]{a\+\_\+point, }\item[{const \hyperlink{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}{Prune}}]{a\+\_\+pruning = {\ttfamily Prune\+:\+:Ordered2} }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which computes the signed distance. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point in space \\ +\hline +\mbox{\tt in} & {\em a\+\_\+pruning} & Pruning algorithm. \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}\item +Source/\hyperlink{EBGeometry__BVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classBVH_1_1LinearNodeT.tex b/docs/doxygen/latex/classBVH_1_1LinearNodeT.tex new file mode 100644 index 00000000..1b49fe32 --- /dev/null +++ b/docs/doxygen/latex/classBVH_1_1LinearNodeT.tex @@ -0,0 +1,243 @@ +\hypertarget{classBVH_1_1LinearNodeT}{}\section{B\+VH\+:\+:Linear\+NodeT$<$ T, P, BV, K $>$ Class Template Reference} +\label{classBVH_1_1LinearNodeT}\index{B\+V\+H\+::\+Linear\+Node\+T$<$ T, P, B\+V, K $>$@{B\+V\+H\+::\+Linear\+Node\+T$<$ T, P, B\+V, K $>$}} + + +Forward declare linear node class. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}\label{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}} +using \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_ae7dbdb102840eb271dadea2f25aa6f8b}\label{classBVH_1_1LinearNodeT_ae7dbdb102840eb271dadea2f25aa6f8b}} +\hyperlink{classBVH_1_1LinearNodeT_ae7dbdb102840eb271dadea2f25aa6f8b}{Linear\+NodeT} () +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a4b5dd392397794113ad3b5bb2ed5003a}\label{classBVH_1_1LinearNodeT_a4b5dd392397794113ad3b5bb2ed5003a}} +virtual \hyperlink{classBVH_1_1LinearNodeT_a4b5dd392397794113ad3b5bb2ed5003a}{$\sim$\+Linear\+NodeT} () +\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1LinearNodeT_a03e3dd1c74bf9e66ed692130b49c2e0f}{set\+Bounding\+Volume} (const BV \&a\+\_\+bounding\+Volume) noexcept +\begin{DoxyCompactList}\small\item\em Set the bounding volume. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_ace68df1290bd44623c694e6b7ebdec6e}\label{classBVH_1_1LinearNodeT_ace68df1290bd44623c694e6b7ebdec6e}} +void \hyperlink{classBVH_1_1LinearNodeT_ace68df1290bd44623c694e6b7ebdec6e}{set\+Primitives\+Offset} (const unsigned long a\+\_\+primitives\+Offset) noexcept +\begin{DoxyCompactList}\small\item\em Set the offset into the primitives array. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1LinearNodeT_a1a91e5f540da1b1bb85224db94cd53d8}{set\+Num\+Primitives} (const int a\+\_\+num\+Primitives) noexcept +\begin{DoxyCompactList}\small\item\em Set number of primitives. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1LinearNodeT_a3a972ef5ea9abc6e2ead9f453e233e2f}{set\+Child\+Offset} (const unsigned long a\+\_\+child\+Offset, const int a\+\_\+which\+Child) noexcept +\begin{DoxyCompactList}\small\item\em Set the child offsets. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a152b12723c86f8fcb7522562cd97cd67}\label{classBVH_1_1LinearNodeT_a152b12723c86f8fcb7522562cd97cd67}} +const BV \& \hyperlink{classBVH_1_1LinearNodeT_a152b12723c86f8fcb7522562cd97cd67}{get\+Bounding\+Volume} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the node bounding volume. return m\+\_\+bounding\+Volume. \end{DoxyCompactList}\item +const unsigned long \& \hyperlink{classBVH_1_1LinearNodeT_a8cfca65bd808adc8eb2793e7d7aabcd3}{get\+Primitives\+Offset} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the primitives offset. \end{DoxyCompactList}\item +const unsigned long \& \hyperlink{classBVH_1_1LinearNodeT_a245e67b6824cadf1733c3c9176259106}{get\+Num\+Primitives} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the number of primitives. \end{DoxyCompactList}\item +const std\+::array$<$ unsigned long, K $>$ \& \hyperlink{classBVH_1_1LinearNodeT_af08feacbaa148425a896c196b0b6d1da}{get\+Child\+Offsets} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the child offsets. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_aba361834e3d013725a92ec4b45633584}\label{classBVH_1_1LinearNodeT_aba361834e3d013725a92ec4b45633584}} +bool \hyperlink{classBVH_1_1LinearNodeT_aba361834e3d013725a92ec4b45633584}{is\+Leaf} () const noexcept +\begin{DoxyCompactList}\small\item\em Is leaf or not. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1LinearNodeT_a2bf5b1c514a20754d527b17e1c664630}{get\+Distance\+To\+Bounding\+Volume} (const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Get the distance from a 3D point to the bounding volume. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1LinearNodeT_a3e85605a1f0986b8440964ed0dbe90f6}{get\+Distance\+To\+Bounding\+Volume2} (const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Get the unsigned square from a 3D point to the bounding volume. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1LinearNodeT_a1a0a50ba8c1c0601f12ae02857246b1f}{get\+Distance\+To\+Primitives} (const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&a\+\_\+point, const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&a\+\_\+primitives) const noexcept +\begin{DoxyCompactList}\small\item\em Compute signed distance to primitives. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a5479cd8a3503d16bb3f09273971df24a}\label{classBVH_1_1LinearNodeT_a5479cd8a3503d16bb3f09273971df24a}} +void \hyperlink{classBVH_1_1LinearNodeT_a5479cd8a3503d16bb3f09273971df24a}{prune\+Ordered2} (T \&a\+\_\+shortest\+Square\+Distance\+So\+Far, unsigned long \&a\+\_\+closest\+Primitive\+So\+Far, const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&a\+\_\+point, const std\+::vector$<$ \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT}$<$ T, P, BV, K $>$ $>$ \&a\+\_\+linear\+Nodes, const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&a\+\_\+primitives) const noexcept +\begin{DoxyCompactList}\small\item\em Pruning algorithm. This is the same algorithm as \hyperlink{classBVH_1_1NodeT_acb7fec40e06e97fcd42ec75169603e8b}{Node\+T\+::prune\+Ordered2}, except that the nodes and primitives come in as arguments (and the node has been collapsed onto one cache line). \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_acef96b811ea69cd649fda35da082b361}\label{classBVH_1_1LinearNodeT_acef96b811ea69cd649fda35da082b361}} +BV \hyperlink{classBVH_1_1LinearNodeT_acef96b811ea69cd649fda35da082b361}{m\+\_\+bounding\+Volume} +\begin{DoxyCompactList}\small\item\em Bounding volume. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a05efc0076443c7131187adfadaad81ea}\label{classBVH_1_1LinearNodeT_a05efc0076443c7131187adfadaad81ea}} +unsigned long \hyperlink{classBVH_1_1LinearNodeT_a05efc0076443c7131187adfadaad81ea}{m\+\_\+primitives\+Offset} +\begin{DoxyCompactList}\small\item\em Offset into primitives array. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a59a4aff1eeac58606f4854e334e10a17}\label{classBVH_1_1LinearNodeT_a59a4aff1eeac58606f4854e334e10a17}} +int \hyperlink{classBVH_1_1LinearNodeT_a59a4aff1eeac58606f4854e334e10a17}{m\+\_\+num\+Primitives} +\begin{DoxyCompactList}\small\item\em Number of primitives. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a2a160d04d0bea69de7eb949fd9d56dda}\label{classBVH_1_1LinearNodeT_a2a160d04d0bea69de7eb949fd9d56dda}} +std\+::array$<$ unsigned long, K $>$ \hyperlink{classBVH_1_1LinearNodeT_a2a160d04d0bea69de7eb949fd9d56dda}{m\+\_\+child\+Offsets} +\begin{DoxyCompactList}\small\item\em Offset to child nodes. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T, class P, class BV, int K$>$\newline +class B\+V\+H\+::\+Linear\+Node\+T$<$ T, P, B\+V, K $>$} + +Forward declare linear node class. + +Node type for linearized (flattened) \hyperlink{namespaceBVH}{B\+VH}. This will be constructed from the other (conventional) \hyperlink{namespaceBVH}{B\+VH} type. + +T is the precision for Vec3, P is the primitive type you want to enclose, BV is the bounding volume you use for it. + +\begin{DoxyNote}{Note} +P M\+U\+ST supply function signed\+Distance(...) and unsigned\+Distance2(\+Vec3). BV must supply a function get\+Distance (had this been C++20, we would have use concepts to enforce this). Note that Linear\+Node is the result of a flattnened \hyperlink{namespaceBVH}{B\+VH} hierarchy where nodes are stored with depth-\/first ordering for improved cache-\/location in the downward traversal. + +This class exists so that we can fit the nodes with a smaller memory footprint. The standard \hyperlink{namespaceBVH}{B\+VH} node (\hyperlink{classBVH_1_1NodeT}{NodeT}) is very useful when building the tree but less useful when traversing it since it stores references to the primitives in the node itself. It will span multiple cache lines. This node exists so that we can fit all the \hyperlink{namespaceBVH}{B\+VH} info onto fewer cache lines. The number of cache lines will depend on the tree degree, precision, and bounding volume that is chosen. +\end{DoxyNote} +\begin{DoxyRefDesc}{Todo} +\item[\hyperlink{todo__todo000001}{Todo}]There\textquotesingle{}s a minor optimization that can be made to the memory alignment, which is as follows\+: For a leaf node we never really need the m\+\_\+child\+Offsets array, and for a regular node we never really need the m\+\_\+primitives\+Offset member. Moreover, m\+\_\+child\+Offsets could be made into a K-\/1 sized array because we happen to know that the linearized hierarchy will store the first child node immediately after the regular node. We could shave off 16 bytes of storage, which would mean that a double-\/precision binary tree only takes up one word of C\+PU memory. \end{DoxyRefDesc} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_af08feacbaa148425a896c196b0b6d1da}\label{classBVH_1_1LinearNodeT_af08feacbaa148425a896c196b0b6d1da}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!get\+Child\+Offsets@{get\+Child\+Offsets}} +\index{get\+Child\+Offsets@{get\+Child\+Offsets}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{get\+Child\+Offsets()}{getChildOffsets()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +const std\+::array$<$ unsigned long, K $>$ \& \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::get\+Child\+Offsets (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the child offsets. + +\begin{DoxyReturn}{Returns} +Returns m\+\_\+child\+Offsets +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a2bf5b1c514a20754d527b17e1c664630}\label{classBVH_1_1LinearNodeT_a2bf5b1c514a20754d527b17e1c664630}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!get\+Distance\+To\+Bounding\+Volume@{get\+Distance\+To\+Bounding\+Volume}} +\index{get\+Distance\+To\+Bounding\+Volume@{get\+Distance\+To\+Bounding\+Volume}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{get\+Distance\+To\+Bounding\+Volume()}{getDistanceToBoundingVolume()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::get\+Distance\+To\+Bounding\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the distance from a 3D point to the bounding volume. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns distance to bounding volume. A zero distance implies that the input point is inside the bounding volume. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a3e85605a1f0986b8440964ed0dbe90f6}\label{classBVH_1_1LinearNodeT_a3e85605a1f0986b8440964ed0dbe90f6}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!get\+Distance\+To\+Bounding\+Volume2@{get\+Distance\+To\+Bounding\+Volume2}} +\index{get\+Distance\+To\+Bounding\+Volume2@{get\+Distance\+To\+Bounding\+Volume2}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{get\+Distance\+To\+Bounding\+Volume2()}{getDistanceToBoundingVolume2()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::get\+Distance\+To\+Bounding\+Volume2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the unsigned square from a 3D point to the bounding volume. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns squared distance to bounding volume. A zero distance implies that the input point is inside the bounding volume. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a1a0a50ba8c1c0601f12ae02857246b1f}\label{classBVH_1_1LinearNodeT_a1a0a50ba8c1c0601f12ae02857246b1f}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!get\+Distance\+To\+Primitives@{get\+Distance\+To\+Primitives}} +\index{get\+Distance\+To\+Primitives@{get\+Distance\+To\+Primitives}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{get\+Distance\+To\+Primitives()}{getDistanceToPrimitives()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::get\+Distance\+To\+Primitives (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1LinearNodeT_a073e87d51d44b4cc243c8f90690247a6}{Vec3} \&}]{a\+\_\+point, }\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&}]{a\+\_\+primitives }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute signed distance to primitives. + +\begin{DoxyNote}{Note} +Only call if this is a leaf node. +\end{DoxyNote} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a245e67b6824cadf1733c3c9176259106}\label{classBVH_1_1LinearNodeT_a245e67b6824cadf1733c3c9176259106}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!get\+Num\+Primitives@{get\+Num\+Primitives}} +\index{get\+Num\+Primitives@{get\+Num\+Primitives}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{get\+Num\+Primitives()}{getNumPrimitives()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +const unsigned long \& \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::get\+Num\+Primitives (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the number of primitives. + +\begin{DoxyReturn}{Returns} +Returns m\+\_\+num\+Primitives +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a8cfca65bd808adc8eb2793e7d7aabcd3}\label{classBVH_1_1LinearNodeT_a8cfca65bd808adc8eb2793e7d7aabcd3}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!get\+Primitives\+Offset@{get\+Primitives\+Offset}} +\index{get\+Primitives\+Offset@{get\+Primitives\+Offset}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{get\+Primitives\+Offset()}{getPrimitivesOffset()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +const unsigned long \& \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::get\+Primitives\+Offset (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the primitives offset. + +\begin{DoxyReturn}{Returns} +Returns m\+\_\+primitives\+Offset +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a03e3dd1c74bf9e66ed692130b49c2e0f}\label{classBVH_1_1LinearNodeT_a03e3dd1c74bf9e66ed692130b49c2e0f}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!set\+Bounding\+Volume@{set\+Bounding\+Volume}} +\index{set\+Bounding\+Volume@{set\+Bounding\+Volume}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{set\+Bounding\+Volume()}{setBoundingVolume()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::set\+Bounding\+Volume (\begin{DoxyParamCaption}\item[{const BV \&}]{a\+\_\+bounding\+Volume }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the bounding volume. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+bounding\+Volume} & Bounding volume for this node. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a3a972ef5ea9abc6e2ead9f453e233e2f}\label{classBVH_1_1LinearNodeT_a3a972ef5ea9abc6e2ead9f453e233e2f}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!set\+Child\+Offset@{set\+Child\+Offset}} +\index{set\+Child\+Offset@{set\+Child\+Offset}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{set\+Child\+Offset()}{setChildOffset()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::set\+Child\+Offset (\begin{DoxyParamCaption}\item[{const unsigned long}]{a\+\_\+child\+Offset, }\item[{const int}]{a\+\_\+which\+Child }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the child offsets. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+child\+Offset} & Offset in node array. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+which\+Child} & Child index in m\+\_\+children\+Offsets. Must be \mbox{[}0,K-\/1\mbox{]} \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1LinearNodeT_a1a91e5f540da1b1bb85224db94cd53d8}\label{classBVH_1_1LinearNodeT_a1a91e5f540da1b1bb85224db94cd53d8}} +\index{B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}!set\+Num\+Primitives@{set\+Num\+Primitives}} +\index{set\+Num\+Primitives@{set\+Num\+Primitives}!B\+V\+H\+::\+Linear\+NodeT@{B\+V\+H\+::\+Linear\+NodeT}} +\subsubsection{\texorpdfstring{set\+Num\+Primitives()}{setNumPrimitives()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1LinearNodeT}{B\+V\+H\+::\+Linear\+NodeT}$<$ T, P, BV, K $>$\+::set\+Num\+Primitives (\begin{DoxyParamCaption}\item[{const int}]{a\+\_\+num\+Primitives }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set number of primitives. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+num\+Primitives} & Number of primitives. \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}\item +Source/\hyperlink{EBGeometry__BVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classBVH_1_1NodeT.tex b/docs/doxygen/latex/classBVH_1_1NodeT.tex new file mode 100644 index 00000000..c047a9a1 --- /dev/null +++ b/docs/doxygen/latex/classBVH_1_1NodeT.tex @@ -0,0 +1,681 @@ +\hypertarget{classBVH_1_1NodeT}{}\section{B\+VH\+:\+:NodeT$<$ T, P, BV, K $>$ Class Template Reference} +\label{classBVH_1_1NodeT}\index{B\+V\+H\+::\+Node\+T$<$ T, P, B\+V, K $>$@{B\+V\+H\+::\+Node\+T$<$ T, P, B\+V, K $>$}} + + +Forward declare the \hyperlink{namespaceBVH}{B\+VH} node since it is needed for the polymorphic lambdas. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}\label{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}} +using \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} = \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$ P $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}\label{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}} +using \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +using \hyperlink{classBVH_1_1NodeT_ac52d9b56f082002c7f8be91062c40ff8}{Node} = \hyperlink{classBVH_1_1NodeT}{NodeT}$<$ T, P, BV, K $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}\label{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}} +using \hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classBVH_1_1NodeT_ac52d9b56f082002c7f8be91062c40ff8}{Node} $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_acbe56195affc439febe8aca84db308e3}\label{classBVH_1_1NodeT_acbe56195affc439febe8aca84db308e3}} +using \hyperlink{classBVH_1_1NodeT_acbe56195affc439febe8aca84db308e3}{Stop\+Function} = \hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{Stop\+FunctionT}$<$ T, P, BV, K $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a3bb028655b8b961fa35109af1c14f281}\label{classBVH_1_1NodeT_a3bb028655b8b961fa35109af1c14f281}} +using \hyperlink{classBVH_1_1NodeT_a3bb028655b8b961fa35109af1c14f281}{Partitioner} = \hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{PartitionerT}$<$ P, K $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a2340f2466ed5b6eebab4bdc72004858e}\label{classBVH_1_1NodeT_a2340f2466ed5b6eebab4bdc72004858e}} +using \hyperlink{classBVH_1_1NodeT_a2340f2466ed5b6eebab4bdc72004858e}{B\+V\+Constructor} = \hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+ConstructorT}$<$ P, BV $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a960d0972bec81cf782b36e57f87da1f1}\label{classBVH_1_1NodeT_a960d0972bec81cf782b36e57f87da1f1}} +\hyperlink{classBVH_1_1NodeT_a960d0972bec81cf782b36e57f87da1f1}{NodeT} () +\begin{DoxyCompactList}\small\item\em Default constructor which sets a regular node without any data (no parent/children and no depth) \end{DoxyCompactList}\item +\hyperlink{classBVH_1_1NodeT_a8867e5e1c47d12eff7a468b2e240f16b}{NodeT} (const \hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \&a\+\_\+parent) +\begin{DoxyCompactList}\small\item\em Construct node from parent. \end{DoxyCompactList}\item +\hyperlink{classBVH_1_1NodeT_a6da86ccc8e4a0c556cd67ca59af983dc}{NodeT} (const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ P $>$ $>$ \&a\+\_\+primitives) +\begin{DoxyCompactList}\small\item\em Construct node from a set of primitives. \end{DoxyCompactList}\item +\hyperlink{classBVH_1_1NodeT_a6312ce04f70c2e1a860ce380298909b6}{NodeT} (const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&a\+\_\+primitives) +\begin{DoxyCompactList}\small\item\em Construct node from a set of primitives. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a5bc328f2381b6babe37496758ea4b583}\label{classBVH_1_1NodeT_a5bc328f2381b6babe37496758ea4b583}} +\hyperlink{classBVH_1_1NodeT_a5bc328f2381b6babe37496758ea4b583}{$\sim$\+NodeT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_acae5a575fa8b236de984fdd41e04c038}{top\+Down\+Sort\+And\+Partition\+Primitives} (const \hyperlink{classBVH_1_1NodeT_a2340f2466ed5b6eebab4bdc72004858e}{B\+V\+Constructor} \&a\+\_\+bv\+Constructor, const \hyperlink{classBVH_1_1NodeT_a3bb028655b8b961fa35109af1c14f281}{Partitioner} \&a\+\_\+partitioner, const \hyperlink{classBVH_1_1NodeT_acbe56195affc439febe8aca84db308e3}{Stop\+Function} \&a\+\_\+stop\+Crit) noexcept +\begin{DoxyCompactList}\small\item\em Function for using top-\/down construction of the bounding volume hierarchy. \end{DoxyCompactList}\item +int \hyperlink{classBVH_1_1NodeT_a158041a671c970da921446050e95f474}{get\+Depth} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the depth of the current node. \end{DoxyCompactList}\item +const \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \& \hyperlink{classBVH_1_1NodeT_a2e0c1e030162a2dc049acb4debd4d9f2}{get\+Primitives} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the primitives stored in this node. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a02cba4dcb065ebfaeea7e4d251b89d04}\label{classBVH_1_1NodeT_a02cba4dcb065ebfaeea7e4d251b89d04}} +const BV \& \hyperlink{classBVH_1_1NodeT_a02cba4dcb065ebfaeea7e4d251b89d04}{get\+Bounding\+Volume} () const noexcept +\begin{DoxyCompactList}\small\item\em Get bounding volume. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_aef7148b18296dce60853b5966c9f1e0d}{signed\+Distance} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point, const \hyperlink{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}{Prune} a\+\_\+pruning=Prune\+::\+Ordered2) const noexcept +\begin{DoxyCompactList}\small\item\em Function which computes the signed distance. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_a3aa6e9109897a573a46714278e0a79c6}{prune\+Ordered} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Function which computes the signed distance using ordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_acb7fec40e06e97fcd42ec75169603e8b}{prune\+Ordered2} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Function which computes the signed distance using ordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_a27cfc030a9b7f9b0341e94dc6733b511}{prune\+Unordered} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Function which computes the signed distance using unordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_aafa2f1f4f4f58296531723e9a6d7d13a}{prune\+Unordered2} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Function which computes the signed distance using unordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \hyperlink{classBVH_1_1LinearBVH}{Linear\+B\+VH}$<$ T, P, BV, K $>$ $>$ \hyperlink{classBVH_1_1NodeT_a926e3990022ab28821d3f51e5fead023}{flatten\+Tree} () +\begin{DoxyCompactList}\small\item\em Flatten everything beneath this node into a depth-\/first sorted \hyperlink{namespaceBVH}{B\+VH} hierarchy. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +void \hyperlink{classBVH_1_1NodeT_a964bd054b57fce2fec50505a65f6bacd}{set\+Node\+Type} (const \hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{Node\+Type} a\+\_\+node\+Type) noexcept +\begin{DoxyCompactList}\small\item\em Set node type to leaf or regular. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_abdff7fdbe3694e2aeb788261175077cc}{set\+Depth} (const int a\+\_\+depth) noexcept +\begin{DoxyCompactList}\small\item\em Set node depth. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_a8113c8dfa5ab6dc3cf931c5c8fdd6ddb}{insert\+Node} (\hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \&a\+\_\+node, const \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \&a\+\_\+primitives) noexcept +\begin{DoxyCompactList}\small\item\em Insert a new node in the tree. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a75a7b385ec12897c1ade331ee24d9b74}\label{classBVH_1_1NodeT_a75a7b385ec12897c1ade331ee24d9b74}} +void \hyperlink{classBVH_1_1NodeT_a75a7b385ec12897c1ade331ee24d9b74}{insert\+Nodes} (const std\+::array$<$ \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List}, K $>$ \&a\+\_\+primitives) noexcept +\begin{DoxyCompactList}\small\item\em Insert nodes with primitives. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_a8f9c409918d61b0d0ad3dd6e2b692443}{set\+To\+Regular\+Node} () noexcept +\begin{DoxyCompactList}\small\item\em Set to regular node. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_a2c9c3d3a83b3c1895c8f89b2bbd62e81}{set\+Primitives} (const \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \&a\+\_\+primitives) noexcept +\begin{DoxyCompactList}\small\item\em Set primitives in this node. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_a8da9f78078b0a579868d026bd61a2947}{get\+Distance\+To\+Bounding\+Volume} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Get the distance from a 3D point to the bounding volume. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_a06708a2711fd354a3c382da664cfe154}{get\+Distance\+To\+Bounding\+Volume2} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Get the unsigned square from a 3D point to the bounding volume. \end{DoxyCompactList}\item +T \hyperlink{classBVH_1_1NodeT_a61dc7040d57f0a69984548eb4804244b}{get\+Distance\+To\+Primitives} (const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the shortest distance to the primitives in this node. \end{DoxyCompactList}\item +\hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{Node\+Type} \hyperlink{classBVH_1_1NodeT_a7b9e3a8bfa35f604298634da102a0ce4}{get\+Node\+Type} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the node type. \end{DoxyCompactList}\item +\hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \& \hyperlink{classBVH_1_1NodeT_adce9d9c6bd4ab3d613bef232353774f3}{get\+Primitives} () noexcept +\begin{DoxyCompactList}\small\item\em Get the list of primitives in this node. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_a92db0ab2d61c76469600478fddd04edc}{set\+Parent} (const \hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \&a\+\_\+parent) noexcept +\begin{DoxyCompactList}\small\item\em Set parent node. \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_ac4a3be457d66d2673f717f203e60fc08}{prune\+Ordered} (T \&a\+\_\+closest, const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Implementation function for prune\+Ordered (it requires a different signature). \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_a2887ad51251739359602dde8db6a5998}{prune\+Ordered2} (T \&a\+\_\+min\+Dist2, std\+::shared\+\_\+ptr$<$ const P $>$ \&a\+\_\+closest, const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Implementation function for prune\+Ordered2 (it requires a different signature). \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_ad252aa451ca983750dfa0c24344253b2}{prune\+Unordered} (T \&a\+\_\+closest, const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Implementation function for prune\+Unordered (it requires a different signature). \end{DoxyCompactList}\item +void \hyperlink{classBVH_1_1NodeT_a1079cba9ac1f114ad2cbc6cdea2eae49}{prune\+Unordered2} (T \&a\+\_\+min\+Dist2, std\+::shared\+\_\+ptr$<$ const P $>$ \&a\+\_\+closest, const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Implementation function for prune\+Unordered2 (it requires a different signature). \end{DoxyCompactList}\item +unsigned long \hyperlink{classBVH_1_1NodeT_a14f014426b00ad7989af328fa369bca8}{flatten\+Tree} (std\+::vector$<$ \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT}$<$ T, P, BV, K $>$ $>$ \&a\+\_\+linear\+Nodes, std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&a\+\_\+sorted\+Primitives, unsigned long \&a\+\_\+offset) const noexcept +\begin{DoxyCompactList}\small\item\em Flatten tree method. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a7f8720f2ab03ee9e81de114c479cb2e5}\label{classBVH_1_1NodeT_a7f8720f2ab03ee9e81de114c479cb2e5}} +BV \hyperlink{classBVH_1_1NodeT_a7f8720f2ab03ee9e81de114c479cb2e5}{m\+\_\+bounding\+Volume} +\begin{DoxyCompactList}\small\item\em Bounding volume object. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a1e8922fc8cfca32763a7fcb85d9a9508}\label{classBVH_1_1NodeT_a1e8922fc8cfca32763a7fcb85d9a9508}} +\hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{Node\+Type} \hyperlink{classBVH_1_1NodeT_a1e8922fc8cfca32763a7fcb85d9a9508}{m\+\_\+node\+Type} +\begin{DoxyCompactList}\small\item\em Node type (leaf or regular) \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a8b924aa0aa13630167f69a7b19038e7e}\label{classBVH_1_1NodeT_a8b924aa0aa13630167f69a7b19038e7e}} +int \hyperlink{classBVH_1_1NodeT_a8b924aa0aa13630167f69a7b19038e7e}{m\+\_\+depth} +\begin{DoxyCompactList}\small\item\em Node depth. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_abcdc79254bc8b9d227a70e1ad15ff35e}\label{classBVH_1_1NodeT_abcdc79254bc8b9d227a70e1ad15ff35e}} +\hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \hyperlink{classBVH_1_1NodeT_abcdc79254bc8b9d227a70e1ad15ff35e}{m\+\_\+primitives} +\begin{DoxyCompactList}\small\item\em Primitives list. This will be empty for regular nodes. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_a35da0576176a01c9c441f0f2b899ca33}\label{classBVH_1_1NodeT_a35da0576176a01c9c441f0f2b899ca33}} +std\+::array$<$ \hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr}, K $>$ \hyperlink{classBVH_1_1NodeT_a35da0576176a01c9c441f0f2b899ca33}{m\+\_\+children} +\begin{DoxyCompactList}\small\item\em Children nodes. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBVH_1_1NodeT_abf7f5d4808d0662f2ee0ae07a4bcddca}\label{classBVH_1_1NodeT_abf7f5d4808d0662f2ee0ae07a4bcddca}} +\hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \hyperlink{classBVH_1_1NodeT_abf7f5d4808d0662f2ee0ae07a4bcddca}{m\+\_\+parent} +\begin{DoxyCompactList}\small\item\em Pointer to parent node. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T, class P, class BV, int K$>$\newline +class B\+V\+H\+::\+Node\+T$<$ T, P, B\+V, K $>$} + +Forward declare the \hyperlink{namespaceBVH}{B\+VH} node since it is needed for the polymorphic lambdas. + +Class which encapsulates a node in a bounding volume hierarchy. + +T is the precision used in the \hyperlink{namespaceBVH}{B\+VH} computations, P is the enclosing primitive and BV is the bounding volume used in the \hyperlink{namespaceBVH}{B\+VH}. + +T is the precision for Vec3, P is the primitive type you want to enclose, BV is the bounding volume you use for it. \begin{DoxyNote}{Note} +P M\+U\+ST supply function signed\+Distance(...) and unsigned\+Distance2(\+Vec3). BV must supply a function get\+Distance (had this been C++20, we would have use concepts to enforce this). +\end{DoxyNote} + + +\subsection{Member Typedef Documentation} +\mbox{\Hypertarget{classBVH_1_1NodeT_ac52d9b56f082002c7f8be91062c40ff8}\label{classBVH_1_1NodeT_ac52d9b56f082002c7f8be91062c40ff8}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!Node@{Node}} +\index{Node@{Node}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{Node}{Node}} +{\footnotesize\ttfamily template$<$class T, class P, class BV, int K$>$ \\ +using \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::\hyperlink{classBVH_1_1NodeT_ac52d9b56f082002c7f8be91062c40ff8}{Node} = \hyperlink{classBVH_1_1NodeT}{NodeT}$<$T, P, BV, K$>$} + + + +Alias for cutting down on typing. + +In the below, \textquotesingle{}Node\textquotesingle{} is a class which uses precision T for computations and encloses primitives P using a bounding volume BV. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classBVH_1_1NodeT_a8867e5e1c47d12eff7a468b2e240f16b}\label{classBVH_1_1NodeT_a8867e5e1c47d12eff7a468b2e240f16b}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!NodeT@{NodeT}} +\index{NodeT@{NodeT}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{Node\+T()}{NodeT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +\hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::\hyperlink{classBVH_1_1NodeT}{NodeT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \&}]{a\+\_\+parent }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Construct node from parent. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+parent} & Parent node.\\ +\hline +\end{DoxyParams} +This sets the node\textquotesingle{}s parent to be a\+\_\+parent and the node\textquotesingle{}s depth to be the parent\textquotesingle{}s depth + 1. \begin{DoxyNote}{Note} +This node becomes a leaf node. +\end{DoxyNote} +\mbox{\Hypertarget{classBVH_1_1NodeT_a6da86ccc8e4a0c556cd67ca59af983dc}\label{classBVH_1_1NodeT_a6da86ccc8e4a0c556cd67ca59af983dc}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!NodeT@{NodeT}} +\index{NodeT@{NodeT}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{Node\+T()}{NodeT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +\hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::\hyperlink{classBVH_1_1NodeT}{NodeT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ P $>$ $>$ \&}]{a\+\_\+primitives }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Construct node from a set of primitives. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & Input primitives.\\ +\hline +\end{DoxyParams} +This sets the node\textquotesingle{}s parent to be a\+\_\+parent and the node\textquotesingle{}s depth to be the parent\textquotesingle{}s depth + 1. \begin{DoxyNote}{Note} +This node becomes a leaf node with depth=0 and which contains the input primitives. +\end{DoxyNote} +\mbox{\Hypertarget{classBVH_1_1NodeT_a6312ce04f70c2e1a860ce380298909b6}\label{classBVH_1_1NodeT_a6312ce04f70c2e1a860ce380298909b6}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!NodeT@{NodeT}} +\index{NodeT@{NodeT}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{Node\+T()}{NodeT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +\hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::\hyperlink{classBVH_1_1NodeT}{NodeT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&}]{a\+\_\+primitives }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Construct node from a set of primitives. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & Input primitives. \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This node becomes a leaf node with depth=0 and which contains the input primitives. +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classBVH_1_1NodeT_a926e3990022ab28821d3f51e5fead023}\label{classBVH_1_1NodeT_a926e3990022ab28821d3f51e5fead023}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!flatten\+Tree@{flatten\+Tree}} +\index{flatten\+Tree@{flatten\+Tree}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{flatten\+Tree()}{flattenTree()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +std\+::shared\+\_\+ptr$<$ \hyperlink{classBVH_1_1LinearBVH}{Linear\+B\+VH}$<$ T, P, BV, K $>$ $>$ \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::flatten\+Tree (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Flatten everything beneath this node into a depth-\/first sorted \hyperlink{namespaceBVH}{B\+VH} hierarchy. + +This will compute the flattening of the standard \hyperlink{namespaceBVH}{B\+VH} tree and return a pointer to the root node. \mbox{\Hypertarget{classBVH_1_1NodeT_a14f014426b00ad7989af328fa369bca8}\label{classBVH_1_1NodeT_a14f014426b00ad7989af328fa369bca8}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!flatten\+Tree@{flatten\+Tree}} +\index{flatten\+Tree@{flatten\+Tree}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{flatten\+Tree()}{flattenTree()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +unsigned long \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::flatten\+Tree (\begin{DoxyParamCaption}\item[{std\+::vector$<$ \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT}$<$ T, P, BV, K $>$ $>$ \&}]{a\+\_\+linear\+Nodes, }\item[{std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ \&}]{a\+\_\+sorted\+Primitives, }\item[{unsigned long \&}]{a\+\_\+offset }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Flatten tree method. + +This function will flatten everything beneath the current node and linearize all the nodes and primitives beneath it to a\+\_\+linear\+Nodes and a\+\_\+sorted\+Primitives. This function is called recursively. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in,out} & {\em a\+\_\+linear\+Nodes} & \hyperlink{namespaceBVH}{B\+VH} nodes, linearized onto a vector. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+sorted\+Primitives} & Sorted primitives (in leaf node order). \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+offset} & Supporting integer for figuring out where in the tree we are. \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +When called from the root node, a\+\_\+linear\+Nodes and a\+\_\+sorted\+Primitives should be empty and a\+\_\+offset=0\+UL. +\end{DoxyNote} +\mbox{\Hypertarget{classBVH_1_1NodeT_a158041a671c970da921446050e95f474}\label{classBVH_1_1NodeT_a158041a671c970da921446050e95f474}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Depth@{get\+Depth}} +\index{get\+Depth@{get\+Depth}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Depth()}{getDepth()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +int \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Depth (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the depth of the current node. + +\begin{DoxyReturn}{Returns} +Depth of current node +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a8da9f78078b0a579868d026bd61a2947}\label{classBVH_1_1NodeT_a8da9f78078b0a579868d026bd61a2947}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Distance\+To\+Bounding\+Volume@{get\+Distance\+To\+Bounding\+Volume}} +\index{get\+Distance\+To\+Bounding\+Volume@{get\+Distance\+To\+Bounding\+Volume}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Distance\+To\+Bounding\+Volume()}{getDistanceToBoundingVolume()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Distance\+To\+Bounding\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Get the distance from a 3D point to the bounding volume. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns distance to bounding volume. A zero distance implies that the input point is inside the bounding volume. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a06708a2711fd354a3c382da664cfe154}\label{classBVH_1_1NodeT_a06708a2711fd354a3c382da664cfe154}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Distance\+To\+Bounding\+Volume2@{get\+Distance\+To\+Bounding\+Volume2}} +\index{get\+Distance\+To\+Bounding\+Volume2@{get\+Distance\+To\+Bounding\+Volume2}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Distance\+To\+Bounding\+Volume2()}{getDistanceToBoundingVolume2()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Distance\+To\+Bounding\+Volume2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Get the unsigned square from a 3D point to the bounding volume. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns squared distance to bounding volume. A zero distance implies that the input point is inside the bounding volume. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a61dc7040d57f0a69984548eb4804244b}\label{classBVH_1_1NodeT_a61dc7040d57f0a69984548eb4804244b}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Distance\+To\+Primitives@{get\+Distance\+To\+Primitives}} +\index{get\+Distance\+To\+Primitives@{get\+Distance\+To\+Primitives}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Distance\+To\+Primitives()}{getDistanceToPrimitives()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Distance\+To\+Primitives (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Compute the shortest distance to the primitives in this node. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the signed distance to the primitives. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a7b9e3a8bfa35f604298634da102a0ce4}\label{classBVH_1_1NodeT_a7b9e3a8bfa35f604298634da102a0ce4}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Node\+Type@{get\+Node\+Type}} +\index{get\+Node\+Type@{get\+Node\+Type}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Node\+Type()}{getNodeType()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +\hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{Node\+Type} \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Node\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Get the node type. + +\begin{DoxyReturn}{Returns} +Node type +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a2e0c1e030162a2dc049acb4debd4d9f2}\label{classBVH_1_1NodeT_a2e0c1e030162a2dc049acb4debd4d9f2}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Primitives@{get\+Primitives}} +\index{get\+Primitives@{get\+Primitives}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Primitives()}{getPrimitives()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +const \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$ P $>$ \& \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Primitives (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the primitives stored in this node. + +\begin{DoxyReturn}{Returns} +List of primitives. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_adce9d9c6bd4ab3d613bef232353774f3}\label{classBVH_1_1NodeT_adce9d9c6bd4ab3d613bef232353774f3}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!get\+Primitives@{get\+Primitives}} +\index{get\+Primitives@{get\+Primitives}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{get\+Primitives()}{getPrimitives()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +\hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$ P $>$ \& \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::get\+Primitives (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Get the list of primitives in this node. + +\begin{DoxyReturn}{Returns} +Primitives list +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a8113c8dfa5ab6dc3cf931c5c8fdd6ddb}\label{classBVH_1_1NodeT_a8113c8dfa5ab6dc3cf931c5c8fdd6ddb}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!insert\+Node@{insert\+Node}} +\index{insert\+Node@{insert\+Node}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{insert\+Node()}{insertNode()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::insert\+Node (\begin{DoxyParamCaption}\item[{\hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \&}]{a\+\_\+node, }\item[{const \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \&}]{a\+\_\+primitives }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Insert a new node in the tree. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+node} & Node to insert \\ +\hline +\mbox{\tt in} & {\em a\+\_\+primitives} & Primitives provided to a\+\_\+node \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_a3aa6e9109897a573a46714278e0a79c6}\label{classBVH_1_1NodeT_a3aa6e9109897a573a46714278e0a79c6}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Ordered@{prune\+Ordered}} +\index{prune\+Ordered@{prune\+Ordered}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Ordered()}{pruneOrdered()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Ordered (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which computes the signed distance using ordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point in space \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Signed distance to the input point +\end{DoxyReturn} +This routine computes the distance to a\+\_\+point using ordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine first descends along the sub-\/branch with the shortest distance to its bounding volume. Once we hit leaf node we update the shortest distance \textquotesingle{}d\textquotesingle{} found so far. As we investigate more branches, they can be pruned if the distance \textquotesingle{}d\textquotesingle{} is shorter than the distance to the node\textquotesingle{}s bounding volume. \mbox{\Hypertarget{classBVH_1_1NodeT_ac4a3be457d66d2673f717f203e60fc08}\label{classBVH_1_1NodeT_ac4a3be457d66d2673f717f203e60fc08}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Ordered@{prune\+Ordered}} +\index{prune\+Ordered@{prune\+Ordered}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Ordered()}{pruneOrdered()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Ordered (\begin{DoxyParamCaption}\item[{T \&}]{a\+\_\+closest, }\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Implementation function for prune\+Ordered (it requires a different signature). + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in,out} & {\em a\+\_\+closest} & Shortest distance to primitives so far. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+point} & Input 3D point \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_acb7fec40e06e97fcd42ec75169603e8b}\label{classBVH_1_1NodeT_acb7fec40e06e97fcd42ec75169603e8b}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Ordered2@{prune\+Ordered2}} +\index{prune\+Ordered2@{prune\+Ordered2}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Ordered2()}{pruneOrdered2()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Ordered2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which computes the signed distance using ordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point in space \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Signed distance to the input point +\end{DoxyReturn} +This routine computes the distance to a\+\_\+point using ordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine first descends along the sub-\/branch with the shortest distance to its bounding volume. Once we hit leaf node we update the shortest distance \textquotesingle{}d\textquotesingle{} found so far. As we investigate more branches, they can be pruned if the distance \textquotesingle{}d\textquotesingle{} is shorter than the distance to the node\textquotesingle{}s bounding volume. \begin{DoxyNote}{Note} +The difference between this and prune\+Ordered(a\+\_\+point) only consist of the fact that this routine uses the unsigned square distance to prune branches and primitives. This is more efficient than prune\+Ordered(a\+\_\+point) because it does e.\+g. not involve an extra square root for computing the distance. +\end{DoxyNote} +\begin{DoxyReturn}{Returns} +Returns the signed distance from a\+\_\+point to the primitives. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a2887ad51251739359602dde8db6a5998}\label{classBVH_1_1NodeT_a2887ad51251739359602dde8db6a5998}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Ordered2@{prune\+Ordered2}} +\index{prune\+Ordered2@{prune\+Ordered2}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Ordered2()}{pruneOrdered2()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Ordered2 (\begin{DoxyParamCaption}\item[{T \&}]{a\+\_\+min\+Dist2, }\item[{std\+::shared\+\_\+ptr$<$ const P $>$ \&}]{a\+\_\+closest, }\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Implementation function for prune\+Ordered2 (it requires a different signature). + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in,out} & {\em a\+\_\+min\+Dist2} & Shortest square distance so far. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+closest} & Closest primitive so far. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+point} & Input 3D point \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_a27cfc030a9b7f9b0341e94dc6733b511}\label{classBVH_1_1NodeT_a27cfc030a9b7f9b0341e94dc6733b511}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Unordered@{prune\+Unordered}} +\index{prune\+Unordered@{prune\+Unordered}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Unordered()}{pruneUnordered()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Unordered (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which computes the signed distance using unordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point in space \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Signed distance to the input point +\end{DoxyReturn} +This routine computes the distance to a\+\_\+point using unordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine visits nodes in the order they were created. Once we hit leaf node we update the shortest distance \textquotesingle{}d\textquotesingle{} found so far. As we investigate more branches, they can be pruned if the distance \textquotesingle{}d\textquotesingle{} is shorter than the distance to the node\textquotesingle{}s bounding volume. \begin{DoxyNote}{Note} +The difference between this and prune\+Ordered(a\+\_\+point) is that this routine always does the nodes in the order they were created. In almost all cases this is more inefficient than prune\+Ordered(a\+\_\+point). +\end{DoxyNote} +\begin{DoxyReturn}{Returns} +Returns the signed distance from a\+\_\+point to the primitives. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_ad252aa451ca983750dfa0c24344253b2}\label{classBVH_1_1NodeT_ad252aa451ca983750dfa0c24344253b2}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Unordered@{prune\+Unordered}} +\index{prune\+Unordered@{prune\+Unordered}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Unordered()}{pruneUnordered()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Unordered (\begin{DoxyParamCaption}\item[{T \&}]{a\+\_\+closest, }\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Implementation function for prune\+Unordered (it requires a different signature). + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in,out} & {\em a\+\_\+closest} & Shortest distance to primitives so far. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+point} & Input 3D point \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_aafa2f1f4f4f58296531723e9a6d7d13a}\label{classBVH_1_1NodeT_aafa2f1f4f4f58296531723e9a6d7d13a}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Unordered2@{prune\+Unordered2}} +\index{prune\+Unordered2@{prune\+Unordered2}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Unordered2()}{pruneUnordered2()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Unordered2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which computes the signed distance using unordered pruning along the \hyperlink{namespaceBVH}{B\+VH} branches. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point in space \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Signed distance to the input point +\end{DoxyReturn} +This routine computes the distance to a\+\_\+point using unordered pruning. We begin at the top (root node of the tree) and descend downwards. This routine visits nodes in the order they were created. Once we hit leaf node we update the shortest distance \textquotesingle{}d\textquotesingle{} found so far. As we investigate more branches, they can be pruned if the distance \textquotesingle{}d\textquotesingle{} is shorter than the distance to the node\textquotesingle{}s bounding volume. The only difference between this routine and prune\+Unordered(a\+\_\+point) is that this routine prunes based on the unsigned square distance first, and only computes the signed distance at the end. \begin{DoxyNote}{Note} +The difference between this and prune\+Ordered2(a\+\_\+point) is that this routine always does nodes in the order they were created. In almost all cases this is more inefficient than prune\+Ordered2(a\+\_\+point). +\end{DoxyNote} +\begin{DoxyReturn}{Returns} +Returns the signed distance from a\+\_\+point to the primitives. +\end{DoxyReturn} +\mbox{\Hypertarget{classBVH_1_1NodeT_a1079cba9ac1f114ad2cbc6cdea2eae49}\label{classBVH_1_1NodeT_a1079cba9ac1f114ad2cbc6cdea2eae49}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!prune\+Unordered2@{prune\+Unordered2}} +\index{prune\+Unordered2@{prune\+Unordered2}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{prune\+Unordered2()}{pruneUnordered2()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::prune\+Unordered2 (\begin{DoxyParamCaption}\item[{T \&}]{a\+\_\+min\+Dist2, }\item[{std\+::shared\+\_\+ptr$<$ const P $>$ \&}]{a\+\_\+closest, }\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Implementation function for prune\+Unordered2 (it requires a different signature). + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in,out} & {\em a\+\_\+min\+Dist2} & Shortest square distance so far. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+closest} & Closest primitive so far. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+point} & Input 3D point \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_abdff7fdbe3694e2aeb788261175077cc}\label{classBVH_1_1NodeT_abdff7fdbe3694e2aeb788261175077cc}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!set\+Depth@{set\+Depth}} +\index{set\+Depth@{set\+Depth}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{set\+Depth()}{setDepth()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::set\+Depth (\begin{DoxyParamCaption}\item[{const int}]{a\+\_\+depth }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Set node depth. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+depth} & Node depth \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_a964bd054b57fce2fec50505a65f6bacd}\label{classBVH_1_1NodeT_a964bd054b57fce2fec50505a65f6bacd}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!set\+Node\+Type@{set\+Node\+Type}} +\index{set\+Node\+Type@{set\+Node\+Type}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{set\+Node\+Type()}{setNodeType()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::set\+Node\+Type (\begin{DoxyParamCaption}\item[{const \hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{Node\+Type}}]{a\+\_\+node\+Type }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Set node type to leaf or regular. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+node\+Type} & Node type \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_a92db0ab2d61c76469600478fddd04edc}\label{classBVH_1_1NodeT_a92db0ab2d61c76469600478fddd04edc}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!set\+Parent@{set\+Parent}} +\index{set\+Parent@{set\+Parent}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{set\+Parent()}{setParent()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::set\+Parent (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a008f5c2c53adb1f5730d8478b48529b1}{Node\+Ptr} \&}]{a\+\_\+parent }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Set parent node. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+parent} & Parent node \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_a2c9c3d3a83b3c1895c8f89b2bbd62e81}\label{classBVH_1_1NodeT_a2c9c3d3a83b3c1895c8f89b2bbd62e81}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!set\+Primitives@{set\+Primitives}} +\index{set\+Primitives@{set\+Primitives}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{set\+Primitives()}{setPrimitives()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::set\+Primitives (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a19cce6e7fbe85eccb4a3718dd69f49b7}{Primitive\+List} \&}]{a\+\_\+primitives }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Set primitives in this node. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & Primitives \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBVH_1_1NodeT_a8f9c409918d61b0d0ad3dd6e2b692443}\label{classBVH_1_1NodeT_a8f9c409918d61b0d0ad3dd6e2b692443}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!set\+To\+Regular\+Node@{set\+To\+Regular\+Node}} +\index{set\+To\+Regular\+Node@{set\+To\+Regular\+Node}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{set\+To\+Regular\+Node()}{setToRegularNode()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::set\+To\+Regular\+Node (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Set to regular node. + +\begin{DoxyNote}{Note} +This sets m\+\_\+node\+Type to regular and clears the primitives list +\end{DoxyNote} +\mbox{\Hypertarget{classBVH_1_1NodeT_aef7148b18296dce60853b5966c9f1e0d}\label{classBVH_1_1NodeT_aef7148b18296dce60853b5966c9f1e0d}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +T \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a6fbb4308c5c55ee170c5f992df7ae1d0}{Vec3} \&}]{a\+\_\+point, }\item[{const \hyperlink{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}{Prune}}]{a\+\_\+pruning = {\ttfamily Prune\+:\+:Ordered2} }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which computes the signed distance. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point in space \\ +\hline +\mbox{\tt in} & {\em a\+\_\+pruning} & Pruning algorithm \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Signed distance to the input point +\end{DoxyReturn} +This will select amongs the various implementations. \mbox{\Hypertarget{classBVH_1_1NodeT_acae5a575fa8b236de984fdd41e04c038}\label{classBVH_1_1NodeT_acae5a575fa8b236de984fdd41e04c038}} +\index{B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}!top\+Down\+Sort\+And\+Partition\+Primitives@{top\+Down\+Sort\+And\+Partition\+Primitives}} +\index{top\+Down\+Sort\+And\+Partition\+Primitives@{top\+Down\+Sort\+And\+Partition\+Primitives}!B\+V\+H\+::\+NodeT@{B\+V\+H\+::\+NodeT}} +\subsubsection{\texorpdfstring{top\+Down\+Sort\+And\+Partition\+Primitives()}{topDownSortAndPartitionPrimitives()}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +void \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$ T, P, BV, K $>$\+::top\+Down\+Sort\+And\+Partition\+Primitives (\begin{DoxyParamCaption}\item[{const \hyperlink{classBVH_1_1NodeT_a2340f2466ed5b6eebab4bdc72004858e}{B\+V\+Constructor} \&}]{a\+\_\+bv\+Constructor, }\item[{const \hyperlink{classBVH_1_1NodeT_a3bb028655b8b961fa35109af1c14f281}{Partitioner} \&}]{a\+\_\+partitioner, }\item[{const \hyperlink{classBVH_1_1NodeT_acbe56195affc439febe8aca84db308e3}{Stop\+Function} \&}]{a\+\_\+stop\+Crit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function for using top-\/down construction of the bounding volume hierarchy. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+bv\+Constructor} & Polymorphic function which builds a bounding volume from a set of primitives. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+partitioner} & Partitioning function. This is a polymorphic function which divides a set of primitives into two lists. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+stop\+Crit} & Termination function which tells us when to stop the recursion.\\ +\hline +\end{DoxyParams} +The rules for terminating the hierarchy construction, how to partition sets of primitives, and how to enclose them by bounding volumes are given in the input arguments (a\+\_\+stop\+Func, a\+\_\+part\+Func, a\+\_\+bv\+Func) + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}\item +Source/\hyperlink{EBGeometry__BVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classBoundingVolumes_1_1AABBT.tex b/docs/doxygen/latex/classBoundingVolumes_1_1AABBT.tex new file mode 100644 index 00000000..2275f044 --- /dev/null +++ b/docs/doxygen/latex/classBoundingVolumes_1_1AABBT.tex @@ -0,0 +1,260 @@ +\hypertarget{classBoundingVolumes_1_1AABBT}{}\section{Bounding\+Volumes\+:\+:A\+A\+B\+BT$<$ T $>$ Class Template Reference} +\label{classBoundingVolumes_1_1AABBT}\index{Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$@{Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$}} + + +Axis-\/aligned bounding box as bounding volume. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}\label{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}} +using \hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias which cuts down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a180558daace1d1fb990f9e197eaec02d}\label{classBoundingVolumes_1_1AABBT_a180558daace1d1fb990f9e197eaec02d}} +\hyperlink{classBoundingVolumes_1_1AABBT_a180558daace1d1fb990f9e197eaec02d}{A\+A\+B\+BT} () +\begin{DoxyCompactList}\small\item\em Default constructor (does nothing) \end{DoxyCompactList}\item +\hyperlink{classBoundingVolumes_1_1AABBT_a28d34a1b4467d329bd50e3561b1e705a}{A\+A\+B\+BT} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+lo, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+hi) +\begin{DoxyCompactList}\small\item\em Full constructor taking the low/high corners of the bounding box. \end{DoxyCompactList}\item +\hyperlink{classBoundingVolumes_1_1AABBT_af69dd29c29d40b1f550118cde9479f15}{A\+A\+B\+BT} (const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} \&a\+\_\+other) +\begin{DoxyCompactList}\small\item\em Copy constructor of another bounding box. \end{DoxyCompactList}\item +\hyperlink{classBoundingVolumes_1_1AABBT_a08ddef449ffd740163b584c8ccd6f395}{A\+A\+B\+BT} (const std\+::vector$<$ \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ $>$ \&a\+\_\+others) +\begin{DoxyCompactList}\small\item\em Constructor which creates an A\+A\+BB which encloses a set of other A\+A\+B\+Bs. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_af0a2f67ce6f85f947849d199e6dee1aa}\label{classBoundingVolumes_1_1AABBT_af0a2f67ce6f85f947849d199e6dee1aa}} +virtual \hyperlink{classBoundingVolumes_1_1AABBT_af0a2f67ce6f85f947849d199e6dee1aa}{$\sim$\+A\+A\+B\+BT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\\hyperlink{classBoundingVolumes_1_1AABBT_ab58be0cf4a32b502fdd1aedb7ba11587}{A\+A\+B\+BT} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) +\begin{DoxyCompactList}\small\item\em Template constructor (since mixed precision allowed) which creates an A\+A\+BB that encloses a set of 3D points. \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\void \hyperlink{classBoundingVolumes_1_1AABBT_a5ff57720a5d6511642ce39a09a7b7663}{define} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) noexcept +\begin{DoxyCompactList}\small\item\em Define function (since mixed precision allowed) which sets this A\+A\+BB such that it encloses a set of 3D points. \end{DoxyCompactList}\item +bool \hyperlink{classBoundingVolumes_1_1AABBT_a87d160a3e05082e34e37d8b4472bad7d}{intersects} (const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Check if this A\+A\+BB intersects another A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a6368509e66a2b5691272f273fe96f670}\label{classBoundingVolumes_1_1AABBT_a6368509e66a2b5691272f273fe96f670}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classBoundingVolumes_1_1AABBT_a6368509e66a2b5691272f273fe96f670}{get\+Low\+Corner} () noexcept +\begin{DoxyCompactList}\small\item\em Get the modifiable lower-\/left corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a937cfc6cbbbd457f872370c1c4d5e81e}\label{classBoundingVolumes_1_1AABBT_a937cfc6cbbbd457f872370c1c4d5e81e}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classBoundingVolumes_1_1AABBT_a937cfc6cbbbd457f872370c1c4d5e81e}{get\+Low\+Corner} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the immutable lower-\/left corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a2ecaeccecdb8882051516409e5749ef9}\label{classBoundingVolumes_1_1AABBT_a2ecaeccecdb8882051516409e5749ef9}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classBoundingVolumes_1_1AABBT_a2ecaeccecdb8882051516409e5749ef9}{get\+High\+Corner} () noexcept +\begin{DoxyCompactList}\small\item\em Get the modifiable upper-\/right corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_aef8dcd08ea8726cdcd3d361d33c4d554}\label{classBoundingVolumes_1_1AABBT_aef8dcd08ea8726cdcd3d361d33c4d554}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classBoundingVolumes_1_1AABBT_aef8dcd08ea8726cdcd3d361d33c4d554}{get\+High\+Corner} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the immutable upper-\/right corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a7c98cb4cec1eb672755c9c469ca44990}\label{classBoundingVolumes_1_1AABBT_a7c98cb4cec1eb672755c9c469ca44990}} +\hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \hyperlink{classBoundingVolumes_1_1AABBT_a7c98cb4cec1eb672755c9c469ca44990}{get\+Centroid} () const noexcept +\begin{DoxyCompactList}\small\item\em Get bounding volume centroid. \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1AABBT_ae65563ac6f3851f8fb05e0c98613fc0d}{get\+Overlapping\+Volume} (const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between this A\+A\+BB and another A\+A\+BB. \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1AABBT_ad883975a0926c0755a978283137f378f}{get\+Distance} (const \hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the distance to this A\+A\+BB (points inside the bounding box have a zero distance) \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1AABBT_a2196f1cf735ccf5d1f5c1ee8dcb449dd}{get\+Distance2} (const \hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the squared distance to this bounding box (points inside the bounding box have a zero distance) \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_ac5b8f2caa8afe1177f3d2924fbc3f7a5}\label{classBoundingVolumes_1_1AABBT_ac5b8f2caa8afe1177f3d2924fbc3f7a5}} +T \hyperlink{classBoundingVolumes_1_1AABBT_ac5b8f2caa8afe1177f3d2924fbc3f7a5}{get\+Volume} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute the bounding box volume. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_ae2f3ba3dde664cccd7c46b0ef4f087d6}\label{classBoundingVolumes_1_1AABBT_ae2f3ba3dde664cccd7c46b0ef4f087d6}} +T \hyperlink{classBoundingVolumes_1_1AABBT_ae2f3ba3dde664cccd7c46b0ef4f087d6}{get\+Area} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute the bounding box area. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a5cbd0ee374c62951aa58644bc09f70cf}\label{classBoundingVolumes_1_1AABBT_a5cbd0ee374c62951aa58644bc09f70cf}} +\hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \hyperlink{classBoundingVolumes_1_1AABBT_a5cbd0ee374c62951aa58644bc09f70cf}{m\+\_\+lo\+Corner} +\begin{DoxyCompactList}\small\item\em Lower-\/left corner of bounding box. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a35f9498191e406b3f48f7454bfdf0cf7}\label{classBoundingVolumes_1_1AABBT_a35f9498191e406b3f48f7454bfdf0cf7}} +\hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \hyperlink{classBoundingVolumes_1_1AABBT_a35f9498191e406b3f48f7454bfdf0cf7}{m\+\_\+hi\+Corner} +\begin{DoxyCompactList}\small\item\em Upper-\/right corner of bounding box. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$} + +Axis-\/aligned bounding box as bounding volume. + +This class represents a Cartesian box that encloses a set of 3D points. \begin{DoxyNote}{Note} +The template parameter T is the precision. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a28d34a1b4467d329bd50e3561b1e705a}\label{classBoundingVolumes_1_1AABBT_a28d34a1b4467d329bd50e3561b1e705a}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+lo, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+hi }\end{DoxyParamCaption})} + + + +Full constructor taking the low/high corners of the bounding box. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+lo} & Low corner \\ +\hline +\mbox{\tt in} & {\em a\+\_\+hi} & High \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_af69dd29c29d40b1f550118cde9479f15}\label{classBoundingVolumes_1_1AABBT_af69dd29c29d40b1f550118cde9479f15}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})} + + + +Copy constructor of another bounding box. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other bounding box \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a08ddef449ffd740163b584c8ccd6f395}\label{classBoundingVolumes_1_1AABBT_a08ddef449ffd740163b584c8ccd6f395}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ $>$ \&}]{a\+\_\+others }\end{DoxyParamCaption})} + + + +Constructor which creates an A\+A\+BB which encloses a set of other A\+A\+B\+Bs. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+others} & Other bounding boxes \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_ab58be0cf4a32b502fdd1aedb7ba11587}\label{classBoundingVolumes_1_1AABBT_ab58be0cf4a32b502fdd1aedb7ba11587}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +template$<$class P $>$ \\ +\hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points }\end{DoxyParamCaption})} + + + +Template constructor (since mixed precision allowed) which creates an A\+A\+BB that encloses a set of 3D points. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +Calls the define function +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a5ff57720a5d6511642ce39a09a7b7663}\label{classBoundingVolumes_1_1AABBT_a5ff57720a5d6511642ce39a09a7b7663}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!define@{define}} +\index{define@{define}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +template$<$class P $>$ \\ +void \hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Define function (since mixed precision allowed) which sets this A\+A\+BB such that it encloses a set of 3D points. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_ad883975a0926c0755a978283137f378f}\label{classBoundingVolumes_1_1AABBT_ad883975a0926c0755a978283137f378f}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!get\+Distance@{get\+Distance}} +\index{get\+Distance@{get\+Distance}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{get\+Distance()}{getDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::get\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the distance to this A\+A\+BB (points inside the bounding box have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the distance to the bounding box (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a2196f1cf735ccf5d1f5c1ee8dcb449dd}\label{classBoundingVolumes_1_1AABBT_a2196f1cf735ccf5d1f5c1ee8dcb449dd}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!get\+Distance2@{get\+Distance2}} +\index{get\+Distance2@{get\+Distance2}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{get\+Distance2()}{getDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::get\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT_aa968c6b21a7f02e1cbfc03d26c7e67b4}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the squared distance to this bounding box (points inside the bounding box have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the squared distance to the bounding box (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_ae65563ac6f3851f8fb05e0c98613fc0d}\label{classBoundingVolumes_1_1AABBT_ae65563ac6f3851f8fb05e0c98613fc0d}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!get\+Overlapping\+Volume@{get\+Overlapping\+Volume}} +\index{get\+Overlapping\+Volume@{get\+Overlapping\+Volume}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{get\+Overlapping\+Volume()}{getOverlappingVolume()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::get\+Overlapping\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the overlapping volume between this A\+A\+BB and another A\+A\+BB. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & The other A\+A\+BB \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns overlapping volume +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1AABBT_a87d160a3e05082e34e37d8b4472bad7d}\label{classBoundingVolumes_1_1AABBT_a87d160a3e05082e34e37d8b4472bad7d}} +\index{Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}!intersects@{intersects}} +\index{intersects@{intersects}!Bounding\+Volumes\+::\+A\+A\+B\+BT@{Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{intersects()}{intersects()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classBoundingVolumes_1_1AABBT}{Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::intersects (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if this A\+A\+BB intersects another A\+A\+BB. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & The other A\+A\+BB \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +True if they intersect and false otherwise. +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}\item +Source/\hyperlink{EBGeometry__BoundingVolumesImplem_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classBoundingVolumes_1_1BoundingSphereT.tex b/docs/doxygen/latex/classBoundingVolumes_1_1BoundingSphereT.tex new file mode 100644 index 00000000..8e69905c --- /dev/null +++ b/docs/doxygen/latex/classBoundingVolumes_1_1BoundingSphereT.tex @@ -0,0 +1,294 @@ +\hypertarget{classBoundingVolumes_1_1BoundingSphereT}{}\section{Bounding\+Volumes\+:\+:Bounding\+SphereT$<$ T $>$ Class Template Reference} +\label{classBoundingVolumes_1_1BoundingSphereT}\index{Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$@{Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$}} + + +Class which encloses a set of points using a bounding sphere. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}\label{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}} +enum \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}{Bounding\+Volume\+Algorithm} \{ {\bfseries Ritter} + \}\begin{DoxyCompactList}\small\item\em Typename for possible algorithms that support the computation of a bounding sphere for a set of 3D points. \end{DoxyCompactList} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}\label{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}} +using \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a5616a743d8b53b11533ef47b3da281aa}\label{classBoundingVolumes_1_1BoundingSphereT_a5616a743d8b53b11533ef47b3da281aa}} +\hyperlink{classBoundingVolumes_1_1BoundingSphereT_a5616a743d8b53b11533ef47b3da281aa}{Bounding\+SphereT} () +\begin{DoxyCompactList}\small\item\em Default constructor. Leaves object in undefined state. \end{DoxyCompactList}\item +\hyperlink{classBoundingVolumes_1_1BoundingSphereT_a9e81ed0ce76489225f5dbd57ed1abc8f}{Bounding\+SphereT} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+center, const T \&a\+\_\+radius) +\begin{DoxyCompactList}\small\item\em Full constructor. Sets the center and radius of the bounding sphere. \end{DoxyCompactList}\item +\hyperlink{classBoundingVolumes_1_1BoundingSphereT_af9cd8b7e77ed36178073be298efd27f0}{Bounding\+SphereT} (const std\+::vector$<$ \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ $>$ \&a\+\_\+other\+Spheres) +\begin{DoxyCompactList}\small\item\em Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres. \end{DoxyCompactList}\item +\hyperlink{classBoundingVolumes_1_1BoundingSphereT_afd5a1632d9ceef8a4fa3af59e562c7f8}{Bounding\+SphereT} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} \&a\+\_\+other) +\begin{DoxyCompactList}\small\item\em Copy constructor. Sets the center and radius from the other sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a4495da5774e14f97c0e7579b37cfd60e}\label{classBoundingVolumes_1_1BoundingSphereT_a4495da5774e14f97c0e7579b37cfd60e}} +virtual \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a4495da5774e14f97c0e7579b37cfd60e}{$\sim$\+Bounding\+SphereT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing). \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\\hyperlink{classBoundingVolumes_1_1BoundingSphereT_a88655edd39b6276b9bb58eb9bd6af82d}{Bounding\+SphereT} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points, const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}{Bounding\+Volume\+Algorithm} \&a\+\_\+alg=Bounding\+Volume\+Algorithm\+::\+Ritter) +\begin{DoxyCompactList}\small\item\em Template constructor which takes a set of 3D points (mixed precision allowed). \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\void \hyperlink{classBoundingVolumes_1_1BoundingSphereT_aac21650a7d3f65081483512064cbcfa8}{define} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points, const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}{Bounding\+Volume\+Algorithm} \&a\+\_\+alg) noexcept +\begin{DoxyCompactList}\small\item\em Template define function which takes a set of 3D points (mixed precision allowed). \end{DoxyCompactList}\item +bool \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a90baad0c400aac7645a7e8c1ab13096a}{intersects} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Check if this bounding sphere intersect another bounding sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a8c4f10492e97aa460b1207f384e1c081}\label{classBoundingVolumes_1_1BoundingSphereT_a8c4f10492e97aa460b1207f384e1c081}} +T \& \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a8c4f10492e97aa460b1207f384e1c081}{get\+Radius} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable radius for this sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_affac2a4ac0cefaada01c5532eb13f26a}\label{classBoundingVolumes_1_1BoundingSphereT_affac2a4ac0cefaada01c5532eb13f26a}} +const T \& \hyperlink{classBoundingVolumes_1_1BoundingSphereT_affac2a4ac0cefaada01c5532eb13f26a}{get\+Radius} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable radius for this sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_ac3adb87ea4da98d70375e5806e8dfdc5}\label{classBoundingVolumes_1_1BoundingSphereT_ac3adb87ea4da98d70375e5806e8dfdc5}} +\hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \& \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ac3adb87ea4da98d70375e5806e8dfdc5}{get\+Centroid} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable center for this sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a62e38a048c7aacd79aec8dcc251e3a65}\label{classBoundingVolumes_1_1BoundingSphereT_a62e38a048c7aacd79aec8dcc251e3a65}} +const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \& \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a62e38a048c7aacd79aec8dcc251e3a65}{get\+Centroid} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable center for this sphere. \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a4581b87c7a3ccd3b58168bfdae9436cb}{get\+Overlapping\+Volume} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between this bounding sphere and another. \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a06ec858b7349e6a926ad476990c774cb}{get\+Distance} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the distance to this bounding sphere (points inside the sphere have a zero distance) \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT_aee81818917225b65b6c3b661e268e66f}{get\+Distance2} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a44e0069495c19069fced07aab8e614c6}{get\+Volume} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the sphere volume. \end{DoxyCompactList}\item +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT_a303fd50d1b8d27c7014c50ba0867a0b3}{get\+Area} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the sphere area. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_abea0326be2d1843f3ad7c6de1ebe2418}\label{classBoundingVolumes_1_1BoundingSphereT_abea0326be2d1843f3ad7c6de1ebe2418}} +{\footnotesize template$<$class P $>$ }\\void \hyperlink{classBoundingVolumes_1_1BoundingSphereT_abea0326be2d1843f3ad7c6de1ebe2418}{build\+Ritter} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) noexcept +\begin{DoxyCompactList}\small\item\em Template function which computes the bounding sphere for a set of points (mixed precision allowed) using Ritter\textquotesingle{}s algorithm. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_adb424c867ed93cf5fdb62afe07a96a05}\label{classBoundingVolumes_1_1BoundingSphereT_adb424c867ed93cf5fdb62afe07a96a05}} +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT_adb424c867ed93cf5fdb62afe07a96a05}{m\+\_\+radius} +\begin{DoxyCompactList}\small\item\em Sphere radius. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_ad65d5be68c4028651d959dc8b88fe944}\label{classBoundingVolumes_1_1BoundingSphereT_ad65d5be68c4028651d959dc8b88fe944}} +\hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad65d5be68c4028651d959dc8b88fe944}{m\+\_\+center} +\begin{DoxyCompactList}\small\item\em Sphere center. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$} + +Class which encloses a set of points using a bounding sphere. + +The template parameter T is the floating-\/point precision which is used. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a9e81ed0ce76489225f5dbd57ed1abc8f}\label{classBoundingVolumes_1_1BoundingSphereT_a9e81ed0ce76489225f5dbd57ed1abc8f}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+center, }\item[{const T \&}]{a\+\_\+radius }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full constructor. Sets the center and radius of the bounding sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+center} & Bounding sphere center \\ +\hline +\mbox{\tt in} & {\em a\+\_\+radius} & Bounding sphere radius \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_af9cd8b7e77ed36178073be298efd27f0}\label{classBoundingVolumes_1_1BoundingSphereT_af9cd8b7e77ed36178073be298efd27f0}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ $>$ \&}]{a\+\_\+other\+Spheres }\end{DoxyParamCaption})} + + + +Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other\+Spheres} & Other bounding spheres. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_afd5a1632d9ceef8a4fa3af59e562c7f8}\label{classBoundingVolumes_1_1BoundingSphereT_afd5a1632d9ceef8a4fa3af59e562c7f8}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})} + + + +Copy constructor. Sets the center and radius from the other sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other sphere \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a88655edd39b6276b9bb58eb9bd6af82d}\label{classBoundingVolumes_1_1BoundingSphereT_a88655edd39b6276b9bb58eb9bd6af82d}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +template$<$class P $>$ \\ +\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points, }\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}{Bounding\+Volume\+Algorithm} \&}]{a\+\_\+alg = {\ttfamily BoundingVolumeAlgorithm\+:\+:Ritter} }\end{DoxyParamCaption})} + + + +Template constructor which takes a set of 3D points (mixed precision allowed). + +This computes the bounding sphere using the supplied algorithm. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\mbox{\tt in} & {\em a\+\_\+alg} & Bounding sphere algorithm. \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This calls the define(...) function. +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_aac21650a7d3f65081483512064cbcfa8}\label{classBoundingVolumes_1_1BoundingSphereT_aac21650a7d3f65081483512064cbcfa8}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!define@{define}} +\index{define@{define}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +template$<$class P $>$ \\ +void \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points, }\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ae98cd00c8e45c93a0fc4fbabec63b007}{Bounding\+Volume\+Algorithm} \&}]{a\+\_\+alg }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Template define function which takes a set of 3D points (mixed precision allowed). + +This computes the bounding sphere using the supplied algorithm. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\mbox{\tt in} & {\em a\+\_\+alg} & Bounding sphere algorithm. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a303fd50d1b8d27c7014c50ba0867a0b3}\label{classBoundingVolumes_1_1BoundingSphereT_a303fd50d1b8d27c7014c50ba0867a0b3}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Area@{get\+Area}} +\index{get\+Area@{get\+Area}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Area()}{getArea()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::get\+Area (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the sphere area. + +\begin{DoxyReturn}{Returns} +Sphere area. +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a06ec858b7349e6a926ad476990c774cb}\label{classBoundingVolumes_1_1BoundingSphereT_a06ec858b7349e6a926ad476990c774cb}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Distance@{get\+Distance}} +\index{get\+Distance@{get\+Distance}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Distance()}{getDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::get\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the distance to this bounding sphere (points inside the sphere have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the distance to the sphere (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_aee81818917225b65b6c3b661e268e66f}\label{classBoundingVolumes_1_1BoundingSphereT_aee81818917225b65b6c3b661e268e66f}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Distance2@{get\+Distance2}} +\index{get\+Distance2@{get\+Distance2}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Distance2()}{getDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::get\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT_ad89ed315255abcde216e9ca1de3068ab}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the squared distance to the sphere (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a4581b87c7a3ccd3b58168bfdae9436cb}\label{classBoundingVolumes_1_1BoundingSphereT_a4581b87c7a3ccd3b58168bfdae9436cb}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Overlapping\+Volume@{get\+Overlapping\+Volume}} +\index{get\+Overlapping\+Volume@{get\+Overlapping\+Volume}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Overlapping\+Volume()}{getOverlappingVolume()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::get\+Overlapping\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the overlapping volume between this bounding sphere and another. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other bounding sphere \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +The overlapping volume, computing using standard expressions. +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a44e0069495c19069fced07aab8e614c6}\label{classBoundingVolumes_1_1BoundingSphereT_a44e0069495c19069fced07aab8e614c6}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Volume@{get\+Volume}} +\index{get\+Volume@{get\+Volume}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Volume()}{getVolume()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::get\+Volume (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the sphere volume. + +\begin{DoxyReturn}{Returns} +Sphere volume +\end{DoxyReturn} +\mbox{\Hypertarget{classBoundingVolumes_1_1BoundingSphereT_a90baad0c400aac7645a7e8c1ab13096a}\label{classBoundingVolumes_1_1BoundingSphereT_a90baad0c400aac7645a7e8c1ab13096a}} +\index{Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}!intersects@{intersects}} +\index{intersects@{intersects}!Bounding\+Volumes\+::\+Bounding\+SphereT@{Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{intersects()}{intersects()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::intersects (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if this bounding sphere intersect another bounding sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other bounding sphere. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +True if the two sphere intersect. +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}\item +Source/\hyperlink{EBGeometry__BoundingVolumesImplem_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1EdgeIteratorT.tex b/docs/doxygen/latex/classDcel_1_1EdgeIteratorT.tex new file mode 100644 index 00000000..a144fa9e --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1EdgeIteratorT.tex @@ -0,0 +1,194 @@ +\hypertarget{classDcel_1_1EdgeIteratorT}{}\section{Dcel\+:\+:Edge\+IteratorT$<$ T $>$ Class Template Reference} +\label{classDcel_1_1EdgeIteratorT}\index{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$@{Dcel\+::\+Edge\+Iterator\+T$<$ T $>$}} + + +Class which can iterate through edges and vertices around a D\+C\+EL polygon face. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}\label{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}} +using \hyperlink{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}{Vertex} = \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_ab65ac3b39da5eeb9e3e795f62647ac0b}\label{classDcel_1_1EdgeIteratorT_ab65ac3b39da5eeb9e3e795f62647ac0b}} +using \hyperlink{classDcel_1_1EdgeIteratorT_ab65ac3b39da5eeb9e3e795f62647ac0b}{Edge} = \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}\label{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}} +using \hyperlink{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}{Face} = \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_ac6f7324622a089d17c5b66eb0be679f0}\label{classDcel_1_1EdgeIteratorT_ac6f7324622a089d17c5b66eb0be679f0}} +using \hyperlink{classDcel_1_1EdgeIteratorT_ac6f7324622a089d17c5b66eb0be679f0}{Vertex\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}{Vertex} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a75d19cf89d4ac007483aa8124482513b}\label{classDcel_1_1EdgeIteratorT_a75d19cf89d4ac007483aa8124482513b}} +using \hyperlink{classDcel_1_1EdgeIteratorT_a75d19cf89d4ac007483aa8124482513b}{Edge\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeIteratorT_ab65ac3b39da5eeb9e3e795f62647ac0b}{Edge} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a99deb9b82e268cf8fd1f7c0b94fea339}\label{classDcel_1_1EdgeIteratorT_a99deb9b82e268cf8fd1f7c0b94fea339}} +using \hyperlink{classDcel_1_1EdgeIteratorT_a99deb9b82e268cf8fd1f7c0b94fea339}{Face\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}{Face} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a20ff352f5f61ce6297e82d5be43377ce}\label{classDcel_1_1EdgeIteratorT_a20ff352f5f61ce6297e82d5be43377ce}} +\hyperlink{classDcel_1_1EdgeIteratorT_a20ff352f5f61ce6297e82d5be43377ce}{Edge\+IteratorT} ()=delete +\begin{DoxyCompactList}\small\item\em Default construction is not allowed. Use one of the full constructors. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeIteratorT_aefe8b41b1b21825922096a45ce645149}{Edge\+IteratorT} (\hyperlink{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}{Face} \&a\+\_\+face) +\begin{DoxyCompactList}\small\item\em Constructor, taking a face as argument. The iterator begins at the half-\/edge pointer contained in the face. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeIteratorT_a1e47d3f1320c6ce4f37e1772ed936451}{Edge\+IteratorT} (const \hyperlink{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}{Face} \&a\+\_\+face) +\begin{DoxyCompactList}\small\item\em Constructor, taking a face as argument. The iterator begins at the half-\/edge pointer contained in the face. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeIteratorT_a0041cf8e8c4dcdda12a514aa64e295f7}{Edge\+IteratorT} (\hyperlink{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}{Vertex} \&a\+\_\+vertex) +\begin{DoxyCompactList}\small\item\em Constructor, taking a vertex as argument. The iterator begins at the outgoing half-\/edge from the vertex. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeIteratorT_abda0210d73dd861142c8e23b4d589bd0}{Edge\+IteratorT} (const \hyperlink{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}{Vertex} \&a\+\_\+vertex) +\begin{DoxyCompactList}\small\item\em Constructor, taking a vertex as argument. The iterator begins at the outgoing half-\/edge from the vertex. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a56e7dcbaf6f74f6c05b1eb9105d203ad}\label{classDcel_1_1EdgeIteratorT_a56e7dcbaf6f74f6c05b1eb9105d203ad}} +\hyperlink{classDcel_1_1EdgeIteratorT_a75d19cf89d4ac007483aa8124482513b}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeIteratorT_a56e7dcbaf6f74f6c05b1eb9105d203ad}{operator()} () noexcept +\begin{DoxyCompactList}\small\item\em Operator returning a pointer to the current half-\/edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a2e4afdda5a3eb033dc293fefc23edaa6}\label{classDcel_1_1EdgeIteratorT_a2e4afdda5a3eb033dc293fefc23edaa6}} +const \hyperlink{classDcel_1_1EdgeIteratorT_a75d19cf89d4ac007483aa8124482513b}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeIteratorT_a2e4afdda5a3eb033dc293fefc23edaa6}{operator()} () const noexcept +\begin{DoxyCompactList}\small\item\em Operator returning a pointer to the current half-\/edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_ab1bc6f043869340ee1e1358e4289b8dd}\label{classDcel_1_1EdgeIteratorT_ab1bc6f043869340ee1e1358e4289b8dd}} +void \hyperlink{classDcel_1_1EdgeIteratorT_ab1bc6f043869340ee1e1358e4289b8dd}{reset} () noexcept +\begin{DoxyCompactList}\small\item\em Reset function for the iterator. This resets the iterator so that it begins from the starting half-\/edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_ae8dc40da0743b61725062646144b8f32}\label{classDcel_1_1EdgeIteratorT_ae8dc40da0743b61725062646144b8f32}} +void \hyperlink{classDcel_1_1EdgeIteratorT_ae8dc40da0743b61725062646144b8f32}{operator++} () noexcept +\begin{DoxyCompactList}\small\item\em Incrementation operator, bringing the iterator to the next half-\/edge. \end{DoxyCompactList}\item +bool \hyperlink{classDcel_1_1EdgeIteratorT_a92bfca2d072bbf54c7be751f8fc4c098}{ok} () const noexcept +\begin{DoxyCompactList}\small\item\em Function which checks if the iteration can be continued. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_ad6b36e4ef39214ccd75966a6ecd82682}\label{classDcel_1_1EdgeIteratorT_ad6b36e4ef39214ccd75966a6ecd82682}} +enum \hyperlink{classDcel_1_1EdgeIteratorT_ad6b36e4ef39214ccd75966a6ecd82682}{Iteration\+Mode} \{ {\bfseries Vertices}, +{\bfseries Faces} + \}\begin{DoxyCompactList}\small\item\em Iteration mode, used to distinguish between the two constructors (face-\/ or vertex-\/based iteration) \end{DoxyCompactList} +\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a39560da0f4479c53ed27c38bdfab7c21}\label{classDcel_1_1EdgeIteratorT_a39560da0f4479c53ed27c38bdfab7c21}} +bool \hyperlink{classDcel_1_1EdgeIteratorT_a39560da0f4479c53ed27c38bdfab7c21}{m\+\_\+full\+Loop} +\begin{DoxyCompactList}\small\item\em If true, a full loop has been made around the polygon face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_aa0c8a35a18d668927dd966ddd9620ce5}\label{classDcel_1_1EdgeIteratorT_aa0c8a35a18d668927dd966ddd9620ce5}} +\hyperlink{classDcel_1_1EdgeIteratorT_ad6b36e4ef39214ccd75966a6ecd82682}{Iteration\+Mode} \hyperlink{classDcel_1_1EdgeIteratorT_aa0c8a35a18d668927dd966ddd9620ce5}{m\+\_\+iter\+Mode} +\begin{DoxyCompactList}\small\item\em Iteration mode. Set in constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a39c525d750868014457cdf06a40455bd}\label{classDcel_1_1EdgeIteratorT_a39c525d750868014457cdf06a40455bd}} +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeIteratorT_ab65ac3b39da5eeb9e3e795f62647ac0b}{Edge} $>$ \hyperlink{classDcel_1_1EdgeIteratorT_a39c525d750868014457cdf06a40455bd}{m\+\_\+start\+Edge} +\begin{DoxyCompactList}\small\item\em Starting half-\/edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_afcebe87fbd158d212d7ba0a6b01efa8c}\label{classDcel_1_1EdgeIteratorT_afcebe87fbd158d212d7ba0a6b01efa8c}} +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeIteratorT_ab65ac3b39da5eeb9e3e795f62647ac0b}{Edge} $>$ \hyperlink{classDcel_1_1EdgeIteratorT_afcebe87fbd158d212d7ba0a6b01efa8c}{m\+\_\+cur\+Edge} +\begin{DoxyCompactList}\small\item\em Current half-\/edge. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Edge\+Iterator\+T$<$ T $>$} + +Class which can iterate through edges and vertices around a D\+C\+EL polygon face. + +This class can be used so that it either visits all the half-\/edges in a face, or all the outgoing half-\/edges from a vertex. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_aefe8b41b1b21825922096a45ce645149}\label{classDcel_1_1EdgeIteratorT_aefe8b41b1b21825922096a45ce645149}} +\index{Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}!Edge\+IteratorT@{Edge\+IteratorT}} +\index{Edge\+IteratorT@{Edge\+IteratorT}!Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}} +\subsubsection{\texorpdfstring{Edge\+Iterator\+T()}{EdgeIteratorT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+IteratorT}$<$ T $>$\+::\hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT} (\begin{DoxyParamCaption}\item[{\hyperlink{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}{Face} \&}]{a\+\_\+face }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Constructor, taking a face as argument. The iterator begins at the half-\/edge pointer contained in the face. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+face} & D\+C\+EL polygon face \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This constructor will will iterate through the half-\/edges in the polygon face. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a1e47d3f1320c6ce4f37e1772ed936451}\label{classDcel_1_1EdgeIteratorT_a1e47d3f1320c6ce4f37e1772ed936451}} +\index{Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}!Edge\+IteratorT@{Edge\+IteratorT}} +\index{Edge\+IteratorT@{Edge\+IteratorT}!Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}} +\subsubsection{\texorpdfstring{Edge\+Iterator\+T()}{EdgeIteratorT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+IteratorT}$<$ T $>$\+::\hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeIteratorT_a59cc24c2a7a6a12c5c60bc04b0ac7497}{Face} \&}]{a\+\_\+face }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Constructor, taking a face as argument. The iterator begins at the half-\/edge pointer contained in the face. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+face} & D\+C\+EL polygon face \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This constructor will will iterate through the half-\/edges in the polygon face. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a0041cf8e8c4dcdda12a514aa64e295f7}\label{classDcel_1_1EdgeIteratorT_a0041cf8e8c4dcdda12a514aa64e295f7}} +\index{Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}!Edge\+IteratorT@{Edge\+IteratorT}} +\index{Edge\+IteratorT@{Edge\+IteratorT}!Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}} +\subsubsection{\texorpdfstring{Edge\+Iterator\+T()}{EdgeIteratorT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+IteratorT}$<$ T $>$\+::\hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT} (\begin{DoxyParamCaption}\item[{\hyperlink{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}{Vertex} \&}]{a\+\_\+vertex }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Constructor, taking a vertex as argument. The iterator begins at the outgoing half-\/edge from the vertex. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+vertex} & D\+C\+EL vertex \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This constructor will will iterate through the outgoing half-\/edges from a vertex. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_abda0210d73dd861142c8e23b4d589bd0}\label{classDcel_1_1EdgeIteratorT_abda0210d73dd861142c8e23b4d589bd0}} +\index{Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}!Edge\+IteratorT@{Edge\+IteratorT}} +\index{Edge\+IteratorT@{Edge\+IteratorT}!Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}} +\subsubsection{\texorpdfstring{Edge\+Iterator\+T()}{EdgeIteratorT()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+IteratorT}$<$ T $>$\+::\hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeIteratorT_a4ca07f27da7faf50db5dbd1f20bbcafb}{Vertex} \&}]{a\+\_\+vertex }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Constructor, taking a vertex as argument. The iterator begins at the outgoing half-\/edge from the vertex. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+vertex} & D\+C\+EL vertex \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This constructor will will iterate through the outgoing half-\/edges from a vertex. +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1EdgeIteratorT_a92bfca2d072bbf54c7be751f8fc4c098}\label{classDcel_1_1EdgeIteratorT_a92bfca2d072bbf54c7be751f8fc4c098}} +\index{Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}!ok@{ok}} +\index{ok@{ok}!Dcel\+::\+Edge\+IteratorT@{Dcel\+::\+Edge\+IteratorT}} +\subsubsection{\texorpdfstring{ok()}{ok()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classDcel_1_1EdgeIteratorT}{Dcel\+::\+Edge\+IteratorT}$<$ T $>$\+::ok (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Function which checks if the iteration can be continued. + +\begin{DoxyReturn}{Returns} +Returns true unless the current half-\/edge is a nullptr (i.\+e., a broken polygon face) OR a full loop has been made around the polygon face (i.\+e. all half-\/edges have been visited) +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelIteratorImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1EdgeT.tex b/docs/doxygen/latex/classDcel_1_1EdgeT.tex new file mode 100644 index 00000000..6b1042aa --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1EdgeT.tex @@ -0,0 +1,483 @@ +\hypertarget{classDcel_1_1EdgeT}{}\section{Dcel\+:\+:EdgeT$<$ T $>$ Class Template Reference} +\label{classDcel_1_1EdgeT}\index{Dcel\+::\+Edge\+T$<$ T $>$@{Dcel\+::\+Edge\+T$<$ T $>$}} + + +Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}\label{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}} +using \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a2409bc47d421bbea1c091fb6b15da271}\label{classDcel_1_1EdgeT_a2409bc47d421bbea1c091fb6b15da271}} +using \hyperlink{classDcel_1_1EdgeT_a2409bc47d421bbea1c091fb6b15da271}{Vertex} = \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a00184663a9d069d2c7a7e0a970f71fd5}\label{classDcel_1_1EdgeT_a00184663a9d069d2c7a7e0a970f71fd5}} +using \hyperlink{classDcel_1_1EdgeT_a00184663a9d069d2c7a7e0a970f71fd5}{Edge} = \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a46456b8f418abc6f09154e8e0d398e37}\label{classDcel_1_1EdgeT_a46456b8f418abc6f09154e8e0d398e37}} +using \hyperlink{classDcel_1_1EdgeT_a46456b8f418abc6f09154e8e0d398e37}{Face} = \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}\label{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}} +using \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT_a2409bc47d421bbea1c091fb6b15da271}{Vertex} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}\label{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}} +using \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT_a00184663a9d069d2c7a7e0a970f71fd5}{Edge} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}\label{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}} +using \hyperlink{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}{Face\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT_a46456b8f418abc6f09154e8e0d398e37}{Face} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_ad55f43bd1061c5ab99c80005861d5bcf}\label{classDcel_1_1EdgeT_ad55f43bd1061c5ab99c80005861d5bcf}} +using \hyperlink{classDcel_1_1EdgeT_ad55f43bd1061c5ab99c80005861d5bcf}{Edge\+Iterator} = \hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a2a9682fd036374aad598a50fe54b2c1f}\label{classDcel_1_1EdgeT_a2a9682fd036374aad598a50fe54b2c1f}} +\hyperlink{classDcel_1_1EdgeT_a2a9682fd036374aad598a50fe54b2c1f}{EdgeT} () +\begin{DoxyCompactList}\small\item\em Default constructor. Sets all pointers to zero and vectors to zero vectors. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_abe96b4404fa1961df79ffa618a7e8633}{EdgeT} (const \hyperlink{classDcel_1_1EdgeT_a00184663a9d069d2c7a7e0a970f71fd5}{Edge} \&a\+\_\+other\+Edge) +\begin{DoxyCompactList}\small\item\em Copy constructor. Copies all information from the other half-\/edge. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_a639b427e60ede1948f8344a41b9bfc32}{EdgeT} (const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \&a\+\_\+vertex) +\begin{DoxyCompactList}\small\item\em Partial constructor. Calls the default constructor but sets the starting vertex. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a94083c72ec137f822fcb08fb600ddd87}\label{classDcel_1_1EdgeT_a94083c72ec137f822fcb08fb600ddd87}} +\hyperlink{classDcel_1_1EdgeT_a94083c72ec137f822fcb08fb600ddd87}{$\sim$\+EdgeT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1EdgeT_aa3257bd5d35041860b10e882e68b2c14}{define} (const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \&a\+\_\+vertex, const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&a\+\_\+pair\+Edge, const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&a\+\_\+next\+Edge, const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&a\+\_\+previous\+Edge, const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} a\+\_\+normal) noexcept +\begin{DoxyCompactList}\small\item\em Define function. Sets the starting vertex, edges, and normal vectors. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1EdgeT_a2611a8e0ae581ab8822f677d6d69edbd}{set\+Vertex} (const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \&a\+\_\+vertex) noexcept +\begin{DoxyCompactList}\small\item\em Set the starting vertex. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1EdgeT_ab9ef2366cf1d411444caf81d5159a3e1}{set\+Pair\+Edge} (const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&a\+\_\+pair\+Edge) noexcept +\begin{DoxyCompactList}\small\item\em Set the pair edge. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1EdgeT_aeeda5324a62f1d8b6e50d788907526bf}{set\+Next\+Edge} (const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&a\+\_\+next\+Edge) noexcept +\begin{DoxyCompactList}\small\item\em Set the next edge. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1EdgeT_af5aa7f27fe95ba4331259b4de927bb37}{set\+Previous\+Edge} (const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&a\+\_\+previous\+Edge) noexcept +\begin{DoxyCompactList}\small\item\em Set the previous edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_adb65dd99901ed730354b17c59e46e1fb}\label{classDcel_1_1EdgeT_adb65dd99901ed730354b17c59e46e1fb}} +void \hyperlink{classDcel_1_1EdgeT_adb65dd99901ed730354b17c59e46e1fb}{set\+Face} (const \hyperlink{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}{Face\+Ptr} \&a\+\_\+face) noexcept +\begin{DoxyCompactList}\small\item\em Set the pointer to this half-\/edge\textquotesingle{}s face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_ac4aaf294fd41c84ef2f7f54a8024e6dd}\label{classDcel_1_1EdgeT_ac4aaf294fd41c84ef2f7f54a8024e6dd}} +void \hyperlink{classDcel_1_1EdgeT_ac4aaf294fd41c84ef2f7f54a8024e6dd}{reconcile} () noexcept +\begin{DoxyCompactList}\small\item\em Compute edge normal and edge length (for performance reasons) \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a44193130714264f57d80e7bfc8264662}{get\+Vertex} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable starting vertex. \end{DoxyCompactList}\item +const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_afa36dc535018588ba2238c5f42a9abd8}{get\+Vertex} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable starting vertex. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_aaa6ae21b177a7661ba61ad2b63ed47f3}{get\+Other\+Vertex} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable end vertex. \end{DoxyCompactList}\item +const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_ac2b40be7e45425caaf85b13b50bd89a0}{get\+Other\+Vertex} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable end vertex. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a1a076a12b7e269aecd77172b1d4c57e1}{get\+Pair\+Edge} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable pair edge. \end{DoxyCompactList}\item +const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a46f28f7da631e2d0f7f3139d1167b392}{get\+Pair\+Edge} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable pair edge. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_ad97e2996c4559b8977d807a5627d5251}{get\+Previous\+Edge} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable previous edge. \end{DoxyCompactList}\item +const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_ae4baac4bda30dfa3827ea87f2f72481f}{get\+Previous\+Edge} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable previous edge. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a1c865581d60a3e89e91d1d8db56fc2d1}{get\+Next\+Edge} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable next edge. \end{DoxyCompactList}\item +const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a6b50d3dd8ab3e2cda28819f6e4be9769}{get\+Next\+Edge} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable next edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a3caca2b8e0d73531566218a7febe24d8}\label{classDcel_1_1EdgeT_a3caca2b8e0d73531566218a7febe24d8}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1EdgeT_a3caca2b8e0d73531566218a7febe24d8}{get\+Normal} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable half-\/edge normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a60b8b2acf41484ff0c521310cece56a3}\label{classDcel_1_1EdgeT_a60b8b2acf41484ff0c521310cece56a3}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1EdgeT_a60b8b2acf41484ff0c521310cece56a3}{get\+Normal} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable half-\/edge normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a522de398f834c68701e4a44f2c9ba972}\label{classDcel_1_1EdgeT_a522de398f834c68701e4a44f2c9ba972}} +\hyperlink{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}{Face\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a522de398f834c68701e4a44f2c9ba972}{get\+Face} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable half-\/edge face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a3966ae6b38b26c618cfb56bd5adb8b54}\label{classDcel_1_1EdgeT_a3966ae6b38b26c618cfb56bd5adb8b54}} +const \hyperlink{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}{Face\+Ptr} \& \hyperlink{classDcel_1_1EdgeT_a3966ae6b38b26c618cfb56bd5adb8b54}{get\+Face} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable half-\/edge face. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1EdgeT_adba2d72aed5f510997d06c2bc9e6e96c}{signed\+Distance} (const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the signed distance to this half edge. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1EdgeT_a50345997f00af679875fda510b3e0607}{unsigned\+Distance2} (const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the signed distance to this half edge. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +T \hyperlink{classDcel_1_1EdgeT_ab937dca20cefcae4083b3cf873d83265}{project\+Point\+To\+Edge} (const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Returns the \char`\"{}projection\char`\"{} of a point to an edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_aae9ee7375ce72ddf5ef375fb18863e8f}\label{classDcel_1_1EdgeT_aae9ee7375ce72ddf5ef375fb18863e8f}} +void \hyperlink{classDcel_1_1EdgeT_aae9ee7375ce72ddf5ef375fb18863e8f}{normalize\+Normal\+Vector} () noexcept +\begin{DoxyCompactList}\small\item\em Normalize the normal vector, ensuring it has length 1. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1EdgeT_abddfe200f9af04cf49362d4ed1e8d37b}{compute\+Edge\+Length} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the edge length. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_ad78566030a7781469035cc4b6ed3393b}\label{classDcel_1_1EdgeT_ad78566030a7781469035cc4b6ed3393b}} +void \hyperlink{classDcel_1_1EdgeT_ad78566030a7781469035cc4b6ed3393b}{compute\+Normal} () noexcept +\begin{DoxyCompactList}\small\item\em Compute normal vector as average of face normals. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \hyperlink{classDcel_1_1EdgeT_af44c33f8b5b0a3d45cd4a83e6fde4db5}{m\+\_\+normal} +\begin{DoxyCompactList}\small\item\em Half-\/edge normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_af70e7b85effe62dd804638984b15695a}\label{classDcel_1_1EdgeT_af70e7b85effe62dd804638984b15695a}} +\hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \hyperlink{classDcel_1_1EdgeT_af70e7b85effe62dd804638984b15695a}{m\+\_\+x2x1} +\begin{DoxyCompactList}\small\item\em Vector from the starting vertex to the end vertex. Exists for performance reasons. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a3689615754e3bdafb12109d5b82183a7}\label{classDcel_1_1EdgeT_a3689615754e3bdafb12109d5b82183a7}} +T \hyperlink{classDcel_1_1EdgeT_a3689615754e3bdafb12109d5b82183a7}{m\+\_\+inv\+Len2} +\begin{DoxyCompactList}\small\item\em Squared inverse edge length. Exists for performance reasons. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a30813ecada33723cc466e0cd1d24abd4}\label{classDcel_1_1EdgeT_a30813ecada33723cc466e0cd1d24abd4}} +\hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \hyperlink{classDcel_1_1EdgeT_a30813ecada33723cc466e0cd1d24abd4}{m\+\_\+vertex} +\begin{DoxyCompactList}\small\item\em Starting vertex. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a5c3bc15e1360b931231cac396493f5b6}\label{classDcel_1_1EdgeT_a5c3bc15e1360b931231cac396493f5b6}} +\hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \hyperlink{classDcel_1_1EdgeT_a5c3bc15e1360b931231cac396493f5b6}{m\+\_\+pair\+Edge} +\begin{DoxyCompactList}\small\item\em Pair edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a77d21fbad704f8aa84aeddeaff1532fd}\label{classDcel_1_1EdgeT_a77d21fbad704f8aa84aeddeaff1532fd}} +\hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \hyperlink{classDcel_1_1EdgeT_a77d21fbad704f8aa84aeddeaff1532fd}{m\+\_\+previous\+Edge} +\begin{DoxyCompactList}\small\item\em Previous edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a26de8e8184c0a6656a2cee2af1bc0230}\label{classDcel_1_1EdgeT_a26de8e8184c0a6656a2cee2af1bc0230}} +\hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \hyperlink{classDcel_1_1EdgeT_a26de8e8184c0a6656a2cee2af1bc0230}{m\+\_\+next\+Edge} +\begin{DoxyCompactList}\small\item\em Next edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1EdgeT_a47aaa6dbeeb6a56f1c7b6d73b2119761}\label{classDcel_1_1EdgeT_a47aaa6dbeeb6a56f1c7b6d73b2119761}} +\hyperlink{classDcel_1_1EdgeT_a97dd9849ea4a21223095f852e48e36e8}{Face\+Ptr} \hyperlink{classDcel_1_1EdgeT_a47aaa6dbeeb6a56f1c7b6d73b2119761}{m\+\_\+face} +\begin{DoxyCompactList}\small\item\em Enclosing polygon face. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Edge\+T$<$ T $>$} + +Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). + +This class is used in D\+C\+EL functionality which stores polygonal surfaces in a mesh. The information contain in an \hyperlink{classDcel_1_1EdgeT}{EdgeT} object contains the necessary object for logically circulating the inside of a polygon face. This means that a polygon face has a double-\/connected list of half-\/edges which circulate the interior of the face. The \hyperlink{classDcel_1_1EdgeT}{EdgeT} object is such a half-\/edge; it represents the outgoing half-\/edge from a vertex, located such that it can be logically represented as a half edge on the \char`\"{}inside\char`\"{} of a polygon face. It contains pointers to the polygon face, next half edge, and the previous half edge. It also contains a pointer to the \char`\"{}pair\char`\"{} half edge, i.\+e. the corresponding half-\/edge on the other face that shares this edge. Since this class is used with D\+C\+EL functionality and signed distance fields, this class also has a signed distance function and thus a \char`\"{}normal vector\char`\"{}. For numericaly efficiency, some extra storage is also allocated (such as the vector between the starting vertex and the end vertex). \begin{DoxyNote}{Note} +The normal vector is outgoing, i.\+e. a point x is \char`\"{}outside\char`\"{} if the dot product between n and (x -\/ x0) is positive. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classDcel_1_1EdgeT_abe96b4404fa1961df79ffa618a7e8633}\label{classDcel_1_1EdgeT_abe96b4404fa1961df79ffa618a7e8633}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!EdgeT@{EdgeT}} +\index{EdgeT@{EdgeT}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{Edge\+T()}{EdgeT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::\hyperlink{classDcel_1_1EdgeT}{EdgeT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_a00184663a9d069d2c7a7e0a970f71fd5}{Edge} \&}]{a\+\_\+other\+Edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Copy constructor. Copies all information from the other half-\/edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other\+Edge} & Other edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a639b427e60ede1948f8344a41b9bfc32}\label{classDcel_1_1EdgeT_a639b427e60ede1948f8344a41b9bfc32}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!EdgeT@{EdgeT}} +\index{EdgeT@{EdgeT}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{Edge\+T()}{EdgeT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::\hyperlink{classDcel_1_1EdgeT}{EdgeT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \&}]{a\+\_\+vertex }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Partial constructor. Calls the default constructor but sets the starting vertex. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+vertex} & Starting vertex. \\ +\hline +\end{DoxyParams} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1EdgeT_abddfe200f9af04cf49362d4ed1e8d37b}\label{classDcel_1_1EdgeT_abddfe200f9af04cf49362d4ed1e8d37b}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!compute\+Edge\+Length@{compute\+Edge\+Length}} +\index{compute\+Edge\+Length@{compute\+Edge\+Length}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{compute\+Edge\+Length()}{computeEdgeLength()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::compute\+Edge\+Length (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Compute the edge length. + +This computes the vector m\+\_\+x2x1 (vector from starting vertex to end vertex) and the inverse length squared. \mbox{\Hypertarget{classDcel_1_1EdgeT_aa3257bd5d35041860b10e882e68b2c14}\label{classDcel_1_1EdgeT_aa3257bd5d35041860b10e882e68b2c14}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!define@{define}} +\index{define@{define}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \&}]{a\+\_\+vertex, }\item[{const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&}]{a\+\_\+pair\+Edge, }\item[{const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&}]{a\+\_\+next\+Edge, }\item[{const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&}]{a\+\_\+previous\+Edge, }\item[{const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3}}]{a\+\_\+normal }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Define function. Sets the starting vertex, edges, and normal vectors. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+vertex} & Starting vertex \\ +\hline +\mbox{\tt in} & {\em a\+\_\+pair\+Edge} & Pair half-\/edge \\ +\hline +\mbox{\tt in} & {\em a\+\_\+next\+Edge} & Next half-\/edge \\ +\hline +\mbox{\tt in} & {\em a\+\_\+previous\+Edge} & Previous half-\/edge \\ +\hline +\mbox{\tt in} & {\em a\+\_\+normal} & Edge normal vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a1c865581d60a3e89e91d1d8db56fc2d1}\label{classDcel_1_1EdgeT_a1c865581d60a3e89e91d1d8db56fc2d1}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Next\+Edge@{get\+Next\+Edge}} +\index{get\+Next\+Edge@{get\+Next\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Next\+Edge()}{getNextEdge()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Next\+Edge (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get modifiable next edge. + +\begin{DoxyReturn}{Returns} +Returns the next edge +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a6b50d3dd8ab3e2cda28819f6e4be9769}\label{classDcel_1_1EdgeT_a6b50d3dd8ab3e2cda28819f6e4be9769}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Next\+Edge@{get\+Next\+Edge}} +\index{get\+Next\+Edge@{get\+Next\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Next\+Edge()}{getNextEdge()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Next\+Edge (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get immutable next edge. + +\begin{DoxyReturn}{Returns} +Returns the next edge +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_aaa6ae21b177a7661ba61ad2b63ed47f3}\label{classDcel_1_1EdgeT_aaa6ae21b177a7661ba61ad2b63ed47f3}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Other\+Vertex@{get\+Other\+Vertex}} +\index{get\+Other\+Vertex@{get\+Other\+Vertex}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Other\+Vertex()}{getOtherVertex()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Other\+Vertex (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get modifiable end vertex. + +\begin{DoxyReturn}{Returns} +Returns the next half-\/edge\textquotesingle{}s starting vertex +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_ac2b40be7e45425caaf85b13b50bd89a0}\label{classDcel_1_1EdgeT_ac2b40be7e45425caaf85b13b50bd89a0}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Other\+Vertex@{get\+Other\+Vertex}} +\index{get\+Other\+Vertex@{get\+Other\+Vertex}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Other\+Vertex()}{getOtherVertex()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Other\+Vertex (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get immutable end vertex. + +\begin{DoxyReturn}{Returns} +Returns the next half-\/edge\textquotesingle{}s starting vertex +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a1a076a12b7e269aecd77172b1d4c57e1}\label{classDcel_1_1EdgeT_a1a076a12b7e269aecd77172b1d4c57e1}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Pair\+Edge@{get\+Pair\+Edge}} +\index{get\+Pair\+Edge@{get\+Pair\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Pair\+Edge()}{getPairEdge()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Pair\+Edge (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get modifiable pair edge. + +\begin{DoxyReturn}{Returns} +Returns the pair edge +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a46f28f7da631e2d0f7f3139d1167b392}\label{classDcel_1_1EdgeT_a46f28f7da631e2d0f7f3139d1167b392}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Pair\+Edge@{get\+Pair\+Edge}} +\index{get\+Pair\+Edge@{get\+Pair\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Pair\+Edge()}{getPairEdge()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Pair\+Edge (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get immutable pair edge. + +\begin{DoxyReturn}{Returns} +Returns the pair edge +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_ad97e2996c4559b8977d807a5627d5251}\label{classDcel_1_1EdgeT_ad97e2996c4559b8977d807a5627d5251}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Previous\+Edge@{get\+Previous\+Edge}} +\index{get\+Previous\+Edge@{get\+Previous\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Previous\+Edge()}{getPreviousEdge()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Previous\+Edge (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get modifiable previous edge. + +\begin{DoxyReturn}{Returns} +Returns the previous edge +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_ae4baac4bda30dfa3827ea87f2f72481f}\label{classDcel_1_1EdgeT_ae4baac4bda30dfa3827ea87f2f72481f}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Previous\+Edge@{get\+Previous\+Edge}} +\index{get\+Previous\+Edge@{get\+Previous\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Previous\+Edge()}{getPreviousEdge()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Previous\+Edge (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get immutable previous edge. + +\begin{DoxyReturn}{Returns} +Returns the previous edge +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a44193130714264f57d80e7bfc8264662}\label{classDcel_1_1EdgeT_a44193130714264f57d80e7bfc8264662}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Vertex@{get\+Vertex}} +\index{get\+Vertex@{get\+Vertex}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Vertex()}{getVertex()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Vertex (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get modifiable starting vertex. + +\begin{DoxyReturn}{Returns} +Returns m\+\_\+vertex +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_afa36dc535018588ba2238c5f42a9abd8}\label{classDcel_1_1EdgeT_afa36dc535018588ba2238c5f42a9abd8}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!get\+Vertex@{get\+Vertex}} +\index{get\+Vertex@{get\+Vertex}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{get\+Vertex()}{getVertex()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ $>$ \& \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::get\+Vertex (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get immutable starting vertex. + +\begin{DoxyReturn}{Returns} +Returns m\+\_\+vertex +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1EdgeT_ab937dca20cefcae4083b3cf873d83265}\label{classDcel_1_1EdgeT_ab937dca20cefcae4083b3cf873d83265}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!project\+Point\+To\+Edge@{project\+Point\+To\+Edge}} +\index{project\+Point\+To\+Edge@{project\+Point\+To\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{project\+Point\+To\+Edge()}{projectPointToEdge()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::project\+Point\+To\+Edge (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Returns the \char`\"{}projection\char`\"{} of a point to an edge. + +This function parametrizes the edge as x(t) = x0 + (x1-\/x0)$\ast$t and returns where on the this edge the point a\+\_\+x0 projects. If projects onto the edge if t = \mbox{[}0,1\mbox{]} and to one of the start/end vertices otherwise. \mbox{\Hypertarget{classDcel_1_1EdgeT_aeeda5324a62f1d8b6e50d788907526bf}\label{classDcel_1_1EdgeT_aeeda5324a62f1d8b6e50d788907526bf}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!set\+Next\+Edge@{set\+Next\+Edge}} +\index{set\+Next\+Edge@{set\+Next\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{set\+Next\+Edge()}{setNextEdge()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::set\+Next\+Edge (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&}]{a\+\_\+next\+Edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the next edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+next\+Edge} & Next edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1EdgeT_ab9ef2366cf1d411444caf81d5159a3e1}\label{classDcel_1_1EdgeT_ab9ef2366cf1d411444caf81d5159a3e1}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!set\+Pair\+Edge@{set\+Pair\+Edge}} +\index{set\+Pair\+Edge@{set\+Pair\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{set\+Pair\+Edge()}{setPairEdge()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::set\+Pair\+Edge (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&}]{a\+\_\+pair\+Edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the pair edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+pair\+Edge} & Pair edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1EdgeT_af5aa7f27fe95ba4331259b4de927bb37}\label{classDcel_1_1EdgeT_af5aa7f27fe95ba4331259b4de927bb37}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!set\+Previous\+Edge@{set\+Previous\+Edge}} +\index{set\+Previous\+Edge@{set\+Previous\+Edge}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{set\+Previous\+Edge()}{setPreviousEdge()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::set\+Previous\+Edge (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_af525f4228d820f6b8b23fc02d937e4c8}{Edge\+Ptr} \&}]{a\+\_\+previous\+Edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the previous edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+previous\+Edge} & Previous edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1EdgeT_a2611a8e0ae581ab8822f677d6d69edbd}\label{classDcel_1_1EdgeT_a2611a8e0ae581ab8822f677d6d69edbd}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!set\+Vertex@{set\+Vertex}} +\index{set\+Vertex@{set\+Vertex}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{set\+Vertex()}{setVertex()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::set\+Vertex (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_ab4ba57cfc6b2f90da43096eea87bb284}{Vertex\+Ptr} \&}]{a\+\_\+vertex }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the starting vertex. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+vertex} & Starting vertex \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1EdgeT_adba2d72aed5f510997d06c2bc9e6e96c}\label{classDcel_1_1EdgeT_adba2d72aed5f510997d06c2bc9e6e96c}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the signed distance to this half edge. + +This routine will check if the input point projects to the edge or one of the vertices. If it projectes to one of the vertices we compute the signed distance to the corresponding vertex. Otherwise we compute the projection to the edge and compute the sign from the normal vector. \mbox{\Hypertarget{classDcel_1_1EdgeT_a50345997f00af679875fda510b3e0607}\label{classDcel_1_1EdgeT_a50345997f00af679875fda510b3e0607}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!unsigned\+Distance2@{unsigned\+Distance2}} +\index{unsigned\+Distance2@{unsigned\+Distance2}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{unsigned\+Distance2()}{unsignedDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::unsigned\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the signed distance to this half edge. + +This routine will check if the input point projects to the edge or one of the vertices. If it projectes to one of the vertices we compute the squared distance to the corresponding vertex. Otherwise we compute the squared distance of the projection to the edge. This is faster than \hyperlink{classDcel_1_1EdgeT_adba2d72aed5f510997d06c2bc9e6e96c}{signed\+Distance()} + +\subsection{Member Data Documentation} +\mbox{\Hypertarget{classDcel_1_1EdgeT_af44c33f8b5b0a3d45cd4a83e6fde4db5}\label{classDcel_1_1EdgeT_af44c33f8b5b0a3d45cd4a83e6fde4db5}} +\index{Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}!m\+\_\+normal@{m\+\_\+normal}} +\index{m\+\_\+normal@{m\+\_\+normal}!Dcel\+::\+EdgeT@{Dcel\+::\+EdgeT}} +\subsubsection{\texorpdfstring{m\+\_\+normal}{m\_normal}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1EdgeT_a93b8679cea557c419af44385ca6d356a}{Vec3} \hyperlink{classDcel_1_1EdgeT}{Dcel\+::\+EdgeT}$<$ T $>$\+::m\+\_\+normal\hspace{0.3cm}{\ttfamily [protected]}} + + + +Half-\/edge normal vector. + +Computed in compute\+Normal which sets the normal vector to be the average of the normal vector of the connected faces + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelEdgeImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1FaceT.tex b/docs/doxygen/latex/classDcel_1_1FaceT.tex new file mode 100644 index 00000000..5004ceef --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1FaceT.tex @@ -0,0 +1,389 @@ +\hypertarget{classDcel_1_1FaceT}{}\section{Dcel\+:\+:FaceT$<$ T $>$ Class Template Reference} +\label{classDcel_1_1FaceT}\index{Dcel\+::\+Face\+T$<$ T $>$@{Dcel\+::\+Face\+T$<$ T $>$}} + + +Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}\label{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}} +using \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_acf33f51e5402ed6bf811521b138121b9}\label{classDcel_1_1FaceT_acf33f51e5402ed6bf811521b138121b9}} +using \hyperlink{classDcel_1_1FaceT_acf33f51e5402ed6bf811521b138121b9}{Vertex} = \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a32a6b328d61bd2739fd840b892833c41}\label{classDcel_1_1FaceT_a32a6b328d61bd2739fd840b892833c41}} +using \hyperlink{classDcel_1_1FaceT_a32a6b328d61bd2739fd840b892833c41}{Edge} = \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a01d61241adc3c536c364084740b8c6da}\label{classDcel_1_1FaceT_a01d61241adc3c536c364084740b8c6da}} +using \hyperlink{classDcel_1_1FaceT_a01d61241adc3c536c364084740b8c6da}{Face} = \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a9c22745bf7351c3bfba27d5816a50deb}\label{classDcel_1_1FaceT_a9c22745bf7351c3bfba27d5816a50deb}} +using \hyperlink{classDcel_1_1FaceT_a9c22745bf7351c3bfba27d5816a50deb}{Vertex\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1FaceT_acf33f51e5402ed6bf811521b138121b9}{Vertex} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}\label{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}} +using \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1FaceT_a32a6b328d61bd2739fd840b892833c41}{Edge} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a4c7f99f7e30983c04a9d0b2f7ca40736}\label{classDcel_1_1FaceT_a4c7f99f7e30983c04a9d0b2f7ca40736}} +using \hyperlink{classDcel_1_1FaceT_a4c7f99f7e30983c04a9d0b2f7ca40736}{Face\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1FaceT_a01d61241adc3c536c364084740b8c6da}{Face} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_afcd6f529cb59cd3dc358d6da52de54a1}\label{classDcel_1_1FaceT_afcd6f529cb59cd3dc358d6da52de54a1}} +using \hyperlink{classDcel_1_1FaceT_afcd6f529cb59cd3dc358d6da52de54a1}{Edge\+Iterator} = \hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1FaceT_ad26587e282563bc4e8c6559b2551627f}\label{classDcel_1_1FaceT_ad26587e282563bc4e8c6559b2551627f}} +\hyperlink{classDcel_1_1FaceT_ad26587e282563bc4e8c6559b2551627f}{FaceT} () +\begin{DoxyCompactList}\small\item\em Default constructor. Sets the half-\/edge to zero and the inside/outside algorithm to crossing number algorithm. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1FaceT_a9111394950a9fb2f8b918423416c83bd}{FaceT} (const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \&a\+\_\+edge) +\begin{DoxyCompactList}\small\item\em Partial constructor. Calls default constructor but associates a half-\/edge. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1FaceT_a0c318a29cae34ba4105235fd55d22b39}{FaceT} (const \hyperlink{classDcel_1_1FaceT_a01d61241adc3c536c364084740b8c6da}{Face} \&a\+\_\+other\+Face) +\begin{DoxyCompactList}\small\item\em Partial constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a56988526e98a2626c644117e9298fd4b}\label{classDcel_1_1FaceT_a56988526e98a2626c644117e9298fd4b}} +\hyperlink{classDcel_1_1FaceT_a56988526e98a2626c644117e9298fd4b}{$\sim$\+FaceT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1FaceT_a44b70fa51382ef625d110bbad64b7442}{define} (const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&a\+\_\+normal, const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \&a\+\_\+edge) noexcept +\begin{DoxyCompactList}\small\item\em Define function which sets the normal vector and half-\/edge. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1FaceT_aaf3f8b92ca4393391ea213b0ecfe19bd}{reconcile} () noexcept +\begin{DoxyCompactList}\small\item\em Reconcile face. This will compute the normal vector, area, centroid, and the 2D embedding of the polygon. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1FaceT_a2680477d0a6c8b2187230170522fe3a5}{set\+Half\+Edge} (const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \&a\+\_\+half\+Edge) noexcept +\begin{DoxyCompactList}\small\item\em Set the half edge. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1FaceT_a12b6dc8412276137532a63c292e4b6fe}{set\+Inside\+Outside\+Algorithm} (typename \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::Inside\+Outside\+Algorithm \&a\+\_\+algorithm) noexcept +\begin{DoxyCompactList}\small\item\em Set the inside/outside algorithm when determining if a point projects to the inside or outside of the polygon. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a121a02750336ee4050bfd5db8f9328b4}\label{classDcel_1_1FaceT_a121a02750336ee4050bfd5db8f9328b4}} +\hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \& \hyperlink{classDcel_1_1FaceT_a121a02750336ee4050bfd5db8f9328b4}{get\+Half\+Edge} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable half-\/edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a1b273c8c0157f7ec9604424a2b073db3}\label{classDcel_1_1FaceT_a1b273c8c0157f7ec9604424a2b073db3}} +const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \& \hyperlink{classDcel_1_1FaceT_a1b273c8c0157f7ec9604424a2b073db3}{get\+Half\+Edge} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable half-\/edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a1b9c15538b2d7840a11b30f5e236c2a9}\label{classDcel_1_1FaceT_a1b9c15538b2d7840a11b30f5e236c2a9}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1FaceT_a1b9c15538b2d7840a11b30f5e236c2a9}{get\+Centroid} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable centroid. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_af2bf6614093074f450b2e0e5ea58682a}\label{classDcel_1_1FaceT_af2bf6614093074f450b2e0e5ea58682a}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1FaceT_af2bf6614093074f450b2e0e5ea58682a}{get\+Centroid} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable centroid. \end{DoxyCompactList}\item +T \& \hyperlink{classDcel_1_1FaceT_a43e5b9aebe8736a42568ae0e6fbb6db3}{get\+Centroid} (const int a\+\_\+dir) noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable centroid position in specified coordinate direction. \end{DoxyCompactList}\item +const T \& \hyperlink{classDcel_1_1FaceT_ac835d260a630e303babd7f87eb7d5a1a}{get\+Centroid} (const int a\+\_\+dir) const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable centroid position in specified coordinate direction. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a0e6079ca8d45b2e2090bd6202c7a679e}\label{classDcel_1_1FaceT_a0e6079ca8d45b2e2090bd6202c7a679e}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1FaceT_a0e6079ca8d45b2e2090bd6202c7a679e}{get\+Normal} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_adff3ebb9eba8d500e21fed65b32ea8fb}\label{classDcel_1_1FaceT_adff3ebb9eba8d500e21fed65b32ea8fb}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1FaceT_adff3ebb9eba8d500e21fed65b32ea8fb}{get\+Normal} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable normal vector. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1FaceT_a8ac718b0c9af797d34efcda43f38b6c0}{signed\+Distance} (const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the signed distance to a point. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1FaceT_a2915506b12c361eb4a25cba80638cb7d}{unsigned\+Distance2} (const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the unsigned squared distance to a point. \end{DoxyCompactList}\item +std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$ $>$ \hyperlink{classDcel_1_1FaceT_a17f38028d7bd3150feb22484e601f557}{get\+All\+Vertex\+Coordinates} () const noexcept +\begin{DoxyCompactList}\small\item\em Return the coordinates of all the vertices on this polygon. \end{DoxyCompactList}\item +std\+::vector$<$ \hyperlink{classDcel_1_1FaceT_a9c22745bf7351c3bfba27d5816a50deb}{Vertex\+Ptr} $>$ \hyperlink{classDcel_1_1FaceT_aba1c0e341f18097112fd55465cc00eeb}{gather\+Vertices} () const noexcept +\begin{DoxyCompactList}\small\item\em Return all the vertices on this polygon. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a8eb0b35ecb5de2601dc9f7ff0d2cac0d}\label{classDcel_1_1FaceT_a8eb0b35ecb5de2601dc9f7ff0d2cac0d}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classDcel_1_1FaceT_a8eb0b35ecb5de2601dc9f7ff0d2cac0d}{get\+Smallest\+Coordinate} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the lower-\/left-\/most coordinate of this polygon face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_ad712b8dec98d77e631e1c7a920424d1f}\label{classDcel_1_1FaceT_ad712b8dec98d77e631e1c7a920424d1f}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classDcel_1_1FaceT_ad712b8dec98d77e631e1c7a920424d1f}{get\+Highest\+Coordinate} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the upper-\/right-\/most coordinate of this polygon face. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a3a3bfa74a7c07252a2a904206678bb66}\label{classDcel_1_1FaceT_a3a3bfa74a7c07252a2a904206678bb66}} +void \hyperlink{classDcel_1_1FaceT_a3a3bfa74a7c07252a2a904206678bb66}{compute\+Area} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the area of this polygon. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a7aded1c77a78a38115e5388311ed25b0}\label{classDcel_1_1FaceT_a7aded1c77a78a38115e5388311ed25b0}} +void \hyperlink{classDcel_1_1FaceT_a7aded1c77a78a38115e5388311ed25b0}{compute\+Centroid} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the centroid position of this polygon. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a574abc710dd63e88503d4011f27adf89}\label{classDcel_1_1FaceT_a574abc710dd63e88503d4011f27adf89}} +void \hyperlink{classDcel_1_1FaceT_a574abc710dd63e88503d4011f27adf89}{compute\+Normal} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the normal position of this polygon. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a863d94c15412e535ca62f9cd52eead5f}\label{classDcel_1_1FaceT_a863d94c15412e535ca62f9cd52eead5f}} +void \hyperlink{classDcel_1_1FaceT_a863d94c15412e535ca62f9cd52eead5f}{compute\+Polygon2D} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the 2D embedding of this polygon. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_aae0f6ac54d41666fa4b6182c65e5e444}\label{classDcel_1_1FaceT_aae0f6ac54d41666fa4b6182c65e5e444}} +void \hyperlink{classDcel_1_1FaceT_aae0f6ac54d41666fa4b6182c65e5e444}{normalize\+Normal\+Vector} () noexcept +\begin{DoxyCompactList}\small\item\em Normalize the normal vector, ensuring it has a length of 1. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_aeddb2fe440acd3dadc6160be390127fe}\label{classDcel_1_1FaceT_aeddb2fe440acd3dadc6160be390127fe}} +T \hyperlink{classDcel_1_1FaceT_aeddb2fe440acd3dadc6160be390127fe}{get\+Area} () noexcept +\begin{DoxyCompactList}\small\item\em Get the area of this polygon face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_ab5352c13f01b1d2ec8fbd630d4c01083}\label{classDcel_1_1FaceT_ab5352c13f01b1d2ec8fbd630d4c01083}} +T \hyperlink{classDcel_1_1FaceT_ab5352c13f01b1d2ec8fbd630d4c01083}{get\+Area} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the area of this polygon face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a5e913d5cdebb6b95c43e6e0fdc2e3589}\label{classDcel_1_1FaceT_a5e913d5cdebb6b95c43e6e0fdc2e3589}} +void \hyperlink{classDcel_1_1FaceT_a5e913d5cdebb6b95c43e6e0fdc2e3589}{compute\+And\+Store\+Edges} () noexcept +\begin{DoxyCompactList}\small\item\em Compute and store all the half-\/edges around this polygon face. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classDcel_1_1FaceT_af4116b8f72e0dfb797f79cd4f27a71e8}{project\+Point\+Into\+Face\+Plane} (const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&a\+\_\+p) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the projection of a point onto the polygon face plane. \end{DoxyCompactList}\item +bool \hyperlink{classDcel_1_1FaceT_a628d1734a63636a528fe2f7019bc4dd8}{is\+Point\+Inside\+Face} (const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&a\+\_\+p) const noexcept +\begin{DoxyCompactList}\small\item\em Check if a point projects to inside or outside the polygon face. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1FaceT_afe66c3d93bb0ea04d9a0d263b2927bd3}\label{classDcel_1_1FaceT_afe66c3d93bb0ea04d9a0d263b2927bd3}} +\hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \hyperlink{classDcel_1_1FaceT_afe66c3d93bb0ea04d9a0d263b2927bd3}{m\+\_\+half\+Edge} +\begin{DoxyCompactList}\small\item\em This polygon\textquotesingle{}s half-\/edge. A valid face will always have != nullptr. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a9228b5f27e1aa5c9eea36a7c27462e6c}\label{classDcel_1_1FaceT_a9228b5f27e1aa5c9eea36a7c27462e6c}} +std\+::vector$<$ \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} $>$ \hyperlink{classDcel_1_1FaceT_a9228b5f27e1aa5c9eea36a7c27462e6c}{m\+\_\+edges} +\begin{DoxyCompactList}\small\item\em Pointers to all the half-\/edges of this face. Exists for performance reasons (in signed\+Distance(...)) \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a572c463c60afb896c8cec667c964631f}\label{classDcel_1_1FaceT_a572c463c60afb896c8cec667c964631f}} +T \hyperlink{classDcel_1_1FaceT_a572c463c60afb896c8cec667c964631f}{m\+\_\+area} +\begin{DoxyCompactList}\small\item\em Polygon face area. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a886ee24ddf3dae99b836b39183a412ba}\label{classDcel_1_1FaceT_a886ee24ddf3dae99b836b39183a412ba}} +\hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \hyperlink{classDcel_1_1FaceT_a886ee24ddf3dae99b836b39183a412ba}{m\+\_\+normal} +\begin{DoxyCompactList}\small\item\em Polygon face normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a9a85e2c47be9ac4bbfe8620bc0773d6d}\label{classDcel_1_1FaceT_a9a85e2c47be9ac4bbfe8620bc0773d6d}} +\hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \hyperlink{classDcel_1_1FaceT_a9a85e2c47be9ac4bbfe8620bc0773d6d}{m\+\_\+centroid} +\begin{DoxyCompactList}\small\item\em Polygon face centroid position. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_a77edb4eca91bcd6fb47ce3574c11b840}\label{classDcel_1_1FaceT_a77edb4eca91bcd6fb47ce3574c11b840}} +std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Polygon2D}{Polygon2D}$<$ T $>$ $>$ \hyperlink{classDcel_1_1FaceT_a77edb4eca91bcd6fb47ce3574c11b840}{m\+\_\+poly2} +\begin{DoxyCompactList}\small\item\em 2D embedding of this polygon. This is the 2D view of the current object projected along its normal vector cardinal. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1FaceT_acc53b6246f9d5d57777789aad6084d14}\label{classDcel_1_1FaceT_acc53b6246f9d5d57777789aad6084d14}} +\hyperlink{classDcel_1_1Polygon2D}{Polygon2D}$<$ T $>$\+::Inside\+Outside\+Algorithm \hyperlink{classDcel_1_1FaceT_acc53b6246f9d5d57777789aad6084d14}{m\+\_\+poly2\+Algorithm} +\begin{DoxyCompactList}\small\item\em Algorithm for inside/outside tests. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Face\+T$<$ T $>$} + +Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). + +This class is a polygon face in a D\+C\+EL mesh. It contains pointer storage to one of the half-\/edges that circulate the inside of the polygon face, as well as having a normal vector, a centroid, and an area. This class supports signed distance computations. These computations require algorithms that compute e.\+g. the winding number of the polygon, or the number of times a ray cast passes through it. Thus, one of its central features is that it can be embedded in 2D by projecting it along the cardinal direction of its normal vector. To be fully consistent with a D\+C\+EL structure the class stores a reference to one of its half edges, but for performance reasons it also stores references to the other half edges. \begin{DoxyNote}{Note} +To compute the distance from a point to the face one must determine if the point projects \char`\"{}inside\char`\"{} or \char`\"{}outside\char`\"{} the polygon. There are several algorithms for this, and by default this class uses a crossing number algorithm. Other algorithms can be set in set\+Inside\+Outside\+Algorithm (see C\+D\+\_\+\+Dcel\+Algorithms.\+H) +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classDcel_1_1FaceT_a9111394950a9fb2f8b918423416c83bd}\label{classDcel_1_1FaceT_a9111394950a9fb2f8b918423416c83bd}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!FaceT@{FaceT}} +\index{FaceT@{FaceT}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{Face\+T()}{FaceT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::\hyperlink{classDcel_1_1FaceT}{FaceT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \&}]{a\+\_\+edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Partial constructor. Calls default constructor but associates a half-\/edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+edge} & Half-\/edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1FaceT_a0c318a29cae34ba4105235fd55d22b39}\label{classDcel_1_1FaceT_a0c318a29cae34ba4105235fd55d22b39}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!FaceT@{FaceT}} +\index{FaceT@{FaceT}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{Face\+T()}{FaceT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::\hyperlink{classDcel_1_1FaceT}{FaceT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_a01d61241adc3c536c364084740b8c6da}{Face} \&}]{a\+\_\+other\+Face }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Partial constructor. + +Calls default constructor but sets the normal vector and half-\/edge equal to the other face\textquotesingle{}s (rest is undefined) + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1FaceT_a44b70fa51382ef625d110bbad64b7442}\label{classDcel_1_1FaceT_a44b70fa51382ef625d110bbad64b7442}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!define@{define}} +\index{define@{define}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&}]{a\+\_\+normal, }\item[{const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \&}]{a\+\_\+edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Define function which sets the normal vector and half-\/edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+normal} & Normal vector \\ +\hline +\mbox{\tt in} & {\em a\+\_\+edge} & Half edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1FaceT_aba1c0e341f18097112fd55465cc00eeb}\label{classDcel_1_1FaceT_aba1c0e341f18097112fd55465cc00eeb}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!gather\+Vertices@{gather\+Vertices}} +\index{gather\+Vertices@{gather\+Vertices}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{gather\+Vertices()}{gatherVertices()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ $>$ $>$ \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::gather\+Vertices (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Return all the vertices on this polygon. + +This builds a list of all the vertices and returns it. \mbox{\Hypertarget{classDcel_1_1FaceT_a17f38028d7bd3150feb22484e601f557}\label{classDcel_1_1FaceT_a17f38028d7bd3150feb22484e601f557}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!get\+All\+Vertex\+Coordinates@{get\+All\+Vertex\+Coordinates}} +\index{get\+All\+Vertex\+Coordinates@{get\+All\+Vertex\+Coordinates}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{get\+All\+Vertex\+Coordinates()}{getAllVertexCoordinates()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$ $>$ \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::get\+All\+Vertex\+Coordinates (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Return the coordinates of all the vertices on this polygon. + +This builds a list of all the vertex coordinates and returns it. \mbox{\Hypertarget{classDcel_1_1FaceT_a43e5b9aebe8736a42568ae0e6fbb6db3}\label{classDcel_1_1FaceT_a43e5b9aebe8736a42568ae0e6fbb6db3}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!get\+Centroid@{get\+Centroid}} +\index{get\+Centroid@{get\+Centroid}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{get\+Centroid()}{getCentroid()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \& \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::get\+Centroid (\begin{DoxyParamCaption}\item[{const int}]{a\+\_\+dir }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get modifiable centroid position in specified coordinate direction. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+dir} & Coordinate direction \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1FaceT_ac835d260a630e303babd7f87eb7d5a1a}\label{classDcel_1_1FaceT_ac835d260a630e303babd7f87eb7d5a1a}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!get\+Centroid@{get\+Centroid}} +\index{get\+Centroid@{get\+Centroid}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{get\+Centroid()}{getCentroid()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const T \& \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::get\+Centroid (\begin{DoxyParamCaption}\item[{const int}]{a\+\_\+dir }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get immutable centroid position in specified coordinate direction. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+dir} & Coordinate direction \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1FaceT_a628d1734a63636a528fe2f7019bc4dd8}\label{classDcel_1_1FaceT_a628d1734a63636a528fe2f7019bc4dd8}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!is\+Point\+Inside\+Face@{is\+Point\+Inside\+Face}} +\index{is\+Point\+Inside\+Face@{is\+Point\+Inside\+Face}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{is\+Point\+Inside\+Face()}{isPointInsideFace()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::is\+Point\+Inside\+Face (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&}]{a\+\_\+p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Check if a point projects to inside or outside the polygon face. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+p} & Point in space \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns true if a\+\_\+p projects to inside the polygon and false otherwise. +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1FaceT_af4116b8f72e0dfb797f79cd4f27a71e8}\label{classDcel_1_1FaceT_af4116b8f72e0dfb797f79cd4f27a71e8}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!project\+Point\+Into\+Face\+Plane@{project\+Point\+Into\+Face\+Plane}} +\index{project\+Point\+Into\+Face\+Plane@{project\+Point\+Into\+Face\+Plane}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{project\+Point\+Into\+Face\+Plane()}{projectPointIntoFacePlane()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::project\+Point\+Into\+Face\+Plane (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&}]{a\+\_\+p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Compute the projection of a point onto the polygon face plane. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+p} & Point in space \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1FaceT_aaf3f8b92ca4393391ea213b0ecfe19bd}\label{classDcel_1_1FaceT_aaf3f8b92ca4393391ea213b0ecfe19bd}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!reconcile@{reconcile}} +\index{reconcile@{reconcile}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{reconcile()}{reconcile()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::reconcile (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Reconcile face. This will compute the normal vector, area, centroid, and the 2D embedding of the polygon. + +\begin{DoxyNote}{Note} +\char`\"{}\+Everything\char`\"{} must be set before doing this, i.\+e. the face must be complete with half edges and there can be no dangling edges. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1FaceT_a2680477d0a6c8b2187230170522fe3a5}\label{classDcel_1_1FaceT_a2680477d0a6c8b2187230170522fe3a5}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!set\+Half\+Edge@{set\+Half\+Edge}} +\index{set\+Half\+Edge@{set\+Half\+Edge}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{set\+Half\+Edge()}{setHalfEdge()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::set\+Half\+Edge (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_a0f3448c4cf108341e48029b8040c7cec}{Edge\+Ptr} \&}]{a\+\_\+half\+Edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the half edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+half\+Edge} & Half edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1FaceT_a12b6dc8412276137532a63c292e4b6fe}\label{classDcel_1_1FaceT_a12b6dc8412276137532a63c292e4b6fe}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!set\+Inside\+Outside\+Algorithm@{set\+Inside\+Outside\+Algorithm}} +\index{set\+Inside\+Outside\+Algorithm@{set\+Inside\+Outside\+Algorithm}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{set\+Inside\+Outside\+Algorithm()}{setInsideOutsideAlgorithm()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::set\+Inside\+Outside\+Algorithm (\begin{DoxyParamCaption}\item[{typename \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::Inside\+Outside\+Algorithm \&}]{a\+\_\+algorithm }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the inside/outside algorithm when determining if a point projects to the inside or outside of the polygon. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+algorithm} & Desired algorithm \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +See C\+D\+\_\+\+Dcel\+Algorithms.\+H for options (and C\+D\+\_\+\+Dcel\+Poly\+Implem.\+H for how the algorithms operate). +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1FaceT_a8ac718b0c9af797d34efcda43f38b6c0}\label{classDcel_1_1FaceT_a8ac718b0c9af797d34efcda43f38b6c0}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the signed distance to a point. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & Point in space\\ +\hline +\end{DoxyParams} +This algorithm operates by checking if the input point projects to the inside of the polygon. If it does then the distance is just the projected distance onto the polygon plane and the sign is well-\/defined. Otherwise, we check the distance to the edges of the polygon. \mbox{\Hypertarget{classDcel_1_1FaceT_a2915506b12c361eb4a25cba80638cb7d}\label{classDcel_1_1FaceT_a2915506b12c361eb4a25cba80638cb7d}} +\index{Dcel\+::\+FaceT@{Dcel\+::\+FaceT}!unsigned\+Distance2@{unsigned\+Distance2}} +\index{unsigned\+Distance2@{unsigned\+Distance2}!Dcel\+::\+FaceT@{Dcel\+::\+FaceT}} +\subsubsection{\texorpdfstring{unsigned\+Distance2()}{unsignedDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$\+::unsigned\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1FaceT_ade9c182834ec6f18a0e17b8140308db2}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the unsigned squared distance to a point. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & Point in space\\ +\hline +\end{DoxyParams} +This algorithm operates by checking if the input point projects to the inside of the polygon. If it does then the distance is just the projected distance onto the polygon plane. Otherwise, we check the distance to the edges of the polygon. + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelFaceImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1MeshT.tex b/docs/doxygen/latex/classDcel_1_1MeshT.tex new file mode 100644 index 00000000..0c2fd78c --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1MeshT.tex @@ -0,0 +1,420 @@ +\hypertarget{classDcel_1_1MeshT}{}\section{Dcel\+:\+:MeshT$<$ T $>$ Class Template Reference} +\label{classDcel_1_1MeshT}\index{Dcel\+::\+Mesh\+T$<$ T $>$@{Dcel\+::\+Mesh\+T$<$ T $>$}} + + +Mesh class which stores a full D\+C\+EL mesh (with signed distance functions) + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +enum \hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Search\+Algorithm} \{ {\bfseries Direct}, +{\bfseries Direct2} + \}\begin{DoxyCompactList}\small\item\em Possible search algorithms for \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}. \end{DoxyCompactList} +\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}\label{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}} +enum \hyperlink{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}{Vertex\+Normal\+Weight} \{ {\bfseries None}, +{\bfseries Angle} + \}\begin{DoxyCompactList}\small\item\em How to weight vertex normal. \end{DoxyCompactList} +\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}\label{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}} +using \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a58b357c4ad94f4a4b813ed7ebf01cd05}\label{classDcel_1_1MeshT_a58b357c4ad94f4a4b813ed7ebf01cd05}} +using \hyperlink{classDcel_1_1MeshT_a58b357c4ad94f4a4b813ed7ebf01cd05}{Vertex} = \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a94f5c42e6f80fd948ebbc294d948ffab}\label{classDcel_1_1MeshT_a94f5c42e6f80fd948ebbc294d948ffab}} +using \hyperlink{classDcel_1_1MeshT_a94f5c42e6f80fd948ebbc294d948ffab}{Edge} = \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_ac1fcce96c65811660619af9eb32589f9}\label{classDcel_1_1MeshT_ac1fcce96c65811660619af9eb32589f9}} +using \hyperlink{classDcel_1_1MeshT_ac1fcce96c65811660619af9eb32589f9}{Face} = \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}\label{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}} +using \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1MeshT_a58b357c4ad94f4a4b813ed7ebf01cd05}{Vertex} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}\label{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}} +using \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1MeshT_a94f5c42e6f80fd948ebbc294d948ffab}{Edge} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}\label{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}} +using \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1MeshT_ac1fcce96c65811660619af9eb32589f9}{Face} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_abe9db973f4510ccb36e20ecfa9223926}\label{classDcel_1_1MeshT_abe9db973f4510ccb36e20ecfa9223926}} +using \hyperlink{classDcel_1_1MeshT_abe9db973f4510ccb36e20ecfa9223926}{Mesh} = \hyperlink{classDcel_1_1MeshT}{MeshT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on the typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a4eae06529761d8aff54e945eb0a3ba91}\label{classDcel_1_1MeshT_a4eae06529761d8aff54e945eb0a3ba91}} +\hyperlink{classDcel_1_1MeshT_a4eae06529761d8aff54e945eb0a3ba91}{MeshT} () +\begin{DoxyCompactList}\small\item\em Default constructor. Leaves unobject in an unusable state. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1MeshT_aa055e10c62778ba629b3f9c849338e03}{MeshT} (const \hyperlink{classDcel_1_1MeshT_abe9db973f4510ccb36e20ecfa9223926}{Mesh} \&a\+\_\+other\+Mesh)=delete +\begin{DoxyCompactList}\small\item\em Disallowed copy construction. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1MeshT_a7468e3630893d64a71a7c2347496576b}{MeshT} (std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \&a\+\_\+faces, std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \&a\+\_\+edges, std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \&a\+\_\+vertices) +\begin{DoxyCompactList}\small\item\em Full constructor. This provides the faces, edges, and vertices to the mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a51da8ad54b3cfe69a695221f73bd97b2}\label{classDcel_1_1MeshT_a51da8ad54b3cfe69a695221f73bd97b2}} +\hyperlink{classDcel_1_1MeshT_a51da8ad54b3cfe69a695221f73bd97b2}{$\sim$\+MeshT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_af65f5fc459d586ba3b6bd0711b0951f5}{define} (std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \&a\+\_\+faces, std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \&a\+\_\+edges, std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \&a\+\_\+vertices) noexcept +\begin{DoxyCompactList}\small\item\em Define function. Puts Mesh in usable state. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_a1814ba63c6e0d7a007ee78c24d6ea159}{sanity\+Check} () const noexcept +\begin{DoxyCompactList}\small\item\em Perform a sanity check. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_abc7a2bd7632be06c0ad9cf49816d262f}{set\+Search\+Algorithm} (const \hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Search\+Algorithm} a\+\_\+algorithm) noexcept +\begin{DoxyCompactList}\small\item\em Search algorithm for direct signed distance computations. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_a1e46a744a2526e451229e2f2e4830ca5}{set\+Inside\+Outside\+Algorithm} (typename \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::Inside\+Outside\+Algorithm a\+\_\+algorithm) noexcept +\begin{DoxyCompactList}\small\item\em Set the inside/outside algorithm to use when computing the signed distance to polygon faces. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_a98d80b5f83b9d6ff55d0d0da34d0b422}{reconcile} (typename \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::\hyperlink{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}{Vertex\+Normal\+Weight} a\+\_\+weight=Vertex\+Normal\+Weight\+::\+Angle) noexcept +\begin{DoxyCompactList}\small\item\em Reconcile function which computes the internal parameters in vertices, edges, and faces for use with signed distance functionality. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a0ccf0a5a707dbad79b3578a401449e9c}\label{classDcel_1_1MeshT_a0ccf0a5a707dbad79b3578a401449e9c}} +std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \& \hyperlink{classDcel_1_1MeshT_a0ccf0a5a707dbad79b3578a401449e9c}{get\+Vertices} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable vertices in this mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a579860225cb9fc926fea4856563bef08}\label{classDcel_1_1MeshT_a579860225cb9fc926fea4856563bef08}} +const std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \& \hyperlink{classDcel_1_1MeshT_a579860225cb9fc926fea4856563bef08}{get\+Vertices} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable vertices in this mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a3c6566eab929cc4108213959fa25777e}\label{classDcel_1_1MeshT_a3c6566eab929cc4108213959fa25777e}} +std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \& \hyperlink{classDcel_1_1MeshT_a3c6566eab929cc4108213959fa25777e}{get\+Edges} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable half-\/edges in this mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a3440c0836148040bfd6cc679f047ec5b}\label{classDcel_1_1MeshT_a3440c0836148040bfd6cc679f047ec5b}} +const std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \& \hyperlink{classDcel_1_1MeshT_a3440c0836148040bfd6cc679f047ec5b}{get\+Edges} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable half-\/edges in this mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a348cffec1fa223f131819abad1c89338}\label{classDcel_1_1MeshT_a348cffec1fa223f131819abad1c89338}} +std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \& \hyperlink{classDcel_1_1MeshT_a348cffec1fa223f131819abad1c89338}{get\+Faces} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable faces in this mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_afe1bd52d15af160f691bdd83305c84c7}\label{classDcel_1_1MeshT_afe1bd52d15af160f691bdd83305c84c7}} +const std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \& \hyperlink{classDcel_1_1MeshT_afe1bd52d15af160f691bdd83305c84c7}{get\+Faces} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable faces in this mesh. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1MeshT_aa6f614aa0d93c3345c10150168347497}{signed\+Distance} (const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the signed distance from a point to this mesh. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1MeshT_a4fa40378fbd4c31cd50e77da70ef30fd}{signed\+Distance} (const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&a\+\_\+x0, \hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Search\+Algorithm} a\+\_\+algorithm) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the signed distance from a point to this mesh. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a597a38ed9f3e3a2a33f2d1211da322f3}\label{classDcel_1_1MeshT_a597a38ed9f3e3a2a33f2d1211da322f3}} +std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$ $>$ \hyperlink{classDcel_1_1MeshT_a597a38ed9f3e3a2a33f2d1211da322f3}{get\+All\+Vertex\+Coordinates} () const noexcept +\begin{DoxyCompactList}\small\item\em Return all vertex coordinates in the mesh. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_a5e31ae8b95c9ee725e205d8ae4fd35dc}{reconcile\+Faces} () noexcept +\begin{DoxyCompactList}\small\item\em Function which computes internal things for the polygon faces. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_a33f6506c1daf9946d1f21117c0ab89d5}{reconcile\+Edges} () noexcept +\begin{DoxyCompactList}\small\item\em Function which computes internal things for the half-\/edges. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_ad2b65aa214d51ecd438bc876e7255290}{reconcile\+Vertices} (typename \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::\hyperlink{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}{Vertex\+Normal\+Weight} a\+\_\+weight) noexcept +\begin{DoxyCompactList}\small\item\em Function which computes internal things for the vertices. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1MeshT_ada074ff3b1a612e46098f4ba6ca0bda2}{Direct\+Signed\+Distance} (const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Implementation of signed distance function which iterates through all faces. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1MeshT_ac00a6da46649246a3a2db70b29bb2407}{Direct\+Signed\+Distance2} (const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Implementation of squared signed distance function which iterates through all faces. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1MeshT_ae13801eefa60ad08ff1da0df1da34784}{increment\+Warning} (std\+::map$<$ std\+::string, int $>$ \&a\+\_\+warnings, const std\+::string \&a\+\_\+warn) const noexcept +\begin{DoxyCompactList}\small\item\em Increment a warning. This is used in \hyperlink{classDcel_1_1MeshT_a1814ba63c6e0d7a007ee78c24d6ea159}{sanity\+Check()} for locating holes or bad inputs in the mesh. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a7115bea1b9d776a5f9c82a1e4fe852a0}\label{classDcel_1_1MeshT_a7115bea1b9d776a5f9c82a1e4fe852a0}} +void \hyperlink{classDcel_1_1MeshT_a7115bea1b9d776a5f9c82a1e4fe852a0}{print\+Warnings} (const std\+::map$<$ std\+::string, int $>$ \&a\+\_\+warnings) const noexcept +\begin{DoxyCompactList}\small\item\em Print all warnings to std\+::cerr. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1MeshT_aaa5bdf8df02aa8bcff84203467f86fbe}\label{classDcel_1_1MeshT_aaa5bdf8df02aa8bcff84203467f86fbe}} +\hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Search\+Algorithm} \hyperlink{classDcel_1_1MeshT_aaa5bdf8df02aa8bcff84203467f86fbe}{m\+\_\+algorithm} +\begin{DoxyCompactList}\small\item\em Search algorithm. Only used in signed distance functions. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a4263fd9ebba22b96e12ee9f046eca089}\label{classDcel_1_1MeshT_a4263fd9ebba22b96e12ee9f046eca089}} +std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \hyperlink{classDcel_1_1MeshT_a4263fd9ebba22b96e12ee9f046eca089}{m\+\_\+vertices} +\begin{DoxyCompactList}\small\item\em Mesh vertices. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a3325cb09037fa32255aa1a8a5536e473}\label{classDcel_1_1MeshT_a3325cb09037fa32255aa1a8a5536e473}} +std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \hyperlink{classDcel_1_1MeshT_a3325cb09037fa32255aa1a8a5536e473}{m\+\_\+edges} +\begin{DoxyCompactList}\small\item\em Mesh half-\/edges. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1MeshT_a17e08b2ee4b5b7b1dc3df974e792ca5f}\label{classDcel_1_1MeshT_a17e08b2ee4b5b7b1dc3df974e792ca5f}} +std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \hyperlink{classDcel_1_1MeshT_a17e08b2ee4b5b7b1dc3df974e792ca5f}{m\+\_\+faces} +\begin{DoxyCompactList}\small\item\em Mesh faces. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Mesh\+T$<$ T $>$} + +Mesh class which stores a full D\+C\+EL mesh (with signed distance functions) + +This encapsulates a full D\+C\+EL mesh, and also includes D\+I\+R\+E\+CT signed distance functions. The mesh consists of a set of vertices, half-\/edges, and polygon faces who each have references to other vertices, half-\/edges, and polygon faces. The signed distance functions D\+I\+R\+E\+CT, which means that they go through A\+LL of the polygon faces and compute the signed distance to them. This is extremely inefficient, which is why this class is almost always embedded into a bounding volume hierarchy. \begin{DoxyNote}{Note} +This class is not for the light of heart -- it will almost always be instantiated through a file parser which reads vertices and edges from file and builds the mesh from that. Do not try to build a \hyperlink{classDcel_1_1MeshT}{MeshT} object yourself, use file parsers! +\end{DoxyNote} + + +\subsection{Member Enumeration Documentation} +\mbox{\Hypertarget{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}\label{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!Search\+Algorithm@{Search\+Algorithm}} +\index{Search\+Algorithm@{Search\+Algorithm}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{Search\+Algorithm}{SearchAlgorithm}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +enum \hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Dcel\+::\+Mesh\+T\+::\+Search\+Algorithm}\hspace{0.3cm}{\ttfamily [strong]}} + + + +Possible search algorithms for \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}. + +Direct means compute the signed distance for all primitives, Direct2 means compute the squared signed distance for all primitives. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classDcel_1_1MeshT_aa055e10c62778ba629b3f9c849338e03}\label{classDcel_1_1MeshT_aa055e10c62778ba629b3f9c849338e03}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!MeshT@{MeshT}} +\index{MeshT@{MeshT}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{Mesh\+T()}{MeshT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::\hyperlink{classDcel_1_1MeshT}{MeshT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1MeshT_abe9db973f4510ccb36e20ecfa9223926}{Mesh} \&}]{a\+\_\+other\+Mesh }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [delete]}} + + + +Disallowed copy construction. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other\+Mesh} & Other mesh \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1MeshT_a7468e3630893d64a71a7c2347496576b}\label{classDcel_1_1MeshT_a7468e3630893d64a71a7c2347496576b}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!MeshT@{MeshT}} +\index{MeshT@{MeshT}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{Mesh\+T()}{MeshT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::\hyperlink{classDcel_1_1MeshT}{MeshT} (\begin{DoxyParamCaption}\item[{std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \&}]{a\+\_\+faces, }\item[{std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \&}]{a\+\_\+edges, }\item[{std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \&}]{a\+\_\+vertices }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full constructor. This provides the faces, edges, and vertices to the mesh. + +Calls define(a\+\_\+faces, a\+\_\+edges, a\+\_\+vertices) +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+faces} & Polygon faces \\ +\hline +\mbox{\tt in} & {\em a\+\_\+edges} & Half-\/edges \\ +\hline +\mbox{\tt in} & {\em a\+\_\+vertices} & Vertices \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +The constructor arguments should provide a complete D\+C\+EL mesh description. This is usually done through a file parser which reads a mesh file format and creates the D\+C\+EL mesh structure +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1MeshT_af65f5fc459d586ba3b6bd0711b0951f5}\label{classDcel_1_1MeshT_af65f5fc459d586ba3b6bd0711b0951f5}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!define@{define}} +\index{define@{define}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a6c71642a9e6b36f9d6ab6027035625f0}{Face\+Ptr} $>$ \&}]{a\+\_\+faces, }\item[{std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_ab2b035530536a8bc56e40aab455f24e3}{Edge\+Ptr} $>$ \&}]{a\+\_\+edges, }\item[{std\+::vector$<$ \hyperlink{classDcel_1_1MeshT_a1e0abeadcb51e679b0dd9a36e2ee08c7}{Vertex\+Ptr} $>$ \&}]{a\+\_\+vertices }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Define function. Puts Mesh in usable state. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+faces} & Polygon faces \\ +\hline +\mbox{\tt in} & {\em a\+\_\+edges} & Half-\/edges \\ +\hline +\mbox{\tt in} & {\em a\+\_\+vertices} & Vertices \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +The function arguments should provide a complete D\+C\+EL mesh description. This is usually done through a file parser which reads a mesh file format and creates the D\+C\+EL mesh structure. Note that this only involves associating pointer structures through the mesh. Internal parameters like face area and normal is computed in \hyperlink{classDcel_1_1MeshT_a98d80b5f83b9d6ff55d0d0da34d0b422}{Mesh\+T$<$\+T$>$\+::reconcile}. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1MeshT_ada074ff3b1a612e46098f4ba6ca0bda2}\label{classDcel_1_1MeshT_ada074ff3b1a612e46098f4ba6ca0bda2}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!Direct\+Signed\+Distance@{Direct\+Signed\+Distance}} +\index{Direct\+Signed\+Distance@{Direct\+Signed\+Distance}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{Direct\+Signed\+Distance()}{DirectSignedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::Direct\+Signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Implementation of signed distance function which iterates through all faces. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1MeshT_ac00a6da46649246a3a2db70b29bb2407}\label{classDcel_1_1MeshT_ac00a6da46649246a3a2db70b29bb2407}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!Direct\+Signed\+Distance2@{Direct\+Signed\+Distance2}} +\index{Direct\+Signed\+Distance2@{Direct\+Signed\+Distance2}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{Direct\+Signed\+Distance2()}{DirectSignedDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::Direct\+Signed\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Implementation of squared signed distance function which iterates through all faces. + +This first find the face with the smallest unsigned square distance, and the returns the signed distance to that face (more efficient than the other version). +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1MeshT_ae13801eefa60ad08ff1da0df1da34784}\label{classDcel_1_1MeshT_ae13801eefa60ad08ff1da0df1da34784}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!increment\+Warning@{increment\+Warning}} +\index{increment\+Warning@{increment\+Warning}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{increment\+Warning()}{incrementWarning()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::increment\+Warning (\begin{DoxyParamCaption}\item[{std\+::map$<$ std\+::string, int $>$ \&}]{a\+\_\+warnings, }\item[{const std\+::string \&}]{a\+\_\+warn }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Increment a warning. This is used in \hyperlink{classDcel_1_1MeshT_a1814ba63c6e0d7a007ee78c24d6ea159}{sanity\+Check()} for locating holes or bad inputs in the mesh. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+warnings} & Map of all registered warnings \\ +\hline +\mbox{\tt in} & {\em a\+\_\+warn} & Current warning to increment by \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1MeshT_a98d80b5f83b9d6ff55d0d0da34d0b422}\label{classDcel_1_1MeshT_a98d80b5f83b9d6ff55d0d0da34d0b422}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!reconcile@{reconcile}} +\index{reconcile@{reconcile}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{reconcile()}{reconcile()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::reconcile (\begin{DoxyParamCaption}\item[{typename \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::\hyperlink{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}{Vertex\+Normal\+Weight}}]{a\+\_\+weight = {\ttfamily VertexNormalWeight\+:\+:Angle} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Reconcile function which computes the internal parameters in vertices, edges, and faces for use with signed distance functionality. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+weight} & Vertex angle weighting function. Either Vertex\+Normal\+Weight\+::\+None for unweighted vertex normals or Vertex\+Normal\+Weight\+::\+Angle for the pseudonormal\\ +\hline +\end{DoxyParams} +This will reconcile faces, edges, and vertices, e.\+g. computing the area and normal vector for faces \mbox{\Hypertarget{classDcel_1_1MeshT_a33f6506c1daf9946d1f21117c0ab89d5}\label{classDcel_1_1MeshT_a33f6506c1daf9946d1f21117c0ab89d5}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!reconcile\+Edges@{reconcile\+Edges}} +\index{reconcile\+Edges@{reconcile\+Edges}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{reconcile\+Edges()}{reconcileEdges()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::reconcile\+Edges (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Function which computes internal things for the half-\/edges. + +\begin{DoxyNote}{Note} +This calls \hyperlink{classDcel_1_1EdgeT_ac4aaf294fd41c84ef2f7f54a8024e6dd}{Dcel\+::\+Edge\+T$<$\+T$>$\+::reconcile()} +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1MeshT_a5e31ae8b95c9ee725e205d8ae4fd35dc}\label{classDcel_1_1MeshT_a5e31ae8b95c9ee725e205d8ae4fd35dc}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!reconcile\+Faces@{reconcile\+Faces}} +\index{reconcile\+Faces@{reconcile\+Faces}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{reconcile\+Faces()}{reconcileFaces()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::reconcile\+Faces (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Function which computes internal things for the polygon faces. + +\begin{DoxyNote}{Note} +This calls \hyperlink{classDcel_1_1FaceT_aaf3f8b92ca4393391ea213b0ecfe19bd}{Dcel\+::\+Face\+T$<$\+T$>$\+::reconcile()} +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1MeshT_ad2b65aa214d51ecd438bc876e7255290}\label{classDcel_1_1MeshT_ad2b65aa214d51ecd438bc876e7255290}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!reconcile\+Vertices@{reconcile\+Vertices}} +\index{reconcile\+Vertices@{reconcile\+Vertices}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{reconcile\+Vertices()}{reconcileVertices()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::reconcile\+Vertices (\begin{DoxyParamCaption}\item[{typename \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::\hyperlink{classDcel_1_1MeshT_a0cd3a02853cf4fcc34a0816368ed4dc0}{Vertex\+Normal\+Weight}}]{a\+\_\+weight }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [protected]}, {\ttfamily [noexcept]}} + + + +Function which computes internal things for the vertices. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+weight} & Vertex angle weighting \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This calls \hyperlink{classDcel_1_1VertexT_adb439515e1814e3fdd9d040b9c1b22df}{Dcel\+::\+Vertex\+T$<$\+T$>$\+::compute\+Vertex\+Normal\+Average()} or \hyperlink{classDcel_1_1VertexT_aa9e66780ec134afe94d9e5a8221fdc0e}{Dcel\+::\+Vertex\+T$<$\+T$>$\+::compute\+Vertex\+Normal\+Angle\+Weighted()} +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1MeshT_a1814ba63c6e0d7a007ee78c24d6ea159}\label{classDcel_1_1MeshT_a1814ba63c6e0d7a007ee78c24d6ea159}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!sanity\+Check@{sanity\+Check}} +\index{sanity\+Check@{sanity\+Check}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{sanity\+Check()}{sanityCheck()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::sanity\+Check (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Perform a sanity check. + +This will provide error messages if vertices are badly linked, faces are nullptr, and so on. These messages are logged by calling \hyperlink{classDcel_1_1MeshT_ae13801eefa60ad08ff1da0df1da34784}{increment\+Warning()} which identifies types of errors that can occur, and how many of those errors have occured. \mbox{\Hypertarget{classDcel_1_1MeshT_a1e46a744a2526e451229e2f2e4830ca5}\label{classDcel_1_1MeshT_a1e46a744a2526e451229e2f2e4830ca5}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!set\+Inside\+Outside\+Algorithm@{set\+Inside\+Outside\+Algorithm}} +\index{set\+Inside\+Outside\+Algorithm@{set\+Inside\+Outside\+Algorithm}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{set\+Inside\+Outside\+Algorithm()}{setInsideOutsideAlgorithm()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::set\+Inside\+Outside\+Algorithm (\begin{DoxyParamCaption}\item[{typename \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::Inside\+Outside\+Algorithm}]{a\+\_\+algorithm }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the inside/outside algorithm to use when computing the signed distance to polygon faces. + +Computing the signed distance to faces requires testing if a point projected to a polygo face plane falls inside or outside the polygon face. There are multiple algorithms to use here. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+algorithm} & Algorithm to use \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1MeshT_abc7a2bd7632be06c0ad9cf49816d262f}\label{classDcel_1_1MeshT_abc7a2bd7632be06c0ad9cf49816d262f}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!set\+Search\+Algorithm@{set\+Search\+Algorithm}} +\index{set\+Search\+Algorithm@{set\+Search\+Algorithm}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{set\+Search\+Algorithm()}{setSearchAlgorithm()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::set\+Search\+Algorithm (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Search\+Algorithm}}]{a\+\_\+algorithm }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Search algorithm for direct signed distance computations. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+algorithm} & Algorithm to use \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1MeshT_aa6f614aa0d93c3345c10150168347497}\label{classDcel_1_1MeshT_aa6f614aa0d93c3345c10150168347497}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the signed distance from a point to this mesh. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point in space.\\ +\hline +\end{DoxyParams} +This function will iterate through A\+LL faces in the mesh and return the value with the smallest magnitude. This is horrendously slow, which is why this function is almost never called. Rather, Mesh\+T$<$\+T$>$ can be embedded in a bounding volume hierarchy for faster access. \begin{DoxyNote}{Note} +This will call the other version with the object\textquotesingle{}s search algorithm. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1MeshT_a4fa40378fbd4c31cd50e77da70ef30fd}\label{classDcel_1_1MeshT_a4fa40378fbd4c31cd50e77da70ef30fd}} +\index{Dcel\+::\+MeshT@{Dcel\+::\+MeshT}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Dcel\+::\+MeshT@{Dcel\+::\+MeshT}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1MeshT}{Dcel\+::\+MeshT}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1MeshT_a646c5d8f66b3079bca35fe4186493627}{Vec3} \&}]{a\+\_\+x0, }\item[{\hyperlink{classDcel_1_1MeshT_abb4c3bb7a52804bb041c133f30151399}{Search\+Algorithm}}]{a\+\_\+algorithm }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the signed distance from a point to this mesh. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point in space. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+algorithm} & Search algorithm\\ +\hline +\end{DoxyParams} +This function will iterate through A\+LL faces in the mesh and return the value with the smallest magnitude. This is horrendously slow, which is why this function is almost never called. Rather, Mesh\+T$<$\+T$>$ can be embedded in a bounding volume hierarchy for faster access. + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelMeshImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1Parser_1_1PLY.tex b/docs/doxygen/latex/classDcel_1_1Parser_1_1PLY.tex new file mode 100644 index 00000000..2ffb3363 --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1Parser_1_1PLY.tex @@ -0,0 +1,187 @@ +\hypertarget{classDcel_1_1Parser_1_1PLY}{}\section{Dcel\+:\+:Parser\+:\+:P\+LY$<$ T $>$ Class Template Reference} +\label{classDcel_1_1Parser_1_1PLY}\index{Dcel\+::\+Parser\+::\+P\+L\+Y$<$ T $>$@{Dcel\+::\+Parser\+::\+P\+L\+Y$<$ T $>$}} + + +Class for generation a Dcel\+::\+Mesh\+T$<$\+T$>$ from the Stanford \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} file format. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}\label{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}} +using \hyperlink{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}{Vertex} = \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}\label{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}} +using \hyperlink{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}{Edge} = \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_ac67854dee5613f4e877e8caddb4580f3}\label{classDcel_1_1Parser_1_1PLY_ac67854dee5613f4e877e8caddb4580f3}} +using \hyperlink{classDcel_1_1Parser_1_1PLY_ac67854dee5613f4e877e8caddb4580f3}{Face} = \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_a047f135a59b43a0fb84f3629a790bba4}\label{classDcel_1_1Parser_1_1PLY_a047f135a59b43a0fb84f3629a790bba4}} +using \hyperlink{classDcel_1_1Parser_1_1PLY_a047f135a59b43a0fb84f3629a790bba4}{Mesh} = \hyperlink{classDcel_1_1MeshT}{MeshT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_aa0a9888ee0a1539928e6c1ffdda299a8}\label{classDcel_1_1Parser_1_1PLY_aa0a9888ee0a1539928e6c1ffdda299a8}} +using \hyperlink{classDcel_1_1Parser_1_1PLY_aa0a9888ee0a1539928e6c1ffdda299a8}{Edge\+Iterator} = \hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +static std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_a047f135a59b43a0fb84f3629a790bba4}{Mesh} $>$ \hyperlink{classDcel_1_1Parser_1_1PLY_aaf13b770fe4d9cfc4e419af7418fc35c}{read\+A\+S\+C\+II} (const std\+::string a\+\_\+filename) +\begin{DoxyCompactList}\small\item\em Static function which reads an A\+S\+C\+II .ply file and returns a D\+C\+EL mesh. \end{DoxyCompactList}\item +static void \hyperlink{classDcel_1_1Parser_1_1PLY_a280f083c1901248de1c69321783ad9d1}{read\+A\+S\+C\+II} (\hyperlink{classDcel_1_1Parser_1_1PLY_a047f135a59b43a0fb84f3629a790bba4}{Mesh} \&a\+\_\+mesh, const std\+::string a\+\_\+filename) +\begin{DoxyCompactList}\small\item\em Static function which reads an A\+S\+C\+II .ply file and puts it in a mesh. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Static Protected Member Functions} +\begin{DoxyCompactItemize} +\item +static void \hyperlink{classDcel_1_1Parser_1_1PLY_aa8741e334f6c350e1269a42ee1022e57}{read\+Header\+A\+S\+C\+II} (int \&a\+\_\+num\+Vertices, int \&a\+\_\+num\+Faces, std\+::ifstream \&a\+\_\+input\+Stream) +\begin{DoxyCompactList}\small\item\em Read an A\+S\+C\+II header. \end{DoxyCompactList}\item +static void \hyperlink{classDcel_1_1Parser_1_1PLY_a755c28a17a836a05af31991a87212df0}{read\+Vertices\+A\+S\+C\+II} (std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}{Vertex} $>$ $>$ \&a\+\_\+vertices, const int a\+\_\+num\+Vertices, std\+::ifstream \&a\+\_\+input\+Stream) +\begin{DoxyCompactList}\small\item\em Read A\+S\+C\+II vertices. \end{DoxyCompactList}\item +static void \hyperlink{classDcel_1_1Parser_1_1PLY_ae54284d1c7c18a584bd14678763a58e7}{read\+Faces\+A\+S\+C\+II} (std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_ac67854dee5613f4e877e8caddb4580f3}{Face} $>$ $>$ \&a\+\_\+faces, std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}{Edge} $>$ $>$ \&a\+\_\+edges, const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}{Vertex} $>$ $>$ \&a\+\_\+vertices, const int a\+\_\+num\+Faces, std\+::ifstream \&a\+\_\+input\+Stream) +\begin{DoxyCompactList}\small\item\em Read A\+S\+C\+II faces and create mesh connectivity. \end{DoxyCompactList}\item +static void \hyperlink{classDcel_1_1Parser_1_1PLY_afaceb1664b12f30599fe68faba6ca725}{reconcile\+Pair\+Edges} (std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}{Edge} $>$ $>$ \&a\+\_\+edges) +\begin{DoxyCompactList}\small\item\em Reconcile pair edges, i.\+e. find the pair edge for every constructed half-\/edge. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Parser\+::\+P\+L\+Y$<$ T $>$} + +Class for generation a Dcel\+::\+Mesh\+T$<$\+T$>$ from the Stanford \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} file format. + +\begin{DoxyNote}{Note} +T is the precision used for storing the mesh. +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_aaf13b770fe4d9cfc4e419af7418fc35c}\label{classDcel_1_1Parser_1_1PLY_aaf13b770fe4d9cfc4e419af7418fc35c}} +\index{Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}!read\+A\+S\+C\+II@{read\+A\+S\+C\+II}} +\index{read\+A\+S\+C\+II@{read\+A\+S\+C\+II}!Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}} +\subsubsection{\texorpdfstring{read\+A\+S\+C\+I\+I()}{readASCII()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +std\+::shared\+\_\+ptr$<$ E\+B\+Geometry\+::\+Dcel\+::\+MeshT$<$ T $>$ $>$ \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+LY}$<$ T $>$\+::read\+A\+S\+C\+II (\begin{DoxyParamCaption}\item[{const std\+::string}]{a\+\_\+filename }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}} + + + +Static function which reads an A\+S\+C\+II .ply file and returns a D\+C\+EL mesh. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+filename} & File name \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_a280f083c1901248de1c69321783ad9d1}\label{classDcel_1_1Parser_1_1PLY_a280f083c1901248de1c69321783ad9d1}} +\index{Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}!read\+A\+S\+C\+II@{read\+A\+S\+C\+II}} +\index{read\+A\+S\+C\+II@{read\+A\+S\+C\+II}!Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}} +\subsubsection{\texorpdfstring{read\+A\+S\+C\+I\+I()}{readASCII()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+LY}$<$ T $>$\+::read\+A\+S\+C\+II (\begin{DoxyParamCaption}\item[{\hyperlink{classDcel_1_1Parser_1_1PLY_a047f135a59b43a0fb84f3629a790bba4}{Mesh} \&}]{a\+\_\+mesh, }\item[{const std\+::string}]{a\+\_\+filename }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}} + + + +Static function which reads an A\+S\+C\+II .ply file and puts it in a mesh. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt out} & {\em a\+\_\+mesh} & D\+C\+EL mesh \\ +\hline +\mbox{\tt in} & {\em a\+\_\+filename} & File name \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_ae54284d1c7c18a584bd14678763a58e7}\label{classDcel_1_1Parser_1_1PLY_ae54284d1c7c18a584bd14678763a58e7}} +\index{Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}!read\+Faces\+A\+S\+C\+II@{read\+Faces\+A\+S\+C\+II}} +\index{read\+Faces\+A\+S\+C\+II@{read\+Faces\+A\+S\+C\+II}!Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}} +\subsubsection{\texorpdfstring{read\+Faces\+A\+S\+C\+I\+I()}{readFacesASCII()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+LY}$<$ T $>$\+::read\+Faces\+A\+S\+C\+II (\begin{DoxyParamCaption}\item[{std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_ac67854dee5613f4e877e8caddb4580f3}{Face} $>$ $>$ \&}]{a\+\_\+faces, }\item[{std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}{Edge} $>$ $>$ \&}]{a\+\_\+edges, }\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}{Vertex} $>$ $>$ \&}]{a\+\_\+vertices, }\item[{const int}]{a\+\_\+num\+Faces, }\item[{std\+::ifstream \&}]{a\+\_\+input\+Stream }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}, {\ttfamily [protected]}} + + + +Read A\+S\+C\+II faces and create mesh connectivity. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt out} & {\em a\+\_\+faces} & D\+C\+EL faces. Constructured in this routine. \\ +\hline +\mbox{\tt out} & {\em a\+\_\+edges} & D\+C\+EL edges. Constructured in this routine. \\ +\hline +\mbox{\tt out} & {\em a\+\_\+vertices} & D\+C\+EL edges. Constructured in read\+Vertices\+A\+S\+C\+II. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+num\+Faces} & Total number of faces in mesh. \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+input\+Stream} & Input stream \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +The next getline() from input\+Stream must read the first face, i.\+e. we assume that read\+\_\+ascii\+\_\+vertices was called I\+M\+M\+E\+D\+I\+A\+T\+E\+LY before this function. That function will center the fstream on the correct line in the input file. +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_aa8741e334f6c350e1269a42ee1022e57}\label{classDcel_1_1Parser_1_1PLY_aa8741e334f6c350e1269a42ee1022e57}} +\index{Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}!read\+Header\+A\+S\+C\+II@{read\+Header\+A\+S\+C\+II}} +\index{read\+Header\+A\+S\+C\+II@{read\+Header\+A\+S\+C\+II}!Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}} +\subsubsection{\texorpdfstring{read\+Header\+A\+S\+C\+I\+I()}{readHeaderASCII()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+LY}$<$ T $>$\+::read\+Header\+A\+S\+C\+II (\begin{DoxyParamCaption}\item[{int \&}]{a\+\_\+num\+Vertices, }\item[{int \&}]{a\+\_\+num\+Faces, }\item[{std\+::ifstream \&}]{a\+\_\+input\+Stream }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}, {\ttfamily [protected]}} + + + +Read an A\+S\+C\+II header. + +This reads the number of vertices and faces in the \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} file. Note that it only reads the header. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt out} & {\em a\+\_\+num\+Vertices} & Number of vertices \\ +\hline +\mbox{\tt out} & {\em a\+\_\+num\+Faces} & Number of faces \\ +\hline +\mbox{\tt in,out} & {\em a\+\_\+input\+Stream} & File stream. On output, the filestream is at the end of the \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} header. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_a755c28a17a836a05af31991a87212df0}\label{classDcel_1_1Parser_1_1PLY_a755c28a17a836a05af31991a87212df0}} +\index{Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}!read\+Vertices\+A\+S\+C\+II@{read\+Vertices\+A\+S\+C\+II}} +\index{read\+Vertices\+A\+S\+C\+II@{read\+Vertices\+A\+S\+C\+II}!Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}} +\subsubsection{\texorpdfstring{read\+Vertices\+A\+S\+C\+I\+I()}{readVerticesASCII()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+LY}$<$ T $>$\+::read\+Vertices\+A\+S\+C\+II (\begin{DoxyParamCaption}\item[{std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_acbecc13804a702a6bf2687d9bf5d7989}{Vertex} $>$ $>$ \&}]{a\+\_\+vertices, }\item[{const int}]{a\+\_\+num\+Vertices, }\item[{std\+::ifstream \&}]{a\+\_\+input\+Stream }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}, {\ttfamily [protected]}} + + + +Read A\+S\+C\+II vertices. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt out} & {\em a\+\_\+vertices} & D\+C\+EL vertices. These are constructed in this routine. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+num\+Vertices} & Number of vertices to read \\ +\hline +\mbox{\tt in} & {\em a\+\_\+input\+Stream} & Input file stream. \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +The next getline() from a\+\_\+input\+Stream must read the first vertex (i.\+e. don\textquotesingle{}t rewind the stream before entering this routine) +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1Parser_1_1PLY_afaceb1664b12f30599fe68faba6ca725}\label{classDcel_1_1Parser_1_1PLY_afaceb1664b12f30599fe68faba6ca725}} +\index{Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}!reconcile\+Pair\+Edges@{reconcile\+Pair\+Edges}} +\index{reconcile\+Pair\+Edges@{reconcile\+Pair\+Edges}!Dcel\+::\+Parser\+::\+P\+LY@{Dcel\+::\+Parser\+::\+P\+LY}} +\subsubsection{\texorpdfstring{reconcile\+Pair\+Edges()}{reconcilePairEdges()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1Parser_1_1PLY}{Dcel\+::\+Parser\+::\+P\+LY}$<$ T $>$\+::reconcile\+Pair\+Edges (\begin{DoxyParamCaption}\item[{std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1Parser_1_1PLY_af3741c96a8a8434780665641912ff1d4}{Edge} $>$ $>$ \&}]{a\+\_\+edges }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [static]}, {\ttfamily [protected]}} + + + +Reconcile pair edges, i.\+e. find the pair edge for every constructed half-\/edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in,out} & {\em a\+\_\+edges} & Half edges. \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelParserImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1Polygon2D.tex b/docs/doxygen/latex/classDcel_1_1Polygon2D.tex new file mode 100644 index 00000000..10057797 --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1Polygon2D.tex @@ -0,0 +1,159 @@ +\hypertarget{classDcel_1_1Polygon2D}{}\section{Dcel\+:\+:Polygon2D$<$ T $>$ Class Template Reference} +\label{classDcel_1_1Polygon2D}\index{Dcel\+::\+Polygon2\+D$<$ T $>$@{Dcel\+::\+Polygon2\+D$<$ T $>$}} + + +Class for embedding a D\+C\+EL polygon face into 2D. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1Polygon2D_a1ec8170036eb8dd1cedbe1b4d31024b4}\label{classDcel_1_1Polygon2D_a1ec8170036eb8dd1cedbe1b4d31024b4}} +enum \hyperlink{classDcel_1_1Polygon2D_a1ec8170036eb8dd1cedbe1b4d31024b4}{Inside\+Outside\+Algorithm} \{ {\bfseries Subtended\+Angle}, +{\bfseries Crossing\+Number}, +{\bfseries Winding\+Number} + \}\begin{DoxyCompactList}\small\item\em Supported algorithms for performing inside/outside tests when checking if a point projects to the inside or outside of a polygon face. \end{DoxyCompactList} +\item +\mbox{\Hypertarget{classDcel_1_1Polygon2D_ab70ec33cb6418fa0204f0d951dfd01fb}\label{classDcel_1_1Polygon2D_ab70ec33cb6418fa0204f0d951dfd01fb}} +using \hyperlink{classDcel_1_1Polygon2D_ab70ec33cb6418fa0204f0d951dfd01fb}{Vec2} = \hyperlink{classVec2T}{Vec2T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}\label{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}} +using \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1Polygon2D_a241e98b67756178d5b8d028b6264a6c2}\label{classDcel_1_1Polygon2D_a241e98b67756178d5b8d028b6264a6c2}} +\hyperlink{classDcel_1_1Polygon2D_a241e98b67756178d5b8d028b6264a6c2}{Polygon2D} ()=delete +\begin{DoxyCompactList}\small\item\em Disallowed constructor, use the one with the normal vector and points. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1Polygon2D_adcd7eb98f174260e21d0185deb44d628}{Polygon2D} (const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&a\+\_\+normal, const std\+::vector$<$ \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} $>$ \&a\+\_\+points) +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1Polygon2D_a0c605c847f830faf8a9f4fbc7a5c5a12}\label{classDcel_1_1Polygon2D_a0c605c847f830faf8a9f4fbc7a5c5a12}} +\hyperlink{classDcel_1_1Polygon2D_a0c605c847f830faf8a9f4fbc7a5c5a12}{$\sim$\+Polygon2D} ()=default +\begin{DoxyCompactList}\small\item\em Destructor (does nothing. \end{DoxyCompactList}\item +bool \hyperlink{classDcel_1_1Polygon2D_ade475a82be10cbacf382016e85316853}{is\+Point\+Inside} (const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&a\+\_\+point, const \hyperlink{classDcel_1_1Polygon2D_a1ec8170036eb8dd1cedbe1b4d31024b4}{Inside\+Outside\+Algorithm} a\+\_\+algorithm) const noexcept +\begin{DoxyCompactList}\small\item\em Check if a point is inside or outside the 2D polygon. \end{DoxyCompactList}\item +bool \hyperlink{classDcel_1_1Polygon2D_ad4d6b51a54f6a9c89812a5bcbc0e1902}{is\+Point\+Inside\+Polygon\+Winding\+Number} (const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Check if a point is inside a 2D polygon, using the winding number algorithm. \end{DoxyCompactList}\item +bool \hyperlink{classDcel_1_1Polygon2D_a8a6a32defe11ad15996e286aa76d4428}{is\+Point\+Inside\+Polygon\+Subtend} (const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Check if a point is inside a 2D polygon, using the subtended angles. \end{DoxyCompactList}\item +bool \hyperlink{classDcel_1_1Polygon2D_aa1edee7ad8913b35663792624e914aad}{is\+Point\+Inside\+Polygon\+Crossing\+Number} (const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Check if a point is inside a 2D polygon, by computing the number of times a ray crosses the polygon edges. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Polygon2\+D$<$ T $>$} + +Class for embedding a D\+C\+EL polygon face into 2D. + +This class is required for determining whether or not a 3D point projected to the plane of an N-\/sided polygon lies inside or outside the polygon face. To do this we compute the 2D embedding of the polygon face, reducing the problem to a tractable dimension where we can use well-\/tested algorithm. The 2D embedding of a polygon occurs by taking a set of 3D points and a corresponding normal vector, and projecting those points along one of the 3D Cartesian axes such that the polygon has the largest area. In essence, we simply find the direction with the smallest normal vector component and ignore that. Once the 2D embedding is computed, we can use well-\/known algorithms for checking if a point lies inside or outside. The supported algorithms are 1) The winding number algorithm (computing the winding number), 2) Computing the subtended angle of the point with the edges of the polygon (sums to 360 degrees if the point is inside), or computing the crossing number which checks how many times a ray cast from the point crosses the edges of the polygon. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classDcel_1_1Polygon2D_adcd7eb98f174260e21d0185deb44d628}\label{classDcel_1_1Polygon2D_adcd7eb98f174260e21d0185deb44d628}} +\index{Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}!Polygon2D@{Polygon2D}} +\index{Polygon2D@{Polygon2D}!Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}} +\subsubsection{\texorpdfstring{Polygon2\+D()}{Polygon2D()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::\hyperlink{classDcel_1_1Polygon2D}{Polygon2D} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&}]{a\+\_\+normal, }\item[{const std\+::vector$<$ \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} $>$ \&}]{a\+\_\+points }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+normal} & Normal vector of the 3D polygon face \\ +\hline +\mbox{\tt in} & {\em a\+\_\+points} & Vertex coordinates of the 3D polygon face \\ +\hline +\end{DoxyParams} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1Polygon2D_ade475a82be10cbacf382016e85316853}\label{classDcel_1_1Polygon2D_ade475a82be10cbacf382016e85316853}} +\index{Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}!is\+Point\+Inside@{is\+Point\+Inside}} +\index{is\+Point\+Inside@{is\+Point\+Inside}!Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}} +\subsubsection{\texorpdfstring{is\+Point\+Inside()}{isPointInside()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::is\+Point\+Inside (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&}]{a\+\_\+point, }\item[{const \hyperlink{classDcel_1_1Polygon2D_a1ec8170036eb8dd1cedbe1b4d31024b4}{Inside\+Outside\+Algorithm}}]{a\+\_\+algorithm }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if a point is inside or outside the 2D polygon. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point coordinates \\ +\hline +\mbox{\tt in} & {\em a\+\_\+algorithm} & Inside/outside algorithm\\ +\hline +\end{DoxyParams} +This will call the function corresponding to a\+\_\+algorithm. \mbox{\Hypertarget{classDcel_1_1Polygon2D_aa1edee7ad8913b35663792624e914aad}\label{classDcel_1_1Polygon2D_aa1edee7ad8913b35663792624e914aad}} +\index{Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}!is\+Point\+Inside\+Polygon\+Crossing\+Number@{is\+Point\+Inside\+Polygon\+Crossing\+Number}} +\index{is\+Point\+Inside\+Polygon\+Crossing\+Number@{is\+Point\+Inside\+Polygon\+Crossing\+Number}!Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}} +\subsubsection{\texorpdfstring{is\+Point\+Inside\+Polygon\+Crossing\+Number()}{isPointInsidePolygonCrossingNumber()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::is\+Point\+Inside\+Polygon\+Crossing\+Number (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if a point is inside a 2D polygon, by computing the number of times a ray crosses the polygon edges. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point coordinates \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns true if the 3D point projects to the inside of the 2D polygon +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1Polygon2D_a8a6a32defe11ad15996e286aa76d4428}\label{classDcel_1_1Polygon2D_a8a6a32defe11ad15996e286aa76d4428}} +\index{Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}!is\+Point\+Inside\+Polygon\+Subtend@{is\+Point\+Inside\+Polygon\+Subtend}} +\index{is\+Point\+Inside\+Polygon\+Subtend@{is\+Point\+Inside\+Polygon\+Subtend}!Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}} +\subsubsection{\texorpdfstring{is\+Point\+Inside\+Polygon\+Subtend()}{isPointInsidePolygonSubtend()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::is\+Point\+Inside\+Polygon\+Subtend (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if a point is inside a 2D polygon, using the subtended angles. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point coordinates \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns true if the 3D point projects to the inside of the 2D polygon +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1Polygon2D_ad4d6b51a54f6a9c89812a5bcbc0e1902}\label{classDcel_1_1Polygon2D_ad4d6b51a54f6a9c89812a5bcbc0e1902}} +\index{Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}!is\+Point\+Inside\+Polygon\+Winding\+Number@{is\+Point\+Inside\+Polygon\+Winding\+Number}} +\index{is\+Point\+Inside\+Polygon\+Winding\+Number@{is\+Point\+Inside\+Polygon\+Winding\+Number}!Dcel\+::\+Polygon2D@{Dcel\+::\+Polygon2D}} +\subsubsection{\texorpdfstring{is\+Point\+Inside\+Polygon\+Winding\+Number()}{isPointInsidePolygonWindingNumber()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classDcel_1_1Polygon2D}{Dcel\+::\+Polygon2D}$<$ T $>$\+::is\+Point\+Inside\+Polygon\+Winding\+Number (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1Polygon2D_a46e9686210f09464e8f5ad13300717b9}{Vec3} \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if a point is inside a 2D polygon, using the winding number algorithm. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point coordinates \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns true if the 3D point projects to the inside of the 2D polygon +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelPolygon2D_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelPolygon2DImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classDcel_1_1VertexT.tex b/docs/doxygen/latex/classDcel_1_1VertexT.tex new file mode 100644 index 00000000..70e268b9 --- /dev/null +++ b/docs/doxygen/latex/classDcel_1_1VertexT.tex @@ -0,0 +1,371 @@ +\hypertarget{classDcel_1_1VertexT}{}\section{Dcel\+:\+:VertexT$<$ T $>$ Class Template Reference} +\label{classDcel_1_1VertexT}\index{Dcel\+::\+Vertex\+T$<$ T $>$@{Dcel\+::\+Vertex\+T$<$ T $>$}} + + +Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}\label{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}} +using \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a2c8a221a9f03e9bafa891bd0759b4f8f}\label{classDcel_1_1VertexT_a2c8a221a9f03e9bafa891bd0759b4f8f}} +using \hyperlink{classDcel_1_1VertexT_a2c8a221a9f03e9bafa891bd0759b4f8f}{Vertex} = \hyperlink{classDcel_1_1VertexT}{VertexT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_abe1079747424916a164ec68b46333fc3}\label{classDcel_1_1VertexT_abe1079747424916a164ec68b46333fc3}} +using \hyperlink{classDcel_1_1VertexT_abe1079747424916a164ec68b46333fc3}{Edge} = \hyperlink{classDcel_1_1EdgeT}{EdgeT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a455510a8591a4e0f235b2049deb96e08}\label{classDcel_1_1VertexT_a455510a8591a4e0f235b2049deb96e08}} +using \hyperlink{classDcel_1_1VertexT_a455510a8591a4e0f235b2049deb96e08}{Face} = \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_aa7d02695a42762b98a66c559e6d3d849}\label{classDcel_1_1VertexT_aa7d02695a42762b98a66c559e6d3d849}} +using \hyperlink{classDcel_1_1VertexT_aa7d02695a42762b98a66c559e6d3d849}{Vertex\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT_a2c8a221a9f03e9bafa891bd0759b4f8f}{Vertex} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. Note that this is std\+::shared\+\_\+ptr$<$Vertex\+T$<$\+T$>$ $>$ \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}\label{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}} +using \hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT_abe1079747424916a164ec68b46333fc3}{Edge} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. Note that this is std\+::shared\+\_\+ptr$<$Edge\+T$<$\+T$>$ $>$ \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}\label{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}} +using \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} = std\+::shared\+\_\+ptr$<$ \hyperlink{classDcel_1_1VertexT_a455510a8591a4e0f235b2049deb96e08}{Face} $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. Note that this is std\+::shared\+\_\+ptr$<$Face\+T$<$\+T$>$ $>$ \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_abf182ec635351e107cd474df25b6ba73}\label{classDcel_1_1VertexT_abf182ec635351e107cd474df25b6ba73}} +using \hyperlink{classDcel_1_1VertexT_abf182ec635351e107cd474df25b6ba73}{Edge\+Iterator} = \hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. Note that this is std\+::shared\+\_\+ptr$<$Edge\+Iterator\+T$<$\+T$>$ $>$ \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\hyperlink{classDcel_1_1VertexT_ab93f0a7a59fa9d78d89d1b0e97451ce7}{VertexT} () +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1VertexT_ade01d01c6a145c31c6f46dccc902cfae}{VertexT} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+position) +\begin{DoxyCompactList}\small\item\em Partial constructor. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1VertexT_a90d3c97e605b8084667a85ddfb4ba8bc}{VertexT} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+position, const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+normal) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +\hyperlink{classDcel_1_1VertexT_ac904e9902633915706d81122e72aa847}{VertexT} (const \hyperlink{classDcel_1_1VertexT_a2c8a221a9f03e9bafa891bd0759b4f8f}{Vertex} \&a\+\_\+other\+Vertex) +\begin{DoxyCompactList}\small\item\em Full copy constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_ab0a8e0aa0960f68177e115b897283a1c}\label{classDcel_1_1VertexT_ab0a8e0aa0960f68177e115b897283a1c}} +\hyperlink{classDcel_1_1VertexT_ab0a8e0aa0960f68177e115b897283a1c}{$\sim$\+VertexT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_a20a894d436707a4205501bbc5cd72323}{define} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+position, const \hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \&a\+\_\+edge, const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+normal) noexcept +\begin{DoxyCompactList}\small\item\em Define function. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_a9c7d9a23275e5e3165eb8c6018b55a7e}{set\+Position} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+position) noexcept +\begin{DoxyCompactList}\small\item\em Set the vertex position. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_a3bffe6c4f0d0766cdd7a4bb3a6050cb4}{set\+Normal} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+normal) noexcept +\begin{DoxyCompactList}\small\item\em Set the vertex normal vector. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_a4ac13c49c61857ea7d0990212b43ca41}{set\+Edge} (const \hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \&a\+\_\+edge) noexcept +\begin{DoxyCompactList}\small\item\em Set the reference to the outgoing edge. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_a032c39370f08bbc27f3da35ee0873409}{add\+Face} (const \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} \&a\+\_\+face) noexcept +\begin{DoxyCompactList}\small\item\em Add a face to the polygon face list. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a5926f14833074dfa2acf28a3e5c36f46}\label{classDcel_1_1VertexT_a5926f14833074dfa2acf28a3e5c36f46}} +void \hyperlink{classDcel_1_1VertexT_a5926f14833074dfa2acf28a3e5c36f46}{normalize\+Normal\+Vector} () noexcept +\begin{DoxyCompactList}\small\item\em Normalize the normal vector, ensuring its length is 1. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_adb439515e1814e3fdd9d040b9c1b22df}\label{classDcel_1_1VertexT_adb439515e1814e3fdd9d040b9c1b22df}} +void \hyperlink{classDcel_1_1VertexT_adb439515e1814e3fdd9d040b9c1b22df}{compute\+Vertex\+Normal\+Average} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the vertex normal, using an average the normal vector in this vertex\textquotesingle{}s face list (m\+\_\+faces) \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_a6faffb2c5038d62c2f7866736ebe7393}{compute\+Vertex\+Normal\+Average} (const std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \&a\+\_\+faces) noexcept +\begin{DoxyCompactList}\small\item\em Compute the vertex normal, using an average of the normal vectors in the input face list. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_aa9e66780ec134afe94d9e5a8221fdc0e}{compute\+Vertex\+Normal\+Angle\+Weighted} () noexcept +\begin{DoxyCompactList}\small\item\em Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face. \end{DoxyCompactList}\item +void \hyperlink{classDcel_1_1VertexT_aea793773eec08852108d3bd5c4eea5a9}{compute\+Vertex\+Normal\+Angle\+Weighted} (const std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \&a\+\_\+faces) noexcept +\begin{DoxyCompactList}\small\item\em Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_af3ecf093a2fc7fd0f728d463ccacb8ce}\label{classDcel_1_1VertexT_af3ecf093a2fc7fd0f728d463ccacb8ce}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1VertexT_af3ecf093a2fc7fd0f728d463ccacb8ce}{get\+Position} () noexcept +\begin{DoxyCompactList}\small\item\em Return modifiable vertex position. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a7a4c3e499c6f7e529cc556eecf94f3fe}\label{classDcel_1_1VertexT_a7a4c3e499c6f7e529cc556eecf94f3fe}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1VertexT_a7a4c3e499c6f7e529cc556eecf94f3fe}{get\+Position} () const noexcept +\begin{DoxyCompactList}\small\item\em Return immutable vertex position. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a11d1c90ccfa44b5ea121223bd86214c9}\label{classDcel_1_1VertexT_a11d1c90ccfa44b5ea121223bd86214c9}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1VertexT_a11d1c90ccfa44b5ea121223bd86214c9}{get\+Normal} () noexcept +\begin{DoxyCompactList}\small\item\em Return modifiable vertex normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a6d2d15dff96e192dff0254d40e1927b7}\label{classDcel_1_1VertexT_a6d2d15dff96e192dff0254d40e1927b7}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classDcel_1_1VertexT_a6d2d15dff96e192dff0254d40e1927b7}{get\+Normal} () const noexcept +\begin{DoxyCompactList}\small\item\em Return immutable vertex normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_ae310f38b6e5b9bb4bae4633117a26708}\label{classDcel_1_1VertexT_ae310f38b6e5b9bb4bae4633117a26708}} +\hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \& \hyperlink{classDcel_1_1VertexT_ae310f38b6e5b9bb4bae4633117a26708}{get\+Outgoing\+Edge} () noexcept +\begin{DoxyCompactList}\small\item\em Return modifiable pointer to outgoing edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_ab726cf7028c0b9de7eaff211d9ca34aa}\label{classDcel_1_1VertexT_ab726cf7028c0b9de7eaff211d9ca34aa}} +const \hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \& \hyperlink{classDcel_1_1VertexT_ab726cf7028c0b9de7eaff211d9ca34aa}{get\+Outgoing\+Edge} () const noexcept +\begin{DoxyCompactList}\small\item\em Return immutable pointer to outgoing edge. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a1d365de69778aa4bb35f80c936e95251}\label{classDcel_1_1VertexT_a1d365de69778aa4bb35f80c936e95251}} +std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \& \hyperlink{classDcel_1_1VertexT_a1d365de69778aa4bb35f80c936e95251}{get\+Faces} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable polygon face list for this vertex. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_aa73d20542e46c20afba1f14cd061f126}\label{classDcel_1_1VertexT_aa73d20542e46c20afba1f14cd061f126}} +const std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \& \hyperlink{classDcel_1_1VertexT_aa73d20542e46c20afba1f14cd061f126}{get\+Faces} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable polygon face list for this vertex. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1VertexT_afce7ba8e2bbf81b158b43af2576c4dda}{signed\+Distance} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the signed distance to this vertex. \end{DoxyCompactList}\item +T \hyperlink{classDcel_1_1VertexT_a552b7d88dfe80c76561b5a002ddc176b}{unsigned\+Distance2} (const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the squared unsigned distance to this vertex. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classDcel_1_1VertexT_ab02281ef4c214c2ea5567dae97864846}\label{classDcel_1_1VertexT_ab02281ef4c214c2ea5567dae97864846}} +\hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \hyperlink{classDcel_1_1VertexT_ab02281ef4c214c2ea5567dae97864846}{m\+\_\+outgoing\+Edge} +\begin{DoxyCompactList}\small\item\em Pointer to an outgoing edge from this vertex. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a1980e54dcfd5cefdebac129580028015}\label{classDcel_1_1VertexT_a1980e54dcfd5cefdebac129580028015}} +\hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \hyperlink{classDcel_1_1VertexT_a1980e54dcfd5cefdebac129580028015}{m\+\_\+position} +\begin{DoxyCompactList}\small\item\em Vertex position. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_a509216af6d1d2ca84d1d774b4a6c7659}\label{classDcel_1_1VertexT_a509216af6d1d2ca84d1d774b4a6c7659}} +\hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \hyperlink{classDcel_1_1VertexT_a509216af6d1d2ca84d1d774b4a6c7659}{m\+\_\+normal} +\begin{DoxyCompactList}\small\item\em Vertex normal vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classDcel_1_1VertexT_ad0a8f9c1015b62c891ad2d877d6b8802}\label{classDcel_1_1VertexT_ad0a8f9c1015b62c891ad2d877d6b8802}} +std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \hyperlink{classDcel_1_1VertexT_ad0a8f9c1015b62c891ad2d877d6b8802}{m\+\_\+faces} +\begin{DoxyCompactList}\small\item\em List of faces connected to this vertex (these must be \char`\"{}manually\char`\"{} added) \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Dcel\+::\+Vertex\+T$<$ T $>$} + +Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). + +This class is used in D\+C\+EL functionality which stores polygonal surfaces in a mesh. The \hyperlink{classDcel_1_1VertexT}{VertexT} class has a position, a normal vector, and a pointer to one of the outgoing edges from the vertex. For performance reasons we also include pointers to all the polygon faces that share this vertex. \begin{DoxyNote}{Note} +The normal vector is outgoing, i.\+e. a point x is \char`\"{}outside\char`\"{} the vertex if the dot product between n and (x -\/ x0) is positive. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classDcel_1_1VertexT_ab93f0a7a59fa9d78d89d1b0e97451ce7}\label{classDcel_1_1VertexT_ab93f0a7a59fa9d78d89d1b0e97451ce7}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!VertexT@{VertexT}} +\index{VertexT@{VertexT}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{Vertex\+T()}{VertexT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::\hyperlink{classDcel_1_1VertexT}{VertexT} (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Default constructor. + +This initializes the position and the normal vector to zero vectors, and the polygon face list is empty \mbox{\Hypertarget{classDcel_1_1VertexT_ade01d01c6a145c31c6f46dccc902cfae}\label{classDcel_1_1VertexT_ade01d01c6a145c31c6f46dccc902cfae}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!VertexT@{VertexT}} +\index{VertexT@{VertexT}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{Vertex\+T()}{VertexT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::\hyperlink{classDcel_1_1VertexT}{VertexT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+position }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Partial constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+position} & Vertex position\\ +\hline +\end{DoxyParams} +This initializes the position to a\+\_\+position and the normal vector to the zero vector. The polygon face list is empty. \mbox{\Hypertarget{classDcel_1_1VertexT_a90d3c97e605b8084667a85ddfb4ba8bc}\label{classDcel_1_1VertexT_a90d3c97e605b8084667a85ddfb4ba8bc}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!VertexT@{VertexT}} +\index{VertexT@{VertexT}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{Vertex\+T()}{VertexT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::\hyperlink{classDcel_1_1VertexT}{VertexT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+position, }\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+normal }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+position} & Vertex position \\ +\hline +\mbox{\tt in} & {\em a\+\_\+normal} & Vertex normal vector\\ +\hline +\end{DoxyParams} +This initializes the position to a\+\_\+position and the normal vector to a\+\_\+normal. The polygon face list is empty. \mbox{\Hypertarget{classDcel_1_1VertexT_ac904e9902633915706d81122e72aa847}\label{classDcel_1_1VertexT_ac904e9902633915706d81122e72aa847}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!VertexT@{VertexT}} +\index{VertexT@{VertexT}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{Vertex\+T()}{VertexT()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::\hyperlink{classDcel_1_1VertexT}{VertexT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a2c8a221a9f03e9bafa891bd0759b4f8f}{Vertex} \&}]{a\+\_\+other\+Vertex }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full copy constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other\+Vertex} & Other vertex\\ +\hline +\end{DoxyParams} +This copies the position, normal vector, and outgoing edge pointer from the other vertex. The polygon face list. + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classDcel_1_1VertexT_a032c39370f08bbc27f3da35ee0873409}\label{classDcel_1_1VertexT_a032c39370f08bbc27f3da35ee0873409}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!add\+Face@{add\+Face}} +\index{add\+Face@{add\+Face}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{add\+Face()}{addFace()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::add\+Face (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} \&}]{a\+\_\+face }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Add a face to the polygon face list. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+face} & Pointer to face. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1VertexT_aa9e66780ec134afe94d9e5a8221fdc0e}\label{classDcel_1_1VertexT_aa9e66780ec134afe94d9e5a8221fdc0e}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!compute\+Vertex\+Normal\+Angle\+Weighted@{compute\+Vertex\+Normal\+Angle\+Weighted}} +\index{compute\+Vertex\+Normal\+Angle\+Weighted@{compute\+Vertex\+Normal\+Angle\+Weighted}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{compute\+Vertex\+Normal\+Angle\+Weighted()}{computeVertexNormalAngleWeighted()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::compute\+Vertex\+Normal\+Angle\+Weighted (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face. + +This calls the other version with a\+\_\+faces = m\+\_\+faces \begin{DoxyNote}{Note} +This computes the normal vector using the pseudnormal algorithm from Baerentzen and Aanes in \char`\"{}\+Signed distance computation using the angle weighted pseudonormal\char`\"{} (D\+OI\+: 10.\+1109/\+T\+V\+CG.2005.\+49) +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1VertexT_aea793773eec08852108d3bd5c4eea5a9}\label{classDcel_1_1VertexT_aea793773eec08852108d3bd5c4eea5a9}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!compute\+Vertex\+Normal\+Angle\+Weighted@{compute\+Vertex\+Normal\+Angle\+Weighted}} +\index{compute\+Vertex\+Normal\+Angle\+Weighted@{compute\+Vertex\+Normal\+Angle\+Weighted}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{compute\+Vertex\+Normal\+Angle\+Weighted()}{computeVertexNormalAngleWeighted()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::compute\+Vertex\+Normal\+Angle\+Weighted (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \&}]{a\+\_\+faces }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the vertex normal, using the pseudonormal algorithm which weights the normal with the subtended angle to each connected face. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+faces} & Faces to use for computation. \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This computes the normal vector using the pseudnormal algorithm from Baerentzen and Aanes in \char`\"{}\+Signed distance computation using the angle weighted pseudonormal\char`\"{} (D\+OI\+: 10.\+1109/\+T\+V\+CG.2005.\+49) +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1VertexT_a6faffb2c5038d62c2f7866736ebe7393}\label{classDcel_1_1VertexT_a6faffb2c5038d62c2f7866736ebe7393}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!compute\+Vertex\+Normal\+Average@{compute\+Vertex\+Normal\+Average}} +\index{compute\+Vertex\+Normal\+Average@{compute\+Vertex\+Normal\+Average}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{compute\+Vertex\+Normal\+Average()}{computeVertexNormalAverage()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::compute\+Vertex\+Normal\+Average (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classDcel_1_1VertexT_a5acb4c66c49319683c71f52e56ad8e8a}{Face\+Ptr} $>$ \&}]{a\+\_\+faces }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the vertex normal, using an average of the normal vectors in the input face list. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+faces} & Faces \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This computes the vertex normal as n = sum(normal(face))/num(faces) +\end{DoxyNote} +\mbox{\Hypertarget{classDcel_1_1VertexT_a20a894d436707a4205501bbc5cd72323}\label{classDcel_1_1VertexT_a20a894d436707a4205501bbc5cd72323}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!define@{define}} +\index{define@{define}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+position, }\item[{const \hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \&}]{a\+\_\+edge, }\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+normal }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Define function. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+position} & Vertex position \\ +\hline +\mbox{\tt in} & {\em a\+\_\+edge} & Pointer to outgoing edge \\ +\hline +\mbox{\tt in} & {\em a\+\_\+normal} & Vertex normal vector\\ +\hline +\end{DoxyParams} +This sets the position, normal vector, and edge pointer. \mbox{\Hypertarget{classDcel_1_1VertexT_a4ac13c49c61857ea7d0990212b43ca41}\label{classDcel_1_1VertexT_a4ac13c49c61857ea7d0990212b43ca41}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!set\+Edge@{set\+Edge}} +\index{set\+Edge@{set\+Edge}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{set\+Edge()}{setEdge()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::set\+Edge (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a7c049a24ac43b9750578e4f4ed543831}{Edge\+Ptr} \&}]{a\+\_\+edge }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the reference to the outgoing edge. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+edge} & Pointer to an outgoing edge \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1VertexT_a3bffe6c4f0d0766cdd7a4bb3a6050cb4}\label{classDcel_1_1VertexT_a3bffe6c4f0d0766cdd7a4bb3a6050cb4}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!set\+Normal@{set\+Normal}} +\index{set\+Normal@{set\+Normal}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{set\+Normal()}{setNormal()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::set\+Normal (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+normal }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the vertex normal vector. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+normal} & Vertex normal vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1VertexT_a9c7d9a23275e5e3165eb8c6018b55a7e}\label{classDcel_1_1VertexT_a9c7d9a23275e5e3165eb8c6018b55a7e}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!set\+Position@{set\+Position}} +\index{set\+Position@{set\+Position}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{set\+Position()}{setPosition()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::set\+Position (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+position }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Set the vertex position. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+position} & Vertex position \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classDcel_1_1VertexT_afce7ba8e2bbf81b158b43af2576c4dda}\label{classDcel_1_1VertexT_afce7ba8e2bbf81b158b43af2576c4dda}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the signed distance to this vertex. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & Position in space. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +The returned distance is $\vert$a\+\_\+x0 -\/ m\+\_\+position$\vert$ and the sign is given by the sign of m\+\_\+normal $\ast$ $\vert$a\+\_\+x0 -\/ m\+\_\+position$\vert$. +\end{DoxyReturn} +\mbox{\Hypertarget{classDcel_1_1VertexT_a552b7d88dfe80c76561b5a002ddc176b}\label{classDcel_1_1VertexT_a552b7d88dfe80c76561b5a002ddc176b}} +\index{Dcel\+::\+VertexT@{Dcel\+::\+VertexT}!unsigned\+Distance2@{unsigned\+Distance2}} +\index{unsigned\+Distance2@{unsigned\+Distance2}!Dcel\+::\+VertexT@{Dcel\+::\+VertexT}} +\subsubsection{\texorpdfstring{unsigned\+Distance2()}{unsignedDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classDcel_1_1VertexT}{Dcel\+::\+VertexT}$<$ T $>$\+::unsigned\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classDcel_1_1VertexT_a6e073dc7426756edef5594816be6e7c7}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the squared unsigned distance to this vertex. + +This is faster to compute than signed\+Distance, and might be preferred for some algorithms. \begin{DoxyReturn}{Returns} +Returns the vector length of (a\+\_\+x -\/ m\+\_\+position) +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp}\item +Source/\hyperlink{EBGeometry__DcelVertexImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classEBGeometry_1_1BoundingVolumes_1_1AABBT.tex b/docs/doxygen/latex/classEBGeometry_1_1BoundingVolumes_1_1AABBT.tex new file mode 100644 index 00000000..15e4a09f --- /dev/null +++ b/docs/doxygen/latex/classEBGeometry_1_1BoundingVolumes_1_1AABBT.tex @@ -0,0 +1,275 @@ +\hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{}\section{E\+B\+Geometry\+:\+:Bounding\+Volumes\+:\+:A\+A\+B\+BT$<$ T $>$ Class Template Reference} +\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT}\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$}} + + +Axis-\/aligned bounding box as bounding volume. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}} +using \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias which cuts down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af14582b583b097dd7d2888812dc7027f}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af14582b583b097dd7d2888812dc7027f}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af14582b583b097dd7d2888812dc7027f}{A\+A\+B\+BT} () +\begin{DoxyCompactList}\small\item\em Default constructor (does nothing) \end{DoxyCompactList}\item +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a14344a09e9c31143fe819c768518d974}{A\+A\+B\+BT} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+lo, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+hi) +\begin{DoxyCompactList}\small\item\em Full constructor taking the low/high corners of the bounding box. \end{DoxyCompactList}\item +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a41e688e21ed4f112d18a00c2f866de5b}{A\+A\+B\+BT} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT} \&a\+\_\+other) +\begin{DoxyCompactList}\small\item\em Copy constructor of another bounding box. \end{DoxyCompactList}\item +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a1298160e99352a0359892b11edcfd01f}{A\+A\+B\+BT} (const std\+::vector$<$ \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ $>$ \&a\+\_\+others) +\begin{DoxyCompactList}\small\item\em Constructor which creates an A\+A\+BB which encloses a set of other A\+A\+B\+Bs. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a918cbae4494608b8dfebe07a1c595f08}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a918cbae4494608b8dfebe07a1c595f08}} +virtual \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a918cbae4494608b8dfebe07a1c595f08}{$\sim$\+A\+A\+B\+BT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a81b76c881d564ac8a8a2b98f90a0319d}{A\+A\+B\+BT} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) +\begin{DoxyCompactList}\small\item\em Template constructor (since mixed precision allowed) which creates an A\+A\+BB that encloses a set of 3D points. \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\void \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a71467f66f1d9c1622c750273ca79946a}{define} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) noexcept +\begin{DoxyCompactList}\small\item\em Define function (since mixed precision allowed) which sets this A\+A\+BB such that it encloses a set of 3D points. \end{DoxyCompactList}\item +bool \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a15e8b77c18d77e1da267b448e6389aff}{intersects} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Check if this A\+A\+BB intersects another A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a850d3d2ffb1afd39ad29f2c3a40bcfc9}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a850d3d2ffb1afd39ad29f2c3a40bcfc9}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a850d3d2ffb1afd39ad29f2c3a40bcfc9}{get\+Low\+Corner} () noexcept +\begin{DoxyCompactList}\small\item\em Get the modifiable lower-\/left corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af18ddf4d7aec12a5815d1a7311d73211}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af18ddf4d7aec12a5815d1a7311d73211}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af18ddf4d7aec12a5815d1a7311d73211}{get\+Low\+Corner} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the immutable lower-\/left corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_aea8039465165dd67f8fe22161b3ccd7b}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_aea8039465165dd67f8fe22161b3ccd7b}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_aea8039465165dd67f8fe22161b3ccd7b}{get\+High\+Corner} () noexcept +\begin{DoxyCompactList}\small\item\em Get the modifiable upper-\/right corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_adb0215acdc4b494b9934cbf625394d24}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_adb0215acdc4b494b9934cbf625394d24}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_adb0215acdc4b494b9934cbf625394d24}{get\+High\+Corner} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the immutable upper-\/right corner of the A\+A\+BB. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a74542ab67572055ef6559bcc6c0335f9}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a74542ab67572055ef6559bcc6c0335f9}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a74542ab67572055ef6559bcc6c0335f9}{get\+Centroid} () const noexcept +\begin{DoxyCompactList}\small\item\em Get bounding volume centroid. \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a02d157786ad67971b4873d6c2b33adbf}{get\+Overlapping\+Volume} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between this A\+A\+BB and another A\+A\+BB. \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_ad751f30ffaef31c0afb66d5d401bbb8f}{get\+Distance} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the distance to this A\+A\+BB (points inside the bounding box have a zero distance) \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a14091ab693c3389b88cad60d68116848}{get\+Distance2} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the squared distance to this bounding box (points inside the bounding box have a zero distance) \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a5f52d6e7087d892d347c0c17dac3de53}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a5f52d6e7087d892d347c0c17dac3de53}} +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a5f52d6e7087d892d347c0c17dac3de53}{get\+Volume} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute the bounding box volume. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_ac733727761633341cb27db022185cba7}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_ac733727761633341cb27db022185cba7}} +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_ac733727761633341cb27db022185cba7}{get\+Area} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute the bounding box area. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a9ae0e966236d98938696fbf6482d56ec}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a9ae0e966236d98938696fbf6482d56ec}} +{\footnotesize template$<$class T $>$ }\\{\bfseries A\+A\+B\+BT} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+lo, const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+hi) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_afca4bd6cb8b2adab62868e10b1be5052}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_afca4bd6cb8b2adab62868e10b1be5052}} +{\footnotesize template$<$class T $>$ }\\{\bfseries A\+A\+B\+BT} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+other) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a3d68ad3207db77d1a844193085bc3818}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a3d68ad3207db77d1a844193085bc3818}} +{\footnotesize template$<$class T $>$ }\\{\bfseries A\+A\+B\+BT} (const std\+::vector$<$ \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ $>$ \&a\+\_\+others) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a81b76c881d564ac8a8a2b98f90a0319d}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a81b76c881d564ac8a8a2b98f90a0319d}} +{\footnotesize template$<$class P $>$ }\\{\bfseries A\+A\+B\+BT} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a71467f66f1d9c1622c750273ca79946a}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a71467f66f1d9c1622c750273ca79946a}} +{\footnotesize template$<$class P $>$ }\\void {\bfseries define} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) noexcept +\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a96be6d9fbb8f50ed4a28983882e8adbf}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a96be6d9fbb8f50ed4a28983882e8adbf}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a96be6d9fbb8f50ed4a28983882e8adbf}{m\+\_\+lo\+Corner} +\begin{DoxyCompactList}\small\item\em Lower-\/left corner of bounding box. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a68a9efa49a6930d325195e2309459f8b}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a68a9efa49a6930d325195e2309459f8b}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a68a9efa49a6930d325195e2309459f8b}{m\+\_\+hi\+Corner} +\begin{DoxyCompactList}\small\item\em Upper-\/right corner of bounding box. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+B\+T$<$ T $>$} + +Axis-\/aligned bounding box as bounding volume. + +This class represents a Cartesian box that encloses a set of 3D points. \begin{DoxyNote}{Note} +The template parameter T is the precision. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a14344a09e9c31143fe819c768518d974}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a14344a09e9c31143fe819c768518d974}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+lo, }\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+hi }\end{DoxyParamCaption})} + + + +Full constructor taking the low/high corners of the bounding box. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+lo} & Low corner \\ +\hline +\mbox{\tt in} & {\em a\+\_\+hi} & High \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a41e688e21ed4f112d18a00c2f866de5b}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a41e688e21ed4f112d18a00c2f866de5b}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})} + + + +Copy constructor of another bounding box. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other bounding box \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a1298160e99352a0359892b11edcfd01f}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a1298160e99352a0359892b11edcfd01f}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ $>$ \&}]{a\+\_\+others }\end{DoxyParamCaption})} + + + +Constructor which creates an A\+A\+BB which encloses a set of other A\+A\+B\+Bs. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+others} & Other bounding boxes \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a81b76c881d564ac8a8a2b98f90a0319d}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a81b76c881d564ac8a8a2b98f90a0319d}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!A\+A\+B\+BT@{A\+A\+B\+BT}} +\index{A\+A\+B\+BT@{A\+A\+B\+BT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{A\+A\+B\+B\+T()}{AABBT()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +template$<$class P $>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points }\end{DoxyParamCaption})} + + + +Template constructor (since mixed precision allowed) which creates an A\+A\+BB that encloses a set of 3D points. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +Calls the define function +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a71467f66f1d9c1622c750273ca79946a}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a71467f66f1d9c1622c750273ca79946a}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!define@{define}} +\index{define@{define}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +template$<$class P $>$ \\ +void \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Define function (since mixed precision allowed) which sets this A\+A\+BB such that it encloses a set of 3D points. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_ad751f30ffaef31c0afb66d5d401bbb8f}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_ad751f30ffaef31c0afb66d5d401bbb8f}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!get\+Distance@{get\+Distance}} +\index{get\+Distance@{get\+Distance}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{get\+Distance()}{getDistance()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+A\+A\+B\+B\+T\+::get\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the distance to this A\+A\+BB (points inside the bounding box have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the distance to the bounding box (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a14091ab693c3389b88cad60d68116848}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a14091ab693c3389b88cad60d68116848}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!get\+Distance2@{get\+Distance2}} +\index{get\+Distance2@{get\+Distance2}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{get\+Distance2()}{getDistance2()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+A\+A\+B\+B\+T\+::get\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT_af139f618de2c5138990a63e93eb7d066}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the squared distance to this bounding box (points inside the bounding box have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the squared distance to the bounding box (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a02d157786ad67971b4873d6c2b33adbf}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a02d157786ad67971b4873d6c2b33adbf}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!get\+Overlapping\+Volume@{get\+Overlapping\+Volume}} +\index{get\+Overlapping\+Volume@{get\+Overlapping\+Volume}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{get\+Overlapping\+Volume()}{getOverlappingVolume()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+A\+A\+B\+B\+T\+::get\+Overlapping\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the overlapping volume between this A\+A\+BB and another A\+A\+BB. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & The other A\+A\+BB \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns overlapping volume +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a15e8b77c18d77e1da267b448e6389aff}\label{classEBGeometry_1_1BoundingVolumes_1_1AABBT_a15e8b77c18d77e1da267b448e6389aff}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}!intersects@{intersects}} +\index{intersects@{intersects}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+A\+A\+B\+BT}} +\subsubsection{\texorpdfstring{intersects()}{intersects()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +bool Bounding\+Volumes\+::\+A\+A\+B\+B\+T\+::intersects (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if this A\+A\+BB intersects another A\+A\+BB. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & The other A\+A\+BB \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +True if they intersect and false otherwise. +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}\item +Source/\hyperlink{EBGeometry__BoundingVolumesImplem_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT.tex b/docs/doxygen/latex/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT.tex new file mode 100644 index 00000000..b1871fb0 --- /dev/null +++ b/docs/doxygen/latex/classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT.tex @@ -0,0 +1,312 @@ +\hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{}\section{E\+B\+Geometry\+:\+:Bounding\+Volumes\+:\+:Bounding\+SphereT$<$ T $>$ Class Template Reference} +\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$}} + + +Class which encloses a set of points using a bounding sphere. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp$>$} + +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}} +enum \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \{ {\bfseries Ritter} + \}\begin{DoxyCompactList}\small\item\em Typename for possible algorithms that support the computation of a bounding sphere for a set of 3D points. \end{DoxyCompactList} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}} +using \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} = \hyperlink{classVec3T}{Vec3T}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_abb47115bf4bd00e16c885a3b8f54dc87}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_abb47115bf4bd00e16c885a3b8f54dc87}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_abb47115bf4bd00e16c885a3b8f54dc87}{Bounding\+SphereT} () +\begin{DoxyCompactList}\small\item\em Default constructor. Leaves object in undefined state. \end{DoxyCompactList}\item +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a67800669cf2aee6493ea0da5439a34fd}{Bounding\+SphereT} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+center, const T \&a\+\_\+radius) +\begin{DoxyCompactList}\small\item\em Full constructor. Sets the center and radius of the bounding sphere. \end{DoxyCompactList}\item +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af360a46fe3463a27f9a718e328aff46e}{Bounding\+SphereT} (const std\+::vector$<$ \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ $>$ \&a\+\_\+other\+Spheres) +\begin{DoxyCompactList}\small\item\em Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres. \end{DoxyCompactList}\item +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ab55488a8ee4b749e8b86c5577735eb3b}{Bounding\+SphereT} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} \&a\+\_\+other) +\begin{DoxyCompactList}\small\item\em Copy constructor. Sets the center and radius from the other sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a06db6d4588098bda148376ee71f51b91}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a06db6d4588098bda148376ee71f51b91}} +virtual \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a06db6d4588098bda148376ee71f51b91}{$\sim$\+Bounding\+SphereT} () +\begin{DoxyCompactList}\small\item\em Destructor (does nothing). \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ad780b67034525d145508a13f8b324546}{Bounding\+SphereT} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points, const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \&a\+\_\+alg=Bounding\+Volume\+Algorithm\+::\+Ritter) +\begin{DoxyCompactList}\small\item\em Template constructor which takes a set of 3D points (mixed precision allowed). \end{DoxyCompactList}\item +{\footnotesize template$<$class P $>$ }\\void \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a95068b84f4ad5867c5d3a1034eb51f6f}{define} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points, const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \&a\+\_\+alg) noexcept +\begin{DoxyCompactList}\small\item\em Template define function which takes a set of 3D points (mixed precision allowed). \end{DoxyCompactList}\item +bool \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af3a1030fd3e2cd2d3c86c95460781410}{intersects} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Check if this bounding sphere intersect another bounding sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a34a34d9da724336de6806ff607aed061}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a34a34d9da724336de6806ff607aed061}} +T \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a34a34d9da724336de6806ff607aed061}{get\+Radius} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable radius for this sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a4ddb47370d9b627250e64cd437d26c37}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a4ddb47370d9b627250e64cd437d26c37}} +const T \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a4ddb47370d9b627250e64cd437d26c37}{get\+Radius} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable radius for this sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a7961a0ee3e60fd5359ba06f481c53351}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a7961a0ee3e60fd5359ba06f481c53351}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a7961a0ee3e60fd5359ba06f481c53351}{get\+Centroid} () noexcept +\begin{DoxyCompactList}\small\item\em Get modifiable center for this sphere. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a461a4f71837537ad801d11d394cff413}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a461a4f71837537ad801d11d394cff413}} +const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \& \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a461a4f71837537ad801d11d394cff413}{get\+Centroid} () const noexcept +\begin{DoxyCompactList}\small\item\em Get immutable center for this sphere. \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aac6c4e803bf7eb25123d17eede0555a2}{get\+Overlapping\+Volume} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between this bounding sphere and another. \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a737a3af41ac98a78685092ab6aa967b5}{get\+Distance} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the distance to this bounding sphere (points inside the sphere have a zero distance) \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af34b67dfb55ff102bda80b76a90e28d6}{get\+Distance2} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \&a\+\_\+x0) const noexcept +\begin{DoxyCompactList}\small\item\em Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a9289fa08e9cf3d0f6e7e0fb5556233f5}{get\+Volume} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the sphere volume. \end{DoxyCompactList}\item +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_afee6f3298c1729e45f34d737efaabe19}{get\+Area} () const noexcept +\begin{DoxyCompactList}\small\item\em Get the sphere area. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aa51cf92c01415a84a9906d7973bfcc43}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aa51cf92c01415a84a9906d7973bfcc43}} +{\footnotesize template$<$class T $>$ }\\{\bfseries Bounding\+SphereT} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+center, const T \&a\+\_\+radius) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a7238b291257be347c8dce3213c4e313a}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a7238b291257be347c8dce3213c4e313a}} +{\footnotesize template$<$class T $>$ }\\{\bfseries Bounding\+SphereT} (const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} \&a\+\_\+other) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aaba73c2b10d4e0b80adc1e16305f87db}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aaba73c2b10d4e0b80adc1e16305f87db}} +{\footnotesize template$<$class T $>$ }\\{\bfseries Bounding\+SphereT} (const std\+::vector$<$ \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ $>$ \&a\+\_\+other\+Spheres) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae7dabdc4c5cf8a82a7dc4f38ffaee132}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae7dabdc4c5cf8a82a7dc4f38ffaee132}} +{\footnotesize template$<$class P $>$ }\\{\bfseries Bounding\+SphereT} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points, const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \&a\+\_\+algorithm) +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a528f18537b4ef853df390e5de06b1b21}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a528f18537b4ef853df390e5de06b1b21}} +{\footnotesize template$<$class P $>$ }\\void {\bfseries define} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points, const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \&a\+\_\+algorithm) noexcept +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a270720886cb098e072173dd25262135f}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a270720886cb098e072173dd25262135f}} +{\footnotesize template$<$class P $>$ }\\void {\bfseries build\+Ritter} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) noexcept +\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a270720886cb098e072173dd25262135f}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a270720886cb098e072173dd25262135f}} +{\footnotesize template$<$class P $>$ }\\void \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a270720886cb098e072173dd25262135f}{build\+Ritter} (const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&a\+\_\+points) noexcept +\begin{DoxyCompactList}\small\item\em Template function which computes the bounding sphere for a set of points (mixed precision allowed) using Ritter\textquotesingle{}s algorithm. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a5c2f7e0aefbd91b38af1e721e9b03b8e}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a5c2f7e0aefbd91b38af1e721e9b03b8e}} +T \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a5c2f7e0aefbd91b38af1e721e9b03b8e}{m\+\_\+radius} +\begin{DoxyCompactList}\small\item\em Sphere radius. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ac6ad34b39a09a119479c5e73cabcf6c3}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ac6ad34b39a09a119479c5e73cabcf6c3}} +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ac6ad34b39a09a119479c5e73cabcf6c3}{m\+\_\+center} +\begin{DoxyCompactList}\small\item\em Sphere center. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+Sphere\+T$<$ T $>$} + +Class which encloses a set of points using a bounding sphere. + +The template parameter T is the floating-\/point precision which is used. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a67800669cf2aee6493ea0da5439a34fd}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a67800669cf2aee6493ea0da5439a34fd}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+center, }\item[{const T \&}]{a\+\_\+radius }\end{DoxyParamCaption})} + + + +Full constructor. Sets the center and radius of the bounding sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+center} & Bounding sphere center \\ +\hline +\mbox{\tt in} & {\em a\+\_\+radius} & Bounding sphere radius \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af360a46fe3463a27f9a718e328aff46e}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af360a46fe3463a27f9a718e328aff46e}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ $>$ \&}]{a\+\_\+other\+Spheres }\end{DoxyParamCaption})} + + + +Full constructor. Constructs a bounding sphere that encloses all the other bounding spheres. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other\+Spheres} & Other bounding spheres. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ab55488a8ee4b749e8b86c5577735eb3b}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ab55488a8ee4b749e8b86c5577735eb3b}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})} + + + +Copy constructor. Sets the center and radius from the other sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other sphere \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ad780b67034525d145508a13f8b324546}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ad780b67034525d145508a13f8b324546}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!Bounding\+SphereT@{Bounding\+SphereT}} +\index{Bounding\+SphereT@{Bounding\+SphereT}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{Bounding\+Sphere\+T()}{BoundingSphereT()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +template$<$class P $>$ \\ +\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::\hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points, }\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \&}]{a\+\_\+alg = {\ttfamily BoundingVolumeAlgorithm\+:\+:Ritter} }\end{DoxyParamCaption})} + + + +Template constructor which takes a set of 3D points (mixed precision allowed). + +This computes the bounding sphere using the supplied algorithm. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\mbox{\tt in} & {\em a\+\_\+alg} & Bounding sphere algorithm. \\ +\hline +\end{DoxyParams} +\begin{DoxyNote}{Note} +This calls the define(...) function. +\end{DoxyNote} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a95068b84f4ad5867c5d3a1034eb51f6f}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a95068b84f4ad5867c5d3a1034eb51f6f}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!define@{define}} +\index{define@{define}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{define()}{define()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +template$<$class P $>$ \\ +void \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}$<$ T $>$\+::define (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ \hyperlink{classVec3T}{Vec3T}$<$ P $>$ $>$ \&}]{a\+\_\+points, }\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_ae80a2de96c8230589e4ea05fa9943946}{Bounding\+Volume\+Algorithm} \&}]{a\+\_\+alg }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Template define function which takes a set of 3D points (mixed precision allowed). + +This computes the bounding sphere using the supplied algorithm. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+points} & Set of 3D points \\ +\hline +\mbox{\tt in} & {\em a\+\_\+alg} & Bounding sphere algorithm. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_afee6f3298c1729e45f34d737efaabe19}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_afee6f3298c1729e45f34d737efaabe19}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Area@{get\+Area}} +\index{get\+Area@{get\+Area}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Area()}{getArea()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+Bounding\+Sphere\+T\+::get\+Area (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the sphere area. + +\begin{DoxyReturn}{Returns} +Sphere area. +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a737a3af41ac98a78685092ab6aa967b5}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a737a3af41ac98a78685092ab6aa967b5}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Distance@{get\+Distance}} +\index{get\+Distance@{get\+Distance}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Distance()}{getDistance()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+Bounding\+Sphere\+T\+::get\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the distance to this bounding sphere (points inside the sphere have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the distance to the sphere (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af34b67dfb55ff102bda80b76a90e28d6}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af34b67dfb55ff102bda80b76a90e28d6}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Distance2@{get\+Distance2}} +\index{get\+Distance2@{get\+Distance2}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Distance2()}{getDistance2()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+Bounding\+Sphere\+T\+::get\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a65cef119542a4c7c1cabb1ea36f40336}{Vec3} \&}]{a\+\_\+x0 }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the squared distance to this bounding sphere (points inside the sphere have a zero distance) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x0} & 3D point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the squared distance to the sphere (a point inside has a zero distance) +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aac6c4e803bf7eb25123d17eede0555a2}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_aac6c4e803bf7eb25123d17eede0555a2}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Overlapping\+Volume@{get\+Overlapping\+Volume}} +\index{get\+Overlapping\+Volume@{get\+Overlapping\+Volume}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Overlapping\+Volume()}{getOverlappingVolume()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+Bounding\+Sphere\+T\+::get\+Overlapping\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute the overlapping volume between this bounding sphere and another. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other bounding sphere \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +The overlapping volume, computing using standard expressions. +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a9289fa08e9cf3d0f6e7e0fb5556233f5}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_a9289fa08e9cf3d0f6e7e0fb5556233f5}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!get\+Volume@{get\+Volume}} +\index{get\+Volume@{get\+Volume}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{get\+Volume()}{getVolume()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +T Bounding\+Volumes\+::\+Bounding\+Sphere\+T\+::get\+Volume (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Get the sphere volume. + +\begin{DoxyReturn}{Returns} +Sphere volume +\end{DoxyReturn} +\mbox{\Hypertarget{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af3a1030fd3e2cd2d3c86c95460781410}\label{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT_af3a1030fd3e2cd2d3c86c95460781410}} +\index{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}!intersects@{intersects}} +\index{intersects@{intersects}!E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT@{E\+B\+Geometry\+::\+Bounding\+Volumes\+::\+Bounding\+SphereT}} +\subsubsection{\texorpdfstring{intersects()}{intersects()}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +bool Bounding\+Volumes\+::\+Bounding\+Sphere\+T\+::intersects (\begin{DoxyParamCaption}\item[{const \hyperlink{classEBGeometry_1_1BoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Check if this bounding sphere intersect another bounding sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other bounding sphere. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +True if the two sphere intersect. +\end{DoxyReturn} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}\item +Source/\hyperlink{EBGeometry__BoundingVolumesImplem_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classRotateOp.tex b/docs/doxygen/latex/classRotateOp.tex new file mode 100644 index 00000000..cee417db --- /dev/null +++ b/docs/doxygen/latex/classRotateOp.tex @@ -0,0 +1,88 @@ +\hypertarget{classRotateOp}{}\section{Rotate\+Op$<$ T $>$ Class Template Reference} +\label{classRotateOp}\index{Rotate\+Op$<$ T $>$@{Rotate\+Op$<$ T $>$}} + + +Rotation operator. Can scale an input point. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp$>$} + + + +Inheritance diagram for Rotate\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=178pt]{classRotateOp__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for Rotate\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=178pt]{classRotateOp__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classRotateOp_afac8d44cae4c9109c96d2c1ae47a1dc2}\label{classRotateOp_afac8d44cae4c9109c96d2c1ae47a1dc2}} +\hyperlink{classRotateOp_afac8d44cae4c9109c96d2c1ae47a1dc2}{Rotate\+Op} () +\begin{DoxyCompactList}\small\item\em Weak constructor. \end{DoxyCompactList}\item +\hyperlink{classRotateOp_a018f0a465bfaf271958ac975eb24b5bb}{Rotate\+Op} (const T a\+\_\+angle, const int a\+\_\+axis) noexcept +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classRotateOp_aaa12091fe7937f5ed7e2d35e0632337b}\label{classRotateOp_aaa12091fe7937f5ed7e2d35e0632337b}} +virtual \hyperlink{classRotateOp_aaa12091fe7937f5ed7e2d35e0632337b}{$\sim$\+Rotate\+Op} ()=default +\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classRotateOp_aaffc25806ef6b9d7ea6651aa2bb9767c}\label{classRotateOp_aaffc25806ef6b9d7ea6651aa2bb9767c}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classRotateOp_aaffc25806ef6b9d7ea6651aa2bb9767c}{transform} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+input\+Point) const noexcept override +\begin{DoxyCompactList}\small\item\em Transform input point. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classRotateOp_ae0f4b6879b2b86506b4a528d7e627255}\label{classRotateOp_ae0f4b6879b2b86506b4a528d7e627255}} +int \hyperlink{classRotateOp_ae0f4b6879b2b86506b4a528d7e627255}{m\+\_\+axis} +\begin{DoxyCompactList}\small\item\em Rotation axis. 0 = x, 1=y etc. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classRotateOp_a8eed86f336946618f1964056405b9ac4}\label{classRotateOp_a8eed86f336946618f1964056405b9ac4}} +T \hyperlink{classRotateOp_a8eed86f336946618f1964056405b9ac4}{m\+\_\+cos\+Angle} +\begin{DoxyCompactList}\small\item\em Theta-\/rotation (degrees) \end{DoxyCompactList}\item +\mbox{\Hypertarget{classRotateOp_ab0f3316357239d07fb1da64b7298d53f}\label{classRotateOp_ab0f3316357239d07fb1da64b7298d53f}} +T \hyperlink{classRotateOp_ab0f3316357239d07fb1da64b7298d53f}{m\+\_\+sin\+Angle} +\begin{DoxyCompactList}\small\item\em Phi-\/rotation (degrees) \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Rotate\+Op$<$ T $>$} + +Rotation operator. Can scale an input point. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classRotateOp_a018f0a465bfaf271958ac975eb24b5bb}\label{classRotateOp_a018f0a465bfaf271958ac975eb24b5bb}} +\index{Rotate\+Op@{Rotate\+Op}!Rotate\+Op@{Rotate\+Op}} +\index{Rotate\+Op@{Rotate\+Op}!Rotate\+Op@{Rotate\+Op}} +\subsubsection{\texorpdfstring{Rotate\+Op()}{RotateOp()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classRotateOp}{Rotate\+Op}$<$ T $>$\+::\hyperlink{classRotateOp}{Rotate\+Op} (\begin{DoxyParamCaption}\item[{const T}]{a\+\_\+angle, }\item[{const int}]{a\+\_\+axis }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [noexcept]}} + + + +Full constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+angle} & Rotation angle \\ +\hline +\mbox{\tt in} & {\em a\+\_\+axis} & Rotation axis \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}\item +Source/\hyperlink{EBGeometry__TransformOpsImplem_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classRotateOp__coll__graph.md5 b/docs/doxygen/latex/classRotateOp__coll__graph.md5 new file mode 100644 index 00000000..9a002750 --- /dev/null +++ b/docs/doxygen/latex/classRotateOp__coll__graph.md5 @@ -0,0 +1 @@ +20b9b6f61bbbf75f8fe0600a98266f26 \ No newline at end of file diff --git a/docs/doxygen/latex/classRotateOp__coll__graph.pdf b/docs/doxygen/latex/classRotateOp__coll__graph.pdf new file mode 100644 index 00000000..f1199d5f Binary files /dev/null and b/docs/doxygen/latex/classRotateOp__coll__graph.pdf differ diff --git a/docs/doxygen/latex/classRotateOp__inherit__graph.md5 b/docs/doxygen/latex/classRotateOp__inherit__graph.md5 new file mode 100644 index 00000000..57b673e2 --- /dev/null +++ b/docs/doxygen/latex/classRotateOp__inherit__graph.md5 @@ -0,0 +1 @@ +0943d6b92c49eeb99e4eb26484b9a0be \ No newline at end of file diff --git a/docs/doxygen/latex/classRotateOp__inherit__graph.pdf b/docs/doxygen/latex/classRotateOp__inherit__graph.pdf new file mode 100644 index 00000000..f1199d5f Binary files /dev/null and b/docs/doxygen/latex/classRotateOp__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classScaleOp.tex b/docs/doxygen/latex/classScaleOp.tex new file mode 100644 index 00000000..6085e430 --- /dev/null +++ b/docs/doxygen/latex/classScaleOp.tex @@ -0,0 +1,62 @@ +\hypertarget{classScaleOp}{}\section{Scale\+Op$<$ T $>$ Class Template Reference} +\label{classScaleOp}\index{Scale\+Op$<$ T $>$@{Scale\+Op$<$ T $>$}} + + +Scale operator. Can also be used as a reflection operator. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp$>$} + + + +Inheritance diagram for Scale\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=178pt]{classScaleOp__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for Scale\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=178pt]{classScaleOp__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classScaleOp_aaa6d5841955e1b0a883bbcb5fdcbddc6}\label{classScaleOp_aaa6d5841955e1b0a883bbcb5fdcbddc6}} +\hyperlink{classScaleOp_aaa6d5841955e1b0a883bbcb5fdcbddc6}{Scale\+Op} () +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classScaleOp_ab556ea0d0521a8a153e2406b1255014e}\label{classScaleOp_ab556ea0d0521a8a153e2406b1255014e}} +\hyperlink{classScaleOp_ab556ea0d0521a8a153e2406b1255014e}{Scale\+Op} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+scale) +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classScaleOp_ab9fc71d00d7e0e339562edcaa2e3fc9a}\label{classScaleOp_ab9fc71d00d7e0e339562edcaa2e3fc9a}} +virtual \hyperlink{classScaleOp_ab9fc71d00d7e0e339562edcaa2e3fc9a}{$\sim$\+Scale\+Op} ()=default +\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classScaleOp_ac09e64516daa1b75111bd36dedfeeda9}\label{classScaleOp_ac09e64516daa1b75111bd36dedfeeda9}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classScaleOp_ac09e64516daa1b75111bd36dedfeeda9}{transform} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+input\+Point) const noexcept override +\begin{DoxyCompactList}\small\item\em Transform input point. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classScaleOp_aa9cdfff381b10970fd51eeb7e3e83188}\label{classScaleOp_aa9cdfff381b10970fd51eeb7e3e83188}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classScaleOp_aa9cdfff381b10970fd51eeb7e3e83188}{m\+\_\+scale} +\begin{DoxyCompactList}\small\item\em Scaling of input point. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Scale\+Op$<$ T $>$} + +Scale operator. Can also be used as a reflection operator. + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}\item +Source/\hyperlink{EBGeometry__TransformOpsImplem_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classScaleOp__coll__graph.md5 b/docs/doxygen/latex/classScaleOp__coll__graph.md5 new file mode 100644 index 00000000..5ee5a976 --- /dev/null +++ b/docs/doxygen/latex/classScaleOp__coll__graph.md5 @@ -0,0 +1 @@ +83054c6e97d368ee387a00d0fcf19e5c \ No newline at end of file diff --git a/docs/doxygen/latex/classScaleOp__coll__graph.pdf b/docs/doxygen/latex/classScaleOp__coll__graph.pdf new file mode 100644 index 00000000..db66def4 Binary files /dev/null and b/docs/doxygen/latex/classScaleOp__coll__graph.pdf differ diff --git a/docs/doxygen/latex/classScaleOp__inherit__graph.md5 b/docs/doxygen/latex/classScaleOp__inherit__graph.md5 new file mode 100644 index 00000000..10b9bff3 --- /dev/null +++ b/docs/doxygen/latex/classScaleOp__inherit__graph.md5 @@ -0,0 +1 @@ +aae161ff3af9c21b3ed1628d798c7e8e \ No newline at end of file diff --git a/docs/doxygen/latex/classScaleOp__inherit__graph.pdf b/docs/doxygen/latex/classScaleOp__inherit__graph.pdf new file mode 100644 index 00000000..db66def4 Binary files /dev/null and b/docs/doxygen/latex/classScaleOp__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classSignedDistanceFunction.tex b/docs/doxygen/latex/classSignedDistanceFunction.tex new file mode 100644 index 00000000..410928eb --- /dev/null +++ b/docs/doxygen/latex/classSignedDistanceFunction.tex @@ -0,0 +1,154 @@ +\hypertarget{classSignedDistanceFunction}{}\section{Signed\+Distance\+Function$<$ T $>$ Class Template Reference} +\label{classSignedDistanceFunction}\index{Signed\+Distance\+Function$<$ T $>$@{Signed\+Distance\+Function$<$ T $>$}} + + +Abstract representation of a signed distance function. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp$>$} + + + +Inheritance diagram for Signed\+Distance\+Function$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{classSignedDistanceFunction__inherit__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classSignedDistanceFunction_abfeeff9b3901e03ec6b73317dc9a722e}\label{classSignedDistanceFunction_abfeeff9b3901e03ec6b73317dc9a722e}} +\hyperlink{classSignedDistanceFunction_abfeeff9b3901e03ec6b73317dc9a722e}{Signed\+Distance\+Function} ()=default +\begin{DoxyCompactList}\small\item\em Disallowed, use the full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSignedDistanceFunction_ab47b289bd8351d7f323938c91b2bb92b}\label{classSignedDistanceFunction_ab47b289bd8351d7f323938c91b2bb92b}} +virtual \hyperlink{classSignedDistanceFunction_ab47b289bd8351d7f323938c91b2bb92b}{$\sim$\+Signed\+Distance\+Function} ()=default +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +virtual T \hyperlink{classSignedDistanceFunction_af5912280ca51dc21a2d6949a30ec7d21}{signed\+Distance} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+point) const noexcept=0 +\begin{DoxyCompactList}\small\item\em Signed distance function. \end{DoxyCompactList}\item +virtual T \hyperlink{classSignedDistanceFunction_a2a3e72186725a4e931db0f8d4895bcb8}{unsigned\+Distance2} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Unsigned distance function. Must return the distance$^\wedge$2. \end{DoxyCompactList}\item +void \hyperlink{classSignedDistanceFunction_a7855565ecca2d35de173161ecfbf19ae}{scale} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+scale) noexcept +\begin{DoxyCompactList}\small\item\em Scale signed distance function. \end{DoxyCompactList}\item +void \hyperlink{classSignedDistanceFunction_add71ebc2e7f3fb5e85766898413482e7}{translate} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+translation) noexcept +\begin{DoxyCompactList}\small\item\em Translate signed distance function. \end{DoxyCompactList}\item +void \hyperlink{classSignedDistanceFunction_ae8de697f4d0966290342bcf6383585ef}{rotate} (const T a\+\_\+angle, const int a\+\_\+axis) noexcept +\begin{DoxyCompactList}\small\item\em Rotate the signed distance function around. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classSignedDistanceFunction_af186f98f9ea4ac96fccb4add4ebf196d}\label{classSignedDistanceFunction_af186f98f9ea4ac96fccb4add4ebf196d}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classSignedDistanceFunction_af186f98f9ea4ac96fccb4add4ebf196d}{transform\+Point} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+point) const noexcept +\begin{DoxyCompactList}\small\item\em Apply transformation operators and move point. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classSignedDistanceFunction_af61e5e2ece6add9d2bcf8e5aa8cf2844}\label{classSignedDistanceFunction_af61e5e2ece6add9d2bcf8e5aa8cf2844}} +std\+::deque$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classTransformOp}{Transform\+Op}$<$ T $>$ $>$ $>$ \hyperlink{classSignedDistanceFunction_af61e5e2ece6add9d2bcf8e5aa8cf2844}{m\+\_\+transform\+Ops} +\begin{DoxyCompactList}\small\item\em List of transformation operators for the signed distance field. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Signed\+Distance\+Function$<$ T $>$} + +Abstract representation of a signed distance function. + +Users can put whatever they like in here, e.\+g. analytic functions, D\+C\+EL meshes, or D\+C\+EL meshes stored in full or compact \hyperlink{namespaceBVH}{B\+VH} trees. The signed\+Distance function must be implemented by the user. When computing it, the user can apply transformation operators (rotations, scaling, translations) by calling transform\+Point on the input coordinate. + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classSignedDistanceFunction_ae8de697f4d0966290342bcf6383585ef}\label{classSignedDistanceFunction_ae8de697f4d0966290342bcf6383585ef}} +\index{Signed\+Distance\+Function@{Signed\+Distance\+Function}!rotate@{rotate}} +\index{rotate@{rotate}!Signed\+Distance\+Function@{Signed\+Distance\+Function}} +\subsubsection{\texorpdfstring{rotate()}{rotate()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$\+::rotate (\begin{DoxyParamCaption}\item[{const T}]{a\+\_\+angle, }\item[{const int}]{a\+\_\+axis }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Rotate the signed distance function around. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+angle} & Rotation angle \\ +\hline +\mbox{\tt in} & {\em a\+\_\+axis} & Rotation axis. 0 = x, 1 = y etc. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classSignedDistanceFunction_a7855565ecca2d35de173161ecfbf19ae}\label{classSignedDistanceFunction_a7855565ecca2d35de173161ecfbf19ae}} +\index{Signed\+Distance\+Function@{Signed\+Distance\+Function}!scale@{scale}} +\index{scale@{scale}!Signed\+Distance\+Function@{Signed\+Distance\+Function}} +\subsubsection{\texorpdfstring{scale()}{scale()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$\+::scale (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+scale }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Scale signed distance function. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+scale} & Scaling factor. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classSignedDistanceFunction_af5912280ca51dc21a2d6949a30ec7d21}\label{classSignedDistanceFunction_af5912280ca51dc21a2d6949a30ec7d21}} +\index{Signed\+Distance\+Function@{Signed\+Distance\+Function}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Signed\+Distance\+Function@{Signed\+Distance\+Function}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +virtual T \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}, {\ttfamily [noexcept]}} + + + +Signed distance function. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point. \\ +\hline +\end{DoxyParams} + + +Implemented in \hyperlink{classSphereSDF_a9b0c5f0b1af2c4b62bee1c873e0158e8}{Sphere\+S\+D\+F$<$ T $>$}, \hyperlink{classUnionBVH_a9681fdc161e2e077a33caaddb78fb4ba}{Union\+B\+V\+H$<$ T, B\+V, K $>$}, and \hyperlink{classUnion_a08beffd354ca261e3d31bcb453951810}{Union$<$ T $>$}. + +\mbox{\Hypertarget{classSignedDistanceFunction_add71ebc2e7f3fb5e85766898413482e7}\label{classSignedDistanceFunction_add71ebc2e7f3fb5e85766898413482e7}} +\index{Signed\+Distance\+Function@{Signed\+Distance\+Function}!translate@{translate}} +\index{translate@{translate}!Signed\+Distance\+Function@{Signed\+Distance\+Function}} +\subsubsection{\texorpdfstring{translate()}{translate()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +void \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$\+::translate (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+translation }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Translate signed distance function. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+translation} & Distance to translate the function. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classSignedDistanceFunction_a2a3e72186725a4e931db0f8d4895bcb8}\label{classSignedDistanceFunction_a2a3e72186725a4e931db0f8d4895bcb8}} +\index{Signed\+Distance\+Function@{Signed\+Distance\+Function}!unsigned\+Distance2@{unsigned\+Distance2}} +\index{unsigned\+Distance2@{unsigned\+Distance2}!Signed\+Distance\+Function@{Signed\+Distance\+Function}} +\subsubsection{\texorpdfstring{unsigned\+Distance2()}{unsignedDistance2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$\+::unsigned\+Distance2 (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}, {\ttfamily [noexcept]}} + + + +Unsigned distance function. Must return the distance$^\wedge$2. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point. \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__SignedDistanceFunction_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp}\item +Source/\hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classSignedDistanceFunction__inherit__graph.md5 b/docs/doxygen/latex/classSignedDistanceFunction__inherit__graph.md5 new file mode 100644 index 00000000..0995930e --- /dev/null +++ b/docs/doxygen/latex/classSignedDistanceFunction__inherit__graph.md5 @@ -0,0 +1 @@ +1334f4f3748b7b691e2a6ff03317039f \ No newline at end of file diff --git a/docs/doxygen/latex/classSignedDistanceFunction__inherit__graph.pdf b/docs/doxygen/latex/classSignedDistanceFunction__inherit__graph.pdf new file mode 100644 index 00000000..78742249 Binary files /dev/null and b/docs/doxygen/latex/classSignedDistanceFunction__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classSphereSDF.tex b/docs/doxygen/latex/classSphereSDF.tex new file mode 100644 index 00000000..d5d12002 --- /dev/null +++ b/docs/doxygen/latex/classSphereSDF.tex @@ -0,0 +1,127 @@ +\hypertarget{classSphereSDF}{}\section{Sphere\+S\+DF$<$ T $>$ Class Template Reference} +\label{classSphereSDF}\index{Sphere\+S\+D\+F$<$ T $>$@{Sphere\+S\+D\+F$<$ T $>$}} + + +Signed distance field for sphere. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp$>$} + + + +Inheritance diagram for Sphere\+S\+DF$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{classSphereSDF__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for Sphere\+S\+DF$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{classSphereSDF__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classSphereSDF_a87b40869b91424d85692216a3268289b}\label{classSphereSDF_a87b40869b91424d85692216a3268289b}} +\hyperlink{classSphereSDF_a87b40869b91424d85692216a3268289b}{Sphere\+S\+DF} () +\begin{DoxyCompactList}\small\item\em Disallowed weak construction. Use one of the full constructors. \end{DoxyCompactList}\item +\hyperlink{classSphereSDF_a3e555062b1b20c1729a9f4ab6136add4}{Sphere\+S\+DF} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+center, const T \&a\+\_\+radius, const bool a\+\_\+flip\+Inside) +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_a2c25f14a19fcb910cd4d48af7123185a}\label{classSphereSDF_a2c25f14a19fcb910cd4d48af7123185a}} +\hyperlink{classSphereSDF_a2c25f14a19fcb910cd4d48af7123185a}{Sphere\+S\+DF} (const \hyperlink{classSphereSDF}{Sphere\+S\+DF} \&a\+\_\+other) +\begin{DoxyCompactList}\small\item\em Copy constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_ab5980286d17bb9da7425b4d9d4045850}\label{classSphereSDF_ab5980286d17bb9da7425b4d9d4045850}} +virtual \hyperlink{classSphereSDF_ab5980286d17bb9da7425b4d9d4045850}{$\sim$\+Sphere\+S\+DF} ()=default +\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_a82922ae162a9b96279cc4d0d866b303d}\label{classSphereSDF_a82922ae162a9b96279cc4d0d866b303d}} +const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classSphereSDF_a82922ae162a9b96279cc4d0d866b303d}{get\+Center} () const noexcept +\begin{DoxyCompactList}\small\item\em Get center. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_a4f3a9220bfe2fc817131f655ce6f30cd}\label{classSphereSDF_a4f3a9220bfe2fc817131f655ce6f30cd}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classSphereSDF_a4f3a9220bfe2fc817131f655ce6f30cd}{get\+Center} () noexcept +\begin{DoxyCompactList}\small\item\em Get center. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_a2cdc1f42f3de4c0ca017571910fbe72c}\label{classSphereSDF_a2cdc1f42f3de4c0ca017571910fbe72c}} +const T \& \hyperlink{classSphereSDF_a2cdc1f42f3de4c0ca017571910fbe72c}{get\+Radius} () const noexcept +\begin{DoxyCompactList}\small\item\em Get radius. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_a09245289037ae77adf204160c0d5b9cc}\label{classSphereSDF_a09245289037ae77adf204160c0d5b9cc}} +T \& \hyperlink{classSphereSDF_a09245289037ae77adf204160c0d5b9cc}{get\+Radius} () noexcept +\begin{DoxyCompactList}\small\item\em Get radius. \end{DoxyCompactList}\item +virtual T \hyperlink{classSphereSDF_a9b0c5f0b1af2c4b62bee1c873e0158e8}{signed\+Distance} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+point) const noexcept override +\begin{DoxyCompactList}\small\item\em Signed distance function for sphere. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classSphereSDF_ab3caacb26a72b3ada01f09a248f5cb83}\label{classSphereSDF_ab3caacb26a72b3ada01f09a248f5cb83}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classSphereSDF_ab3caacb26a72b3ada01f09a248f5cb83}{m\+\_\+center} +\begin{DoxyCompactList}\small\item\em Sphere center. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_ac4b0f786ea2b53530512ce3fa4e7bdbd}\label{classSphereSDF_ac4b0f786ea2b53530512ce3fa4e7bdbd}} +T \hyperlink{classSphereSDF_ac4b0f786ea2b53530512ce3fa4e7bdbd}{m\+\_\+radius} +\begin{DoxyCompactList}\small\item\em Sphere radius. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classSphereSDF_a9a32a668648c166b41c5d1c3981c9579}\label{classSphereSDF_a9a32a668648c166b41c5d1c3981c9579}} +bool \hyperlink{classSphereSDF_a9a32a668648c166b41c5d1c3981c9579}{m\+\_\+flip\+Inside} +\begin{DoxyCompactList}\small\item\em For flipping sign. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Sphere\+S\+D\+F$<$ T $>$} + +Signed distance field for sphere. + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classSphereSDF_a3e555062b1b20c1729a9f4ab6136add4}\label{classSphereSDF_a3e555062b1b20c1729a9f4ab6136add4}} +\index{Sphere\+S\+DF@{Sphere\+S\+DF}!Sphere\+S\+DF@{Sphere\+S\+DF}} +\index{Sphere\+S\+DF@{Sphere\+S\+DF}!Sphere\+S\+DF@{Sphere\+S\+DF}} +\subsubsection{\texorpdfstring{Sphere\+S\+D\+F()}{SphereSDF()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classSphereSDF}{Sphere\+S\+DF}$<$ T $>$\+::\hyperlink{classSphereSDF}{Sphere\+S\+DF} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+center, }\item[{const T \&}]{a\+\_\+radius, }\item[{const bool}]{a\+\_\+flip\+Inside }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Default constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+center} & Sphere center \\ +\hline +\mbox{\tt in} & {\em a\+\_\+radius} & Sphere radius \\ +\hline +\mbox{\tt in} & {\em a\+\_\+flip\+Inside} & Flip inside or not \\ +\hline +\end{DoxyParams} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classSphereSDF_a9b0c5f0b1af2c4b62bee1c873e0158e8}\label{classSphereSDF_a9b0c5f0b1af2c4b62bee1c873e0158e8}} +\index{Sphere\+S\+DF@{Sphere\+S\+DF}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Sphere\+S\+DF@{Sphere\+S\+DF}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +virtual T \hyperlink{classSphereSDF}{Sphere\+S\+DF}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [override]}, {\ttfamily [virtual]}, {\ttfamily [noexcept]}} + + + +Signed distance function for sphere. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & Position. \\ +\hline +\end{DoxyParams} + + +Implements \hyperlink{classSignedDistanceFunction_af5912280ca51dc21a2d6949a30ec7d21}{Signed\+Distance\+Function$<$ T $>$}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__AnalyticDistanceFunctions_8hpp}{E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classSphereSDF__coll__graph.md5 b/docs/doxygen/latex/classSphereSDF__coll__graph.md5 new file mode 100644 index 00000000..581dfe86 --- /dev/null +++ b/docs/doxygen/latex/classSphereSDF__coll__graph.md5 @@ -0,0 +1 @@ +e1a5ac238945088c09b467bbedfa370b \ No newline at end of file diff --git a/docs/doxygen/latex/classSphereSDF__coll__graph.pdf b/docs/doxygen/latex/classSphereSDF__coll__graph.pdf new file mode 100644 index 00000000..d5487881 Binary files /dev/null and b/docs/doxygen/latex/classSphereSDF__coll__graph.pdf differ diff --git a/docs/doxygen/latex/classSphereSDF__inherit__graph.md5 b/docs/doxygen/latex/classSphereSDF__inherit__graph.md5 new file mode 100644 index 00000000..ad411508 --- /dev/null +++ b/docs/doxygen/latex/classSphereSDF__inherit__graph.md5 @@ -0,0 +1 @@ +c7dcb382970bc33fd3d879854e8a7a2d \ No newline at end of file diff --git a/docs/doxygen/latex/classSphereSDF__inherit__graph.pdf b/docs/doxygen/latex/classSphereSDF__inherit__graph.pdf new file mode 100644 index 00000000..d5487881 Binary files /dev/null and b/docs/doxygen/latex/classSphereSDF__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classTransformOp.tex b/docs/doxygen/latex/classTransformOp.tex new file mode 100644 index 00000000..46fa0a26 --- /dev/null +++ b/docs/doxygen/latex/classTransformOp.tex @@ -0,0 +1,68 @@ +\hypertarget{classTransformOp}{}\section{Transform\+Op$<$ T $>$ Class Template Reference} +\label{classTransformOp}\index{Transform\+Op$<$ T $>$@{Transform\+Op$<$ T $>$}} + + +Base class for transformation operators. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp$>$} + + + +Inheritance diagram for Transform\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=350pt]{classTransformOp__inherit__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classTransformOp_ab904cbdd373ca07e08b254163331b3b4}\label{classTransformOp_ab904cbdd373ca07e08b254163331b3b4}} +\hyperlink{classTransformOp_ab904cbdd373ca07e08b254163331b3b4}{Transform\+Op} ()=default +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classTransformOp_a556cc7f5bbe70ce148a0791b883eb58c}\label{classTransformOp_a556cc7f5bbe70ce148a0791b883eb58c}} +virtual \hyperlink{classTransformOp_a556cc7f5bbe70ce148a0791b883eb58c}{$\sim$\+Transform\+Op} ()=default +\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item +virtual \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classTransformOp_a61c1920daa9f55fd2ea9095cbcfa18b8}{transform} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+input\+Point) const noexcept=0 +\begin{DoxyCompactList}\small\item\em Transform input coordinate. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Transform\+Op$<$ T $>$} + +Base class for transformation operators. + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classTransformOp_a61c1920daa9f55fd2ea9095cbcfa18b8}\label{classTransformOp_a61c1920daa9f55fd2ea9095cbcfa18b8}} +\index{Transform\+Op@{Transform\+Op}!transform@{transform}} +\index{transform@{transform}!Transform\+Op@{Transform\+Op}} +\subsubsection{\texorpdfstring{transform()}{transform()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +virtual \hyperlink{classVec3T}{Vec3T}$<$T$>$ \hyperlink{classTransformOp}{Transform\+Op}$<$ T $>$\+::transform (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+input\+Point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}, {\ttfamily [noexcept]}} + + + +Transform input coordinate. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+input\+Point} & Input point \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns transformed point. +\end{DoxyReturn} + + +Implemented in \hyperlink{classRotateOp_aaffc25806ef6b9d7ea6651aa2bb9767c}{Rotate\+Op$<$ T $>$}, \hyperlink{classScaleOp_ac09e64516daa1b75111bd36dedfeeda9}{Scale\+Op$<$ T $>$}, and \hyperlink{classTranslateOp_a16941d9e52b02d39f9c92f6b23f61af6}{Translate\+Op$<$ T $>$}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classTransformOp__inherit__graph.md5 b/docs/doxygen/latex/classTransformOp__inherit__graph.md5 new file mode 100644 index 00000000..c184ea54 --- /dev/null +++ b/docs/doxygen/latex/classTransformOp__inherit__graph.md5 @@ -0,0 +1 @@ +af0822c381373b075dabae009cd54e0d \ No newline at end of file diff --git a/docs/doxygen/latex/classTransformOp__inherit__graph.pdf b/docs/doxygen/latex/classTransformOp__inherit__graph.pdf new file mode 100644 index 00000000..ad31eba7 Binary files /dev/null and b/docs/doxygen/latex/classTransformOp__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classTranslateOp.tex b/docs/doxygen/latex/classTranslateOp.tex new file mode 100644 index 00000000..a8174189 --- /dev/null +++ b/docs/doxygen/latex/classTranslateOp.tex @@ -0,0 +1,62 @@ +\hypertarget{classTranslateOp}{}\section{Translate\+Op$<$ T $>$ Class Template Reference} +\label{classTranslateOp}\index{Translate\+Op$<$ T $>$@{Translate\+Op$<$ T $>$}} + + +Translation operator. Can translate an input point. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp$>$} + + + +Inheritance diagram for Translate\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=178pt]{classTranslateOp__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for Translate\+Op$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=178pt]{classTranslateOp__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classTranslateOp_ab20f5a272d6cd34bf98fc23523913fc9}\label{classTranslateOp_ab20f5a272d6cd34bf98fc23523913fc9}} +\hyperlink{classTranslateOp_ab20f5a272d6cd34bf98fc23523913fc9}{Translate\+Op} () +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classTranslateOp_ac646a47f26119d8316533c91f3043864}\label{classTranslateOp_ac646a47f26119d8316533c91f3043864}} +\hyperlink{classTranslateOp_ac646a47f26119d8316533c91f3043864}{Translate\+Op} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+translation) +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classTranslateOp_ad96b4ec0f30fb98dbd684afef1bfff03}\label{classTranslateOp_ad96b4ec0f30fb98dbd684afef1bfff03}} +virtual \hyperlink{classTranslateOp_ad96b4ec0f30fb98dbd684afef1bfff03}{$\sim$\+Translate\+Op} ()=default +\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classTranslateOp_a16941d9e52b02d39f9c92f6b23f61af6}\label{classTranslateOp_a16941d9e52b02d39f9c92f6b23f61af6}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classTranslateOp_a16941d9e52b02d39f9c92f6b23f61af6}{transform} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+input\+Point) const noexcept override +\begin{DoxyCompactList}\small\item\em Transform input point. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classTranslateOp_a35f16c6a9cf4c03edffa19d86e73d27a}\label{classTranslateOp_a35f16c6a9cf4c03edffa19d86e73d27a}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classTranslateOp_a35f16c6a9cf4c03edffa19d86e73d27a}{m\+\_\+translation} +\begin{DoxyCompactList}\small\item\em Translation of input point. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Translate\+Op$<$ T $>$} + +Translation operator. Can translate an input point. + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}\item +Source/\hyperlink{EBGeometry__TransformOpsImplem_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classTranslateOp__coll__graph.md5 b/docs/doxygen/latex/classTranslateOp__coll__graph.md5 new file mode 100644 index 00000000..1a43f791 --- /dev/null +++ b/docs/doxygen/latex/classTranslateOp__coll__graph.md5 @@ -0,0 +1 @@ +ba80cb345da2c1a8ec1466c2bf313edc \ No newline at end of file diff --git a/docs/doxygen/latex/classTranslateOp__coll__graph.pdf b/docs/doxygen/latex/classTranslateOp__coll__graph.pdf new file mode 100644 index 00000000..4a806795 Binary files /dev/null and b/docs/doxygen/latex/classTranslateOp__coll__graph.pdf differ diff --git a/docs/doxygen/latex/classTranslateOp__inherit__graph.md5 b/docs/doxygen/latex/classTranslateOp__inherit__graph.md5 new file mode 100644 index 00000000..9f9afd89 --- /dev/null +++ b/docs/doxygen/latex/classTranslateOp__inherit__graph.md5 @@ -0,0 +1 @@ +2570f911b11401cfd5616bf7f7910d6b \ No newline at end of file diff --git a/docs/doxygen/latex/classTranslateOp__inherit__graph.pdf b/docs/doxygen/latex/classTranslateOp__inherit__graph.pdf new file mode 100644 index 00000000..4a806795 Binary files /dev/null and b/docs/doxygen/latex/classTranslateOp__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classUnion.tex b/docs/doxygen/latex/classUnion.tex new file mode 100644 index 00000000..fc2aba61 --- /dev/null +++ b/docs/doxygen/latex/classUnion.tex @@ -0,0 +1,119 @@ +\hypertarget{classUnion}{}\section{Union$<$ T $>$ Class Template Reference} +\label{classUnion}\index{Union$<$ T $>$@{Union$<$ T $>$}} + + +Distance function union. Computes the signed distance to the closest object of N non-\/overlapping objects. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Union.\+hpp$>$} + + + +Inheritance diagram for Union$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{classUnion__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for Union$<$ T $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{classUnion__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnion_a9e9d1d95ae54fa471c6f29e778239021}\label{classUnion_a9e9d1d95ae54fa471c6f29e778239021}} +using \hyperlink{classUnion_a9e9d1d95ae54fa471c6f29e778239021}{S\+DF} = \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnion_a2dea7d7ed6d5456f87feff0e02c99453}\label{classUnion_a2dea7d7ed6d5456f87feff0e02c99453}} +\hyperlink{classUnion_a2dea7d7ed6d5456f87feff0e02c99453}{Union} ()=delete +\begin{DoxyCompactList}\small\item\em Disallowed, use the full constructor. \end{DoxyCompactList}\item +\hyperlink{classUnion_a7f1a9e850f8965dc35e221b23a55e451}{Union} (const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classUnion_a9e9d1d95ae54fa471c6f29e778239021}{S\+DF} $>$ $>$ \&a\+\_\+distance\+Functions, const bool a\+\_\+flip\+Sign) +\begin{DoxyCompactList}\small\item\em Full constructor. Computes the signed distance. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnion_a5c4f15da1b35f6f6643d49ed18faa386}\label{classUnion_a5c4f15da1b35f6f6643d49ed18faa386}} +virtual \hyperlink{classUnion_a5c4f15da1b35f6f6643d49ed18faa386}{$\sim$\+Union} ()=default +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +T \hyperlink{classUnion_a08beffd354ca261e3d31bcb453951810}{signed\+Distance} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+point) const noexcept override +\begin{DoxyCompactList}\small\item\em Value function. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnion_a5d2f543272ab5fe25f6f5945ad1ef27f}\label{classUnion_a5d2f543272ab5fe25f6f5945ad1ef27f}} +std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const \hyperlink{classUnion_a9e9d1d95ae54fa471c6f29e778239021}{S\+DF} $>$ $>$ \hyperlink{classUnion_a5d2f543272ab5fe25f6f5945ad1ef27f}{m\+\_\+distance\+Functions} +\begin{DoxyCompactList}\small\item\em List of distance functions. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnion_a53b9705419030572836a540e7fa3752f}\label{classUnion_a53b9705419030572836a540e7fa3752f}} +bool \hyperlink{classUnion_a53b9705419030572836a540e7fa3752f}{m\+\_\+flip\+Sign} +\begin{DoxyCompactList}\small\item\em Hook for turning inside to outside. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Union$<$ T $>$} + +Distance function union. Computes the signed distance to the closest object of N non-\/overlapping objects. + +\begin{DoxyNote}{Note} +This class only makes sense if the object do not overlap. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classUnion_a7f1a9e850f8965dc35e221b23a55e451}\label{classUnion_a7f1a9e850f8965dc35e221b23a55e451}} +\index{Union@{Union}!Union@{Union}} +\index{Union@{Union}!Union@{Union}} +\subsubsection{\texorpdfstring{Union()}{Union()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classUnion}{Union}$<$ T $>$\+::\hyperlink{classUnion}{Union} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classUnion_a9e9d1d95ae54fa471c6f29e778239021}{S\+DF} $>$ $>$ \&}]{a\+\_\+distance\+Functions, }\item[{const bool}]{a\+\_\+flip\+Sign }\end{DoxyParamCaption})} + + + +Full constructor. Computes the signed distance. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+distance\+Functions} & Distance functions \\ +\hline +\mbox{\tt in} & {\em a\+\_\+flip\+Sign} & Hook for turning inside to outside \\ +\hline +\end{DoxyParams} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classUnion_a08beffd354ca261e3d31bcb453951810}\label{classUnion_a08beffd354ca261e3d31bcb453951810}} +\index{Union@{Union}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Union@{Union}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classUnion}{Union}$<$ T $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}, {\ttfamily [noexcept]}} + + + +Value function. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point. \\ +\hline +\end{DoxyParams} + + +Implements \hyperlink{classSignedDistanceFunction_af5912280ca51dc21a2d6949a30ec7d21}{Signed\+Distance\+Function$<$ T $>$}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp}\item +Source/\hyperlink{EBGeometry__UnionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classUnionBVH.tex b/docs/doxygen/latex/classUnionBVH.tex new file mode 100644 index 00000000..07590de3 --- /dev/null +++ b/docs/doxygen/latex/classUnionBVH.tex @@ -0,0 +1,180 @@ +\hypertarget{classUnionBVH}{}\section{Union\+B\+VH$<$ T, BV, K $>$ Class Template Reference} +\label{classUnionBVH}\index{Union\+B\+V\+H$<$ T, B\+V, K $>$@{Union\+B\+V\+H$<$ T, B\+V, K $>$}} + + +Distance function union using B\+V\+Hs. Computes the signed distance to the closest object of N non-\/overlapping objects. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp$>$} + + + +Inheritance diagram for Union\+B\+VH$<$ T, BV, K $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{classUnionBVH__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for Union\+B\+VH$<$ T, BV, K $>$\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{classUnionBVH__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}\label{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}} +using \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} = \hyperlink{classSignedDistanceFunction}{Signed\+Distance\+Function}$<$ T $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}\label{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}} +using \hyperlink{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}{B\+V\+Constructor} = E\+B\+Geometry\+::\+B\+V\+H\+::\+B\+V\+ConstructorT$<$ \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF}, BV $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. This is a std\+::function$<$\+B\+V(\+S\+D\+F)$>$, i.\+e. a function which returns a bounding volume for an S\+DF. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnionBVH_aa2d9a2e95e58a0d7dfb2b92283626cac}\label{classUnionBVH_aa2d9a2e95e58a0d7dfb2b92283626cac}} +\hyperlink{classUnionBVH_aa2d9a2e95e58a0d7dfb2b92283626cac}{Union\+B\+VH} ()=delete +\begin{DoxyCompactList}\small\item\em Disallowed, use the full constructor. \end{DoxyCompactList}\item +\hyperlink{classUnionBVH_a6a0a50fcddc59dbb1c9b9444b0fce117}{Union\+B\+VH} (const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} $>$ $>$ \&a\+\_\+distance\+Functions, const bool a\+\_\+flip\+Sign) +\begin{DoxyCompactList}\small\item\em Partial constructor. Associates distance functions but does not build \hyperlink{namespaceBVH}{B\+VH} tree. \end{DoxyCompactList}\item +\hyperlink{classUnionBVH_a9eb2c19a0fdc645e068c09398d3dd0f3}{Union\+B\+VH} (const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} $>$ $>$ \&a\+\_\+distance\+Functions, const bool a\+\_\+flip\+Sign, const \hyperlink{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}{B\+V\+Constructor} \&a\+\_\+bv\+Constructor) +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +void \hyperlink{classUnionBVH_a97769f4c449610b681a70b93c99a40ca}{build\+Tree} (const \hyperlink{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}{B\+V\+Constructor} \&a\+\_\+bv\+Constructor) +\begin{DoxyCompactList}\small\item\em Build \hyperlink{namespaceBVH}{B\+VH} tree for the input objects. User must supply a partitioner and a BV constructor for the S\+DF objects. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_aac0a1f16ad0a273e72c8bcd15b80f336}\label{classUnionBVH_aac0a1f16ad0a273e72c8bcd15b80f336}} +virtual \hyperlink{classUnionBVH_aac0a1f16ad0a273e72c8bcd15b80f336}{$\sim$\+Union\+B\+VH} ()=default +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +T \hyperlink{classUnionBVH_a9681fdc161e2e077a33caaddb78fb4ba}{signed\+Distance} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+point) const noexcept override +\begin{DoxyCompactList}\small\item\em Value function. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Types} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnionBVH_ac23ace50239fbe00130df2a7e42af995}\label{classUnionBVH_ac23ace50239fbe00130df2a7e42af995}} +using \hyperlink{classUnionBVH_ac23ace50239fbe00130df2a7e42af995}{S\+D\+F\+List} = std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} $>$ $>$ +\begin{DoxyCompactList}\small\item\em Alias for cutting down on typing. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_a9fd434576440274a81c0251962d7ff7e}\label{classUnionBVH_a9fd434576440274a81c0251962d7ff7e}} +using \hyperlink{classUnionBVH_a9fd434576440274a81c0251962d7ff7e}{Builder\+Node} = E\+B\+Geometry\+::\+B\+V\+H\+::\+NodeT$<$ T, \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF}, BV, K $>$ +\begin{DoxyCompactList}\small\item\em Builder node type in \hyperlink{namespaceBVH}{B\+VH} tree. Tree is constructed in \char`\"{}full\char`\"{}. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_a25cac5a9dc5396299f06399434ebe212}\label{classUnionBVH_a25cac5a9dc5396299f06399434ebe212}} +using \hyperlink{classUnionBVH_a25cac5a9dc5396299f06399434ebe212}{Linear\+Node} = E\+B\+Geometry\+::\+B\+V\+H\+::\+Linear\+B\+VH$<$ T, \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF}, BV, K $>$ +\begin{DoxyCompactList}\small\item\em Node type in \hyperlink{namespaceBVH}{B\+VH} tree. We use a flattened tree. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classUnionBVH_a026a103a13d0b04bedb6dabd50e4da69}\label{classUnionBVH_a026a103a13d0b04bedb6dabd50e4da69}} +std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} $>$ $>$ \hyperlink{classUnionBVH_a026a103a13d0b04bedb6dabd50e4da69}{m\+\_\+distance\+Functions} +\begin{DoxyCompactList}\small\item\em List of distance functions. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_ad59be4f96e0f020c28f4677dcb94a004}\label{classUnionBVH_ad59be4f96e0f020c28f4677dcb94a004}} +std\+::shared\+\_\+ptr$<$ \hyperlink{classUnionBVH_a25cac5a9dc5396299f06399434ebe212}{Linear\+Node} $>$ \hyperlink{classUnionBVH_ad59be4f96e0f020c28f4677dcb94a004}{m\+\_\+root\+Node} +\begin{DoxyCompactList}\small\item\em Root node for \hyperlink{namespaceBVH}{B\+VH} tree. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_a2c3a008bd61f225a83c959f2280b9649}\label{classUnionBVH_a2c3a008bd61f225a83c959f2280b9649}} +bool \hyperlink{classUnionBVH_a2c3a008bd61f225a83c959f2280b9649}{m\+\_\+is\+Good} +\begin{DoxyCompactList}\small\item\em Is good or not. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classUnionBVH_a0782d93bd0a7bff7580a99e6fef285c7}\label{classUnionBVH_a0782d93bd0a7bff7580a99e6fef285c7}} +bool \hyperlink{classUnionBVH_a0782d93bd0a7bff7580a99e6fef285c7}{m\+\_\+flip\+Sign} +\begin{DoxyCompactList}\small\item\em Hook for turning inside to outside. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T, class BV, int K$>$\newline +class Union\+B\+V\+H$<$ T, B\+V, K $>$} + +Distance function union using B\+V\+Hs. Computes the signed distance to the closest object of N non-\/overlapping objects. + +\begin{DoxyNote}{Note} +This class only makes sense if the object do not overlap. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classUnionBVH_a6a0a50fcddc59dbb1c9b9444b0fce117}\label{classUnionBVH_a6a0a50fcddc59dbb1c9b9444b0fce117}} +\index{Union\+B\+VH@{Union\+B\+VH}!Union\+B\+VH@{Union\+B\+VH}} +\index{Union\+B\+VH@{Union\+B\+VH}!Union\+B\+VH@{Union\+B\+VH}} +\subsubsection{\texorpdfstring{Union\+B\+V\+H()}{UnionBVH()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T , class BV , int K$>$ \\ +\hyperlink{classUnionBVH}{Union\+B\+VH}$<$ T, BV, K $>$\+::\hyperlink{classUnionBVH}{Union\+B\+VH} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} $>$ $>$ \&}]{a\+\_\+distance\+Functions, }\item[{const bool}]{a\+\_\+flip\+Sign }\end{DoxyParamCaption})} + + + +Partial constructor. Associates distance functions but does not build \hyperlink{namespaceBVH}{B\+VH} tree. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+distance\+Functions} & Signed distance functions. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+flip\+Sign} & Hook for turning inside to outside \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classUnionBVH_a9eb2c19a0fdc645e068c09398d3dd0f3}\label{classUnionBVH_a9eb2c19a0fdc645e068c09398d3dd0f3}} +\index{Union\+B\+VH@{Union\+B\+VH}!Union\+B\+VH@{Union\+B\+VH}} +\index{Union\+B\+VH@{Union\+B\+VH}!Union\+B\+VH@{Union\+B\+VH}} +\subsubsection{\texorpdfstring{Union\+B\+V\+H()}{UnionBVH()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T , class BV , int K$>$ \\ +\hyperlink{classUnionBVH}{Union\+B\+VH}$<$ T, BV, K $>$\+::\hyperlink{classUnionBVH}{Union\+B\+VH} (\begin{DoxyParamCaption}\item[{const std\+::vector$<$ std\+::shared\+\_\+ptr$<$ \hyperlink{classUnionBVH_a5d1d64d7cabf1000fc1a804d06e103cc}{S\+DF} $>$ $>$ \&}]{a\+\_\+distance\+Functions, }\item[{const bool}]{a\+\_\+flip\+Sign, }\item[{const \hyperlink{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}{B\+V\+Constructor} \&}]{a\+\_\+bv\+Constructor }\end{DoxyParamCaption})} + + + +Full constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+distance\+Functions} & Signed distance functions. \\ +\hline +\mbox{\tt in} & {\em a\+\_\+flip\+Sign} & Hook for turning inside to outside \\ +\hline +\mbox{\tt in} & {\em a\+\_\+bv\+Constructor} & Bounding volume constructor. \\ +\hline +\end{DoxyParams} + + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classUnionBVH_a97769f4c449610b681a70b93c99a40ca}\label{classUnionBVH_a97769f4c449610b681a70b93c99a40ca}} +\index{Union\+B\+VH@{Union\+B\+VH}!build\+Tree@{build\+Tree}} +\index{build\+Tree@{build\+Tree}!Union\+B\+VH@{Union\+B\+VH}} +\subsubsection{\texorpdfstring{build\+Tree()}{buildTree()}} +{\footnotesize\ttfamily template$<$class T , class BV , int K$>$ \\ +void \hyperlink{classUnionBVH}{Union\+B\+VH}$<$ T, BV, K $>$\+::build\+Tree (\begin{DoxyParamCaption}\item[{const \hyperlink{classUnionBVH_a09561e026cd6a7da1a7dbdbad5eea2c2}{B\+V\+Constructor} \&}]{a\+\_\+bv\+Constructor }\end{DoxyParamCaption})} + + + +Build \hyperlink{namespaceBVH}{B\+VH} tree for the input objects. User must supply a partitioner and a BV constructor for the S\+DF objects. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+bv\+Constructor} & Constructor for building a bounding volume that encloses an object. \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classUnionBVH_a9681fdc161e2e077a33caaddb78fb4ba}\label{classUnionBVH_a9681fdc161e2e077a33caaddb78fb4ba}} +\index{Union\+B\+VH@{Union\+B\+VH}!signed\+Distance@{signed\+Distance}} +\index{signed\+Distance@{signed\+Distance}!Union\+B\+VH@{Union\+B\+VH}} +\subsubsection{\texorpdfstring{signed\+Distance()}{signedDistance()}} +{\footnotesize\ttfamily template$<$class T , class BV , int K$>$ \\ +T \hyperlink{classUnionBVH}{Union\+B\+VH}$<$ T, BV, K $>$\+::signed\+Distance (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+point }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}, {\ttfamily [noexcept]}} + + + +Value function. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+point} & 3D point. \\ +\hline +\end{DoxyParams} + + +Implements \hyperlink{classSignedDistanceFunction_af5912280ca51dc21a2d6949a30ec7d21}{Signed\+Distance\+Function$<$ T $>$}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp}\item +Source/\hyperlink{EBGeometry__UnionBVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classUnionBVH__coll__graph.md5 b/docs/doxygen/latex/classUnionBVH__coll__graph.md5 new file mode 100644 index 00000000..bf81be02 --- /dev/null +++ b/docs/doxygen/latex/classUnionBVH__coll__graph.md5 @@ -0,0 +1 @@ +c4e0f8455553a7f5c13f73c010407e34 \ No newline at end of file diff --git a/docs/doxygen/latex/classUnionBVH__coll__graph.pdf b/docs/doxygen/latex/classUnionBVH__coll__graph.pdf new file mode 100644 index 00000000..6d09f1bf Binary files /dev/null and b/docs/doxygen/latex/classUnionBVH__coll__graph.pdf differ diff --git a/docs/doxygen/latex/classUnionBVH__inherit__graph.md5 b/docs/doxygen/latex/classUnionBVH__inherit__graph.md5 new file mode 100644 index 00000000..5526dae2 --- /dev/null +++ b/docs/doxygen/latex/classUnionBVH__inherit__graph.md5 @@ -0,0 +1 @@ +4882037545377e04a18daa266ede5211 \ No newline at end of file diff --git a/docs/doxygen/latex/classUnionBVH__inherit__graph.pdf b/docs/doxygen/latex/classUnionBVH__inherit__graph.pdf new file mode 100644 index 00000000..6d09f1bf Binary files /dev/null and b/docs/doxygen/latex/classUnionBVH__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classUnion__coll__graph.md5 b/docs/doxygen/latex/classUnion__coll__graph.md5 new file mode 100644 index 00000000..c67dff12 --- /dev/null +++ b/docs/doxygen/latex/classUnion__coll__graph.md5 @@ -0,0 +1 @@ +83cc046ffd0eec0795792bfa552653b9 \ No newline at end of file diff --git a/docs/doxygen/latex/classUnion__coll__graph.pdf b/docs/doxygen/latex/classUnion__coll__graph.pdf new file mode 100644 index 00000000..2ce2ca18 Binary files /dev/null and b/docs/doxygen/latex/classUnion__coll__graph.pdf differ diff --git a/docs/doxygen/latex/classUnion__inherit__graph.md5 b/docs/doxygen/latex/classUnion__inherit__graph.md5 new file mode 100644 index 00000000..82ceb939 --- /dev/null +++ b/docs/doxygen/latex/classUnion__inherit__graph.md5 @@ -0,0 +1 @@ +6d11435472018ef2dd3f298b7cde409d \ No newline at end of file diff --git a/docs/doxygen/latex/classUnion__inherit__graph.pdf b/docs/doxygen/latex/classUnion__inherit__graph.pdf new file mode 100644 index 00000000..2ce2ca18 Binary files /dev/null and b/docs/doxygen/latex/classUnion__inherit__graph.pdf differ diff --git a/docs/doxygen/latex/classVec2T.tex b/docs/doxygen/latex/classVec2T.tex new file mode 100644 index 00000000..36d2fc53 --- /dev/null +++ b/docs/doxygen/latex/classVec2T.tex @@ -0,0 +1,323 @@ +\hypertarget{classVec2T}{}\section{Vec2T$<$ T $>$ Class Template Reference} +\label{classVec2T}\index{Vec2\+T$<$ T $>$@{Vec2\+T$<$ T $>$}} + + +Two-\/dimensional vector class with arithmetic operators. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Vec.\+hpp$>$} + +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classVec2T_a4aa6e0bd3922abd84449278429a03418}\label{classVec2T_a4aa6e0bd3922abd84449278429a03418}} +\hyperlink{classVec2T_a4aa6e0bd3922abd84449278429a03418}{Vec2T} () +\begin{DoxyCompactList}\small\item\em Default constructor. Sets the vector to the zero vector. \end{DoxyCompactList}\item +\hyperlink{classVec2T_a15e8a7710ad0a1de03a34660ae54e96e}{Vec2T} (const \hyperlink{classVec2T}{Vec2T} \&u) +\begin{DoxyCompactList}\small\item\em Copy constructor. \end{DoxyCompactList}\item +\hyperlink{classVec2T_a0721d6450bab8361f76ee63826f9e8f4}{Vec2T} (const T \&a\+\_\+x, const T \&a\+\_\+y) +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_a15a9bac13b94b58f0907443bc551dbee}\label{classVec2T_a15a9bac13b94b58f0907443bc551dbee}} +\hyperlink{classVec2T_a15a9bac13b94b58f0907443bc551dbee}{$\sim$\+Vec2T} ()=default +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T_ab44f1c41a9a73757430403ea47e1ff33}{operator=} (const \hyperlink{classVec2T}{Vec2T} \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Assignment operator. Sets this.\+x = a\+\_\+other.\+x and this.\+y = a\+\_\+other.\+y. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a0ea1e944e722dfdc3a37ebd7ef922eea}{operator+} (const \hyperlink{classVec2T}{Vec2T} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Addition operator. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a788b057579c3c92068e15595d7781734}{operator-\/} (const \hyperlink{classVec2T}{Vec2T} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Subtraction operator. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_aa8176b9c1a1331f1b0358188cd04883f}\label{classVec2T_aa8176b9c1a1331f1b0358188cd04883f}} +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_aa8176b9c1a1331f1b0358188cd04883f}{operator-\/} () const noexcept +\begin{DoxyCompactList}\small\item\em Negation operator. Returns a new Vec2\+T$<$\+T$>$ with negated components. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a1047f21e704d25c4bc5980cd13c00e1c}{operator$\ast$} (const T \&s) const noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a3cc96a6930ed713df486d177490e1e5c}{operator/} (const T \&s) const noexcept +\begin{DoxyCompactList}\small\item\em Division operator. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T_a6f5fbfd88dc2eac09f17fb999c76e5b0}{operator+=} (const \hyperlink{classVec2T}{Vec2T} \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Addition operator. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T_a6c98f1e7b2bb5479e3616fbda7124313}{operator-\/=} (const \hyperlink{classVec2T}{Vec2T} \&a\+\_\+other) noexcept +\begin{DoxyCompactList}\small\item\em Subtraction operator. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T_ad7525f66bf0c609e79e1d2590af6be0c}{operator$\ast$=} (const T \&s) noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator. \end{DoxyCompactList}\item +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T_a84e4a2ee2d84fbb42c84d0638ff929f8}{operator/=} (const T \&s) noexcept +\begin{DoxyCompactList}\small\item\em Division operator operator. \end{DoxyCompactList}\item +T \hyperlink{classVec2T_ab7ed0195847b7a1037051402967780a3}{dot} (const \hyperlink{classVec2T}{Vec2T} \&a\+\_\+other) const noexcept +\begin{DoxyCompactList}\small\item\em Dot product operator. \end{DoxyCompactList}\item +T \hyperlink{classVec2T_ad7965b8d549a5f9d08cab43760dab56b}{length} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute length of vector. \end{DoxyCompactList}\item +T \hyperlink{classVec2T_a9beb3ae1b8b76926f8864686cb6a2ace}{length2} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute square of vector. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classVec2T_a3c243787a7817ce09946691cdf14d0e0}\label{classVec2T_a3c243787a7817ce09946691cdf14d0e0}} +static constexpr \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a3c243787a7817ce09946691cdf14d0e0}{zero} () noexcept +\begin{DoxyCompactList}\small\item\em Return av vector with x = y = 0. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_a9103ce94a3efa9e85cb732fb68af744e}\label{classVec2T_a9103ce94a3efa9e85cb732fb68af744e}} +static constexpr \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a9103ce94a3efa9e85cb732fb68af744e}{one} () noexcept +\begin{DoxyCompactList}\small\item\em Return av vector with x = y = 1. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_aca5161a674a3546a8c9d5543537548a3}\label{classVec2T_aca5161a674a3546a8c9d5543537548a3}} +static constexpr \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_aca5161a674a3546a8c9d5543537548a3}{min} () noexcept +\begin{DoxyCompactList}\small\item\em Return minimum possible representative vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_a1211175344f9ee8bc0fd4ac2589799d8}\label{classVec2T_a1211175344f9ee8bc0fd4ac2589799d8}} +static constexpr \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a1211175344f9ee8bc0fd4ac2589799d8}{max} () noexcept +\begin{DoxyCompactList}\small\item\em Return maximum possible representative vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_a28b453ff4fd4ede74e401454b67f73d6}\label{classVec2T_a28b453ff4fd4ede74e401454b67f73d6}} +static constexpr \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T_a28b453ff4fd4ede74e401454b67f73d6}{infinity} () noexcept +\begin{DoxyCompactList}\small\item\em Return a vector with inf components. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classVec2T_a66ea295b52114b22de1f76cce1aa7f51}\label{classVec2T_a66ea295b52114b22de1f76cce1aa7f51}} +T \hyperlink{classVec2T_a66ea295b52114b22de1f76cce1aa7f51}{x} +\begin{DoxyCompactList}\small\item\em First component in the vector. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec2T_a71ce5251d618a6dbd4e0e7a0f867b6cf}\label{classVec2T_a71ce5251d618a6dbd4e0e7a0f867b6cf}} +T \hyperlink{classVec2T_a71ce5251d618a6dbd4e0e7a0f867b6cf}{y} +\begin{DoxyCompactList}\small\item\em Second component in the vector. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Vec2\+T$<$ T $>$} + +Two-\/dimensional vector class with arithmetic operators. + +The class has a public-\/only interface. To change it\textquotesingle{}s components one can call the member functions, or set components directly, e.\+g. vec.\+x = 5.\+0 \begin{DoxyNote}{Note} +\hyperlink{classVec2T}{Vec2T} is a templated class primarily used with D\+C\+EL grids. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classVec2T_a15e8a7710ad0a1de03a34660ae54e96e}\label{classVec2T_a15e8a7710ad0a1de03a34660ae54e96e}} +\index{Vec2T@{Vec2T}!Vec2T@{Vec2T}} +\index{Vec2T@{Vec2T}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{Vec2\+T()}{Vec2T()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::\hyperlink{classVec2T}{Vec2T} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Copy constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector\\ +\hline +\end{DoxyParams} +Sets $\ast$this = u \mbox{\Hypertarget{classVec2T_a0721d6450bab8361f76ee63826f9e8f4}\label{classVec2T_a0721d6450bab8361f76ee63826f9e8f4}} +\index{Vec2T@{Vec2T}!Vec2T@{Vec2T}} +\index{Vec2T@{Vec2T}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{Vec2\+T()}{Vec2T()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::\hyperlink{classVec2T}{Vec2T} (\begin{DoxyParamCaption}\item[{const T \&}]{a\+\_\+x, }\item[{const T \&}]{a\+\_\+y }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x} & First vector component \\ +\hline +\mbox{\tt in} & {\em a\+\_\+y} & Second vector component\\ +\hline +\end{DoxyParams} +Sets this-\/$>$x = a\+\_\+x and this-\/$>$y = a\+\_\+y + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classVec2T_ab7ed0195847b7a1037051402967780a3}\label{classVec2T_ab7ed0195847b7a1037051402967780a3}} +\index{Vec2T@{Vec2T}!dot@{dot}} +\index{dot@{dot}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{dot()}{dot()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::dot (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Dot product operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & other vector\\ +\hline +\end{DoxyParams} +Returns the dot product, i.\+e. this-\/$>$x$\ast$a\+\_\+other.x + this-\/$>$y+a\+\_\+other.y \mbox{\Hypertarget{classVec2T_ad7965b8d549a5f9d08cab43760dab56b}\label{classVec2T_ad7965b8d549a5f9d08cab43760dab56b}} +\index{Vec2T@{Vec2T}!length@{length}} +\index{length@{length}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{length()}{length()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::length (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute length of vector. + +\begin{DoxyReturn}{Returns} +Returns length of vector, i.\+e. sqrt\mbox{[}(this-\/$>$x)$\ast$(this-\/$>$x) + (this-\/$>$y)$\ast$(this-\/$>$y)\mbox{]} +\end{DoxyReturn} +\mbox{\Hypertarget{classVec2T_a9beb3ae1b8b76926f8864686cb6a2ace}\label{classVec2T_a9beb3ae1b8b76926f8864686cb6a2ace}} +\index{Vec2T@{Vec2T}!length2@{length2}} +\index{length2@{length2}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{length2()}{length2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::length2 (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute square of vector. + +\begin{DoxyReturn}{Returns} +Returns length of vector, i.\+e. (this-\/$>$x)$\ast$(this-\/$>$x) + (this-\/$>$y)$\ast$(this-\/$>$y) +\end{DoxyReturn} +\mbox{\Hypertarget{classVec2T_a1047f21e704d25c4bc5980cd13c00e1c}\label{classVec2T_a1047f21e704d25c4bc5980cd13c00e1c}} +\index{Vec2T@{Vec2T}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator$\ast$ (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to be multiplied\\ +\hline +\end{DoxyParams} +Returns a new Vec2\+T$<$\+T$>$ with components x = s$\ast$this-\/$>$x (and same for y) \mbox{\Hypertarget{classVec2T_ad7525f66bf0c609e79e1d2590af6be0c}\label{classVec2T_ad7525f66bf0c609e79e1d2590af6be0c}} +\index{Vec2T@{Vec2T}!operator$\ast$=@{operator$\ast$=}} +\index{operator$\ast$=@{operator$\ast$=}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator$\ast$=()}{operator*=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator$\ast$= (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to multiply by\\ +\hline +\end{DoxyParams} +Returns ($\ast$this) with components this-\/$>$x = s$\ast$this-\/$>$x (and same for y) \mbox{\Hypertarget{classVec2T_a0ea1e944e722dfdc3a37ebd7ef922eea}\label{classVec2T_a0ea1e944e722dfdc3a37ebd7ef922eea}} +\index{Vec2T@{Vec2T}!operator+@{operator+}} +\index{operator+@{operator+}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator+()}{operator+()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator+ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Addition operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other vector\\ +\hline +\end{DoxyParams} +Returns a new object with component x = this-\/$>$x + a\+\_\+other.\+x (same for y-\/component) \mbox{\Hypertarget{classVec2T_a6f5fbfd88dc2eac09f17fb999c76e5b0}\label{classVec2T_a6f5fbfd88dc2eac09f17fb999c76e5b0}} +\index{Vec2T@{Vec2T}!operator+=@{operator+=}} +\index{operator+=@{operator+=}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator+=()}{operator+=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator+= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Addition operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other vector to add\\ +\hline +\end{DoxyParams} +Returns ($\ast$this) with components this-\/$>$x = this-\/$>$x + a\+\_\+other.\+x (and same for y) \mbox{\Hypertarget{classVec2T_a788b057579c3c92068e15595d7781734}\label{classVec2T_a788b057579c3c92068e15595d7781734}} +\index{Vec2T@{Vec2T}!operator-\/@{operator-\/}} +\index{operator-\/@{operator-\/}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator-\/()}{operator-()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator-\/ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Subtraction operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other vector\\ +\hline +\end{DoxyParams} +Returns a new object with component x = this-\/$>$x -\/ a\+\_\+other.\+x (same for y-\/component) \mbox{\Hypertarget{classVec2T_a6c98f1e7b2bb5479e3616fbda7124313}\label{classVec2T_a6c98f1e7b2bb5479e3616fbda7124313}} +\index{Vec2T@{Vec2T}!operator-\/=@{operator-\/=}} +\index{operator-\/=@{operator-\/=}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator-\/=()}{operator-=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator-\/= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Subtraction operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other vector to subtract\\ +\hline +\end{DoxyParams} +Returns ($\ast$this) with components this-\/$>$x = this-\/$>$x -\/ a\+\_\+other.\+x (and same for y) \mbox{\Hypertarget{classVec2T_a3cc96a6930ed713df486d177490e1e5c}\label{classVec2T_a3cc96a6930ed713df486d177490e1e5c}} +\index{Vec2T@{Vec2T}!operator/@{operator/}} +\index{operator/@{operator/}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator/ (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to be multiplied\\ +\hline +\end{DoxyParams} +Returns a new Vec2\+T$<$\+T$>$ with components x = (1/s)$\ast$this-\/$>$x (and same for y) \mbox{\Hypertarget{classVec2T_a84e4a2ee2d84fbb42c84d0638ff929f8}\label{classVec2T_a84e4a2ee2d84fbb42c84d0638ff929f8}} +\index{Vec2T@{Vec2T}!operator/=@{operator/=}} +\index{operator/=@{operator/=}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator/=()}{operator/=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator/= (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to divide by\\ +\hline +\end{DoxyParams} +Returns ($\ast$this) with components this-\/$>$x = (1/s)$\ast$this-\/$>$x (and same for y) \mbox{\Hypertarget{classVec2T_ab44f1c41a9a73757430403ea47e1ff33}\label{classVec2T_ab44f1c41a9a73757430403ea47e1ff33}} +\index{Vec2T@{Vec2T}!operator=@{operator=}} +\index{operator=@{operator=}!Vec2T@{Vec2T}} +\subsubsection{\texorpdfstring{operator=()}{operator=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec2T}{Vec2T}$<$ T $>$ \& \hyperlink{classVec2T}{Vec2T}$<$ T $>$\+::operator= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec2T}{Vec2T}$<$ T $>$ \&}]{a\+\_\+other }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Assignment operator. Sets this.\+x = a\+\_\+other.\+x and this.\+y = a\+\_\+other.\+y. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+other} & Other vector \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp}\item +Source/\hyperlink{EBGeometry__VecImplem_8hpp}{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/classVec3T.tex b/docs/doxygen/latex/classVec3T.tex new file mode 100644 index 00000000..4286c7aa --- /dev/null +++ b/docs/doxygen/latex/classVec3T.tex @@ -0,0 +1,601 @@ +\hypertarget{classVec3T}{}\section{Vec3T$<$ T $>$ Class Template Reference} +\label{classVec3T}\index{Vec3\+T$<$ T $>$@{Vec3\+T$<$ T $>$}} + + +Three-\/dimensional vector class with arithmetic operators. + + + + +{\ttfamily \#include $<$E\+B\+Geometry\+\_\+\+Vec.\+hpp$>$} + +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classVec3T_a919b1cabc678f8d71763e03fab500334}\label{classVec3T_a919b1cabc678f8d71763e03fab500334}} +\hyperlink{classVec3T_a919b1cabc678f8d71763e03fab500334}{Vec3T} () +\begin{DoxyCompactList}\small\item\em Default constructor. Sets the vector to the zero vector. \end{DoxyCompactList}\item +\hyperlink{classVec3T_ab328767434f527b25c110dc83a0cb7ee}{Vec3T} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&a\+\_\+u) +\begin{DoxyCompactList}\small\item\em Copy constructor. \end{DoxyCompactList}\item +\hyperlink{classVec3T_acc3573bc8c3232eb14a22ca833cbce30}{Vec3T} (const T \&a\+\_\+x, const T \&a\+\_\+y, const T \&a\+\_\+z) +\begin{DoxyCompactList}\small\item\em Full constructor. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec3T_a505fc5de8e213d1fc8e0df5f3b7a3dc7}\label{classVec3T_a505fc5de8e213d1fc8e0df5f3b7a3dc7}} +\hyperlink{classVec3T_a505fc5de8e213d1fc8e0df5f3b7a3dc7}{$\sim$\+Vec3T} ()=default +\begin{DoxyCompactList}\small\item\em Destructor (does nothing) \end{DoxyCompactList}\item +T \& \hyperlink{classVec3T_a098a19968b6c7b0b76c2572e5236a71a}{operator\mbox{[}$\,$\mbox{]}} (int i) noexcept +\begin{DoxyCompactList}\small\item\em Return component in vector. (i=0 =$>$ x and so on) \end{DoxyCompactList}\item +const T \& \hyperlink{classVec3T_ad09224c5f7e142059d75772c0cbd1990}{operator\mbox{[}$\,$\mbox{]}} (int i) const noexcept +\begin{DoxyCompactList}\small\item\em Return non-\/modifiable component in vector. (i=0 =$>$ x and so on) \end{DoxyCompactList}\item +bool \hyperlink{classVec3T_a715546682c26647643148a80087c4ab4}{operator==} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em Comparison operator. Returns true if all components are the same. \end{DoxyCompactList}\item +bool \hyperlink{classVec3T_aba830919c5020bb060f39fe9df6b7ca1}{operator$<$} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em \char`\"{}\+Smaller than\char`\"{} operator. \end{DoxyCompactList}\item +bool \hyperlink{classVec3T_af99810068907e4935ac38bc397ba1102}{operator$>$} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em \char`\"{}\+Greater than\char`\"{} operator. \end{DoxyCompactList}\item +bool \hyperlink{classVec3T_a266a34a83b9f23a391151be45a4e39f8}{operator$<$=} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em \char`\"{}\+Smaller or equal to\char`\"{} operator. \end{DoxyCompactList}\item +bool \hyperlink{classVec3T_a3296f8319642088e08bd2d3e253fcd64}{operator$>$=} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em \char`\"{}\+Greater or equal to\char`\"{} operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T_a34681a81b55b4e7ae818e01b5f27a3e0}{operator=} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Assignment operator. Sets components equal to the argument vector\textquotesingle{}s components. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_af1ab895de89a1a3143f58d2ce5d78bc2}{operator+} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em Addition operator. Returns a new vector with added compoments. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_ac00a70e55a93ecd8c60d29a129f8fbf3}{operator-\/} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em Subtraction operator. Returns a new vector with subtracted compoments. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec3T_a2d32936bb5a9ddc22152d301723bc3e0}\label{classVec3T_a2d32936bb5a9ddc22152d301723bc3e0}} +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_a2d32936bb5a9ddc22152d301723bc3e0}{operator-\/} () const noexcept +\begin{DoxyCompactList}\small\item\em Negation operator. Returns a vector with negated components. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_aa4768276707889db34a716e9e476b9f1}{operator$\ast$} (const T \&s) const noexcept +\begin{DoxyCompactList}\small\item\em Multiplication operator. Returns a vector with scalar multiplied components. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_a579db6fb2bed30b3f024d1a017d7a124}{operator$\ast$} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&s) const noexcept +\begin{DoxyCompactList}\small\item\em Component-\/wise multiplication operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_acc5973c1c82e51c597b47ba39870f528}{operator/} (const T \&s) const noexcept +\begin{DoxyCompactList}\small\item\em Division operator. Returns a vector with scalar divided components. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_a3c48111d27fb16cc3304e7aa2b4603fc}{operator/} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&v) const noexcept +\begin{DoxyCompactList}\small\item\em Component-\/wise division operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T_a7d06c56d8579d8b3695f43f62544f999}{operator+=} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Vector addition operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T_a8a580094450e167248f4ee089027fa40}{operator-\/=} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Vector subtraction operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T_a0448e51b7f785b14df47092929cb73a3}{operator$\ast$=} (const T \&s) noexcept +\begin{DoxyCompactList}\small\item\em Vector multiplication operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T_a9446e83162d3daee6133d12b354a3a41}{operator/=} (const T \&s) noexcept +\begin{DoxyCompactList}\small\item\em Vector division operator. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_ad0a0c9754ef8df1fa28abdaa01c246c4}{min} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Vector minimum function. Returns a new vector with componentwise minimums. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_ac126bbdaeff79e475327887bfa8aa62c}{max} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) noexcept +\begin{DoxyCompactList}\small\item\em Vector maximum function. Returns a new vector with componentwise maximums. \end{DoxyCompactList}\item +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_af628d2d42a93200a929bd54a1fe8353f}{cross} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em Vector cross product. \end{DoxyCompactList}\item +T \hyperlink{classVec3T_ab4bebdfbdc863826a1a7e86cad130ff8}{dot} (const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&u) const noexcept +\begin{DoxyCompactList}\small\item\em Vector dot product. \end{DoxyCompactList}\item +int \hyperlink{classVec3T_a292391c1f72ca66e100e7e70512ff9b1}{max\+Dir} (const bool a\+\_\+do\+Abs) const noexcept +\begin{DoxyCompactList}\small\item\em Return the direction which has the largest component (can be absolute) \end{DoxyCompactList}\item +T \hyperlink{classVec3T_a93c868b181e24a4f74702a8b8a36f815}{length} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute vector length. \end{DoxyCompactList}\item +T \hyperlink{classVec3T_aaed89aee434cfa0abd86fe33bff49b4e}{length2} () const noexcept +\begin{DoxyCompactList}\small\item\em Compute vector length squared. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classVec3T_af438ba5c8990b07e566bf7e48dcbcfb2}\label{classVec3T_af438ba5c8990b07e566bf7e48dcbcfb2}} +static constexpr \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_af438ba5c8990b07e566bf7e48dcbcfb2}{zero} () noexcept +\begin{DoxyCompactList}\small\item\em Return av vector with x = y = z = 0. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec3T_a82237dfeed4017e952c893817afc3827}\label{classVec3T_a82237dfeed4017e952c893817afc3827}} +static constexpr \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_a82237dfeed4017e952c893817afc3827}{one} () noexcept +\begin{DoxyCompactList}\small\item\em Return av vector with x = y = z = 1. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec3T_a4f27fdac2e6ac4feffe148bb8857f8bc}\label{classVec3T_a4f27fdac2e6ac4feffe148bb8857f8bc}} +static constexpr \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_a4f27fdac2e6ac4feffe148bb8857f8bc}{min} () noexcept +\begin{DoxyCompactList}\small\item\em Return a vector with minimum representable components. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec3T_af06b99bd905435060149a61a13f61546}\label{classVec3T_af06b99bd905435060149a61a13f61546}} +static constexpr \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_af06b99bd905435060149a61a13f61546}{max} () noexcept +\begin{DoxyCompactList}\small\item\em Return a vector with maximum representable components. \end{DoxyCompactList}\item +\mbox{\Hypertarget{classVec3T_ad88913a21fd56327b28092c2e39ebc3e}\label{classVec3T_ad88913a21fd56327b28092c2e39ebc3e}} +static constexpr \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T_ad88913a21fd56327b28092c2e39ebc3e}{infinity} () noexcept +\begin{DoxyCompactList}\small\item\em Return a vector with inf components. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classVec3T_a0643a9f9a68edf5d4656f2e613c9624f}\label{classVec3T_a0643a9f9a68edf5d4656f2e613c9624f}} +T \hyperlink{classVec3T_a0643a9f9a68edf5d4656f2e613c9624f}{X} \mbox{[}3\mbox{]} +\begin{DoxyCompactList}\small\item\em Vector components. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class T$>$\newline +class Vec3\+T$<$ T $>$} + +Three-\/dimensional vector class with arithmetic operators. + +The class has a public-\/only interface. To change it\textquotesingle{}s components one can call the member functions, or set components directly, e.\+g. vec.\+x = 5.\+0 \begin{DoxyNote}{Note} +\hyperlink{classVec3T}{Vec3T} is a templated class primarily used with D\+C\+EL grids. It is always 3D, i.\+e. independent of Chombo configuration settings. This lets one use D\+C\+EL functionality even though the simulation might only be 2D. +\end{DoxyNote} + + +\subsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classVec3T_ab328767434f527b25c110dc83a0cb7ee}\label{classVec3T_ab328767434f527b25c110dc83a0cb7ee}} +\index{Vec3T@{Vec3T}!Vec3T@{Vec3T}} +\index{Vec3T@{Vec3T}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{Vec3\+T()}{Vec3T()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::\hyperlink{classVec3T}{Vec3T} (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{a\+\_\+u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Copy constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+u} & Other vector\\ +\hline +\end{DoxyParams} +Sets $\ast$this = u \mbox{\Hypertarget{classVec3T_acc3573bc8c3232eb14a22ca833cbce30}\label{classVec3T_acc3573bc8c3232eb14a22ca833cbce30}} +\index{Vec3T@{Vec3T}!Vec3T@{Vec3T}} +\index{Vec3T@{Vec3T}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{Vec3\+T()}{Vec3T()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::\hyperlink{classVec3T}{Vec3T} (\begin{DoxyParamCaption}\item[{const T \&}]{a\+\_\+x, }\item[{const T \&}]{a\+\_\+y, }\item[{const T \&}]{a\+\_\+z }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} + + + +Full constructor. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+x} & First vector component \\ +\hline +\mbox{\tt in} & {\em a\+\_\+y} & Second vector component \\ +\hline +\mbox{\tt in} & {\em a\+\_\+z} & Third vector component\\ +\hline +\end{DoxyParams} +Sets this-\/$>$x = a\+\_\+x, this-\/$>$y = a\+\_\+y, and this-\/$>$z = a\+\_\+z + +\subsection{Member Function Documentation} +\mbox{\Hypertarget{classVec3T_af628d2d42a93200a929bd54a1fe8353f}\label{classVec3T_af628d2d42a93200a929bd54a1fe8353f}} +\index{Vec3T@{Vec3T}!cross@{cross}} +\index{cross@{cross}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{cross()}{cross()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::cross (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector cross product. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the cross product between ($\ast$this) and u +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_ab4bebdfbdc863826a1a7e86cad130ff8}\label{classVec3T_ab4bebdfbdc863826a1a7e86cad130ff8}} +\index{Vec3T@{Vec3T}!dot@{dot}} +\index{dot@{dot}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{dot()}{dot()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::dot (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector dot product. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns the dot product between ($\ast$this) and u +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_a93c868b181e24a4f74702a8b8a36f815}\label{classVec3T_a93c868b181e24a4f74702a8b8a36f815}} +\index{Vec3T@{Vec3T}!length@{length}} +\index{length@{length}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{length()}{length()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::length (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute vector length. + +\begin{DoxyReturn}{Returns} +Returns the vector length, i.\+e. sqrt(X\mbox{[}0\mbox{]}$\ast$X\mbox{[}0\mbox{]} + X\mbox{[}1\mbox{]}$\ast$X\mbox{[}1\mbox{]} + Y\mbox{[}0\mbox{]}$\ast$Y\mbox{[}0\mbox{]}) +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_aaed89aee434cfa0abd86fe33bff49b4e}\label{classVec3T_aaed89aee434cfa0abd86fe33bff49b4e}} +\index{Vec3T@{Vec3T}!length2@{length2}} +\index{length2@{length2}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{length2()}{length2()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::length2 (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Compute vector length squared. + +\begin{DoxyReturn}{Returns} +Returns the vector length squared, i.\+e. (X\mbox{[}0\mbox{]}$\ast$X\mbox{[}0\mbox{]} + X\mbox{[}1\mbox{]}$\ast$X\mbox{[}1\mbox{]} + Y\mbox{[}0\mbox{]}$\ast$Y\mbox{[}0\mbox{]}) +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_ac126bbdaeff79e475327887bfa8aa62c}\label{classVec3T_ac126bbdaeff79e475327887bfa8aa62c}} +\index{Vec3T@{Vec3T}!max@{max}} +\index{max@{max}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{max()}{max()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::max (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector maximum function. Returns a new vector with componentwise maximums. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with X\mbox{[}0\mbox{]} = std\+::minmax-\/$>$X\mbox{[}0\mbox{]}, u.\+X\mbox{[}0\mbox{]}) (and same for the other components) +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_a292391c1f72ca66e100e7e70512ff9b1}\label{classVec3T_a292391c1f72ca66e100e7e70512ff9b1}} +\index{Vec3T@{Vec3T}!max\+Dir@{max\+Dir}} +\index{max\+Dir@{max\+Dir}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{max\+Dir()}{maxDir()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +int \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::max\+Dir (\begin{DoxyParamCaption}\item[{const bool}]{a\+\_\+do\+Abs }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Return the direction which has the largest component (can be absolute) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+do\+Abs} & If true, evaluate component magnitudes rather than values. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Direction with the biggest component +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_ad0a0c9754ef8df1fa28abdaa01c246c4}\label{classVec3T_ad0a0c9754ef8df1fa28abdaa01c246c4}} +\index{Vec3T@{Vec3T}!min@{min}} +\index{min@{min}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{min()}{min()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::min (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector minimum function. Returns a new vector with componentwise minimums. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with X\mbox{[}0\mbox{]} = std\+::min(this-\/$>$X\mbox{[}0\mbox{]}, u.\+X\mbox{[}0\mbox{]}) (and same for the other components) +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_aa4768276707889db34a716e9e476b9f1}\label{classVec3T_aa4768276707889db34a716e9e476b9f1}} +\index{Vec3T@{Vec3T}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$\ast$ (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Multiplication operator. Returns a vector with scalar multiplied components. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to multiply by \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with X\mbox{[}i\mbox{]} = this-\/$>$X\mbox{[}i\mbox{]} $\ast$ s +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_a579db6fb2bed30b3f024d1a017d7a124}\label{classVec3T_a579db6fb2bed30b3f024d1a017d7a124}} +\index{Vec3T@{Vec3T}!operator$\ast$@{operator$\ast$}} +\index{operator$\ast$@{operator$\ast$}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$\ast$()}{operator*()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T$>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$T$>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$\ast$ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{s }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Component-\/wise multiplication operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to multiply by \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with X\mbox{[}i\mbox{]} = this-\/$>$X\mbox{[}i\mbox{]} $\ast$ s\mbox{[}i\mbox{]} for each component. +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_a0448e51b7f785b14df47092929cb73a3}\label{classVec3T_a0448e51b7f785b14df47092929cb73a3}} +\index{Vec3T@{Vec3T}!operator$\ast$=@{operator$\ast$=}} +\index{operator$\ast$=@{operator$\ast$=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$\ast$=()}{operator*=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$\ast$= (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector multiplication operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to multiply by \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns ($\ast$this) with multiplied compoments, e.\+g. this-\/$>$X\mbox{[}0\mbox{]} = this-\/$>$X\mbox{[}0\mbox{]} $\ast$ s +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_af1ab895de89a1a3143f58d2ce5d78bc2}\label{classVec3T_af1ab895de89a1a3143f58d2ce5d78bc2}} +\index{Vec3T@{Vec3T}!operator+@{operator+}} +\index{operator+@{operator+}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator+()}{operator+()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator+ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Addition operator. Returns a new vector with added compoments. + +\begin{DoxyReturn}{Returns} +Returns a new vector with x = this-\/$>$x -\/ u.\+x and so on. +\end{DoxyReturn} + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a7d06c56d8579d8b3695f43f62544f999}\label{classVec3T_a7d06c56d8579d8b3695f43f62544f999}} +\index{Vec3T@{Vec3T}!operator+=@{operator+=}} +\index{operator+=@{operator+=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator+=()}{operator+=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator+= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector addition operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Vector to add \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns ($\ast$this) with incremented compoments, e.\+g. this-\/$>$X\mbox{[}0\mbox{]} = this-\/$>$X\mbox{[}0\mbox{]} + u.\+X\mbox{[}0\mbox{]} +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_ac00a70e55a93ecd8c60d29a129f8fbf3}\label{classVec3T_ac00a70e55a93ecd8c60d29a129f8fbf3}} +\index{Vec3T@{Vec3T}!operator-\/@{operator-\/}} +\index{operator-\/@{operator-\/}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator-\/()}{operator-()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator-\/ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Subtraction operator. Returns a new vector with subtracted compoments. + +\begin{DoxyReturn}{Returns} +Returns a new vector with x = this-\/$>$x -\/ u.\+x and so on. +\end{DoxyReturn} + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a8a580094450e167248f4ee089027fa40}\label{classVec3T_a8a580094450e167248f4ee089027fa40}} +\index{Vec3T@{Vec3T}!operator-\/=@{operator-\/=}} +\index{operator-\/=@{operator-\/=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator-\/=()}{operator-=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator-\/= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector subtraction operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Vector to subtraction \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns ($\ast$this) with subtracted compoments, e.\+g. this-\/$>$X\mbox{[}0\mbox{]} = this-\/$>$X\mbox{[}0\mbox{]} -\/ u.\+X\mbox{[}0\mbox{]} +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_acc5973c1c82e51c597b47ba39870f528}\label{classVec3T_acc5973c1c82e51c597b47ba39870f528}} +\index{Vec3T@{Vec3T}!operator/@{operator/}} +\index{operator/@{operator/}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator/ (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Division operator. Returns a vector with scalar divided components. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to divided by \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with X\mbox{[}i\mbox{]} = this-\/$>$X\mbox{[}i\mbox{]} / s +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_a3c48111d27fb16cc3304e7aa2b4603fc}\label{classVec3T_a3c48111d27fb16cc3304e7aa2b4603fc}} +\index{Vec3T@{Vec3T}!operator/@{operator/}} +\index{operator/@{operator/}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator/()}{operator/()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator/ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{v }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Component-\/wise division operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em v} & Other vector \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new vector with X\mbox{[}i\mbox{]} = this-\/$>$X\mbox{[}i\mbox{]}/v\mbox{[}i\mbox{]} for each component. +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_a9446e83162d3daee6133d12b354a3a41}\label{classVec3T_a9446e83162d3daee6133d12b354a3a41}} +\index{Vec3T@{Vec3T}!operator/=@{operator/=}} +\index{operator/=@{operator/=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator/=()}{operator/=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator/= (\begin{DoxyParamCaption}\item[{const T \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Vector division operator. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em s} & Scalar to divide by \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns ($\ast$this) with multiplied compoments, e.\+g. this-\/$>$X\mbox{[}0\mbox{]} = this-\/$>$X\mbox{[}0\mbox{]} / s +\end{DoxyReturn} +\mbox{\Hypertarget{classVec3T_aba830919c5020bb060f39fe9df6b7ca1}\label{classVec3T_aba830919c5020bb060f39fe9df6b7ca1}} +\index{Vec3T@{Vec3T}!operator$<$@{operator$<$}} +\index{operator$<$@{operator$<$}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$<$()}{operator<()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$<$ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +\char`\"{}\+Smaller than\char`\"{} operator. + +Returns true if this-\/$>$x $<$ u.\+x A\+ND this-\/$>$y $<$ u.\+y A\+ND this-\/$>$z $<$ u.\+z and false otherwise +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a266a34a83b9f23a391151be45a4e39f8}\label{classVec3T_a266a34a83b9f23a391151be45a4e39f8}} +\index{Vec3T@{Vec3T}!operator$<$=@{operator$<$=}} +\index{operator$<$=@{operator$<$=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$<$=()}{operator<=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$<$= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +\char`\"{}\+Smaller or equal to\char`\"{} operator. + +Returns true if this-\/$>$x $<$= u.\+x A\+ND this-\/$>$y $<$= u.\+y A\+ND this-\/$>$z $<$= u.\+z +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a34681a81b55b4e7ae818e01b5f27a3e0}\label{classVec3T_a34681a81b55b4e7ae818e01b5f27a3e0}} +\index{Vec3T@{Vec3T}!operator=@{operator=}} +\index{operator=@{operator=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator=()}{operator=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +\hyperlink{classVec3T}{Vec3T}$<$ T $>$ \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Assignment operator. Sets components equal to the argument vector\textquotesingle{}s components. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a715546682c26647643148a80087c4ab4}\label{classVec3T_a715546682c26647643148a80087c4ab4}} +\index{Vec3T@{Vec3T}!operator==@{operator==}} +\index{operator==@{operator==}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator==()}{operator==()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator== (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Comparison operator. Returns true if all components are the same. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_af99810068907e4935ac38bc397ba1102}\label{classVec3T_af99810068907e4935ac38bc397ba1102}} +\index{Vec3T@{Vec3T}!operator$>$@{operator$>$}} +\index{operator$>$@{operator$>$}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$>$()}{operator>()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$>$ (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +\char`\"{}\+Greater than\char`\"{} operator. + +Returns true if this-\/$>$x $>$ u.\+x A\+ND this-\/$>$y $>$ u.\+y A\+ND this-\/$>$z $>$ u.\+z +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a3296f8319642088e08bd2d3e253fcd64}\label{classVec3T_a3296f8319642088e08bd2d3e253fcd64}} +\index{Vec3T@{Vec3T}!operator$>$=@{operator$>$=}} +\index{operator$>$=@{operator$>$=}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator$>$=()}{operator>=()}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator$>$= (\begin{DoxyParamCaption}\item[{const \hyperlink{classVec3T}{Vec3T}$<$ T $>$ \&}]{u }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +\char`\"{}\+Greater or equal to\char`\"{} operator. + +Returns true if this-\/$>$x $>$= u.\+x A\+ND this-\/$>$y $>$= u.\+y A\+ND this-\/$>$z $>$= u.\+z +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em u} & Other vector \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_a098a19968b6c7b0b76c2572e5236a71a}\label{classVec3T_a098a19968b6c7b0b76c2572e5236a71a}} +\index{Vec3T@{Vec3T}!operator\mbox{[}\mbox{]}@{operator[]}} +\index{operator\mbox{[}\mbox{]}@{operator[]}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator[]()}{operator[]()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator\mbox{[}$\,$\mbox{]} (\begin{DoxyParamCaption}\item[{int}]{i }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Return component in vector. (i=0 =$>$ x and so on) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em i} & Index. Must be $<$ 3 \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{classVec3T_ad09224c5f7e142059d75772c0cbd1990}\label{classVec3T_ad09224c5f7e142059d75772c0cbd1990}} +\index{Vec3T@{Vec3T}!operator\mbox{[}\mbox{]}@{operator[]}} +\index{operator\mbox{[}\mbox{]}@{operator[]}!Vec3T@{Vec3T}} +\subsubsection{\texorpdfstring{operator[]()}{operator[]()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +const T \& \hyperlink{classVec3T}{Vec3T}$<$ T $>$\+::operator\mbox{[}$\,$\mbox{]} (\begin{DoxyParamCaption}\item[{int}]{i }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [noexcept]}} + + + +Return non-\/modifiable component in vector. (i=0 =$>$ x and so on) + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em i} & Index. Must be $<$ 3 \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +Source/\hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp}\item +Source/\hyperlink{EBGeometry__VecImplem_8hpp}{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/dir_74389ed8173ad57b461b9d623a1f3867.tex b/docs/doxygen/latex/dir_74389ed8173ad57b461b9d623a1f3867.tex new file mode 100644 index 00000000..fa21f3fc --- /dev/null +++ b/docs/doxygen/latex/dir_74389ed8173ad57b461b9d623a1f3867.tex @@ -0,0 +1,71 @@ +\hypertarget{dir_74389ed8173ad57b461b9d623a1f3867}{}\section{Source Directory Reference} +\label{dir_74389ed8173ad57b461b9d623a1f3867}\index{Source Directory Reference@{Source Directory Reference}} +\subsection*{Files} +\begin{DoxyCompactItemize} +\item +file \hyperlink{EBGeometry__AnalyticDistanceFunctions_8hpp}{E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of various analytic distance functions. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a various bounding volumes used for bounding volume hierarchy. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__BoundingVolumesImplem_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a bounding volume hierarchy (\hyperlink{namespaceBVH}{B\+VH}) class. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__BVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__Dcel_8hpp}{E\+B\+Geometry\+\_\+\+Dcel.\+hpp} +\begin{DoxyCompactList}\small\item\em Namespace documentation. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelBVH_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+B\+V\+H.\+hpp} +\begin{DoxyCompactList}\small\item\em File which contains partitioners and lambdas for enclosing dcel\+\_\+face in bounding volume heirarchies. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a half-\/edge class for use in D\+C\+EL descriptions of polygon tesselations. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelEdgeImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a polygon face class for use in D\+C\+EL descriptions of polygon tesselations. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelFaceImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of iterators for D\+C\+EL surface Tesselations. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelIteratorImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a mesh class which stores a D\+C\+EL mesh (with signed distance functions) \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelMeshImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of utilities for passing data into D\+C\+EL structures. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelParserImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelPolygon2D_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a two-\/dimensional polygon class for embedding 3D polygon faces. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelPolygon2DImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of Dcel\+Polygon.\+hpp. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a vertex class for use in D\+C\+EL descriptions of polygon tesselations. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__DcelVertexImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__NamespaceFooter_8hpp}{E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp} +\begin{DoxyCompactList}\small\item\em Name space footer. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__NamespaceHeader_8hpp}{E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp} +\begin{DoxyCompactList}\small\item\em Name space header. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__SignedDistanceFunction_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp} +\begin{DoxyCompactList}\small\item\em Abstract base class for representing a signed distance function. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of transformation operators for signed distance fields. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__TransformOpsImplem_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a union operator for creating multi-\/object scenes. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of a union operator for creating multi-\/object scenes. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__UnionBVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__UnionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp}. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp} +\begin{DoxyCompactList}\small\item\em Declaration of 2D and 3D point/vector classes with templated precision. Used with D\+C\+EL tools. \end{DoxyCompactList}\item +file \hyperlink{EBGeometry__VecImplem_8hpp}{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp} +\begin{DoxyCompactList}\small\item\em Implementation of \hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp}. \end{DoxyCompactList}\end{DoxyCompactItemize} diff --git a/docs/doxygen/latex/doxygen.sty b/docs/doxygen/latex/doxygen.sty new file mode 100644 index 00000000..e457acc1 --- /dev/null +++ b/docs/doxygen/latex/doxygen.sty @@ -0,0 +1,503 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +\RequirePackage{array} +\RequirePackage{calc} +\RequirePackage{float} +\RequirePackage{ifthen} +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{longtable} +\RequirePackage{tabu} +\RequirePackage{tabularx} +\RequirePackage{multirow} + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by
 ... 
+\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}{% + \par% + \scriptsize% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}{% + \DoxyCode% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
    ...
) +\newenvironment{DoxyEnumerate}{% + \enumerate% +}{% + \endenumerate% +} + +% Used by bullet lists (using '-', @li, @arg, or
    ...
) +\newenvironment{DoxyItemize}{% + \itemize% +}{% + \enditemize% +} + +% Used by description lists (using
...
) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \begin{center}% +}{% + \end{center}% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @internal +\newenvironment{DoxyInternal}[1]{% + \paragraph*{#1}% +}{% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{list}{}{% + \settowidth{\labelwidth}{40pt}% + \setlength{\leftmargin}{\labelwidth}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{-4pt}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \tabulinesep=1mm% + \par% + \ifthenelse{\equal{#1}{}}% + {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu} spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + } + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu}% + \vspace{6pt}% +} + +% Used for fields simple class style enums +\newenvironment{DoxyEnumFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu} spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newenvironment{TabularC}[1]% +{\tabulinesep=1mm +\begin{longtabu} spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu}\par}% + +\newenvironment{TabularNC}[1]% +{\begin{tabu} spread 0pt [l]{*#1{|X[-1]}|}}% +{\end{tabu}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used to link to a table when hyperlinks are turned on +\newcommand{\doxytablelink}[2]{% + \ref{#1}% +} + +% Used to link to a table when hyperlinks are turned off +\newcommand{\doxytableref}[3]{% + \ref{#3}% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Colors used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} + +% Color used for table heading +\newcommand{\tableheadbgcolor}{lightgray}% + +% Version of hypertarget with correct landing location +\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} + +% Define caption that is also suitable in a table +\makeatletter +\def\doxyfigcaption{% +\refstepcounter{figure}% +\@dblarg{\@caption{figure}}} +\makeatother diff --git a/docs/doxygen/latex/files.tex b/docs/doxygen/latex/files.tex new file mode 100644 index 00000000..658295c4 --- /dev/null +++ b/docs/doxygen/latex/files.tex @@ -0,0 +1,37 @@ +\section{File List} +Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{{\bfseries E\+B\+Geometry.\+hpp} }{\pageref{EBGeometry_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__AnalyticDistanceFunctions_8hpp}{E\+B\+Geometry\+\_\+\+Analytic\+Distance\+Functions.\+hpp} \\*Declaration of various analytic distance functions }{\pageref{EBGeometry__AnalyticDistanceFunctions_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp} \\*Declaration of a various bounding volumes used for bounding volume hierarchy }{\pageref{EBGeometry__BoundingVolumes_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__BoundingVolumesImplem_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__BoundingVolumes_8hpp}{E\+B\+Geometry\+\_\+\+Bounding\+Volumes.\+hpp} }{\pageref{EBGeometry__BoundingVolumesImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp} \\*Declaration of a bounding volume hierarchy (\hyperlink{namespaceBVH}{B\+VH}) class }{\pageref{EBGeometry__BVH_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__BVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__BVH_8hpp}{E\+B\+Geometry\+\_\+\+B\+V\+H.\+hpp} }{\pageref{EBGeometry__BVHImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__Dcel_8hpp}{E\+B\+Geometry\+\_\+\+Dcel.\+hpp} \\*Namespace documentation }{\pageref{EBGeometry__Dcel_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelBVH_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+B\+V\+H.\+hpp} \\*File which contains partitioners and lambdas for enclosing dcel\+\_\+face in bounding volume heirarchies }{\pageref{EBGeometry__DcelBVH_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp} \\*Declaration of a half-\/edge class for use in D\+C\+EL descriptions of polygon tesselations }{\pageref{EBGeometry__DcelEdge_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelEdgeImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__DcelEdge_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge.\+hpp} }{\pageref{EBGeometry__DcelEdgeImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp} \\*Declaration of a polygon face class for use in D\+C\+EL descriptions of polygon tesselations }{\pageref{EBGeometry__DcelFace_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelFaceImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__DcelFace_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Face.\+hpp} }{\pageref{EBGeometry__DcelFaceImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp} \\*Declaration of iterators for D\+C\+EL surface Tesselations }{\pageref{EBGeometry__DcelIterator_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelIteratorImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__DcelIterator_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Iterator.\+hpp} }{\pageref{EBGeometry__DcelIteratorImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp} \\*Declaration of a mesh class which stores a D\+C\+EL mesh (with signed distance functions) }{\pageref{EBGeometry__DcelMesh_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelMeshImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__DcelMesh_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Mesh.\+hpp} }{\pageref{EBGeometry__DcelMeshImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp} \\*Declaration of utilities for passing data into D\+C\+EL structures }{\pageref{EBGeometry__DcelParser_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelParserImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__DcelParser_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Parser.\+hpp} }{\pageref{EBGeometry__DcelParserImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelPolygon2D_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D.\+hpp} \\*Declaration of a two-\/dimensional polygon class for embedding 3D polygon faces }{\pageref{EBGeometry__DcelPolygon2D_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelPolygon2DImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Polygon2\+D\+Implem.\+hpp} \\*Implementation of Dcel\+Polygon.\+hpp }{\pageref{EBGeometry__DcelPolygon2DImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp} \\*Declaration of a vertex class for use in D\+C\+EL descriptions of polygon tesselations }{\pageref{EBGeometry__DcelVertex_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__DcelVertexImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__DcelVertex_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Vertex.\+hpp} }{\pageref{EBGeometry__DcelVertexImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__NamespaceFooter_8hpp}{E\+B\+Geometry\+\_\+\+Namespace\+Footer.\+hpp} \\*Name space footer }{\pageref{EBGeometry__NamespaceFooter_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__NamespaceHeader_8hpp}{E\+B\+Geometry\+\_\+\+Namespace\+Header.\+hpp} \\*Name space header }{\pageref{EBGeometry__NamespaceHeader_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__SignedDistanceFunction_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function.\+hpp} \\*Abstract base class for representing a signed distance function }{\pageref{EBGeometry__SignedDistanceFunction_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__SignedDistanceFunctionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Signed\+Distance\+Function\+Implem.\+hpp} }{\pageref{EBGeometry__SignedDistanceFunctionImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp} \\*Declaration of transformation operators for signed distance fields }{\pageref{EBGeometry__TransformOps_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__TransformOpsImplem_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__TransformOps_8hpp}{E\+B\+Geometry\+\_\+\+Transform\+Ops.\+hpp} }{\pageref{EBGeometry__TransformOpsImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp} \\*Declaration of a union operator for creating multi-\/object scenes }{\pageref{EBGeometry__Union_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp} \\*Declaration of a union operator for creating multi-\/object scenes }{\pageref{EBGeometry__UnionBVH_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__UnionBVHImplem_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__UnionBVH_8hpp}{E\+B\+Geometry\+\_\+\+Union\+B\+V\+H.\+hpp} }{\pageref{EBGeometry__UnionBVHImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__UnionImplem_8hpp}{E\+B\+Geometry\+\_\+\+Union\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__Union_8hpp}{E\+B\+Geometry\+\_\+\+Union.\+hpp} }{\pageref{EBGeometry__UnionImplem_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp} \\*Declaration of 2D and 3D point/vector classes with templated precision. Used with D\+C\+EL tools }{\pageref{EBGeometry__Vec_8hpp}}{} +\item\contentsline{section}{Source/\hyperlink{EBGeometry__VecImplem_8hpp}{E\+B\+Geometry\+\_\+\+Vec\+Implem.\+hpp} \\*Implementation of \hyperlink{EBGeometry__Vec_8hpp}{E\+B\+Geometry\+\_\+\+Vec.\+hpp} }{\pageref{EBGeometry__VecImplem_8hpp}}{} +\end{DoxyCompactList} diff --git a/docs/doxygen/latex/hierarchy.tex b/docs/doxygen/latex/hierarchy.tex new file mode 100644 index 00000000..730a4b47 --- /dev/null +++ b/docs/doxygen/latex/hierarchy.tex @@ -0,0 +1,29 @@ +\section{Class Hierarchy} +This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} +\item \contentsline{section}{Bounding\+Volumes\+:\+:A\+A\+B\+BT$<$ T $>$}{\pageref{classBoundingVolumes_1_1AABBT}}{} +\item \contentsline{section}{Bounding\+Volumes\+:\+:Bounding\+SphereT$<$ T $>$}{\pageref{classBoundingVolumes_1_1BoundingSphereT}}{} +\item \contentsline{section}{Dcel\+:\+:Edge\+IteratorT$<$ T $>$}{\pageref{classDcel_1_1EdgeIteratorT}}{} +\item \contentsline{section}{Dcel\+:\+:EdgeT$<$ T $>$}{\pageref{classDcel_1_1EdgeT}}{} +\item \contentsline{section}{Dcel\+:\+:FaceT$<$ T $>$}{\pageref{classDcel_1_1FaceT}}{} +\item \contentsline{section}{B\+VH\+:\+:Linear\+B\+VH$<$ T, P, BV, K $>$}{\pageref{classBVH_1_1LinearBVH}}{} +\item \contentsline{section}{B\+VH\+:\+:Linear\+NodeT$<$ T, P, BV, K $>$}{\pageref{classBVH_1_1LinearNodeT}}{} +\item \contentsline{section}{Dcel\+:\+:MeshT$<$ T $>$}{\pageref{classDcel_1_1MeshT}}{} +\item \contentsline{section}{B\+VH\+:\+:NodeT$<$ T, P, BV, K $>$}{\pageref{classBVH_1_1NodeT}}{} +\item \contentsline{section}{Dcel\+:\+:Parser\+:\+:P\+LY$<$ T $>$}{\pageref{classDcel_1_1Parser_1_1PLY}}{} +\item \contentsline{section}{Dcel\+:\+:Polygon2D$<$ T $>$}{\pageref{classDcel_1_1Polygon2D}}{} +\item \contentsline{section}{Signed\+Distance\+Function$<$ T $>$}{\pageref{classSignedDistanceFunction}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Sphere\+S\+DF$<$ T $>$}{\pageref{classSphereSDF}}{} +\item \contentsline{section}{Union$<$ T $>$}{\pageref{classUnion}}{} +\item \contentsline{section}{Union\+B\+VH$<$ T, BV, K $>$}{\pageref{classUnionBVH}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Transform\+Op$<$ T $>$}{\pageref{classTransformOp}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Rotate\+Op$<$ T $>$}{\pageref{classRotateOp}}{} +\item \contentsline{section}{Scale\+Op$<$ T $>$}{\pageref{classScaleOp}}{} +\item \contentsline{section}{Translate\+Op$<$ T $>$}{\pageref{classTranslateOp}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Vec2T$<$ T $>$}{\pageref{classVec2T}}{} +\item \contentsline{section}{Vec3T$<$ T $>$}{\pageref{classVec3T}}{} +\item \contentsline{section}{Dcel\+:\+:VertexT$<$ T $>$}{\pageref{classDcel_1_1VertexT}}{} +\end{DoxyCompactList} diff --git a/docs/doxygen/latex/index.tex b/docs/doxygen/latex/index.tex new file mode 100644 index 00000000..c0841efc --- /dev/null +++ b/docs/doxygen/latex/index.tex @@ -0,0 +1,57 @@ +A compact code for computing signed distance functions to watertight and orientable surface grids. Can be used with embedded-\/boundary (EB) codes like Chombo or A\+M\+ReX. + +The tesselations must consist of planar polygons (not necessarily triangles). Internally, the surface mesh is stored in a doubly-\/connected edge list (D\+C\+EL), i.\+e. a half-\/edge data structure. On watertight and orientable grids, the distance to any feature (facet, edge, vertex) is well defined, and can naively be computed in various ways\+: + + +\begin{DoxyItemize} +\item Directly, by iterating through all facets. +\item With conventional bounding volume hierarchies (B\+V\+Hs). +\item With compact (linearized) B\+V\+Hs. +\end{DoxyItemize} + +The B\+V\+Hs in \hyperlink{namespaceEBGeometry}{E\+B\+Geometry} are not limited to facets. Users can also embed entire objects (e.\+g., analytic functions) in the B\+V\+Hs, e.\+g. the \hyperlink{namespaceBVH}{B\+VH} accelerator can be used for a packed sphere geometry. B\+V\+Hs can also be nested so that the \hyperlink{namespaceBVH}{B\+VH} accelerator is used to embed objects that are themselves described by a \hyperlink{namespaceBVH}{B\+VH}. For example, a scene consisting of many objects described by surface grids can be embedded as a B\+V\+H-\/of-\/\+B\+VH type of scene. + + + +In addition, \hyperlink{namespaceEBGeometry}{E\+B\+Geometry} provides standard operators for signed distance fields like rotations, translations, and scalings. Multi-\/object scenes can be constructed with conventional unions, or with B\+V\+H-\/enabled unions (which can be orders of magnitudes faster). + +\subsection*{Requirements } + + +\begin{DoxyItemize} +\item A C++ compiler which supports C++14. +\item Watertight and orientable surfaces (only P\+LY files currently supported). +\end{DoxyItemize} + +\subsection*{Basic usage } + +\hyperlink{namespaceEBGeometry}{E\+B\+Geometry} is a header-\/only library in C++. To use it, simply make \hyperlink{EBGeometry_8hpp_source}{E\+B\+Geometry.\+hpp} visible to your code and include it. + +To clone the code do \begin{DoxyVerb}git clone git@github.com:rmrsk/EBGeometry.git +\end{DoxyVerb} + + +Various examples are given in the Examples folder. To run one of the examples, navigate to the example and compile and run it. E.\+g., \begin{DoxyVerb}cd Examples/Basic +g++ -O3 -std=c++14 main.cpp +./a.out porsche.ply +\end{DoxyVerb} + + +All the examples take the following steps that are specific to \hyperlink{namespaceEBGeometry}{E\+B\+Geometry}\+: + + +\begin{DoxyEnumerate} +\item Parse a surface mesh into a D\+C\+EL mesh object. +\item Partition the D\+C\+EL mesh object in a bounding volume hierarchy. +\item Create direct and B\+V\+H-\/accelerated signed distance functions and compute the distance to the mesh. +\end{DoxyEnumerate} + +More complex examples that use Chombo or A\+M\+ReX will also include application-\/specific code. + +\subsection*{Advanced usage } + +For more advanced usage, users can supply their own file parsers (only P\+LY files are currently supported), provide their own bounding volumes, or their own \hyperlink{namespaceBVH}{B\+VH} partitioners. \hyperlink{namespaceEBGeometry}{E\+B\+Geometry} is not too strict about these things, and uses rigorous templating for ensuring that the \hyperlink{namespaceEBGeometry}{E\+B\+Geometry} functionality can be extended. + +\subsection*{License } + +See L\+I\+C\+E\+N\+SE and Copyright.\+txt for redistribution rights. \ No newline at end of file diff --git a/docs/doxygen/latex/namespaceBVH.tex b/docs/doxygen/latex/namespaceBVH.tex new file mode 100644 index 00000000..99752a17 --- /dev/null +++ b/docs/doxygen/latex/namespaceBVH.tex @@ -0,0 +1,106 @@ +\hypertarget{namespaceBVH}{}\section{B\+VH Namespace Reference} +\label{namespaceBVH}\index{B\+VH@{B\+VH}} + + +Namespace for various bounding volume heirarchy (\hyperlink{namespaceBVH}{B\+VH}) functionality. + + +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classBVH_1_1LinearBVH}{Linear\+B\+VH} +\begin{DoxyCompactList}\small\item\em Forward declare linear \hyperlink{namespaceBVH}{B\+VH} class. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1LinearNodeT}{Linear\+NodeT} +\begin{DoxyCompactList}\small\item\em Forward declare linear node class. \end{DoxyCompactList}\item +class \hyperlink{classBVH_1_1NodeT}{NodeT} +\begin{DoxyCompactList}\small\item\em Forward declare the \hyperlink{namespaceBVH}{B\+VH} node since it is needed for the polymorphic lambdas. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Typedefs} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}\label{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}} +{\footnotesize template$<$class P $>$ }\\using \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT} = std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const P $>$ $>$ +\begin{DoxyCompactList}\small\item\em Alias to cut down on typing. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , class P , class BV , int K$>$ }\\using \hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{Stop\+FunctionT} = std\+::function$<$ bool(const \hyperlink{classBVH_1_1NodeT}{NodeT}$<$ T, P, BV, K $>$ \&a\+\_\+node)$>$ +\begin{DoxyCompactList}\small\item\em Stop function for deciding when a \hyperlink{namespaceBVH}{B\+VH} node can\textquotesingle{}t be divided into sub-\/volumes. \end{DoxyCompactList}\item +{\footnotesize template$<$class P , int K$>$ }\\using \hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{PartitionerT} = std\+::function$<$ std\+::array$<$ \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$ P $>$, K $>$(const \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$ P $>$ \&a\+\_\+primitives)$>$ +\begin{DoxyCompactList}\small\item\em Polymorphic partitioner for splitting a list of primitives into K new lists of primitives. \end{DoxyCompactList}\item +{\footnotesize template$<$class P , class BV $>$ }\\using \hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+ConstructorT} = std\+::function$<$ BV(const std\+::shared\+\_\+ptr$<$ const P $>$ \&a\+\_\+primitive)$>$ +\begin{DoxyCompactList}\small\item\em Constructor method for creating bounding volumes from a list of primitives. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Enumerations} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}\label{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}} +enum \hyperlink{namespaceBVH_a7613f83a60cfae9aba31861110bd9e54}{Node\+Type} \+: bool \{ {\bfseries Regular}, +{\bfseries Leaf} + \}\begin{DoxyCompactList}\small\item\em Enum for determining if a \hyperlink{namespaceBVH}{B\+VH} node is a leaf or a regular node (only leaf nodes contain data) \end{DoxyCompactList} +\item +\mbox{\Hypertarget{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}\label{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}} +enum \hyperlink{namespaceBVH_a3ddb7b34ac1deb3baed2f32d9eacbe5b}{Prune} \{ {\bfseries Ordered}, +{\bfseries Ordered2}, +{\bfseries Unordered}, +{\bfseries Unordered2} + \}\begin{DoxyCompactList}\small\item\em Typename for identifying algorithms used in subtree pruning. \end{DoxyCompactList} +\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Namespace for various bounding volume heirarchy (\hyperlink{namespaceBVH}{B\+VH}) functionality. + +\subsection{Typedef Documentation} +\mbox{\Hypertarget{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}\label{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}} +\index{B\+VH@{B\+VH}!B\+V\+ConstructorT@{B\+V\+ConstructorT}} +\index{B\+V\+ConstructorT@{B\+V\+ConstructorT}!B\+VH@{B\+VH}} +\subsubsection{\texorpdfstring{B\+V\+ConstructorT}{BVConstructorT}} +{\footnotesize\ttfamily template$<$class P , class BV $>$ \\ +using \hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+H\+::\+B\+V\+ConstructorT} = typedef std\+::function$<$BV(const std\+::shared\+\_\+ptr$<$const P$>$\& a\+\_\+primitive)$>$} + + + +Constructor method for creating bounding volumes from a list of primitives. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & List of primitives. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a new bounding volumes which is guaranteed to enclose all the input primitives. +\end{DoxyReturn} +\mbox{\Hypertarget{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}\label{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}} +\index{B\+VH@{B\+VH}!PartitionerT@{PartitionerT}} +\index{PartitionerT@{PartitionerT}!B\+VH@{B\+VH}} +\subsubsection{\texorpdfstring{PartitionerT}{PartitionerT}} +{\footnotesize\ttfamily template$<$class P , int K$>$ \\ +using \hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT} = typedef std\+::function$<$std\+::array$<$\hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$P$>$, K$>$(const \hyperlink{namespaceBVH_aa1e753bda451b85cd5b948722a2ad7c7}{Primitive\+ListT}$<$P$>$\& a\+\_\+primitives)$>$} + + + +Polymorphic partitioner for splitting a list of primitives into K new lists of primitives. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & List of primitives to be subdivided into sub-\/bounding volumes. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a list (std\+::array) of new primitives which make up the new bounding volumes. +\end{DoxyReturn} +\mbox{\Hypertarget{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}\label{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}} +\index{B\+VH@{B\+VH}!Stop\+FunctionT@{Stop\+FunctionT}} +\index{Stop\+FunctionT@{Stop\+FunctionT}!B\+VH@{B\+VH}} +\subsubsection{\texorpdfstring{Stop\+FunctionT}{StopFunctionT}} +{\footnotesize\ttfamily template$<$class T , class P , class BV , int K$>$ \\ +using \hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{B\+V\+H\+::\+Stop\+FunctionT} = typedef std\+::function$<$bool(const \hyperlink{classBVH_1_1NodeT}{NodeT}$<$T, P, BV, K$>$\& a\+\_\+node)$>$} + + + +Stop function for deciding when a \hyperlink{namespaceBVH}{B\+VH} node can\textquotesingle{}t be divided into sub-\/volumes. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+node} & \hyperlink{namespaceBVH}{B\+VH} node \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +True if the node can\textquotesingle{}t be divided into subvolumes and false otherwise. +\end{DoxyReturn} diff --git a/docs/doxygen/latex/namespaceBoundingVolumes.tex b/docs/doxygen/latex/namespaceBoundingVolumes.tex new file mode 100644 index 00000000..7b6ad019 --- /dev/null +++ b/docs/doxygen/latex/namespaceBoundingVolumes.tex @@ -0,0 +1,103 @@ +\hypertarget{namespaceBoundingVolumes}{}\section{Bounding\+Volumes Namespace Reference} +\label{namespaceBoundingVolumes}\index{Bounding\+Volumes@{Bounding\+Volumes}} + + +Namespace for encapsulating various bounding volumes for usage with B\+V\+Hs. + + +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT} +\begin{DoxyCompactList}\small\item\em Axis-\/aligned bounding box as bounding volume. \end{DoxyCompactList}\item +class \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT} +\begin{DoxyCompactList}\small\item\em Class which encloses a set of points using a bounding sphere. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Functions} +\begin{DoxyCompactItemize} +\item +{\footnotesize template$<$class T $>$ }\\bool \hyperlink{namespaceBoundingVolumes_af35f33c5f319a466550d9ad1040beced}{intersects} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&a\+\_\+u, const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Intersection method for testing if two bounding spheres overlap. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\bool \hyperlink{namespaceBoundingVolumes_a5c360ccd42017c01acbe1caf2cfd1efe}{intersects} (const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+u, const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Intersection method for testing if two bounding boxes overlap. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\T \hyperlink{namespaceBoundingVolumes_a4f159289c317e02beedb4b38136ad692}{get\+Overlapping\+Volume} (const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&a\+\_\+u, const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between two bounding spheres. \end{DoxyCompactList}\item +{\footnotesize template$<$class T $>$ }\\T \hyperlink{namespaceBoundingVolumes_ae5716e39e88aaeec0c204f453cac2acd}{get\+Overlapping\+Volume} (const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+u, const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&a\+\_\+v) noexcept +\begin{DoxyCompactList}\small\item\em Compute the overlapping volume between two bounding boxes. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Namespace for encapsulating various bounding volumes for usage with B\+V\+Hs. + +\subsection{Function Documentation} +\mbox{\Hypertarget{namespaceBoundingVolumes_a4f159289c317e02beedb4b38136ad692}\label{namespaceBoundingVolumes_a4f159289c317e02beedb4b38136ad692}} +\index{Bounding\+Volumes@{Bounding\+Volumes}!get\+Overlapping\+Volume@{get\+Overlapping\+Volume}} +\index{get\+Overlapping\+Volume@{get\+Overlapping\+Volume}!Bounding\+Volumes@{Bounding\+Volumes}} +\subsubsection{\texorpdfstring{get\+Overlapping\+Volume()}{getOverlappingVolume()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T Bounding\+Volumes\+::get\+Overlapping\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+u, }\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [noexcept]}} + + + +Compute the overlapping volume between two bounding spheres. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+u} & One bounding sphere \\ +\hline +\mbox{\tt in} & {\em a\+\_\+v} & The other bounding sphere \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{namespaceBoundingVolumes_ae5716e39e88aaeec0c204f453cac2acd}\label{namespaceBoundingVolumes_ae5716e39e88aaeec0c204f453cac2acd}} +\index{Bounding\+Volumes@{Bounding\+Volumes}!get\+Overlapping\+Volume@{get\+Overlapping\+Volume}} +\index{get\+Overlapping\+Volume@{get\+Overlapping\+Volume}!Bounding\+Volumes@{Bounding\+Volumes}} +\subsubsection{\texorpdfstring{get\+Overlapping\+Volume()}{getOverlappingVolume()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +T Bounding\+Volumes\+::get\+Overlapping\+Volume (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+u, }\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [noexcept]}} + + + +Compute the overlapping volume between two bounding boxes. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+u} & One bounding box \\ +\hline +\mbox{\tt in} & {\em a\+\_\+v} & The other bounding box \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{namespaceBoundingVolumes_af35f33c5f319a466550d9ad1040beced}\label{namespaceBoundingVolumes_af35f33c5f319a466550d9ad1040beced}} +\index{Bounding\+Volumes@{Bounding\+Volumes}!intersects@{intersects}} +\index{intersects@{intersects}!Bounding\+Volumes@{Bounding\+Volumes}} +\subsubsection{\texorpdfstring{intersects()}{intersects()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool Bounding\+Volumes\+::intersects (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+u, }\item[{const \hyperlink{classBoundingVolumes_1_1BoundingSphereT}{Bounding\+SphereT}$<$ T $>$ \&}]{a\+\_\+v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [noexcept]}} + + + +Intersection method for testing if two bounding spheres overlap. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+u} & One bounding sphere \\ +\hline +\mbox{\tt in} & {\em a\+\_\+v} & The other bounding sphere \\ +\hline +\end{DoxyParams} +\mbox{\Hypertarget{namespaceBoundingVolumes_a5c360ccd42017c01acbe1caf2cfd1efe}\label{namespaceBoundingVolumes_a5c360ccd42017c01acbe1caf2cfd1efe}} +\index{Bounding\+Volumes@{Bounding\+Volumes}!intersects@{intersects}} +\index{intersects@{intersects}!Bounding\+Volumes@{Bounding\+Volumes}} +\subsubsection{\texorpdfstring{intersects()}{intersects()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily template$<$class T $>$ \\ +bool Bounding\+Volumes\+::intersects (\begin{DoxyParamCaption}\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+u, }\item[{const \hyperlink{classBoundingVolumes_1_1AABBT}{A\+A\+B\+BT}$<$ T $>$ \&}]{a\+\_\+v }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [noexcept]}} + + + +Intersection method for testing if two bounding boxes overlap. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+u} & One bounding box \\ +\hline +\mbox{\tt in} & {\em a\+\_\+v} & The other bounding box \\ +\hline +\end{DoxyParams} diff --git a/docs/doxygen/latex/namespaceDcel.tex b/docs/doxygen/latex/namespaceDcel.tex new file mode 100644 index 00000000..e76e0d3c --- /dev/null +++ b/docs/doxygen/latex/namespaceDcel.tex @@ -0,0 +1,139 @@ +\hypertarget{namespaceDcel}{}\section{Dcel Namespace Reference} +\label{namespaceDcel}\index{Dcel@{Dcel}} + + +Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. + + +\subsection*{Namespaces} +\begin{DoxyCompactItemize} +\item + \hyperlink{namespaceDcel_1_1Parser}{Parser} +\begin{DoxyCompactList}\small\item\em Namespace which encapsulates possible file parsers for building D\+C\+EL meshes. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1EdgeIteratorT}{Edge\+IteratorT} +\begin{DoxyCompactList}\small\item\em Class which can iterate through edges and vertices around a D\+C\+EL polygon face. \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1EdgeT}{EdgeT} +\begin{DoxyCompactList}\small\item\em Class which represents a half-\/edge in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1FaceT}{FaceT} +\begin{DoxyCompactList}\small\item\em Class which represents a polygon face in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1MeshT}{MeshT} +\begin{DoxyCompactList}\small\item\em Mesh class which stores a full D\+C\+EL mesh (with signed distance functions) \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1Polygon2D}{Polygon2D} +\begin{DoxyCompactList}\small\item\em Class for embedding a D\+C\+EL polygon face into 2D. \end{DoxyCompactList}\item +class \hyperlink{classDcel_1_1VertexT}{VertexT} +\begin{DoxyCompactList}\small\item\em Class which represents a vertex node in a double-\/edge connected list (D\+C\+EL). \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Typedefs} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceDcel_a69f60bf0111d66715bf4f7a8e22645e6}\label{namespaceDcel_a69f60bf0111d66715bf4f7a8e22645e6}} +{\footnotesize template$<$class T $>$ }\\using \hyperlink{namespaceDcel_a69f60bf0111d66715bf4f7a8e22645e6}{Primitive\+List} = std\+::vector$<$ std\+::shared\+\_\+ptr$<$ const \hyperlink{classDcel_1_1FaceT}{Dcel\+::\+FaceT}$<$ T $>$ $>$ $>$ +\begin{DoxyCompactList}\small\item\em Alias for which primitives are used in the \hyperlink{namespaceBVH}{B\+VH}. For D\+C\+EL meshes the primitive is a polygon face. \end{DoxyCompactList}\end{DoxyCompactItemize} +\subsection*{Variables} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}\label{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}} +constexpr int \hyperlink{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}{primitives\+Per\+Leaf\+Node} = 1 +\begin{DoxyCompactList}\small\item\em This is the lowest number of a primitives that a \hyperlink{namespaceBVH}{B\+VH} node is allowed to enclose. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , class BV $>$ }\\\hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+H\+::\+B\+V\+ConstructorT}$<$ \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$, BV $>$ \hyperlink{namespaceDcel_a628449c42ce3f2784ca018f2a3c88a11}{default\+B\+V\+Constructor} +\begin{DoxyCompactList}\small\item\em Bounding volume constructor for a D\+C\+EL face. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , class BV , int K$>$ }\\\hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{B\+V\+H\+::\+Stop\+FunctionT}$<$ T, \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$, BV, K $>$ \hyperlink{namespaceDcel_a45e9f2554a8d9ea01164cd51f787f989}{default\+Stop\+Function} +\begin{DoxyCompactList}\small\item\em Default stop function. This function terminates the division process if a \hyperlink{namespaceBVH}{B\+VH} node has only one primitive. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , int K$>$ }\\\hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT}$<$ \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$, K $>$ \hyperlink{namespaceDcel_ab4f869248e23d47bb01ad06c76288fef}{spatial\+Split\+Partitioner} +\begin{DoxyCompactList}\small\item\em Default partitioner function for subdividing into K sub-\/volumes. \end{DoxyCompactList}\item +{\footnotesize template$<$class T , int K$>$ }\\\hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT}$<$ \hyperlink{classDcel_1_1FaceT}{FaceT}$<$ T $>$, K $>$ \hyperlink{namespaceDcel_a08217ffcd4cfc6f58a3b0b3f780fc611}{spatial\+Split\+Binary\+Partitioner} +\begin{DoxyCompactList}\small\item\em Binary partitioner based on spatial splits. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Namespace containing various double-\/connected edge list (D\+C\+EL) functionality. + +\subsection{Variable Documentation} +\mbox{\Hypertarget{namespaceDcel_a628449c42ce3f2784ca018f2a3c88a11}\label{namespaceDcel_a628449c42ce3f2784ca018f2a3c88a11}} +\index{Dcel@{Dcel}!default\+B\+V\+Constructor@{default\+B\+V\+Constructor}} +\index{default\+B\+V\+Constructor@{default\+B\+V\+Constructor}!Dcel@{Dcel}} +\subsubsection{\texorpdfstring{default\+B\+V\+Constructor}{defaultBVConstructor}} +{\footnotesize\ttfamily template$<$class T , class BV $>$ \\ +\hyperlink{namespaceBVH_a245702d7eff40cdaedb5dff68c25a88a}{B\+V\+H\+::\+B\+V\+ConstructorT}$<$\hyperlink{classDcel_1_1FaceT}{FaceT}$<$T$>$, BV$>$ Dcel\+::default\+B\+V\+Constructor} + +{\bfseries Initial value\+:} +\begin{DoxyCode} += [](\textcolor{keyword}{const} std::shared\_ptr >& a\_primitive)\{ + \textcolor{keywordflow}{return} BV(a\_primitive->getAllVertexCoordinates()); + \} +\end{DoxyCode} + + +Bounding volume constructor for a D\+C\+EL face. + +With B\+V\+Hs and D\+C\+EL, the object to be bounded is the polygon face (e.\+g., triangle). We assume that our BV constructor can enclose points, so we return an object that encloses all the vertices of the polygon. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitive} & Primitive (facet) to be bounded. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns a bounding volume which encloses the input face. +\end{DoxyReturn} +\mbox{\Hypertarget{namespaceDcel_a45e9f2554a8d9ea01164cd51f787f989}\label{namespaceDcel_a45e9f2554a8d9ea01164cd51f787f989}} +\index{Dcel@{Dcel}!default\+Stop\+Function@{default\+Stop\+Function}} +\index{default\+Stop\+Function@{default\+Stop\+Function}!Dcel@{Dcel}} +\subsubsection{\texorpdfstring{default\+Stop\+Function}{defaultStopFunction}} +{\footnotesize\ttfamily template$<$class T , class BV , int K$>$ \\ +\hyperlink{namespaceBVH_afef1c5979c34a11d23b756cc09654bf9}{B\+V\+H\+::\+Stop\+FunctionT}$<$T, \hyperlink{classDcel_1_1FaceT}{FaceT}$<$T$>$, BV, K$>$ Dcel\+::default\+Stop\+Function} + +{\bfseries Initial value\+:} +\begin{DoxyCode} += [](\textcolor{keyword}{const} \hyperlink{classBVH_1_1NodeT}{BVH::NodeT}, BV, K>& a\_node)\{ + \textcolor{keyword}{const} \textcolor{keyword}{auto}& primitives = a\_node.getPrimitives(); + \textcolor{keyword}{const} \textcolor{keywordtype}{int} numPrims = primitives.size(); + + \textcolor{keywordflow}{return} numPrims <= \hyperlink{namespaceDcel_a4db11eb50441e7c4e6c3ae796a202024}{primitivesPerLeafNode} || numPrims < K; + \} +\end{DoxyCode} + + +Default stop function. This function terminates the division process if a \hyperlink{namespaceBVH}{B\+VH} node has only one primitive. + +In this function, \hyperlink{classBVH_1_1NodeT}{B\+V\+H\+::\+NodeT}$<$T, Face\+T$<$\+T$>$, \hyperlink{namespaceBVH}{B\+VH} $>$ is a \hyperlink{namespaceBVH}{B\+VH} node. The interpretation of the parameters are\+: T is the precision, Face\+T$<$\+T$>$ is the primitive type in the \hyperlink{namespaceBVH}{B\+VH} tree, and BV is the bounding volume type. +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+node} & Bounding volume hierarchy node. \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +Returns true if the bounding volume shouldn\textquotesingle{}t be split more and false otherwise. +\end{DoxyReturn} +\mbox{\Hypertarget{namespaceDcel_a08217ffcd4cfc6f58a3b0b3f780fc611}\label{namespaceDcel_a08217ffcd4cfc6f58a3b0b3f780fc611}} +\index{Dcel@{Dcel}!spatial\+Split\+Binary\+Partitioner@{spatial\+Split\+Binary\+Partitioner}} +\index{spatial\+Split\+Binary\+Partitioner@{spatial\+Split\+Binary\+Partitioner}!Dcel@{Dcel}} +\subsubsection{\texorpdfstring{spatial\+Split\+Binary\+Partitioner}{spatialSplitBinaryPartitioner}} +{\footnotesize\ttfamily template$<$class T , int K$>$ \\ +\hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT}$<$\hyperlink{classDcel_1_1FaceT}{FaceT}$<$T$>$, K$>$ Dcel\+::spatial\+Split\+Binary\+Partitioner} + + + +Binary partitioner based on spatial splits. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & List of primitives to partition into sub-\/bounding volumes\\ +\hline +\end{DoxyParams} +This is a partitioner that calls the spatial\+Split\+Partitioner in order to recursively subdivided volumes into 2$^\wedge$K subvolumes. \mbox{\Hypertarget{namespaceDcel_ab4f869248e23d47bb01ad06c76288fef}\label{namespaceDcel_ab4f869248e23d47bb01ad06c76288fef}} +\index{Dcel@{Dcel}!spatial\+Split\+Partitioner@{spatial\+Split\+Partitioner}} +\index{spatial\+Split\+Partitioner@{spatial\+Split\+Partitioner}!Dcel@{Dcel}} +\subsubsection{\texorpdfstring{spatial\+Split\+Partitioner}{spatialSplitPartitioner}} +{\footnotesize\ttfamily template$<$class T , int K$>$ \\ +\hyperlink{namespaceBVH_a7c33d54da9893d506709b2ca96b76f55}{B\+V\+H\+::\+PartitionerT}$<$\hyperlink{classDcel_1_1FaceT}{FaceT}$<$T$>$, K$>$ Dcel\+::spatial\+Split\+Partitioner} + + + +Default partitioner function for subdividing into K sub-\/volumes. + + +\begin{DoxyParams}[1]{Parameters} +\mbox{\tt in} & {\em a\+\_\+primitives} & List of primitives to partition into sub-\/bounding volumes\\ +\hline +\end{DoxyParams} +This is a very stupid partitioner which splits into equal chunks along the longest coordinate. \ No newline at end of file diff --git a/docs/doxygen/latex/namespaceDcel_1_1Parser.tex b/docs/doxygen/latex/namespaceDcel_1_1Parser.tex new file mode 100644 index 00000000..b9e88cb9 --- /dev/null +++ b/docs/doxygen/latex/namespaceDcel_1_1Parser.tex @@ -0,0 +1,16 @@ +\hypertarget{namespaceDcel_1_1Parser}{}\section{Dcel\+:\+:Parser Namespace Reference} +\label{namespaceDcel_1_1Parser}\index{Dcel\+::\+Parser@{Dcel\+::\+Parser}} + + +Namespace which encapsulates possible file parsers for building D\+C\+EL meshes. + + +\subsection*{Classes} +\begin{DoxyCompactItemize} +\item +class \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} +\begin{DoxyCompactList}\small\item\em Class for generation a Dcel\+::\+Mesh\+T$<$\+T$>$ from the Stanford \hyperlink{classDcel_1_1Parser_1_1PLY}{P\+LY} file format. \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\subsection{Detailed Description} +Namespace which encapsulates possible file parsers for building D\+C\+EL meshes. \ No newline at end of file diff --git a/docs/doxygen/latex/namespaceEBGeometry.tex b/docs/doxygen/latex/namespaceEBGeometry.tex new file mode 100644 index 00000000..e7568ea8 --- /dev/null +++ b/docs/doxygen/latex/namespaceEBGeometry.tex @@ -0,0 +1,11 @@ +\hypertarget{namespaceEBGeometry}{}\section{E\+B\+Geometry Namespace Reference} +\label{namespaceEBGeometry}\index{E\+B\+Geometry@{E\+B\+Geometry}} + + +Name space for all of \hyperlink{namespaceEBGeometry}{E\+B\+Geometry}. + + + + +\subsection{Detailed Description} +Name space for all of \hyperlink{namespaceEBGeometry}{E\+B\+Geometry}. \ No newline at end of file diff --git a/docs/doxygen/latex/namespaces.tex b/docs/doxygen/latex/namespaces.tex new file mode 100644 index 00000000..9fcc6077 --- /dev/null +++ b/docs/doxygen/latex/namespaces.tex @@ -0,0 +1,8 @@ +\section{Namespace List} +Here is a list of all documented namespaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\hyperlink{namespaceBoundingVolumes}{Bounding\+Volumes} \\*Namespace for encapsulating various bounding volumes for usage with B\+V\+Hs }{\pageref{namespaceBoundingVolumes}}{} +\item\contentsline{section}{\hyperlink{namespaceBVH}{B\+VH} \\*Namespace for various bounding volume heirarchy (\hyperlink{namespaceBVH}{B\+VH}) functionality }{\pageref{namespaceBVH}}{} +\item\contentsline{section}{\hyperlink{namespaceDcel}{Dcel} \\*Namespace containing various double-\/connected edge list (D\+C\+EL) functionality }{\pageref{namespaceDcel}}{} +\item\contentsline{section}{\hyperlink{namespaceDcel_1_1Parser}{Dcel\+::\+Parser} \\*Namespace which encapsulates possible file parsers for building D\+C\+EL meshes }{\pageref{namespaceDcel_1_1Parser}}{} +\item\contentsline{section}{\hyperlink{namespaceEBGeometry}{E\+B\+Geometry} \\*Name space for all of \hyperlink{namespaceEBGeometry}{E\+B\+Geometry} }{\pageref{namespaceEBGeometry}}{} +\end{DoxyCompactList} diff --git a/docs/doxygen/latex/refman.tex b/docs/doxygen/latex/refman.tex new file mode 100644 index 00000000..6d48fc5f --- /dev/null +++ b/docs/doxygen/latex/refman.tex @@ -0,0 +1,228 @@ +\documentclass[twoside]{book} + +% Packages required by doxygen +\usepackage{fixltx2e} +\usepackage{calc} +\usepackage{doxygen} +\usepackage[export]{adjustbox} % also loads graphicx +\usepackage{graphicx} +\usepackage[utf8]{inputenc} +\usepackage{makeidx} +\usepackage{multicol} +\usepackage{multirow} +\PassOptionsToPackage{warn}{textcomp} +\usepackage{textcomp} +\usepackage[nointegrals]{wasysym} +\usepackage[table]{xcolor} + +% Font selection +\usepackage[T1]{fontenc} +\usepackage[scaled=.90]{helvet} +\usepackage{courier} +\usepackage{amssymb} +\usepackage{sectsty} +\renewcommand{\familydefault}{\sfdefault} +\allsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% +} +\renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% +} +\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + +% Page & text layout +\usepackage{geometry} +\geometry{% + a4paper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% +} +\tolerance=750 +\hfuzz=15pt +\hbadness=750 +\setlength{\emergencystretch}{15pt} +\setlength{\parindent}{0cm} +\setlength{\parskip}{3ex plus 2ex minus 2ex} +\makeatletter +\renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% +} +\renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% +} +\makeatother + +% Headers & footers +\usepackage{fancyhdr} +\pagestyle{fancyplain} +\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}} +\fancyhead[CE]{\fancyplain{}{}} +\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}} +\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}} +\fancyhead[CO]{\fancyplain{}{}} +\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}} +\fancyfoot[LE]{\fancyplain{}{}} +\fancyfoot[CE]{\fancyplain{}{}} +\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }} +\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated by Doxygen }} +\fancyfoot[CO]{\fancyplain{}{}} +\fancyfoot[RO]{\fancyplain{}{}} +\renewcommand{\footrulewidth}{0.4pt} +\renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% +} +\renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% +} + +% Indices & bibliography +\usepackage{natbib} +\usepackage[titles]{tocloft} +\setcounter{tocdepth}{3} +\setcounter{secnumdepth}{5} +\makeindex + +% Hyperlinks (required, but should be loaded last) +\usepackage{ifpdf} +\ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} +\else + \usepackage[ps2pdf,pagebackref=true]{hyperref} +\fi +\hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode% +} + +% Custom commands +\newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% +} + +\usepackage{caption} +\captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} + +%===== C O N T E N T S ===== + +\begin{document} + +% Titlepage & ToC +\hypersetup{pageanchor=false, + bookmarksnumbered=true, + pdfencoding=unicode + } +\pagenumbering{alph} +\begin{titlepage} +\vspace*{7cm} +\begin{center}% +{\Large E\+B\+Geometry \\[1ex]\large 1.\+0 }\\ +\vspace*{1cm} +{\large Generated by Doxygen 1.8.13}\\ +\end{center} +\end{titlepage} +\clearemptydoublepage +\pagenumbering{roman} +\tableofcontents +\clearemptydoublepage +\pagenumbering{arabic} +\hypersetup{pageanchor=true} + +%--- Begin generated contents --- +\chapter{E\+B\+Geometry} +\label{index}\hypertarget{index}{}\input{index} +\chapter{Todo List} +\label{todo} +\Hypertarget{todo} +\input{todo} +\chapter{Namespace Index} +\input{namespaces} +\chapter{Hierarchical Index} +\input{hierarchy} +\chapter{Class Index} +\input{annotated} +\chapter{File Index} +\input{files} +\chapter{Namespace Documentation} +\input{namespaceBoundingVolumes} +\input{namespaceBVH} +\input{namespaceDcel} +\input{namespaceDcel_1_1Parser} +\input{namespaceEBGeometry} +\chapter{Class Documentation} +\input{classBoundingVolumes_1_1AABBT} +\input{classBoundingVolumes_1_1BoundingSphereT} +\input{classDcel_1_1EdgeIteratorT} +\input{classDcel_1_1EdgeT} +\input{classDcel_1_1FaceT} +\input{classBVH_1_1LinearBVH} +\input{classBVH_1_1LinearNodeT} +\input{classDcel_1_1MeshT} +\input{classBVH_1_1NodeT} +\input{classDcel_1_1Parser_1_1PLY} +\input{classDcel_1_1Polygon2D} +\input{classRotateOp} +\input{classScaleOp} +\input{classSignedDistanceFunction} +\input{classSphereSDF} +\input{classTransformOp} +\input{classTranslateOp} +\input{classUnion} +\input{classUnionBVH} +\input{classVec2T} +\input{classVec3T} +\input{classDcel_1_1VertexT} +\chapter{File Documentation} +\input{EBGeometry__AnalyticDistanceFunctions_8hpp} +\input{EBGeometry__BoundingVolumes_8hpp} +\input{EBGeometry__BoundingVolumesImplem_8hpp} +\input{EBGeometry__BVH_8hpp} +\input{EBGeometry__BVHImplem_8hpp} +\input{EBGeometry__Dcel_8hpp} +\input{EBGeometry__DcelBVH_8hpp} +\input{EBGeometry__DcelEdge_8hpp} +\input{EBGeometry__DcelEdgeImplem_8hpp} +\input{EBGeometry__DcelFace_8hpp} +\input{EBGeometry__DcelFaceImplem_8hpp} +\input{EBGeometry__DcelIterator_8hpp} +\input{EBGeometry__DcelIteratorImplem_8hpp} +\input{EBGeometry__DcelMesh_8hpp} +\input{EBGeometry__DcelMeshImplem_8hpp} +\input{EBGeometry__DcelParser_8hpp} +\input{EBGeometry__DcelParserImplem_8hpp} +\input{EBGeometry__DcelPolygon2D_8hpp} +\input{EBGeometry__DcelPolygon2DImplem_8hpp} +\input{EBGeometry__DcelVertex_8hpp} +\input{EBGeometry__DcelVertexImplem_8hpp} +\input{EBGeometry__NamespaceFooter_8hpp} +\input{EBGeometry__NamespaceHeader_8hpp} +\input{EBGeometry__SignedDistanceFunction_8hpp} +\input{EBGeometry__SignedDistanceFunctionImplem_8hpp} +\input{EBGeometry__TransformOps_8hpp} +\input{EBGeometry__TransformOpsImplem_8hpp} +\input{EBGeometry__Union_8hpp} +\input{EBGeometry__UnionBVH_8hpp} +\input{EBGeometry__UnionBVHImplem_8hpp} +\input{EBGeometry__UnionImplem_8hpp} +\input{EBGeometry__Vec_8hpp} +\input{EBGeometry__VecImplem_8hpp} +%--- End generated contents --- + +% Index +\backmatter +\newpage +\phantomsection +\clearemptydoublepage +\addcontentsline{toc}{chapter}{Index} +\printindex + +\end{document} diff --git a/docs/doxygen/latex/todo.tex b/docs/doxygen/latex/todo.tex new file mode 100644 index 00000000..a55f733b --- /dev/null +++ b/docs/doxygen/latex/todo.tex @@ -0,0 +1,9 @@ + +\begin{DoxyRefList} +\item[\label{todo__todo000001}% +\Hypertarget{todo__todo000001}% +Class \hyperlink{classBVH_1_1LinearNodeT}{B\+VH\+:\+:Linear\+NodeT$<$ T, P, BV, K $>$} ]There\textquotesingle{}s a minor optimization that can be made to the memory alignment, which is as follows\+: For a leaf node we never really need the m\+\_\+child\+Offsets array, and for a regular node we never really need the m\+\_\+primitives\+Offset member. Moreover, m\+\_\+child\+Offsets could be made into a K-\/1 sized array because we happen to know that the linearized hierarchy will store the first child node immediately after the regular node. We could shave off 16 bytes of storage, which would mean that a double-\/precision binary tree only takes up one word of C\+PU memory. +\item[\label{todo__todo000002}% +\Hypertarget{todo__todo000002}% +File \hyperlink{EBGeometry__DcelEdgeImplem_8hpp}{E\+B\+Geometry\+\_\+\+Dcel\+Edge\+Implem.hpp} ]Include m\+\_\+face in constructors +\end{DoxyRefList} \ No newline at end of file diff --git a/docs/genindex.html b/docs/genindex.html new file mode 100644 index 00000000..fe861bfe --- /dev/null +++ b/docs/genindex.html @@ -0,0 +1,200 @@ + + + + + + + + + + + Index — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +
    + +
  • Docs »
  • + +
  • Index
  • + + +
  • + + + +
  • + +
+ + +
+
+
+
+ + +

Index

+ +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..19268581 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,269 @@ + + + + + + + + + + + Welcome to EBGeometry’s documentation! — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

Welcome to EBGeometry’s documentation!

+

This is the developer documentation for EBGeometry. +EBGeometry is a small C++ package for computing signed distance fields from surface tesselations. +Although it is a self-contained package, it is was originally written for usage with embedded boundary (EB) codes.

+

This documentation is the user documentation for EBGeometry. +A separate Doxygen-generated API of EBGeometry is found here.

+ +
+ + +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/objects.inv b/docs/objects.inv new file mode 100644 index 00000000..db09f459 --- /dev/null +++ b/docs/objects.inv @@ -0,0 +1,9 @@ +# Sphinx inventory version 2 +# Project: EBGeometry +# Version: +# The remainder of this file is compressed using zlib. +xڅTn0 +8M]{L: (vad K$ ޾drv'[{ԣ 8_^F#noLKkշ$VWF ˉF'!V|ZNi5=zitΛg¢ޚɧ,~>>SEYy + + + + + + + + Search — EBGeometry 1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +
    + +
  • Docs »
  • + +
  • Search
  • + + +
  • + + + +
  • + +
+ + +
+
+
+
+ + + + +
+ +
+ +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/searchindex.js b/docs/searchindex.js new file mode 100644 index 00000000..a85d6b69 --- /dev/null +++ b/docs/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["BVH","Concepts","DCEL","Implementation","Introduction","ZZReferences","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinxcontrib.bibtex":9,sphinx:56},filenames:["BVH.rst","Concepts.rst","DCEL.rst","Implementation.rst","Introduction.rst","ZZReferences.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"1109":5,"2005":5,"243":5,"253":5,"abstract":3,"case":[0,1,2],"class":6,"const":3,"default":2,"float":3,"function":[1,2,4,6],"import":[1,2],"int":3,"new":0,"public":3,"return":[1,3],"true":1,"void":3,For:[0,1,2,3],The:[0,1,2,3,4],There:0,a_angl:3,a_axi:3,a_point:3,a_scal:3,a_transl:3,aana:5,about:3,abov:[0,3],acceler:[0,4,6],access:2,addit:[1,3],advantag:0,after:2,algorithm:2,all:[0,2],alpha_i:2,also:[0,1,2,3],altern:[0,3],although:[0,6],alwai:1,amrex:4,analyt:[0,6],angl:[2,3,5],ani:0,anisotrop:3,api:[3,6],appli:3,applic:1,approxim:0,ari:0,arithmet:3,around:[0,3],avail:2,axi:3,back:0,baerentzen:5,balanc:0,basic:[3,4,6],begin:1,belong:2,below:[0,3],between:[0,1,2],beyond:0,binari:0,block:[],both:[0,2],bottom:0,bound:[4,6],boundari:[4,6],branch:0,brief:3,bvh:[0,4,6],calcul:4,call:[0,3],can:[0,1,2,3,4],cartesian:3,cdot:2,center:1,child:0,children:0,chombo:4,circul:2,clariti:[],clone:4,close:0,closer:0,closest:[0,1,2],code:[3,4,6],com:4,common:3,compact:[4,6],compar:[0,2,4],compil:4,complet:0,compon:3,composit:1,comput:[0,2,4,5,6],concept:[3,6],connect:[2,4],consequ:0,consid:[0,3],consist:2,construct:[4,6],constructor:3,contain:[0,3,6],content:6,convent:1,coordin:[2,3],coupl:4,creat:[0,4],criteria:0,cross:2,data:[0,2,3],dcel:[4,6],defin:[1,2,3],degre:3,descend:0,detail:3,determin:[0,2,3],develop:6,differ:1,dimension:[2,3],distanc:[4,5,6],distinguish:2,divid:0,doe:2,doi:5,done:[0,2],dot:3,doubli:[2,4],down:0,doxygen:6,duplic:0,each:[0,2],easili:2,ebgeometri:[0,1,2,3,4],ebgeometry_analyticsigneddist:[],ebgeometry_analyticsigneddistancefunct:3,edg:[2,3,4],eikon:1,either:2,emb:4,embed:[0,2,4,6],encapsul:3,enclos:0,end:[1,2],enoughprimit:0,ensur:1,entir:[0,3],entri:3,equal:[],evalu:1,everywher:1,exact:1,exampl:[0,1,3,4],exist:[0,2,3,4],exterior:[1,3],extern:3,extrem:0,f_i:2,face:[0,2],facet:2,factor:3,featur:[2,6],fetch:2,field:[2,3,4,6],fig:[0,2],file:6,find:0,first:[0,2,3],flexibl:[0,4],flip:2,folder:4,follow:[0,1,2,3,4],foral:0,form:4,found:[1,6],frac:2,from:[0,2,4,6],full:[4,6],fundament:[0,3],further:0,furthermor:[],gener:6,geometr:0,get:0,git:4,github:4,given:2,goal:0,graphic:5,grid:[3,4],group:1,grown:[],half:[2,3],has:[0,1,3],have:[0,3],header:[3,4],heavi:4,here:[0,3,6],heurist:0,hierarc:0,hierarch:0,hierarchi:[4,6],higher:4,hole:2,how:[3,4],hpp:[3,4],ieee:5,ignor:2,illustr:0,implement:[2,4,6],implicit:1,includ:4,index:1,input:[0,3],insert:0,insertchildnod:0,insid:[1,2],integr:6,interior:[1,3],intersect:1,introduct:[3,6],investig:0,involv:2,its:0,jump:2,just:2,later:0,ldot:[0,1],leaf:0,least:0,left:[0,1,2,3],length:3,level:4,librari:[3,4],lies:2,like:[3,4],limit:0,line:2,linear:4,linearbvh:3,list:[0,2,4],literatur:[],longer:[],m_bvh:3,m_mesh:3,magnitud:0,major:3,make:[0,4],manipul:3,mathbb:1,mathbf:[0,1,2,3],mesh:[3,4,6],mesht:3,metaprogram:4,method:0,might:2,minim:0,more:[0,2],most:[2,3],move:0,multi:4,multipl:3,must:3,mydistancefunct:3,mysigneddistancefunct:3,nabla:1,namespac:[2,3],navig:4,necessari:2,need:3,neighbor:2,newli:0,newobject:0,next:2,node:0,noexcept:3,non:1,normal:6,note:0,number:[0,2],numer:3,object:[0,1,2,3,4],obtain:[2,4],one:[0,2,3],onli:[0,3,4],onto:3,oper:3,order:[0,3,4],orient:[2,4],origin:[4,6],other:[0,3],otherwis:2,out:3,outgo:2,outsid:[1,2],over:2,overlap:[0,1],overrid:3,own:[2,3],packag:6,pair:2,parametr:2,parent:[],parser:6,partit:[0,4],partition:3,partitionedobject:0,perform:[0,3,4],permit:[2,4],place:[],planar:[2,3],plane:[1,2],point:[0,1,2,3],pointer:2,polygon:[0,2,3],posit:2,possibl:[0,1,2,3],practic:0,precis:3,previou:2,prime:[2,3],primit:0,procedur:0,product:3,project:[2,3],properti:[0,1],protect:3,provid:[0,1],prune:0,pseudonorm:[2,5],put:3,quad:1,queri:[],quickstart:6,radiu:1,rather:1,read:3,reason:[],recurs:0,refer:[0,2,6],regard:0,regular:0,relat:3,reliant:0,repres:[0,1,4],represent:[2,4,6],requir:[0,2,6],result:1,retain:1,revers:1,right:[0,1,2,3],rightarrow:[0,1],rmrsk:4,root:[],rotat:[1,3,4],routin:[0,3],rudimentari:4,rule:0,run:[2,3],s_1:1,s_2:1,s_i:1,s_k:1,same:1,scale:[1,3,4],scene:4,sdf:3,search:0,second:3,see:[2,3],self:6,sens:[],separ:6,sequenti:3,set:[0,1],shape:3,share:2,shared_ptr:3,shorter:0,should:0,show:[0,4],shown:[2,3],sign:[4,5,6],signeddist:3,signeddistancefunct:3,simpl:[0,4],simpli:2,sinc:[0,1],singl:[0,2],slice:1,small:6,sophist:0,sourc:3,sph:1,sphere:[1,3],split:[],standard:[2,6],start:2,statement:1,std:3,step:0,store:[0,2,4],straightforward:4,structur:[0,3,4,6],subset:0,subtend:2,subtract:3,subtre:0,sum:2,sum_i:2,supplement:[0,2],suppli:3,support:[0,4],surfac:[2,3,4,6],take:0,templat:3,termin:0,tessel:6,textrm:[0,1],than:[0,1,2],thei:0,them:4,themselv:[],therefor:2,theta:3,thi:[0,2,3,6],think:2,three:[2,3],through:[0,1,3],throughout:[],thu:0,tight:4,tightli:0,top:[0,4],topdownconstruct:0,topic:[],touch:1,transact:5,transform:[4,6],transformpoint:3,translat:[1,3,4],travers:0,tree:[0,4],triangl:0,triangul:0,tvcg:5,two:[0,2,3,4],type:[0,6],under:3,union:[4,6],uniqu:2,usag:[4,6],use:[1,2,4],used:[0,4],useful:0,user:[3,6],uses:[2,4],using:[2,3,5],usual:0,variou:[2,3],vast:[],vec2t:3,vec3t:3,vec:0,vector:6,vertex:2,vertic:[2,3],visibl:4,visit:0,visual:5,volum:[4,6],water:4,watertight:[2,4],weight:5,well:[0,1,2],what:0,when:[0,2,3],where:[0,1,2,3],which:[0,1,2,3,4],whose:0,wind:2,without:3,written:[1,3,4,6],yield:2,your:4},titles:["Bounding volume hierarchies","Basic concepts","DCEL mesh structure","Implementation","Introduction","References","Welcome to EBGeometry\u2019s documentation!"],titleterms:{"class":3,"function":[0,3],acceler:3,analyt:3,basic:[0,1,2],bound:[0,3],bvh:3,compact:3,concept:[0,1,2],construct:[0,3],dcel:[2,3],distanc:[0,1,2,3],document:6,ebgeometri:6,featur:4,field:1,file:3,full:3,hierarchi:[0,3],implement:3,integr:3,introduct:4,mesh:2,normal:2,numer:[],parser:3,quickstart:4,refer:5,represent:3,requir:4,sign:[0,1,2,3],standard:3,structur:2,transform:[1,3],type:3,union:[1,3],vector:[2,3],volum:[0,3],welcom:6}}) \ No newline at end of file diff --git a/doxyfile b/doxyfile new file mode 100644 index 00000000..14ba1088 --- /dev/null +++ b/doxyfile @@ -0,0 +1,2494 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "EBGeometry" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs/doxygen + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ./ ./Source + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = ./ + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /