From fdc72a722c2b9932ecc1bf9bd56ac125f3aef623 Mon Sep 17 00:00:00 2001 From: gjj Date: Tue, 24 Sep 2024 20:25:31 +0800 Subject: [PATCH] fix bug of blobtree traversal --- algoim/organizer/blobtree.hpp | 8 ++++---- algoim/organizer/organizer.hpp | 21 +++++++++++++-------- gjj/primitiveDebug.hpp | 20 +++++++++++++++++++- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/algoim/organizer/blobtree.hpp b/algoim/organizer/blobtree.hpp index f0c09c8..e030fb7 100644 --- a/algoim/organizer/blobtree.hpp +++ b/algoim/organizer/blobtree.hpp @@ -117,15 +117,15 @@ void propagate(BlobTree& tree, unsigned int nodeIdx, bool in) return; } -// TODO: std::vector 可以改成bitset之类 +// TODO: std::vector 浪费内存,应实现动态大小的bitset /** * relatedPrimitives 是当次traversal需要care的primitives的索引,例如OcTree子问题中关联的Primitive */ -int traverse(BlobTree& tree, const std::vector& relatedPrimitives, const std::vector& primitiveInout) +int traverse(BlobTree& tree, const std::vector& relatedPrimitives, const std::vector& primitiveInout) { assert(relatedPrimitives.size() == primitiveInout.size()); - for (int primitiveIdx : relatedPrimitives) { - propagate(tree, tree.primitiveNodeIdx[primitiveIdx], primitiveInout[primitiveIdx]); + for (int i = 0; i < relatedPrimitives.size(); ++i) { + propagate(tree, tree.primitiveNodeIdx[relatedPrimitives[i]], static_cast(primitiveInout[i])); if (tree.structure.back().inOut != NODE_IN_OUT_UNKNOWN) { return tree.structure.back().inOut; } } return NODE_IN_OUT_UNKNOWN; diff --git a/algoim/organizer/organizer.hpp b/algoim/organizer/organizer.hpp index 09f6656..04c0ed1 100644 --- a/algoim/organizer/organizer.hpp +++ b/algoim/organizer/organizer.hpp @@ -113,15 +113,20 @@ bool keepQuadraturePoint(const std::vector& tensors, const OcTreeNode& // 只需要考虑intersect polys,不用考虑fully contained polys const auto& polyIntersectIndices = ocTreeNode.polyIntersectIndices; assert(tensors.size() == polyIntersectIndices.size()); - if (polyIntersectIndices.size() == 0) { - assert(ocTreeNode.blobTree.structure.back().inOut != NODE_IN_OUT_UNKNOWN); - return ocTreeNode.blobTree.structure.back().inOut; - } - std::vector primitiveInOuts(polyIntersectIndices.size()); + // if (polyIntersectIndices.size() == 0) { + // assert(ocTreeNode.blobTree.structure.back().inOut != NODE_IN_OUT_UNKNOWN); + // return ocTreeNode.blobTree.structure.back().inOut == organizer::NODE_IN; + // } + std::vector primitiveInOuts(polyIntersectIndices.size()); for (int i = 0; i < ocTreeNode.polyIntersectIndices.size(); ++i) { // primitiveInOuts[i] = isInsidePowers(scene.polys[polyIntersectIndices[i]].rawPower, originPt); primitiveInOuts[i] = isInsideBernstein(tensors[i], point); } + if (primitiveInOuts.size() == 3 && primitiveInOuts[0] == NODE_IN && primitiveInOuts[1] == NODE_IN + && primitiveInOuts[2] == NODE_IN) { + int aaa = 1; + int bbb = 1; + } // 这里blobTree是拷贝传参 auto blobTree = ocTreeNode.blobTree; int res = organizer::traverse(blobTree, ocTreeNode.polyIntersectIndices, primitiveInOuts); @@ -615,15 +620,15 @@ void quadratureScene(const std::vector>& primitiv for (int i = 0; i < minimalReps.size(); ++i) { rootNode.polyIntersectIndices.emplace_back(i); } int cnt = 1; buildOcTreeV0(scene, rootNode, leaves, 1, cnt); - - basicTask(scene, leaves[14], q); + std::cout << "octree built over" << std::endl; + // basicTask(scene, leaves[14], q); int i = 0; for (const auto& leaf : leaves) { auto basicRes = basicTask(scene, leaf, q); if (std::isinf(basicRes.volume)) { std::cout << "inf volume when solving leaf: " << i << std::endl; } volume += basicRes.volume; - std::cout << "Solved leaves: " << ++i << "/" << leaves.size() << std::endl; + std::cout << "Solved leaves: " << ++i << "/" << leaves.size() << ", volume: " << volume << std::endl; } volume *= prod(xmax - xmin); diff --git a/gjj/primitiveDebug.hpp b/gjj/primitiveDebug.hpp index fb1e213..9cea124 100644 --- a/gjj/primitiveDebug.hpp +++ b/gjj/primitiveDebug.hpp @@ -176,6 +176,23 @@ void caseScene() quadratureScene(primitiveDescriptions, uvector3(-0.8, -1.3, -1.6), uvector3(1.6, 1.6, 1.5), blobTree); } +void caseScene1() +{ + const int PRIMITIVE_CNT = 2; + std::vector> primitiveDescriptions(PRIMITIVE_CNT); + primitiveDescriptions[0] = std::make_shared(CuboidDesc(0., 1.6)); + primitiveDescriptions[1] = std::make_shared(CuboidDesc(uvector3(0.6, 0.6, -0.6), 2.)); + organizer::BlobTree blobTree; + blobTree.structure.resize(PRIMITIVE_CNT * 2 - 1); + blobTree.primitiveNodeIdx.resize(PRIMITIVE_CNT); + // blobTree.structure[0] = {0, 0, NODE_IN_OUT_UNKNOWN, 0, 1, 2}; // cube1 + blobTree.structure[0] = {1, 0, NODE_IN_OUT_UNKNOWN, 0, 1, 2}; // cube1 + blobTree.structure[1] = {1, 0, NODE_IN_OUT_UNKNOWN, 0, 0, 0}; // cube2 + blobTree.structure[2] = {0, OP_INTERSECTION, NODE_IN_OUT_UNKNOWN, 0, 0, 0}; // INTERSECTION of cubes = opNode1 + blobTree.primitiveNodeIdx = {0, 1}; + quadratureScene(primitiveDescriptions, uvector3(-0.8, -1.3, -1.6), uvector3(1.6, 1.6, 1.5), blobTree); +} + void testDeCasteljau() { auto phiDesc = std::make_shared(SphereDesc(0.8, uvector3(0), 1.)); @@ -343,7 +360,8 @@ void testPrimitive() // casePolyhedronSphere(); // testSubDivideWithDeCasteljau(); // testBlob(); - caseScene(); + // caseScene(); + caseScene1(); // testPlaneWithinSubcell(); // caseCubeSphere(); // caseTwoCube();