From 4e423e630e4284d7542224166f31b3c8145f4c27 Mon Sep 17 00:00:00 2001 From: gjj Date: Thu, 12 Sep 2024 00:13:38 +0800 Subject: [PATCH] filter with blobTre --- algoim/organizer/blobtree.hpp | 4 ++-- algoim/organizer/organizer.hpp | 38 ++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/algoim/organizer/blobtree.hpp b/algoim/organizer/blobtree.hpp index 33d56cd..73e1e6e 100644 --- a/algoim/organizer/blobtree.hpp +++ b/algoim/organizer/blobtree.hpp @@ -97,9 +97,9 @@ int traverse(BlobTree& tree, const std::vector& relatedPrimitives, const st assert(relatedPrimitives.size() == primitiveInout.size()); for (int primitiveIdx : relatedPrimitives) { propagate(tree, tree.primitiveNodeIdx[primitiveIdx], primitiveInout[primitiveIdx]); - if (tree.structure.back().inOut != 0) { return tree.structure.back().inOut; } + if (tree.structure.back().inOut != NODE_IN_OUT_UNKNOWN) { return tree.structure.back().inOut; } } - return 0; + return NODE_IN_OUT_UNKNOWN; } int traverse(BlobTree& tree, const int relatedPrimitive, const bool primitiveInout) diff --git a/algoim/organizer/organizer.hpp b/algoim/organizer/organizer.hpp index f889ab1..70394c3 100644 --- a/algoim/organizer/organizer.hpp +++ b/algoim/organizer/organizer.hpp @@ -112,7 +112,7 @@ std::pair, uvector> getOneEightCellAABB(const uvector3& } // namespace detail // TODO: delete it -bool keepQuadraturePoint(std::vector& originTensors, const uvector3& originPt) +bool isPointInside(const std::vector& originTensors, const uvector3& originPt) { for (auto& t : originTensors) { if (evalPower(t, originPt) >= 0) { return false; } @@ -120,13 +120,33 @@ bool keepQuadraturePoint(std::vector& originTensors, const uvector3& or return true; } -bool keepQuadraturePoint(const Scene& scene, const OcTreeNode& ocTreeNode, const uvector3& originPt) +// bool isPointInside(const std::vector& completeTensorReps, const uvector3& originPt) +// { +// for (auto& completeTensorRep : completeTensorReps) { +// if (isPointInside(completeTensorRep.originalPower, originPt)) { return false; } +// } +// return true; +// } + +// 这里blobTree是拷贝传参 +bool keepQuadraturePoint(const Scene& scene, + organizer::BlobTree blobTree, + const OcTreeNode& ocTreeNode, + const uvector3& originPt) { // 只需要考虑intersect polys,不用考虑fully contained polys - for (auto& polyIntersectIdx : ocTreeNode.polyIntersectIndices) { - // TODO: + const auto& polyIntersectIndices = ocTreeNode.polyIntersectIndices; + std::vector primitiveInOuts(polyIntersectIndices.size()); + for (int i = 0; i < ocTreeNode.polyIntersectIndices.size(); ++i) { + primitiveInOuts[i] = isPointInside(scene.polys[polyIntersectIndices[i]].originalPower, originPt); + } + int res = organizer::traverse(blobTree, ocTreeNode.polyIntersectIndices, primitiveInOuts); + assert(res == organizer::NODE_IN || res == organizer::NODE_OUT); + if (res == organizer::NODE_OUT) { + return false; + } else { + return true; } - return true; } // std::vector> primitives; @@ -415,7 +435,7 @@ void basicTask(const std::vector>& primitives, in ipquad.integrate(AutoMixed, q, [&](const uvector& x, real w) { auto realX = x * range + xmin; - if (keepQuadraturePoint(originTensors, realX)) volume += w * integrand(realX); + if (isPointInside(originTensors, realX)) volume += w * integrand(realX); }); volume *= pow(xmax - xmin, 3); std::cout << "Volume xxx: " << volume << std::endl; @@ -425,7 +445,7 @@ void basicTask(const std::vector>& primitives, in for (auto& p : originTensorStacks) delete p; }; -BasicTaskRes basicTask(const Scene& scene, const OcTreeNode& node, int q = 20) +BasicTaskRes basicTask(const Scene& scene, const organizer::BlobTree& blobTree, const OcTreeNode& node, int q = 20) { auto integrand = [](const uvector& x) { return 1.0; }; real volume = 0., surf = 0.; @@ -433,7 +453,7 @@ BasicTaskRes basicTask(const Scene& scene, const OcTreeNode& node, int q = 20) ImplicitPolyQuadrature<3> ipquad(scene.polys); ipquad.integrate(AutoMixed, q, [&](const uvector& x, real w) { auto realX = x * range + node.min; - if (keepQuadraturePoint(scene, node, realX)) volume += w * integrand(realX); + if (keepQuadraturePoint(scene, blobTree, node, realX)) volume += w * integrand(realX); }); } @@ -498,7 +518,7 @@ void quadratureScene(const std::vector>& primitiv buildOcTree(scene, rootNode, leaves); for (const auto& leaf : leaves) { - auto basicRes = basicTask(scene, leaf, xmin, xmax, 10); + auto basicRes = basicTask(blobTree, scene, leaf, xmin, xmax, 10); volume += basicRes.volume; }