Browse Source

basic shape construction

master
gjj 6 months ago
parent
commit
31041674fc
  1. 3
      .clang-format
  2. 36
      algoim/organizer/organizer.hpp
  3. 83
      algoim/organizer/primitive.hpp
  4. 5
      algoim/quadrature_multipoly.hpp
  5. 125
      gjj/primitiveDebug.hpp

3
.clang-format

@ -1,4 +1,5 @@
BasedOnStyle: Google BasedOnStyle: Google
AccessModifierOffset: -4 AccessModifierOffset: -4
AlignAfterOpenBracket: Align AlignAfterOpenBracket: Align
AlignArrayOfStructures: Left AlignArrayOfStructures: Left
@ -51,7 +52,7 @@ AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes AlwaysBreakTemplateDeclarations: Yes
AttributeMacros: AttributeMacros:
- __capability - __capability
BinPackArguments: false BinPackArguments: true
BinPackParameters: false BinPackParameters: false
BitFieldColonSpacing: Both BitFieldColonSpacing: Both
BraceWrapping: BraceWrapping:

36
algoim/organizer/organizer.hpp

@ -158,7 +158,7 @@ const std::array<int, 2> sides = {-1, 1};
struct BasicTaskRes { struct BasicTaskRes {
real volume; real volume;
real area; real surf;
}; };
// 对于mark含2个及以上0的情况,尝试对每个0填1或-1的所有组合 // 对于mark含2个及以上0的情况,尝试对每个0填1或-1的所有组合
@ -257,7 +257,8 @@ void buildOcTree(const Scene& scene, const OcTreeNode& node, std::vector<OcTreeN
tensor3 subPoly(nullptr, poly.compositedBernstein.ext()); tensor3 subPoly(nullptr, poly.compositedBernstein.ext());
bernstein::deCasteljau(poly.compositedBernstein, subNodes[i].min, subNodes[i].max, subPoly); bernstein::deCasteljau(poly.compositedBernstein, subNodes[i].min, subNodes[i].max, subPoly);
if (bernstein::uniformSign(subPoly) == -1) { if (bernstein::uniformSign(subPoly) == -1) {
subNodes[i].polyFullyContainedIndices.emplace_back(polyIntersectIndex); // subNodes[i].polyFullyContainedIndices.emplace_back(polyIntersectIndex);
organizer::traverse(subNodes[subIdx].blobTree, polyIntersectIndex, organizer::NODE_IN);
} else { } else {
subNodes[i].polyIntersectIndices.emplace_back(polyIntersectIndex); subNodes[i].polyIntersectIndices.emplace_back(polyIntersectIndex);
} }
@ -265,9 +266,6 @@ void buildOcTree(const Scene& scene, const OcTreeNode& node, std::vector<OcTreeN
continue; continue;
} }
for (int subIdx = 0; subIdx < CHILD_NUM; ++subIdx) { for (int subIdx = 0; subIdx < CHILD_NUM; ++subIdx) {
// intermediateNodes[lastIdx + subIdx].polyIntersectIndices.emplace_back(poly);
// intermediateNodes[lastIdx + subIdx].min = nowNodeMin;
// intermediateNodes[lastIdx + subIdx].max = nowNodeMax;
subNodes[subIdx].polyIntersectIndices.emplace_back(polyIntersectIndex); subNodes[subIdx].polyIntersectIndices.emplace_back(polyIntersectIndex);
} }
continue; continue;
@ -304,11 +302,11 @@ void buildOcTree(const Scene& scene, const OcTreeNode& node, std::vector<OcTreeN
} }
// launch subdivision in subcells // launch subdivision in subcells
for (subIdx = 0; subIdx < CHILD_NUM; ++subIdx) { for (subIdx = 0; subIdx < CHILD_NUM; ++subIdx) {
subNodes[subIdx].polyFullyContainedIndices.resize(subNodes[subIdx].polyFullyContainedIndices.size() // subNodes[subIdx].polyFullyContainedIndices.resize(subNodes[subIdx].polyFullyContainedIndices.size()
+ node.polyFullyContainedIndices.size()); // + node.polyFullyContainedIndices.size());
subNodes[subIdx].polyFullyContainedIndices.insert(subNodes[subIdx].polyFullyContainedIndices.end(), // subNodes[subIdx].polyFullyContainedIndices.insert(subNodes[subIdx].polyFullyContainedIndices.end(),
node.polyFullyContainedIndices.begin(), // node.polyFullyContainedIndices.begin(),
node.polyFullyContainedIndices.end()); // node.polyFullyContainedIndices.end());
buildOcTree(scene, subNodes[subIdx], leaves); buildOcTree(scene, subNodes[subIdx], leaves);
} }
} }
@ -453,14 +451,19 @@ BasicTaskRes basicTask(const Scene& scene, const organizer::BlobTree& blobTree,
ImplicitPolyQuadrature<3> ipquad(scene.polys); ImplicitPolyQuadrature<3> ipquad(scene.polys);
ipquad.integrate(AutoMixed, q, [&](const uvector<real, 3>& x, real w) { ipquad.integrate(AutoMixed, q, [&](const uvector<real, 3>& x, real w) {
auto realX = x * range + node.min; auto realX = x * range + node.min;
if (keepQuadraturePoint(scene, blobTree, node, realX)) volume += w * integrand(realX); if (keepQuadraturePoint(scene, blobTree, node, realX)) { volume += w * integrand(realX); }
}); });
ipquad.integrate_surf(AutoMixed, q, [&](const uvector<real, 3>& x, real w, const uvector<real, 3>& wn) {
surf += w * integrand(x * range + node.min);
});
return {volume, surf};
} }
void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives, void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives,
const uvector3& xmin, const uvector3& xmin,
const uvector3& xmax, const uvector3& xmax,
const organizer::BlobTree& blobTree) const organizer::BlobTree& blobTree,
const real q = 10)
{ {
OcTreeNode rootNode(xmin, xmax, blobTree); OcTreeNode rootNode(xmin, xmax, blobTree);
std::vector<OcTreeNode> leaves; std::vector<OcTreeNode> leaves;
@ -511,6 +514,9 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv
real testEvalBernstein = bernstein::evalBernsteinPoly(phi, testX); real testEvalBernstein = bernstein::evalBernsteinPoly(phi, testX);
completeTensorReps.emplace_back(CompleteTensorRep{phi, planeTensors}); completeTensorReps.emplace_back(CompleteTensorRep{phi, planeTensors});
} else if (auto pt = std::dynamic_pointer_cast<ConeDesc>(primitives[i])) {
tensor3 originTensor(nullptr, 3);
tensor3 transformedTensor(nullptr, 3);
} }
} }
@ -518,15 +524,13 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv
buildOcTree(scene, rootNode, leaves); buildOcTree(scene, rootNode, leaves);
for (const auto& leaf : leaves) { for (const auto& leaf : leaves) {
auto basicRes = basicTask(scene, blobTree, leaf, 10); auto basicRes = basicTask(scene, blobTree, leaf, q);
volume += basicRes.volume; volume += basicRes.volume * prod(leaf.max - leaf.min);
} }
volume *= prod(xmax - xmin); volume *= prod(xmax - xmin);
// TODO: surface area
std::cout << "Volume xxx: " << volume << std::endl; std::cout << "Volume xxx: " << volume << std::endl;
// free memory, further deallocating memory of xarray // free memory, further deallocating memory of xarray
for (auto& p : tensorStacks) delete p; for (auto& p : tensorStacks) delete p;
} }

