1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#include "itkQuadEdgeMesh.h"
int
itkQuadEdgeMeshTest1(int, char *[])
{
std::cout << "Testing points..." << std::endl;
using PixelType = double;
constexpr unsigned int Dimension = 3;
using MeshType = itk::QuadEdgeMesh<PixelType, Dimension>;
using CellTraits = MeshType::CellTraits;
using QEType = CellTraits::QuadEdgeType;
using CellType = MeshType::CellType;
using QEPolygonCellType = itk::QuadEdgeMeshPolygonCell<CellType>;
using QELineCellType = itk::QuadEdgeMeshLineCell<CellType>;
auto mesh = MeshType::New();
mesh->GetCellBoundaryFeatureNeighbors(0, 0, 0, nullptr);
mesh->GetCellNeighbors(0, nullptr);
// test ComputeNumberOfPoints( ) failsafe
{
if (mesh->ComputeNumberOfPoints())
{
return EXIT_FAILURE;
}
}
MeshType::PointType pts[5];
pts[0][0] = -1.0;
pts[0][1] = -1.0;
pts[0][2] = 0.0;
pts[1][0] = 1.0;
pts[1][1] = -1.0;
pts[1][2] = 0.0;
pts[2][0] = 1.0;
pts[2][1] = 1.0;
pts[2][2] = 0.0;
pts[3][0] = -1.0;
pts[3][1] = 1.0;
pts[3][2] = 0.0;
pts[4][0] = 0.0;
pts[4][1] = 0.0;
pts[4][2] = 1.0;
mesh->SetPoint(0, pts[0]);
mesh->SetPoint(1, pts[1]);
mesh->SetPoint(2, pts[2]);
mesh->SetPoint(3, pts[3]);
mesh->SetPoint(4, pts[4]);
if (mesh->GetNumberOfPoints() != 5)
{
std::cout << "Not all points added." << std::endl;
return EXIT_FAILURE;
}
using PointsIterator = MeshType::PointsContainer::Iterator;
PointsIterator pointIterator = mesh->GetPoints()->Begin();
PointsIterator end = mesh->GetPoints()->End();
int nPoints = 0;
while (pointIterator != end)
{
MeshType::PointType p = pointIterator.Value();
if (p != pts[nPoints])
{
std::cout << "Point N. " << nPoints << " differs." << std::endl;
return EXIT_FAILURE;
}
pointIterator++;
nPoints++;
}
if (nPoints != 5)
{
std::cout << "Iteration didn't visit all points." << std::endl;
return EXIT_FAILURE;
}
// Test AddEdge failsafe
{
if (mesh->AddEdge(1, 1))
{
std::cout << "Should not be able to define an edge"
<< " with twice the same Point identifier." << std::endl;
return EXIT_FAILURE;
}
if (mesh->AddEdge(1, 6))
{
std::cout << "Should not be able to define an edge"
<< " with a non existing point Id." << std::endl;
return EXIT_FAILURE;
}
// create a tetahedra and one isolated point: id = 4
int specialCells[12] = { 0, 1, 2, 0, 2, 3, 3, 1, 0, 1, 3, 2 };
CellType::CellAutoPointer cellpointer;
QEPolygonCellType * poly;
for (int i = 0; i < 4; ++i)
{
poly = new QEPolygonCellType(3);
cellpointer.TakeOwnership(poly);
cellpointer->SetPointId(0, specialCells[3 * i]);
cellpointer->SetPointId(1, specialCells[3 * i + 1]);
cellpointer->SetPointId(2, specialCells[3 * i + 2]);
mesh->SetCell(i, cellpointer);
}
// test origin internal
if (mesh->AddEdge(4, 1))
{
std::cout << "Should not be able to define an edge"
<< " with an internal origin." << std::endl;
return EXIT_FAILURE;
}
// test destination internal
if (mesh->AddEdge(1, 4))
{
std::cout << "Should not be able to define an edge"
<< " with an internal destination." << std::endl;
return EXIT_FAILURE;
}
}
// test DeletePoint failsafes
{
mesh->DeletePoint(1); // that will not delete the point
// check it.
}
// test DeleteEdge failsafe
{
// deleteEdge( pid, pid )
mesh->DeleteEdge(1, 4); // that will not delete the edge
// check it.
// deleteEdge( QEPrimal * )
// check with a disconnected edge
// LightWeightDeleteEdge
auto * qeLineCell = new QELineCellType;
mesh->LightWeightDeleteEdge((QEType *)nullptr);
mesh->LightWeightDeleteEdge(qeLineCell->GetQEGeom());
mesh->LightWeightDeleteEdge(qeLineCell);
}
// test delete face failsafe
{
mesh->DeleteFace(1299877); // should fail, Id too high
}
// Test GetEdge failsafe
{
if (!mesh->GetEdge(0))
{
std::cout << "Should be able to get this edge" << std::endl;
return EXIT_FAILURE;
}
if (mesh->GetEdge(129987))
{
std::cout << "Should not be able to get an edge"
<< " with a non existing ID." << std::endl;
return EXIT_FAILURE;
}
}
// test AddFace failsafe
{
if (mesh->AddFaceTriangle(0, 1, 129987))
{
std::cout << "Should not be able to add a face"
<< " with a non existing ID." << std::endl;
return EXIT_FAILURE;
}
}
std::cout << "Test passed" << std::endl;
return EXIT_SUCCESS;
}
|