/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . \*---------------------------------------------------------------------------*/ #include "treeDataPrimitivePatch.H" #include "indexedOctree.H" #include "triangleFuncs.H" #include "triSurfaceTools.H" #include "triFace.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template Foam::treeBoundBox Foam::treeDataPrimitivePatch::calcBb ( const pointField& points, const face& f ) { treeBoundBox bb(points[f[0]], points[f[0]]); for (label fp = 1; fp < f.size(); fp++) { const point& p = points[f[fp]]; bb.min() = min(bb.min(), p); bb.max() = max(bb.max(), p); } return bb; } template void Foam::treeDataPrimitivePatch::update() { if (cacheBb_) { bbs_.setSize(patch_.size()); forAll(patch_, i) { bbs_[i] = calcBb(patch_.points(), patch_[i]); } } } template bool Foam::treeDataPrimitivePatch::findIntersection ( const indexedOctree >& tree, const label index, const point& start, const point& end, point& intersectionPoint ) { const treeDataPrimitivePatch& shape = tree.shapes(); const PatchType& patch = shape.patch(); const pointField& points = patch.points(); const typename PatchType::FaceType& f = patch[index]; // Do quick rejection test if (shape.cacheBb_) { const treeBoundBox& faceBb = shape.bbs_[index]; if ((faceBb.posBits(start) & faceBb.posBits(end)) != 0) { // start and end in same block outside of faceBb. return false; } } const vector dir(end - start); pointHit inter; if (f.size() == 3) { inter = triPointRef ( points[f[0]], points[f[1]], points[f[2]] ).intersection(start, dir, intersection::HALF_RAY, shape.planarTol_); } else { const pointField& faceCentres = patch.faceCentres(); inter = f.intersection ( start, dir, faceCentres[index], points, intersection::HALF_RAY ); } if (inter.hit() && inter.distance() <= 1) { // Note: no extra test on whether intersection is in front of us // since using half_ray intersectionPoint = inter.hitPoint(); return true; } else { return false; } } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // Construct from components template Foam::treeDataPrimitivePatch::treeDataPrimitivePatch ( const bool cacheBb, const PatchType& patch, const scalar planarTol ) : patch_(patch), cacheBb_(cacheBb), planarTol_(planarTol) { update(); } template Foam::treeDataPrimitivePatch::findNearestOp::findNearestOp ( const indexedOctree >& tree ) : tree_(tree) {} template Foam::treeDataPrimitivePatch::findIntersectOp::findIntersectOp ( const indexedOctree >& tree ) : tree_(tree) {} template Foam::treeDataPrimitivePatch::findAllIntersectOp::findAllIntersectOp ( const indexedOctree >& tree, DynamicList