83
algoim/organizer/primitive.hpp

@ -451,12 +451,12 @@ private:
class BRepDesc : virtual public PrimitiveDesc class BRepDesc : virtual public PrimitiveDesc
{ {
public:
const static PrimitiveType type = BRep; const static PrimitiveType type = BRep;
std::vector<uvector3> vertices; std::vector<uvector3> vertices;
std::vector<ParametricCurve> curves; std::vector<ParametricCurve> curves;
std::vector<ParametricSurface> surfaces; std::vector<ParametricSurface> surfaces;
public:
void print() override { std::cout << "BRep Description" << std::endl; } void print() override { std::cout << "BRep Description" << std::endl; }
real eval(const uvector3& p) real eval(const uvector3& p)
@ -495,18 +495,28 @@ public:
class CylinderDesc : virtual public PrimitiveDesc class CylinderDesc : virtual public PrimitiveDesc
{ {
public:
const static PrimitiveType type = Cylinder; const static PrimitiveType type = Cylinder;
uvector3 node1; uvector3 node1;
uvector3 node2; uvector3 node2;
real radius; real radius;
CylinderDesc(const uvector3& n1_, const uvector3& n2_, real r_) : PrimitiveDesc(), node1(n1_), node2(n2_), radius(r_) {} // CylinderDesc(const uvector3& n1_, const uvector3& n2_, real r_) : PrimitiveDesc(), node1(n1_), node2(n2_), radius(r_) {}
// 现在是只支持轴对齐x,y,z的圆柱
// TODO: 实现张量积的旋转后换成支持任意方向的
CylinderDesc(const uvector3& n1, real r, real h, int alignAxis) : PrimitiveDesc(), node1(n1), radius(r)
{
assert(alignAxis >= 0 && alignAxis <= 2);
node2 = node1;
node2(alignAxis) += h;
}
void print() override { std::cout << "Cylinder Description" << std::endl; } void print() override { std::cout << "Cylinder Description" << std::endl; }
}; };
class ConeDesc : virtual public PrimitiveDesc class ConeDesc : virtual public PrimitiveDesc
{ {
public:
const static PrimitiveType type = Cone; const static PrimitiveType type = Cone;
uvector3 node1; uvector3 node1;
uvector3 node2; uvector3 node2;
@ -532,10 +542,60 @@ public:
{ {
} }
MeshDesc() = default;
void print() override { std::cout << "Mesh Description" << std::endl; } void print() override { std::cout << "Mesh Description" << std::endl; }
}; };
class PyramidDesc : public MeshDesc
{
public:
PyramidDesc(const std::vector<uvector3>& bottomVertices, const uvector3& topVertex) : PrimitiveDesc()
{
vertices = bottomVertices;
int bottomSize = bottomVertices.size();
vertices.emplace_back(topVertex);
indices.reserve(bottomSize * 3 + bottomSize);
indexInclusiveScan.reserve(bottomSize + 1);
for (int i = 0; i < bottomSize; ++i) {
indices.emplace_back(i);
indices.emplace_back(i == bottomSize - 1 ? 0 : indices.emplace_back(i + 1));
indices.emplace_back(bottomSize);
indexInclusiveScan.emplace_back(indexInclusiveScan.empty() ? 3 : indexInclusiveScan.back() + 3);
}
for (int i = 0; i < bottomSize; ++i) {
indices.emplace_back(i);
indices.emplace_back(i);
}
indexInclusiveScan.emplace_back(indexInclusiveScan.back() + bottomSize);
}
};
class CuboidDesc : public MeshDesc
{
public:
CuboidDesc(const uvector3& center, const uvector3& size) : MeshDesc()
{
vertices.resize(8);
uvector3 halfSize = size / 2;
for (int i = 0; i < 8; ++i) {
vertices[i] = center;
vertices[i](0) += (i & 1) ? halfSize(0) : -halfSize(0);
vertices[i](1) += (i & 2) ? halfSize(1) : -halfSize(1);
vertices[i](2) += (i & 4) ? halfSize(2) : -halfSize(2);
}
indices = {3, 2, 0, 1, // left
4, 6, 7, 5, // right
6, 2, 3, 7, // top
1, 0, 4, 5, // bottom
7, 3, 1, 5, // front
2, 6, 4, 0}; // back
indexInclusiveScan = {4, 8, 12, 16, 20, 24};
}
};
void makeMesh(const MeshDesc& mesh, xarray<real, 3>& tensor, std::vector<xarray<real, 3>>& planeTensors) void makeMesh(const MeshDesc& mesh, xarray<real, 3>& tensor, std::vector<xarray<real, 3>>& planeTensors)
{ {
uvector3 ext(1 + mesh.indexInclusiveScan.size()); uvector3 ext(1 + mesh.indexInclusiveScan.size());
assert(all(ext == tensor.ext())); assert(all(ext == tensor.ext()));
@ -585,9 +645,18 @@ void makeSphere(const SphereDesc& sphereDesc, xarray<real, 3>& tensor)
// return PowerTensor(tensor); // return PowerTensor(tensor);
}; };
void makeCylinder(xarray<real, 3>& tensor, uvector3 startPt, uvector3 endPt, real r) void makeCylinder(const CylinderDesc& cylinder, xarray<real, 3>& tensor, std::vector<tensor3>& rawTensors)
{
assert(rawTensors.size() == 3
&& (all(rawTensors[0].ext() == uvector3(3, 3, 1)) || all(rawTensors[0].ext() == uvector3(3, 3, 1))
|| all(rawTensors[0].ext() == uvector3(3, 3, 1)))
&& all(rawTensors[1].ext() == uvector3(2)) && all(rawTensors[1].ext() == uvector3(2)));
uvector<int, 3> ext = 5;
assert(all(ext == tensor.ext()));
}
void makeCone(const CylinderDesc& cone, tensor3& tensor)
{ {
// PowerTensor pt;
// TODO: // TODO:
} }
@ -605,8 +674,8 @@ struct Scene {
const int CHILD_NUM = 8; const int CHILD_NUM = 8;
struct OcTreeNode { struct OcTreeNode {
std::vector<int> polyIntersectIndices; // 同一poly会出现在不同node的polyIndices中 std::vector<int> polyIntersectIndices; // 同一poly会出现在不同node的polyIndices中
std::vector<int> polyFullyContainedIndices; // 完全包含该node的poly, 同样会出现在不同node的polyIndices中 // std::vector<int> polyFullyContainedIndices; // 完全包含该node的poly, 同样会出现在不同node的polyIndices中
// std::array<int, CHILD_NUM> children; // octree // std::array<int, CHILD_NUM> children; // octree
uvector3 min, max; uvector3 min, max;
organizer::BlobTree blobTree; // 部分遍历过的octree,那些不属于该node的primitive的out信息已经在该blobtree种尽可能地向上传递 organizer::BlobTree blobTree; // 部分遍历过的octree,那些不属于该node的primitive的out信息已经在该blobtree种尽可能地向上传递
@ -620,7 +689,7 @@ struct OcTreeNode {
// 深拷贝 // 深拷贝
OcTreeNode(const OcTreeNode& node) OcTreeNode(const OcTreeNode& node)
: polyIntersectIndices(node.polyIntersectIndices), : polyIntersectIndices(node.polyIntersectIndices),
polyFullyContainedIndices(node.polyFullyContainedIndices), // polyFullyContainedIndices(node.polyFullyContainedIndices),
min(node.min), min(node.min),
max(node.max), max(node.max),
blobTree(node.blobTree) blobTree(node.blobTree)

5
algoim/quadrature_multipoly.hpp

@ -623,7 +623,7 @@ struct ImplicitPolyQuadrature {
assert(max(abs(score)) > 0); assert(max(abs(score)) > 0);
score /= 2 * max(abs(score)); score /= 2 * max(abs(score));
for (int i = 0; i < N; ++i) for (int i = 0; i < N; ++i)
if (!has_disc(i)) score(i) += 1.0; if (!has_disc(i)) score(i) += 1.0; // 1个与k相切的多项式都没有,才+1
// Choose height direction and form base polynomials; if tanh-sinh is being used at this // Choose height direction and form base polynomials; if tanh-sinh is being used at this
// level, suggest the same all the way down; moreover, suggest tanh-sinh if a non-empty // level, suggest the same all the way down; moreover, suggest tanh-sinh if a non-empty
@ -689,7 +689,7 @@ struct ImplicitPolyQuadrature {
// For every phi(i) ... // For every phi(i) ...
for (size_t i = 0; i < phi.count(); ++i) { for (size_t i = 0; i < phi.count(); ++i) {
const auto& p = phi.poly(i); const auto& p = phi.poly(i);
const auto& mask = phi.mask(i); // 这个mask干什么的? const auto& mask = phi.mask(i);
int P = p.ext(k); int P = p.ext(k);
// Ignore phi if its mask is void everywhere above the base point // Ignore phi if its mask is void everywhere above the base point
@ -702,6 +702,7 @@ struct ImplicitPolyQuadrature {
int rcount = bernstein::bernsteinUnitIntervalRealRoots(pline, P, roots); int rcount = bernstein::bernsteinUnitIntervalRealRoots(pline, P, roots);
// Add all real roots in [0,1] which are also within masked region of phi // Add all real roots in [0,1] which are also within masked region of phi
// 为什么[0,1]的real roots还必须要在mask为true的subregion?
for (int j = 0; j < rcount; ++j) { for (int j = 0; j < rcount; ++j) {
auto x = add_component(xbase, k, roots[j]); auto x = add_component(xbase, k, roots[j]);
if (detail::pointWithinMask(mask, x)) nodes[count++] = roots[j]; if (detail::pointWithinMask(mask, x)) nodes[count++] = roots[j];

125
gjj/primitiveDebug.hpp

@ -35,14 +35,9 @@ void casePolyhedron1()
// std::vector<std::shared_ptr<PrimitiveDesc>> ps; // std::vector<std::shared_ptr<PrimitiveDesc>> ps;
// mesh // mesh
std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, -0.8),
uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, 0.8), uvector3(0.8, -0.8, -0.8), uvector3(0.8, -0.8, 0.8),
uvector3(-0.8, 0.8, -0.8), uvector3(0.8, 0.8, -0.8), uvector3(0.8, 0.8, 0.8)};
uvector3(-0.8, 0.8, 0.8),
uvector3(0.8, -0.8, -0.8),
uvector3(0.8, -0.8, 0.8),
uvector3(0.8, 0.8, -0.8),
uvector3(0.8, 0.8, 0.8)};
std::vector<int> indices = {3, 2, 0, 1, // left std::vector<int> indices = {3, 2, 0, 1, // left
4, 6, 7, 5, // right 4, 6, 7, 5, // right
6, 2, 3, 7, // top 6, 2, 3, 7, // top
@ -63,23 +58,14 @@ void casePolyhedron2()
// std::vector<std::shared_ptr<PrimitiveDesc>> ps; // std::vector<std::shared_ptr<PrimitiveDesc>> ps;
// mesh // mesh
std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, -0.8),
uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, 0.8), uvector3(0.8, -0.8, -0.8), uvector3(0.8, -0.8, 0.8),
uvector3(-0.8, 0.8, -0.8), uvector3(0.8, 0.8, -0.8), uvector3(0.8, 0.8, 0.8)};
uvector3(-0.8, 0.8, 0.8),
uvector3(0.8, -0.8, -0.8),
uvector3(0.8, -0.8, 0.8),
uvector3(0.8, 0.8, -0.8),
uvector3(0.8, 0.8, 0.8)};
std::vector<int> indices = { std::vector<int> indices = {
3, 3, 2, 0,
2,
0,
1, // left 1, // left
6, 6, 2, 3,
2, 7 // top
3,
7 // top
}; };
std::vector<int> scan = {4, 8}; std::vector<int> scan = {4, 8};
@ -101,31 +87,19 @@ void casePolyhedron3()
// uvector3(1.6, 0, 1.6), // uvector3(1.6, 0, 1.6),
// uvector3(1.6, 1.6, 0), // uvector3(1.6, 1.6, 0),
// uvector3(1.6, 1.6, 1.6)}; // uvector3(1.6, 1.6, 1.6)};
std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, -0.8),
uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, 0.8), uvector3(0.8, -0.8, -0.8), uvector3(0.8, -0.8, 0.8),
uvector3(-0.8, 0.8, -0.8), uvector3(0.8, 0.8, -0.8), uvector3(0.8, 0.8, 0.8)};
uvector3(-0.8, 0.8, 0.8), std::vector<int> indices = {3, 2, 0,
uvector3(0.8, -0.8, -0.8), 1, // left
uvector3(0.8, -0.8, 0.8), 6, 2, 3,
uvector3(0.8, 0.8, -0.8), 7, // top
uvector3(0.8, 0.8, 0.8)}; // 7,
std::vector<int> indices = {3, // 3,
2, // 1,
0, // 5, // front
1, // left 2, 6, 4, 0}; // back
6, std::vector<int> scan = {4, 8, 12};
2,
3,
7, // top
// 7,
// 3,
// 1,
// 5, // front
2,
6,
4,
0}; // back
std::vector<int> scan = {4, 8, 12};
basicTask(std::make_shared<MeshDesc>(MeshDesc(vertices, indices, scan))); basicTask(std::make_shared<MeshDesc>(MeshDesc(vertices, indices, scan)));
} }
@ -133,26 +107,14 @@ void casePolyhedronSphere()
{ {
// PI * r^3 / 6 // PI * r^3 / 6
auto phi0 = std::make_shared<SphereDesc>(SphereDesc(0.8, uvector3(-0.8, 0.8, -0.8), 1.)); auto phi0 = std::make_shared<SphereDesc>(SphereDesc(0.8, uvector3(-0.8, 0.8, -0.8), 1.));
std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), std::vector<uvector3> vertices = {uvector3(-0.8, -0.8, -0.8), uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, -0.8),
uvector3(-0.8, -0.8, 0.8), uvector3(-0.8, 0.8, 0.8), uvector3(0.8, -0.8, -0.8), uvector3(0.8, -0.8, 0.8),
uvector3(-0.8, 0.8, -0.8), uvector3(0.8, 0.8, -0.8), uvector3(0.8, 0.8, 0.8)};
uvector3(-0.8, 0.8, 0.8), std::vector<int> indices = {3, 2, 0,
uvector3(0.8, -0.8, -0.8), 1, // left
uvector3(0.8, -0.8, 0.8), 6, 2, 3,
uvector3(0.8, 0.8, -0.8), 7, // top
uvector3(0.8, 0.8, 0.8)}; 2, 6, 4, 0}; // back
std::vector<int> indices = {3,
2,
0,
1, // left
6,
2,
3,
7, // top
2,
6,
4,
0}; // back
std::vector<int> scan = {4, 8, 12}; std::vector<int> scan = {4, 8, 12};
std::vector<std::shared_ptr<PrimitiveDesc>> primitiveDescriptions(2); std::vector<std::shared_ptr<PrimitiveDesc>> primitiveDescriptions(2);
primitiveDescriptions[0] = phi0; primitiveDescriptions[0] = phi0;
@ -160,6 +122,25 @@ void casePolyhedronSphere()
basicTask(primitiveDescriptions); basicTask(primitiveDescriptions);
} }
void caseScene()
{
std::vector<std::shared_ptr<PrimitiveDesc>> primitiveDescriptions(7);
primitiveDescriptions[0] = std::make_shared<CuboidDesc>(CuboidDesc(0., 1.6));
primitiveDescriptions[1] = std::make_shared<CuboidDesc>(CuboidDesc(uvector3(0.6, 0.6, -0.6), 2.));
primitiveDescriptions[2] = std::make_shared<SphereDesc>(SphereDesc(0.7, uvector3(0.8, 0.8, 0.8), 1.));
primitiveDescriptions[3] = std::make_shared<SphereDesc>(SphereDesc(0.5, uvector3(-0.3, -0.8, 0.8), 1.));
primitiveDescriptions[4] = std::make_shared<ConeDesc>(ConeDesc(uvector3(0., -0.2, 0.), uvector3(0., -0.9, 0.), 0.4));
std::vector<uvector3> pyramidBottomVertices = {
uvector3{-1, -1, 0},
uvector3{1, -1, 0},
uvector3{1, 1, 0},
uvector3{-1, 1, 0}
};
primitiveDescriptions[5] = std::make_shared<PyramidDesc>(pyramidBottomVertices, uvector3{0, 0, 1});
primitiveDescriptions[4] = std::make_shared<CylinderDesc>(CylinderDesc(uvector3(-0.3, 0.3, 2.3), 0.4, 3.6, 1));
quadratureScene(primitiveDescriptions, uvector3(-1., -1.3, -1.6), uvector3(1.6, 1.6, 2.3), organizer::BlobTree());
}
void testDeCasteljau() void testDeCasteljau()
{ {
auto phiDesc = std::make_shared<SphereDesc>(SphereDesc(0.8, uvector3(0), 1.)); auto phiDesc = std::make_shared<SphereDesc>(SphereDesc(0.8, uvector3(0), 1.));
@ -172,10 +153,8 @@ void testDeCasteljau()
// bernstein::deCasteljau(tensorBernstein, uvector3(0), uvector3(0.2690598923241497 + 0.0000001), // bernstein::deCasteljau(tensorBernstein, uvector3(0), uvector3(0.2690598923241497 + 0.0000001),
// transformedTensorBernstein); // transformedTensorBernstein);
bernstein::deCasteljau(tensorBernstein, bernstein::deCasteljau(tensorBernstein, uvector3(0.2690598923241497 + 0.0000001),
uvector3(0.2690598923241497 + 0.0000001), uvector3(1 - 0.2690598923241497 - 0.0000001), transformedTensorBernstein);
uvector3(1 - 0.2690598923241497 - 0.0000001),
transformedTensorBernstein);
uvector3 testX = uvector3(0.5); uvector3 testX = uvector3(0.5);
int sign = bernstein::uniformSign(transformedTensorBernstein); int sign = bernstein::uniformSign(transformedTensorBernstein);
@ -191,7 +170,7 @@ void testDeCasteljau()
void testBlob() void testBlob()
{ {
orgzer::Blob blob = {5, 3, 4, 5, 6}; organizer::Blob blob = {5, 3, 4, 5, 6};
// std::cout << blob.isPrimitive << std::endl; // std::cout << blob.isPrimitive << std::endl;
// std::cout << blob.nodeOp << std::endl; // std::cout << blob.nodeOp << std::endl;

Loading…
Cancel
Save