From b0ec3bd561b2543f4d66240f09a94eda66b6ad41 Mon Sep 17 00:00:00 2001 From: gjj Date: Thu, 19 Sep 2024 00:47:45 +0800 Subject: [PATCH] AABB --- algoim/organizer/organizer.hpp | 42 +++++++++++++++++++--------------- algoim/organizer/primitive.hpp | 25 ++++++++++++++++++-- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/algoim/organizer/organizer.hpp b/algoim/organizer/organizer.hpp index 47e079b..0092912 100644 --- a/algoim/organizer/organizer.hpp +++ b/algoim/organizer/organizer.hpp @@ -311,6 +311,7 @@ void buildOcTreeV1(const Scene& scene, const OcTreeNode& node, std::vector& leaves) { + int a = 0; const std::vector& polyIntersectIndices = node.polyIntersectIndices; if (polyIntersectIndices.size() <= 4) { leaves.emplace_back(node); @@ -340,9 +341,9 @@ void buildOcTreeV0(const Scene& scene, const OcTreeNode& node, std::vector& p, int q = 20, real xmin = if (auto pt = std::dynamic_pointer_cast(p)) { tensor3 tensor(nullptr, 3); algoim_spark_alloc(real, tensor); - makeSphere(*pt, tensor); + AABB aabb; + makeSphere(*pt, tensor, aabb); detail::powerTransformation(range, xmin, tensor); tensor3 phi(nullptr, 3); @@ -387,8 +389,8 @@ void basicTask(const std::shared_ptr& p, int q = 20, real xmin = tensor3 compositeTensor(nullptr, 1 + faceCount); algoim_spark_alloc(real, compositeTensor); - - makeMesh(*pt, compositeTensor, planeTensors); + AABB aabb; + makeMesh(*pt, compositeTensor, planeTensors, aabb); detail::powerTransformation(range, xmin, compositeTensor); auto planeStdVector1 = xarray2StdVector(planeTensors[0]); @@ -439,7 +441,8 @@ void basicTask(const std::vector>& primitives, in algoim_spark_alloc_heap(real, phi)); // 必须先于algoim_spark_alloc,使transformedTensor的内存以栈形式释放 algoim_spark_alloc(real, transformedTensor); - makeSphere(*pt, originTensor); + AABB aabb; + makeSphere(*pt, originTensor, aabb); originTensors.emplace_back(originTensor); detail::powerTransformation(range, xmin, originTensor, transformedTensor); @@ -458,8 +461,8 @@ void basicTask(const std::vector>& primitives, in tensor3 compositeTensor(nullptr, 1 + faceCount); algoim_spark_alloc(real, compositeTensor); - - makeMesh(*pt, compositeTensor, planeTensors); + AABB aabb; + makeMesh(*pt, compositeTensor, planeTensors, aabb); detail::powerTransformation(range, xmin, compositeTensor); real testEvalPower = evalPower(compositeTensor, testX); @@ -528,13 +531,14 @@ void quadratureScene(const std::vector>& primitiv algoim_spark_alloc_heap(real, phi)); // 必须先于algoim_spark_alloc,使transformedTensor的内存以栈形式释放 algoim_spark_alloc(real, transformedTensor); - makeSphere(*pt, originTensor); + AABB aabb; + makeSphere(*pt, originTensor, aabb); detail::powerTransformation(range, xmin, originTensor, transformedTensor); real testEvaOri = evalPower(originTensor, testX); detail::power2BernsteinTensor(transformedTensor, phi); - completeTensorReps.emplace_back(CompleteTensorRep{phi, {originTensor}}); + completeTensorReps.emplace_back(CompleteTensorRep{phi, {originTensor}, aabb}); } else if (auto pt = std::dynamic_pointer_cast(primitives[i])) { const int faceCount = pt->indexInclusiveScan.size(); assert(faceCount > 1); @@ -547,8 +551,8 @@ void quadratureScene(const std::vector>& primitiv tensor3 compositeTensor(nullptr, 1 + faceCount); algoim_spark_alloc(real, compositeTensor); - - makeMesh(*pt, compositeTensor, planeTensors); + AABB aabb; + makeMesh(*pt, compositeTensor, planeTensors, aabb); detail::powerTransformation(range, xmin, compositeTensor); real testEvalPower = evalPower(compositeTensor, testX); @@ -556,7 +560,7 @@ void quadratureScene(const std::vector>& primitiv detail::power2BernsteinTensor(compositeTensor, phi); real testEvalBernstein = bernstein::evalBernsteinPoly(phi, testX); - completeTensorReps.emplace_back(CompleteTensorRep{phi, planeTensors}); + completeTensorReps.emplace_back(CompleteTensorRep{phi, planeTensors, aabb}); } else if (auto pt = std::dynamic_pointer_cast(primitives[i])) { std::vector rawTensors(3, tensor3(nullptr, 2)); rawTensors[0].ext_ = 3; @@ -569,14 +573,14 @@ void quadratureScene(const std::vector>& primitiv tensor3 compositeTensor(nullptr, resExt); algoim_spark_alloc(real, compositeTensor); - - makeCylinder(*pt, compositeTensor, rawTensors); + AABB aabb; + makeCylinder(*pt, compositeTensor, rawTensors, aabb); detail::powerTransformation(range, xmin, compositeTensor); real testEvalPower = evalPower(compositeTensor, testX); detail::power2BernsteinTensor(compositeTensor, phi); - completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors}); + completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors, aabb}); } else if (auto pt = std::dynamic_pointer_cast(primitives[i])) { std::vector rawTensors(3, tensor3(nullptr, 2)); rawTensors[0].ext_ = 3; @@ -588,14 +592,14 @@ void quadratureScene(const std::vector>& primitiv tensor3 compositeTensor(nullptr, resExt); algoim_spark_alloc(real, compositeTensor); - - makeCone(*pt, compositeTensor, rawTensors); + AABB aabb; + makeCone(*pt, compositeTensor, rawTensors, aabb); detail::powerTransformation(range, xmin, compositeTensor); real testEvalPower = evalPower(compositeTensor, testX); detail::power2BernsteinTensor(compositeTensor, phi); - completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors}); + completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors, aabb}); } else { std::cerr << "unrecognized primitive type." << std::endl; } diff --git a/algoim/organizer/primitive.hpp b/algoim/organizer/primitive.hpp index aeb261a..b5933d4 100644 --- a/algoim/organizer/primitive.hpp +++ b/algoim/organizer/primitive.hpp @@ -687,7 +687,7 @@ void makeSphere(const SphereDesc& sphereDesc, xarray& tensor, AABB& aab aabb.max = sphereDesc.center + sphereDesc.radius; }; -void makeCylinder(const CylinderDesc& cylinderDesc, xarray& tensor, std::vector& rawTensors) +void makeCylinder(const CylinderDesc& cylinderDesc, xarray& tensor, std::vector& rawTensors, AABB& aabb) { auto & cylinderSrf = rawTensors[0], plane1 = rawTensors[1], plane2 = rawTensors[2]; int alignAxis = cylinderDesc.alignAxis; @@ -719,9 +719,19 @@ void makeCylinder(const CylinderDesc& cylinderDesc, xarray& tensor, std cylinderSrf.m(idx) = 1; detail::compositePower(rawTensors, 0, 0, 1, tensor); + + // AABB + aabb.extend(cylinderDesc.node1); + auto node2 = cylinderDesc.node1; + node2(alignAxis) += cylinderDesc.height; + aabb.extend(node2); + aabb.min(dimA) -= r; + aabb.max(dimA) += r; + aabb.min(dimB) -= r; + aabb.max(dimB) += r; } -void makeCone(const ConeDesc& coneDesc, tensor3& tensor, std::vector& rawTensors) +void makeCone(const ConeDesc& coneDesc, tensor3& tensor, std::vector& rawTensors, AABB& aabb) { assert(rawTensors.size() == 3 && all(rawTensors[0].ext() == 3) && all(rawTensors[1].ext() == 2) && all(rawTensors[2].ext() == 2)); @@ -755,11 +765,22 @@ void makeCone(const ConeDesc& coneDesc, tensor3& tensor, std::vector& r coneSrf.m(idx) = scaleSquare; detail::compositePower(rawTensors, 0, 0, 1, tensor); + + // AABB + aabb.extend(coneDesc.node1); + auto node2 = coneDesc.node1; + node2(alignAxis) += coneDesc.height; + aabb.extend(node2); + aabb.min(dimA) -= coneDesc.radius; + aabb.max(dimA) += coneDesc.radius; + aabb.min(dimB) -= coneDesc.radius; + aabb.max(dimB) += coneDesc.radius; } struct CompleteTensorRep { tensor3 compositedBernstein; // 合法输入在[0,1]^3 std::vector rawPower; // 合法输入在场景 + AABB aabb; }; struct Scene {