28 SmartPointer<
Domain<T, 3>> passedOutputLS, Vec2D<T> passedExtent,
29 int passedExtrusionAxis,
31 BoundaryConditionEnum::INFINITE_BOUNDARY)
32 : inputLevelSet(passedInputLS), outputLevelSet(passedOutputLS),
33 extent(passedExtent), extrusionAxis(passedExtrusionAxis),
34 boundaryConds{{passedInputLS->getGrid().getBoundaryConditions(0),
35 passedInputLS->getGrid().getBoundaryConditions(1),
36 passedBoundaryCond}} {}
39 SmartPointer<
Domain<T, 3>> passedOutputLS, Vec2D<T> passedExtent,
40 int passedExtrusionAxis,
41 std::array<BoundaryConditionEnum, 3> passedBoundaryConds)
42 : inputLevelSet(passedInputLS), outputLevelSet(passedOutputLS),
43 extent(passedExtent), extrusionAxis(passedExtrusionAxis),
44 boundaryConds(passedBoundaryConds) {}
73 if (inputLevelSet ==
nullptr) {
75 .addError(
"No input Level Set supplied to Extrude.")
78 if (outputLevelSet ==
nullptr) {
80 .addError(
"No output Level Set supplied to Extrude.")
84 if (extrusionAxis < 0 || extrusionAxis > 2) {
86 .addError(
"Extrusion axis must be between 0 and 2.")
91 std::vector<std::pair<viennahrle::Index<3>,
T>> points3D;
93 auto &domain2D = inputLevelSet->getDomain();
94 auto &grid2D = inputLevelSet->getGrid();
95 const T gridDelta = grid2D.getGridDelta();
96 auto minBounds = grid2D.getMinBounds();
97 auto maxBounds = grid2D.getMaxBounds();
99 double domainBounds[2 * 3];
101 if (extrusionAxis == 0) {
102 domainBounds[0] = extent[0];
103 domainBounds[1] = extent[1];
104 domainBounds[2] = minBounds[0] * gridDelta;
105 domainBounds[3] = maxBounds[0] * gridDelta;
106 domainBounds[4] = minBounds[1] * gridDelta;
107 domainBounds[5] = maxBounds[1] * gridDelta;
110 }
else if (extrusionAxis == 1) {
111 domainBounds[0] = minBounds[0] * gridDelta;
112 domainBounds[1] = maxBounds[0] * gridDelta;
113 domainBounds[2] = extent[0];
114 domainBounds[3] = extent[1];
115 domainBounds[4] = minBounds[1] * gridDelta;
116 domainBounds[5] = maxBounds[1] * gridDelta;
119 }
else if (extrusionAxis == 2) {
120 domainBounds[0] = minBounds[0] * gridDelta;
121 domainBounds[1] = maxBounds[0] * gridDelta;
122 domainBounds[2] = minBounds[1] * gridDelta;
123 domainBounds[3] = maxBounds[1] * gridDelta;
124 domainBounds[4] = extent[0];
125 domainBounds[5] = extent[1];
130 auto tmpLevelSet = SmartPointer<Domain<T, 3>>::New(
131 domainBounds, boundaryConds.data(), gridDelta);
132 outputLevelSet->deepCopy(tmpLevelSet);
134 const hrleIndexType extStart = std::floor(extent[0] / gridDelta);
135 const hrleIndexType extEnd = std::ceil(extent[1] / gridDelta);
139 !it.isFinished(); ++it) {
143 const auto index2D = it.getStartIndices();
144 const T value = it.getValue();
146 for (hrleIndexType ext = extStart; ext <= extEnd; ++ext) {
147 viennahrle::Index<3> index3D;
148 index3D[extrusionAxis] = ext;
149 index3D[xx] = index2D[0];
150 index3D[yy] = index2D[1];
152 points3D.emplace_back(index3D, value);
156 outputLevelSet->insertPoints(points3D);
157 outputLevelSet->finalize(2);