From f0781f790e5b2ec9b5200e8536312504e50eb36d Mon Sep 17 00:00:00 2001 From: El Hadi Moussi Date: Tue, 6 Aug 2024 14:30:25 +0200 Subject: [PATCH] Add test for Cone --- resources/CMakeLists.txt | 1 + resources/ShapeRecognCone.med | Bin 0 -> 125983 bytes src/ShapeRecogn/Test/CMakeLists.txt | 1 + src/ShapeRecogn/Test/ConeTest.cxx | 326 +++++++++++++++++++++++ src/ShapeRecogn/Test/ConeTest.hxx | 62 +++++ src/ShapeRecogn/Test/TestShapeRecogn.cxx | 2 + 6 files changed, 392 insertions(+) create mode 100644 resources/ShapeRecognCone.med create mode 100644 src/ShapeRecogn/Test/ConeTest.cxx create mode 100644 src/ShapeRecogn/Test/ConeTest.hxx diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt index de9d4c73b..919b6486e 100644 --- a/resources/CMakeLists.txt +++ b/resources/CMakeLists.txt @@ -96,6 +96,7 @@ SET(MED_other_FILES castem17_result_ascii.sauv ShapeRecognPlane.med ShapeRecognCylinder.med + ShapeRecognCone.med ) SET(MED_RESOURCES_FILES ${MED_test_fig_files}) diff --git a/resources/ShapeRecognCone.med b/resources/ShapeRecognCone.med new file mode 100644 index 0000000000000000000000000000000000000000..da32d3e8b47703ce085a1d5fb212c191b2f54ae7 GIT binary patch literal 125983 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 VPHp@Tx0p`3)gp^3@V}t~{{`RP@TLF& literal 0 HcmV?d00001 diff --git a/src/ShapeRecogn/Test/CMakeLists.txt b/src/ShapeRecogn/Test/CMakeLists.txt index c81c9c4b1..713284d32 100644 --- a/src/ShapeRecogn/Test/CMakeLists.txt +++ b/src/ShapeRecogn/Test/CMakeLists.txt @@ -34,6 +34,7 @@ SET(TestShapeRecogn_SOURCES MathOpsTest.cxx PlaneTest.cxx CylinderTest.cxx + ConeTest.cxx ) SALOME_ACCUMULATE_ENVIRONMENT(MEDCOUPLING_RESOURCE_DIR "${CMAKE_BINARY_DIR}/resources") diff --git a/src/ShapeRecogn/Test/ConeTest.cxx b/src/ShapeRecogn/Test/ConeTest.cxx new file mode 100644 index 000000000..74cd85401 --- /dev/null +++ b/src/ShapeRecogn/Test/ConeTest.cxx @@ -0,0 +1,326 @@ +#include "ConeTest.hxx" + +#include "ShapeRecognMesh.hxx" +#include "Areas.hxx" +#include "MathOps.hxx" +#include "TestInterpKernelUtils.hxx" // getResourceFile() + +using namespace MEDCoupling; + +void ConeTest::setUp() +{ + std::string file = INTERP_TEST::getResourceFile("ShapeRecognCone.med", 3); + srMesh = new ShapeRecognMesh(file); + srMesh->recognize(); + areas = srMesh->getAreas(); +} + +void ConeTest::tearDown() +{ + if (srMesh != 0) + delete srMesh; + areas = 0; +} + +void ConeTest::testNumberOfAreas() +{ + CPPUNIT_ASSERT_EQUAL(3, (int)areas->getNumberOfAreas()); +} + +void ConeTest::testComputePlaneProperties() +{ + const Nodes *nodes = srMesh->getNodes(); + Areas areas(nodes); + mcIdType areaId = areas.addArea(); + std::vector nodeIds{560, 561, 562, 563, 564}; + // Check the coordinates + std::vector coordsRef{ + -0.13274028, + -1.19035036, + 7.0, + 0.62579096, + -0.97231524, + 7.0, + -0.75942852, + -0.99273623, + 7.0, + 0.76454326, + 0.85588873, + 7.0, + 1.12546475, + -0.04924272, + 7.0, + }; + for (size_t i = 0; i < nodeIds.size(); ++i) + { + mcIdType nodeId = nodeIds[i]; + areas.addNode(areaId, nodeId); + std::array coords = nodes->getCoordinates(nodeId); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i], coords[0], 1E-6); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i + 1], coords[1], 1E-6); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i + 2], coords[2], 1E-6); + } + areas.computeProperties(areaId); + // Check normal + std::array normal = areas.getNormal(areaId); + std::array normalRef{0.0, 0.0, 1.0}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(normalRef[i], normal[i], 1E-6); +} + +void ConeTest::testComputeCylinderProperties() +{ + const Nodes *nodes = srMesh->getNodes(); + Areas areas(nodes); + mcIdType areaId = areas.addArea(); + // check coordinates + std::vector coordsRef{ + 8.58402821e+00, + -2.10248053e-15, + 1.41597179e+00, + 7.87604232e+00, + -1.92907400e-15, + 2.12395768e+00, + 7.16805642e+00, + -1.75566747e-15, + 2.83194358e+00, + }; + // Add nodes + std::vector nodeIds{26, 27, 28}; + for (size_t i = 0; i < nodeIds.size(); ++i) + { + mcIdType nodeId = nodeIds[i]; + areas.addNode(areaId, nodeId); + std::array coords = nodes->getCoordinates(nodeId); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i], coords[0], 1E-6); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i + 1], coords[1], 1E-6); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i + 2], coords[2], 1E-6); + } + areas.computeProperties(areaId); + // Check radius + double radius = areas.getRadius(areaId); + double radiusRef = 11.016809459292505; + CPPUNIT_ASSERT_DOUBLES_EQUAL(radiusRef, radius, 1E-6); + // Check axis + std::array axis = areas.getAxis(areaId); + std::array axisRef{-2.85185021e-02, 2.47000552e-05, 9.99593264e-01}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(axisRef[i], axis[i], 1E-6); + // Check axis point + std::array axisPoint = areas.getAxisPoint(areaId); + std::array axisPointRef{9.55163389e-02, -2.27195412e-05, -5.67562579e+00}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(axisPointRef[i], axisPoint[i], 1E-6); +} + +void ConeTest::testComputeConeProperties() +{ + std::srand(0); + const Nodes *nodes = srMesh->getNodes(); + Areas areas(nodes); + mcIdType areaId = areas.addArea(PrimitiveType::Cone); + std::vector coordsRef{ + 8.58402821e+00, + -2.10248053e-15, + 1.41597179e+00, + 7.87604232e+00, + -1.92907400e-15, + 2.12395768e+00, + 7.16805642e+00, + -1.75566747e-15, + 2.83194358e+00, + 6.46007053e+00, + -1.58226094e-15, + 3.53992947e+00}; + // Add nodes + std::vector nodeIds{26, 27, 28, 29}; + for (size_t i = 0; i < nodeIds.size(); ++i) + { + mcIdType nodeId = nodeIds[i]; + areas.addNode(areaId, nodeId); + std::array coords = nodes->getCoordinates(nodeId); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i], coords[0], 1E-6); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i + 1], coords[1], 1E-6); + CPPUNIT_ASSERT_DOUBLES_EQUAL(coordsRef[3 * i + 2], coords[2], 1E-6); + } + areas.computeProperties(areaId); + // Radius + double radiusRef = 10.546213172989718; + CPPUNIT_ASSERT_DOUBLES_EQUAL(radiusRef, areas.getRadius(areaId), 1E-6); + // Angle + double angleRef = 0.7567719849399294; + CPPUNIT_ASSERT_DOUBLES_EQUAL(angleRef, areas.getAngle(areaId), 1E-6); + // Axis + std::array axisRef{-2.99093478e-02, 1.48776702e-05, 9.99552615e-01}; + std::array axis = areas.getAxis(areaId); + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(axisRef[i], axis[i], 1E-6); + // Axis Point + std::array axisPointRef{ + 7.43242419e-02, -1.70396559e-05, -4.98890939e+00}; + std::array axisPoint = areas.getAxisPoint(areaId); + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(axisPointRef[i], axisPoint[i], 1E-6); + // Apex + std::array apexRef{ + -3.87870047e-01, 1.98282729e-04, 1.03928162e+01}; + std::array apex = areas.getApex(areaId); + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(apexRef[i], apex[i], 1E-6); +} + +void ConeTest::testFirstArea() +{ + // primitive type + CPPUNIT_ASSERT_EQUAL(PrimitiveType::Plane, areas->getPrimitiveType(0)); + // node ids + std::vector nodeIdsRef{ + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571}; + std::vector nodeIds = areas->getNodeIds(0); + std::sort(nodeIds.begin(), nodeIds.end()); + CPPUNIT_ASSERT_EQUAL(nodeIdsRef.size(), nodeIds.size()); + for (size_t i = 0; i < nodeIds.size(); ++i) + CPPUNIT_ASSERT_EQUAL(nodeIdsRef[i], nodeIds[i]); + // normal + std::array normal = areas->getNormal(0); + std::array normalRef{0.0, 0.0, 1.0}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(normalRef[i], normal[i], 1E-6); +} + +void ConeTest::testSecondArea() +{ + // primitive type + CPPUNIT_ASSERT_EQUAL(PrimitiveType::Plane, areas->getPrimitiveType(0)); + // node ids + std::vector nodeIdsRef = { + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, + 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, + 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, + 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, + 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, + 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, + 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, + 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, + 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, + 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, + 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, + 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, + 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, + 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, + 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, + 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, + 956}; + std::vector nodeIds = areas->getNodeIds(1); + std::sort(nodeIds.begin(), nodeIds.end()); + CPPUNIT_ASSERT_EQUAL(nodeIdsRef.size(), nodeIds.size()); + for (size_t i = 0; i < nodeIds.size(); ++i) + CPPUNIT_ASSERT_EQUAL(nodeIdsRef[i], nodeIds[i]); + // normal + std::array normal = areas->getNormal(1); + std::array normalRef = {0.0, 0.0, -1.0}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(normalRef[i], normal[i], 1E-6); +} + +void ConeTest::testThirdArea() +{ + // primitive type + CPPUNIT_ASSERT_EQUAL(PrimitiveType::Cone, areas->getPrimitiveType(2)); + // node ids + std::vector nodeIdsRef{ + 0, 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, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548}; + std::vector nodeIds = areas->getNodeIds(2); + std::sort(nodeIds.begin(), nodeIds.end()); + CPPUNIT_ASSERT_EQUAL(nodeIdsRef.size(), nodeIds.size()); + for (size_t i = 0; i < nodeIds.size(); ++i) + CPPUNIT_ASSERT_EQUAL(nodeIdsRef[i], nodeIds[i]); + // radius + CPPUNIT_ASSERT_DOUBLES_EQUAL(9.893621777737378, areas->getRadius(2), 1E-2); + // angle + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.7869372818478629, areas->getAngle(2), 1E-4); + // axis + std::array axis = areas->getAxis(2); + std::array axisRef{ + -1.17267701e-03, 2.96765974e-04, 9.99999268e-01}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(axisRef[i], axis[i], 1E-4); + // axis point + std::array axisPoint = areas->getAxisPoint(2); + std::array axisPointRef{ + -6.50039462e-03, -5.76665576e-05, -3.99198765e+00}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL( + axisPointRef[i], axisPoint[i], 1E-2); + // apex + std::array apex = areas->getApex(2); + std::array apexRef{ + 1.86120942e-02, 2.86081304e-03, 1.00293742e+01}; + for (size_t i = 0; i < 3; ++i) + CPPUNIT_ASSERT_DOUBLES_EQUAL(apexRef[i], apex[i], 1E-1); +} diff --git a/src/ShapeRecogn/Test/ConeTest.hxx b/src/ShapeRecogn/Test/ConeTest.hxx new file mode 100644 index 000000000..283bfc845 --- /dev/null +++ b/src/ShapeRecogn/Test/ConeTest.hxx @@ -0,0 +1,62 @@ +// Copyright (C) 2007-2024 CEA, EDF +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +#ifndef __CONETEST_HXX__ +#define __CONETEST_HXX__ + +#include +#include + +namespace MEDCoupling +{ + class ShapeRecognMesh; + class Areas; + + class ConeTest : public CppUnit::TestFixture + { + CPPUNIT_TEST_SUITE(ConeTest); + CPPUNIT_TEST(testNumberOfAreas); + CPPUNIT_TEST(testComputePlaneProperties); + CPPUNIT_TEST(testComputeCylinderProperties); + CPPUNIT_TEST(testComputeConeProperties); + CPPUNIT_TEST(testFirstArea); + CPPUNIT_TEST(testSecondArea); + CPPUNIT_TEST(testThirdArea); + CPPUNIT_TEST_SUITE_END(); + + public: + void setUp() override; + void tearDown() override; + + void testComputePlaneProperties(); + void testComputeCylinderProperties(); + void testComputeConeProperties(); + + void testNumberOfAreas(); + void testFirstArea(); + void testSecondArea(); + void testThirdArea(); + + private: + ShapeRecognMesh *srMesh = 0; + const Areas *areas; + }; +}; + +#endif // __CONETEST_HXX__ diff --git a/src/ShapeRecogn/Test/TestShapeRecogn.cxx b/src/ShapeRecogn/Test/TestShapeRecogn.cxx index 89946ba5e..134f35b4b 100644 --- a/src/ShapeRecogn/Test/TestShapeRecogn.cxx +++ b/src/ShapeRecogn/Test/TestShapeRecogn.cxx @@ -20,9 +20,11 @@ #include "MathOpsTest.hxx" #include "PlaneTest.hxx" #include "CylinderTest.hxx" +#include "ConeTest.hxx" CPPUNIT_TEST_SUITE_REGISTRATION(MEDCoupling::MathOpsTest); CPPUNIT_TEST_SUITE_REGISTRATION(MEDCoupling::PlaneTest); CPPUNIT_TEST_SUITE_REGISTRATION(MEDCoupling::CylinderTest); +CPPUNIT_TEST_SUITE_REGISTRATION(MEDCoupling::ConeTest); #include "BasicMainTest.hxx" -- 2.39.2