1:45 PM 11/12/2025 ���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!
Warning: Undefined variable $authorization in C:\xampp\htdocs\demo\fi.php on line 57

Warning: Undefined variable $translation in C:\xampp\htdocs\demo\fi.php on line 118

Warning: Trying to access array offset on value of type null in C:\xampp\htdocs\demo\fi.php on line 119

Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampp\htdocs\demo\fi.php on line 120

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 247

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 248

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 249

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 250

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 251

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 252
// Copyright (c) 2005 INRIA Sophia-Antipolis (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/Principal_component_analysis/include/CGAL/PCA_util_Eigen.h $ // $Id: include/CGAL/PCA_util_Eigen.h b26b07a1242 $ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Pierre Alliez and Sylvain Pion and Ankit Gupta and Simon Giraudot #ifndef CGAL_LINEAR_LEAST_SQUARES_FITTING_UTIL_EIGEN_H #define CGAL_LINEAR_LEAST_SQUARES_FITTING_UTIL_EIGEN_H #include #include #include #include #include namespace CGAL { namespace internal { template FT approximate_cbrt (const FT& x) { return static_cast(std::cbrt (CGAL::to_double(x))); } // assemble covariance matrix from a triangle set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K&, // kernel const typename K::Triangle_3*,// used for indirection const CGAL::Dimension_tag<2>&, const Eigen_diagonalize_traits&) { typedef typename K::FT FT; typedef typename K::Triangle_3 Triangle; typedef typename Eigen::Matrix Matrix; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 //Final combined covariance matrix for all triangles and their combined mass FT mass = 0.0; // assemble 2nd order moment about the origin. Matrix moment; moment << FT(1.0/12.0), FT(1.0/24.0), FT(1.0/24.0), FT(1.0/24.0), FT(1.0/12.0), FT(1.0/24.0), FT(1.0/24.0), FT(1.0/24.0), FT(1.0/12.0); for(InputIterator it = first; it != beyond; it++) { // Now for each triangle, construct the 2nd order moment about the origin. // assemble the transformation matrix. const Triangle& t = *it; // defined for convenience. Matrix transformation; transformation << t[0].x(), t[1].x(), t[2].x(), t[0].y(), t[1].y(), t[2].y(), t[0].z(), t[1].z(), t[2].z(); FT area = CGAL::approximate_sqrt(t.squared_area()); // skip zero measure primitives if(area == (FT)0.0) continue; // Find the 2nd order moment for the triangle wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix transformation = 2 * area * transformation * moment * transformation.transpose(); // and add to covariance matrix covariance[0] += transformation(0,0); covariance[1] += transformation(1,0); covariance[2] += transformation(2,0); covariance[3] += transformation(1,1); covariance[4] += transformation(2,1); covariance[5] += transformation(2,2); mass += area; } CGAL_assertion_msg (mass != FT(0), "Can't compute PCA of null measure."); // Translate the 2nd order moment calculated about the origin to // the center of mass to get the covariance. covariance[0] += -mass * (c.x() * c.x()); covariance[1] += -mass * (c.x() * c.y()); covariance[2] += -mass * (c.z() * c.x()); covariance[3] += -mass * (c.y() * c.y()); covariance[4] += -mass * (c.z() * c.y()); covariance[5] += -mass * (c.z() * c.z()); } // assemble covariance matrix from a cuboid set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& , // kernel const typename K::Iso_cuboid_3*,// used for indirection const CGAL::Dimension_tag<3>&, const Eigen_diagonalize_traits&) { typedef typename K::FT FT; typedef typename K::Iso_cuboid_3 Iso_cuboid; typedef typename Eigen::Matrix Matrix; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 // final combined covariance matrix for all cuboids and their combined mass FT mass = (FT)0.0; // assemble 2nd order moment about the origin. Matrix moment; moment << (FT)(1.0/3.0), (FT)(1.0/4.0), (FT)(1.0/4.0), (FT)(1.0/4.0), (FT)(1.0/3.0), (FT)(1.0/4.0), (FT)(1.0/4.0), (FT)(1.0/4.0), (FT)(1.0/3.0); for(InputIterator it = first; it != beyond; it++) { // Now for each cuboid, construct the 2nd order moment about the origin. // assemble the transformation matrix. const Iso_cuboid& t = *it; // defined for convenience. // FT example = CGAL::to_double(t[0].x()); FT x0 = t.xmin(); FT y0 = t.ymin(); FT z0 = t.zmin(); FT x1 = t.xmax(); FT y1 = t.ymax(); FT z1 = t.zmax(); Matrix transformation; transformation << x1 - x0, 0 , 0 , 0 , y1 - y0, 0 , 0 , 0 , z1 - z0; FT volume = (x1-x0) * (y1-y0) * (z1-z0); // skip zero measure primitives if(volume == (FT)0.0) continue; CGAL_assertion(volume > 0.0); // Find the 2nd order moment for the cuboid wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix transformation = volume * transformation * moment * transformation.transpose(); // Translate the 2nd order moment to the minimum corner (x0,y0,z0) of the cuboid. FT xav0 = (x1 - x0) / FT(2.0); FT yav0 = (y1 - y0) / FT(2.0); FT zav0 = (z1 - z0) / FT(2.0); // and add to covariance matrix covariance[0] += transformation(0,0) + volume * (2*x0*xav0 + x0*x0); covariance[1] += transformation(1,0) + volume * (xav0*y0 + yav0*x0 + x0*y0); covariance[2] += transformation(2,0) + volume * (x0*zav0 + xav0*z0 + x0*z0); covariance[3] += transformation(1,1) + volume * (2*y0*yav0 + y0*y0); covariance[4] += transformation(2,1) + volume * (yav0*z0 + y0*zav0 + z0*y0); covariance[5] += transformation(2,2) + volume * (2*zav0*z0 + z0*z0); mass += volume; } CGAL_assertion_msg (mass != FT(0), "Can't compute PCA of null measure."); // Translate the 2nd order moment calculated about the origin to // the center of mass to get the covariance. covariance[0] += mass * (- c.x() * c.x()); covariance[1] += mass * (- c.x() * c.y()); covariance[2] += mass * (- c.z() * c.x()); covariance[3] += mass * (- c.y() * c.y()); covariance[4] += mass * (- c.z() * c.y()); covariance[5] += mass * (- c.z() * c.z()); } // assemble covariance matrix from a cuboid set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& , // kernel const typename K::Iso_cuboid_3*,// used for indirection const CGAL::Dimension_tag<2>&, const Eigen_diagonalize_traits&) { #if 1 typedef typename K::FT FT; typedef typename K::Iso_cuboid_3 Iso_cuboid; typedef typename K::Triangle_3 Triangle; auto converter = [](const Iso_cuboid& c, int idx) -> Triangle { // Decomposition of 6 faces of the cuboid into 12 triangles static constexpr std::array, 12 > indices = {{ { 0, 1, 2 }, { 0, 2, 3 }, { 2, 3, 4 }, { 2, 4, 7 }, { 3, 4, 5 }, { 3, 5, 0 }, { 4, 5, 6 }, { 4, 6, 7 }, { 5, 6, 1 }, { 5, 1, 0 }, { 6, 7, 2 }, { 6, 2, 1 } }}; return Triangle (c[indices[idx][0]], c[indices[idx][1]], c[indices[idx][2]]); }; assemble_covariance_matrix_3 (make_subiterator (first, converter), make_subiterator (beyond), covariance, c, K(), (Triangle*)nullptr, CGAL::Dimension_tag<2>(), Eigen_diagonalize_traits()); #else // This variant uses the standard formulas but seems to be broken // (line/plane estimated appear to be wrong). In the absence of a // reliable fix so far, the above workaround applying PCA to a // decomposition of the cuboid into triangles is used. typedef typename K::FT FT; typedef typename K::Iso_cuboid_3 Iso_cuboid; typedef typename Eigen::Matrix Matrix; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 //Final combined covariance matrix for all cuboids and their combined mass FT mass = (FT)0.0; // assemble 2nd order moment about the origin. Matrix moment; moment << (FT)(7.0/3.0), (FT)1.5, (FT)1.5, (FT)1.5, (FT)(7.0/3.0), (FT)1.5, (FT)1.5, (FT)1.5, (FT)(7.0/3.0); for(InputIterator it = first; it != beyond; it++) { // Now for each cuboid, construct the 2nd order moment about the origin. // assemble the transformation matrix. const Iso_cuboid& t = *it; // defined for convenience. FT x0 = t.xmin(); FT y0 = t.ymin(); FT z0 = t.zmin(); FT x1 = t.xmax(); FT y1 = t.ymax(); FT z1 = t.zmax(); Matrix transformation; transformation << x1 - x0, 0 , 0 , 0 , y1 - y0, 0 , 0 , 0 , z1 - z0; FT area = FT(2) * ((x1-x0)*(y1-y0) + (x1-x0)*(z1-z0) + (y1-y0)*(z1-z0)); // skip zero measure primitives if(area == (FT)0.0) continue; CGAL_assertion(area > 0.0); // Find the 2nd order moment for the cuboid wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix transformation = area * transformation * moment * transformation.transpose(); // Translate the 2nd order moment to the minimum corner (x0,y0,z0) of the cuboid. FT xav0 = (x1 - x0) / (2.0); FT yav0 = (y1 - y0) / (2.0); FT zav0 = (z1 - z0) / (2.0); // and add to covariance matrix covariance[0] += transformation(0,0) + area * (2*x0*xav0 + x0*x0); covariance[1] += transformation(1,0) + area * (xav0*y0 + yav0*x0 + x0*y0); covariance[2] += transformation(2,0) + area * (x0*zav0 + xav0*z0 + x0*z0); covariance[3] += transformation(1,1) + area * (2*y0*yav0 + y0*y0); covariance[4] += transformation(2,1) + area * (yav0*z0 + y0*zav0 + z0*y0); covariance[5] += transformation(2,2) + area * (2*zav0*z0 + z0*z0); mass += area; } CGAL_assertion_msg (mass != FT(0), "Can't compute PCA of null measure."); // Translate the 2nd order moment calculated about the origin to // the center of mass to get the covariance. covariance[0] += -mass * (c.x() * c.x()); covariance[1] += -mass * (c.x() * c.y()); covariance[2] += -mass * (c.z() * c.x()); covariance[3] += -mass * (c.y() * c.y()); covariance[4] += -mass * (c.z() * c.y()); covariance[5] += -mass * (c.z() * c.z()); #endif } // assemble covariance matrix from a sphere set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K&, // kernel const typename K::Sphere_3*, // used for indirection const CGAL::Dimension_tag<3>&, const Eigen_diagonalize_traits&) { typedef typename K::FT FT; typedef typename K::Sphere_3 Sphere; typedef typename Eigen::Matrix Matrix; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 //Final combined covariance matrix for all spheres and their combined mass FT mass = 0.0; // assemble 2nd order moment about the origin. Matrix moment; moment << FT(4.0/15.0), FT(0.0), FT(0.0), FT(0.0), FT(4.0/15.0), FT(0.0), FT(0.0), FT(0.0), FT(4.0/15.0); for(InputIterator it = first; it != beyond; it++) { // Now for each sphere, construct the 2nd order moment about the origin. // assemble the transformation matrix. const Sphere& t = *it; // defined for convenience. FT radius = CGAL::approximate_sqrt(t.squared_radius()); Matrix transformation; transformation << radius, 0.0, 0.0, 0.0, radius, 0.0, 0.0, 0.0, radius; FT volume = radius * t.squared_radius(); // skip zero measure primitives if(volume == (FT)0.0) continue; // Find the 2nd order moment for the sphere wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix transformation = volume * transformation * moment * transformation.transpose(); volume *= FT(4.0 / 3.0); // Translate the 2nd order moment to the center of the sphere. FT x0 = t.center().x(); FT y0 = t.center().y(); FT z0 = t.center().z(); // and add to covariance matrix covariance[0] += transformation(0,0) + volume * x0*x0; covariance[1] += transformation(1,0) + volume * x0*y0; covariance[2] += transformation(2,0) + volume * x0*z0; covariance[3] += transformation(1,1) + volume * y0*y0; covariance[4] += transformation(2,1) + volume * z0*y0; covariance[5] += transformation(2,2) + volume * z0*z0; mass += volume; } CGAL_assertion_msg (mass != FT(0), "Can't compute PCA of null measure."); // Translate the 2nd order moment calculated about the origin to // the center of mass to get the covariance. covariance[0] += -mass * (c.x() * c.x()); covariance[1] += -mass * (c.x() * c.y()); covariance[2] += -mass * (c.z() * c.x()); covariance[3] += -mass * (c.y() * c.y()); covariance[4] += -mass * (c.z() * c.y()); covariance[5] += -mass * (c.z() * c.z()); } // assemble covariance matrix from a sphere set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K&, // kernel const typename K::Sphere_3*, // used for indirection const CGAL::Dimension_tag<2>&, const Eigen_diagonalize_traits&) { typedef typename K::FT FT; typedef typename K::Sphere_3 Sphere; typedef typename Eigen::Matrix Matrix; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 //Final combined covariance matrix for all spheres and their combined mass FT mass = 0.0; // assemble 2nd order moment about the origin. Matrix moment; moment << FT(4.0/3.0), FT(0.0), FT(0.0), FT(0.0), FT(4.0/3.0), FT(0.0), FT(0.0), FT(0.0), FT(4.0/3.0); for(InputIterator it = first; it != beyond; it++) { // Now for each sphere, construct the 2nd order moment about the origin. // assemble the transformation matrix. const Sphere& t = *it; // defined for convenience. // FT example = CGAL::to_double(t[0].x()); FT radius = CGAL::approximate_sqrt(t.squared_radius()); Matrix transformation; transformation << radius, 0.0, 0.0, 0.0, radius, 0.0, 0.0, 0.0, radius; FT area = t.squared_radius(); // skip zero measure primitives if(area == (FT)0.0) continue; // Find the 2nd order moment for the sphere wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix transformation = area * transformation * moment * transformation.transpose(); area *= FT(4.0); // Translate the 2nd order moment to the center of the sphere. FT x0 = t.center().x(); FT y0 = t.center().y(); FT z0 = t.center().z(); // and add to covariance matrix covariance[0] += transformation(0,0) + area * x0*x0; covariance[1] += transformation(1,0) + area * x0*y0; covariance[2] += transformation(2,0) + area * x0*z0; covariance[3] += transformation(1,1) + area * y0*y0; covariance[4] += transformation(2,1) + area * z0*y0; covariance[5] += transformation(2,2) + area * z0*z0; mass += area; } CGAL_assertion_msg (mass != FT(0), "Can't compute PCA of null measure."); // Translate the 2nd order moment calculated about the origin to // the center of mass to get the covariance. covariance[0] += -mass * (c.x() * c.x()); covariance[1] += -mass * (c.x() * c.y()); covariance[2] += -mass * (c.z() * c.x()); covariance[3] += -mass * (c.y() * c.y()); covariance[4] += -mass * (c.z() * c.y()); covariance[5] += -mass * (c.z() * c.z()); } // assemble covariance matrix from a tetrahedron set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& , // kernel const typename K::Tetrahedron_3*,// used for indirection const CGAL::Dimension_tag<3>&, const Eigen_diagonalize_traits&) { typedef typename K::FT FT; typedef typename K::Point_3 Point_3; typedef typename K::Vector_3 Vector_3; typedef typename K::Tetrahedron_3 Tetrahedron; typedef typename Eigen::Matrix Matrix; typedef typename Eigen::Matrix Vector; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 // assemble 2nd order moment about the origin. Matrix moment; moment << FT(1.0/60.0), FT(1.0/120.0), FT(1.0/120.0), FT(1.0/120.0), FT(1.0/60.0), FT(1.0/120.0), FT(1.0/120.0), FT(1.0/120.0), FT(1.0/60.0); Matrix accum; // zero by default accum << 0, 0, 0, 0, 0, 0, 0, 0, 0; for (InputIterator it = first; it != beyond; it++) { const Tetrahedron& t = *it; // defined for convenience. FT x0 = t[0].x(); FT y0 = t[0].y(); FT z0 = t[0].z(); Matrix transformation; transformation << t[1].x()-x0, t[2].x()-x0, t[3].x()-x0, t[1].y()-y0, t[2].y()-y0, t[3].y()-y0, t[1].z()-z0, t[2].z()-z0, t[3].z()-z0; FT volume = CGAL::abs(t.volume()); // skip zero measure primitives if(volume == (FT)0.0) continue; // affine transform transformation = 6. * volume * transformation * moment * transformation.transpose(); Vector_3 d = t[0] - c; // delta Vector vec_d; vec_d << d.x(), d.y(), d.z(); Point_3 C = CGAL::centroid(t) - (t[0] - CGAL::ORIGIN); // careful, local centroid Vector vec_c; vec_c << C.x(), C.y(), C.z(); Matrix M = vec_c * vec_d.transpose() + vec_d * vec_c.transpose() + vec_d * vec_d.transpose(); accum += transformation + volume * M; } covariance[0] = accum(0,0); covariance[1] = accum(1,0); covariance[2] = accum(2,0); covariance[3] = accum(1,1); covariance[4] = accum(2,1); covariance[5] = accum(2,2); } // assemble covariance matrix from a segment set template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Eigen_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& , // kernel const typename K::Segment_3*,// used for indirection const CGAL::Dimension_tag<1>&, const Eigen_diagonalize_traits&) { typedef typename K::FT FT; typedef typename K::Segment_3 Segment; typedef typename Eigen::Matrix Matrix; // assemble covariance matrix as a semi-definite matrix. // Matrix numbering: // 0 1 2 // 3 4 // 5 //Final combined covariance matrix for all segments and their combined mass FT mass = 0.0; // assemble 2nd order moment about the origin. Matrix moment; moment << FT(1.0/3.0), FT(0.5/3.0), FT(0.0), FT(0.5/3.0), FT(1.0/3.0), FT(0.0), FT(0.0), FT(0.0), FT(0.0); for(InputIterator it = first; it != beyond; it++) { // Now for each segment, construct the 2nd order moment about the origin. // assemble the transformation matrix. const Segment& t = *it; // defined for convenience. // FT example = CGAL::to_double(t[0].x()); Matrix transformation; transformation << t[0].x(), t[1].x(), 0.0, t[0].y(), t[1].y(), 0.0, t[0].z(), t[1].z(), 1.0; FT length = CGAL::approximate_sqrt(t.squared_length()); // skip zero measure primitives if(length == (FT)0.0) continue; // Find the 2nd order moment for the segment wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix transformation = length * transformation * moment * transformation.transpose(); // and add to covariance matrix covariance[0] += transformation(0,0); covariance[1] += transformation(1,0); covariance[2] += transformation(2,0); covariance[3] += transformation(1,1); covariance[4] += transformation(2,1); covariance[5] += transformation(2,2); mass += length; } CGAL_assertion_msg (mass != FT(0), "Can't compute PCA of null measure."); // Translate the 2nd order moment calculated about the origin to // the center of mass to get the covariance. covariance[0] += -mass * (c.x() * c.x()); covariance[1] += -mass * (c.x() * c.y()); covariance[2] += -mass * (c.z() * c.x()); covariance[3] += -mass * (c.y() * c.y()); covariance[4] += -mass * (c.z() * c.y()); covariance[5] += -mass * (c.z() * c.z()); } // Variants using default template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Triangle_3* t,// used for indirection const CGAL::Dimension_tag<2>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, t, tag, Eigen_diagonalize_traits()); } template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Iso_cuboid_3* ic,// used for indirection const CGAL::Dimension_tag<3>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, ic, tag, Eigen_diagonalize_traits()); } template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Iso_cuboid_3* ic,// used for indirection const CGAL::Dimension_tag<2>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, ic, tag, Eigen_diagonalize_traits()); } template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Sphere_3* s, // used for indirection const CGAL::Dimension_tag<3>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, s, tag, Eigen_diagonalize_traits()); } template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Sphere_3* s, // used for indirection const CGAL::Dimension_tag<2>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, s, tag, Eigen_diagonalize_traits()); } template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Tetrahedron_3* t,// used for indirection const CGAL::Dimension_tag<3>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, t, tag, Eigen_diagonalize_traits()); } template < typename InputIterator, typename K > void assemble_covariance_matrix_3(InputIterator first, InputIterator beyond, typename Default_diagonalize_traits::Covariance_matrix& covariance, // covariance matrix const typename K::Point_3& c, // centroid const K& k, // kernel const typename K::Segment_3* s,// used for indirection const CGAL::Dimension_tag<1>& tag, const Default_diagonalize_traits&) { assemble_covariance_matrix_3 (first, beyond, covariance, c, k, s, tag, Eigen_diagonalize_traits()); } } // end namespace internal } //namespace CGAL #endif // CGAL_LINEAR_LEAST_SQUARES_FITTING_UTIL_EIGEN_H