initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / meshTools / triSurface / octreeData / octreeDataTriSurfaceTreeLeaf.C
blobe555cb2487cbe48d2b7f2e7ad48f39f457025a77
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software; you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation; either version 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 Description
27 \*---------------------------------------------------------------------------*/
29 #include "octreeDataTriSurfaceTreeLeaf.H"
30 #include "octreeDataTriSurface.H"
32 // * * * * * * * * * * * * * Template Specialisations  * * * * * * * * * * * //
34 template<>
35 bool Foam::treeLeaf<Foam::octreeDataTriSurface>::findNearest
37     const octreeDataTriSurface& shapes,
38     const point& sample,
39     treeBoundBox& tightest,
40     label& tightestI,
41     scalar& tightestDist
42 ) const
44     // Some aliases
45     const treeBoundBoxList& allBb = shapes.allBb();
46     point& min = tightest.min();
47     point& max = tightest.max();
49     point nearest;
51     bool changed = false;
52     forAll(indices_, i)
53     {
54         label faceI = indices_[i];
56         // Quick rejection test.
57         if (tightest.overlaps(allBb[faceI]))
58         {
59             // Full calculation
60             scalar dist = shapes.calcNearest(faceI, sample, nearest);
62             if (dist < tightestDist)
63             {
64                 // Update bb (centered around sample, span is dist)
65                 min.x() = sample.x() - dist;
66                 min.y() = sample.y() - dist;
67                 min.z() = sample.z() - dist;
69                 max.x() = sample.x() + dist;
70                 max.y() = sample.y() + dist;
71                 max.z() = sample.z() + dist;
73                 tightestI = faceI;
74                 tightestDist = dist;
76                 changed = true;
77             }
78         }
79     }
80     return changed;
84 // ************************************************************************* //