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) 2007 INRIA Sophia-Antipolis (France), INRIA Lorraine LORIA. // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/Ridges_3/include/CGAL/Umbilics.h $ // $Id: include/CGAL/Umbilics.h b26b07a1242 $ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Marc Pouget and Frédéric Cazals #ifndef CGAL_UMBILIC_H_ #define CGAL_UMBILIC_H_ #include #include #include #include #include #include #include #include #include #include namespace CGAL { enum Umbilic_type { NON_GENERIC_UMBILIC = 0, ELLIPTIC_UMBILIC, HYPERBOLIC_UMBILIC}; //------------------------------------------------------------------- //Umbilic : stores umbilic data, its location given by a vertex, its //type and a circle of edges bordering a disk containing the vertex //------------------------------------------------------------------ template < class TriangleMesh > class Umbilic { public: typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; //constructor Umbilic(const TriangleMesh& P, const vertex_descriptor v_init, const std::list contour_init); //access fct vertex_descriptor vertex() const { return v;} Umbilic_type umbilic_type() const { return umb_type;} Umbilic_type& umbilic_type() { return umb_type;} const TriangleMesh& mesh()const { return P;} const std::list& contour_list() const { return contour;} protected: const TriangleMesh& P; const vertex_descriptor v; Umbilic_type umb_type; const std::list contour; }; //constructor template Umbilic:: Umbilic(const TriangleMesh& P, const vertex_descriptor v_init, const std::list contour_init) : P(P), v(v_init), contour(contour_init) {} template std::ostream& operator<<(std::ostream& out_stream, const Umbilic& umbilic) { typedef typename boost::property_map::const_type VPM; VPM vpm = get(vertex_point, umbilic.mesh()); out_stream << "Umbilic at location (" << get(vpm, umbilic.vertex()) << ") of type "; switch (umbilic.umbilic_type()) { case CGAL::NON_GENERIC_UMBILIC: out_stream << "non generic" << std::endl; break; case CGAL::ELLIPTIC_UMBILIC: out_stream << "elliptic" << std::endl; break; case CGAL::HYPERBOLIC_UMBILIC: out_stream << "hyperbolic" << std::endl; break; default : out_stream << "Something wrong occurred for sure..." << std::endl; break; } return out_stream; } //--------------------------------------------------------------------------- //Umbilic_approximation : enable computation of umbilics of a //TriangleMesh. It uses the class //T_PolyhedralSurf_neighbors to compute topological disk patches //around vertices //-------------------------------------------------------------------------- template < class TriangleMesh, class VertexFTMap, class VertexVectorMap > class Umbilic_approximation { typedef typename boost::property_map::const_type VPM; typedef typename boost::property_traits::value_type Point_3; typedef typename Kernel_traits::Kernel Kernel; public: typedef typename Kernel::FT FT; typedef typename Kernel::Vector_3 Vector_3; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::halfedge_descriptor halfedge_descriptor; typedef typename boost::graph_traits::face_iterator Facet_const_iterator; typedef typename boost::graph_traits::vertex_iterator Vertex_const_iterator; //requirements for the templates TriangleMesh and VertexFTMap or VertexVectorMap static_assert(std::is_same::value); static_assert(std::is_same::value); static_assert(std::is_same::value); static_assert(std::is_same::value); typedef CGAL::Umbilic Umbilic; //constructor : sets propertymaps and the poly_neighbors Umbilic_approximation(const TriangleMesh& P, const VertexFTMap& vertex2k1_pm, const VertexFTMap& vertex2k2_pm, const VertexVectorMap& vertex2d1_pm, const VertexVectorMap& vertex2d2_pm); //identify umbilics as vertices minimizing the function k1-k2 on //their patch and for which the index is not 0. We avoid //potential umbilics whose contours touch the border. template OutputIterator compute(OutputIterator it, FT size); protected: const TriangleMesh& P; typedef T_PolyhedralSurf_neighbors Poly_neighbors; std::shared_ptr poly_neighbors; CGAL::Abs cgal_abs; CGAL::To_double To_double; //Property maps const VertexFTMap &k1, &k2; const VertexVectorMap &d1, &d2; // index: following CW the contour, we choose an orientation for the // max dir of an arbitrary starting point, the max dir field is // oriented on the next point so that the scalar product of the // consecutive vectors is positive. Adding all the angles between // consecutive vectors around the contour gives ~ -/+180 for a // wedge/trisector, ~ 0 gives a false umbilic, everything else gives // a non_generic umbilic. int compute_type(Umbilic& umb); }; template < class TriangleMesh, class VertexFTMap, class VertexVectorMap > Umbilic_approximation< TriangleMesh, VertexFTMap, VertexVectorMap >:: Umbilic_approximation(const TriangleMesh& p, const VertexFTMap& vertex2k1_pm, const VertexFTMap& vertex2k2_pm, const VertexVectorMap& vertex2d1_pm, const VertexVectorMap& vertex2d2_pm) : P(p), k1(vertex2k1_pm), k2(vertex2k2_pm), d1(vertex2d1_pm), d2(vertex2d2_pm) { CGAL_precondition(is_triangle_mesh(P)); poly_neighbors = std::shared_ptr(new Poly_neighbors(P)); } template < class TriangleMesh, class VertexFTMap, class VertexVectorMap > template OutputIterator Umbilic_approximation< TriangleMesh, VertexFTMap, VertexVectorMap >:: compute(OutputIterator umbilics_it, FT size) { CGAL_precondition( size >= 1 ); std::vector vces; std::list contour; FT umbilicEstimatorVertex, umbilicEstimatorNeigh; bool is_umbilic = true; //MAIN loop on P vertices Vertex_const_iterator itb, ite; std::tie(itb,ite) = vertices(P); for (;itb != ite; itb++) { vertex_descriptor vh = *itb; umbilicEstimatorVertex = cgal_abs(get(k1,vh)-get(k2,vh)); //reset vector, list and bool vces.clear(); contour.clear(); is_umbilic = true; //the size of neighborhood is (size * OneRingSize) poly_neighbors->compute_neighbors(vh, vces, contour, size); // avoid umbilics whose contours touch the border (Note may not be // desirable?) typename std::list::const_iterator itb_cont = contour.begin(), ite_cont = contour.end(); for (; itb_cont != ite_cont; itb_cont++) if ( is_border(*itb_cont, P) ) {is_umbilic = false; continue;} if (is_umbilic == false) continue; //is v an umbilic? //a priori is_umbilic = true, and it switches to false as soon as a // neigh vertex has a lower umbilicEstimator value typename std::vector::const_iterator itbv = vces.begin(), itev = vces.end(); itbv++; for (; itbv != itev; itbv++) { umbilicEstimatorNeigh = cgal_abs( get(k1,*itbv) - get(k2,*itbv) ); if ( umbilicEstimatorNeigh < umbilicEstimatorVertex ) {is_umbilic = false; break;} } if (is_umbilic == false) continue; //v is an umbilic (wrt the min of k1-k2), compute the index. If //the index is not 0 then we have actually an umbilic which is output Umbilic* cur_umbilic = new Umbilic(P, vh, contour); if (compute_type(*cur_umbilic) != 0) *umbilics_it++ = cur_umbilic; } return umbilics_it; } template < class TriangleMesh, class VertexFTMap, class VertexVectorMap > int Umbilic_approximation< TriangleMesh, VertexFTMap, VertexVectorMap >:: compute_type(Umbilic& umb) { Vector_3 dir, dirnext, normal; double cosinus, angle=0, angleSum=0; vertex_descriptor v; typename std::list::const_iterator itb = umb.contour_list().begin(), itlast = --umb.contour_list().end(); v = target(*itb, P); dir = get(d1,v); normal = CGAL::cross_product(get(d1,v), get(d2,v)); //sum angles along the contour do{ itb++; v = target(*itb, P); dirnext = get(d1,v); cosinus = To_double(dir*dirnext); if (cosinus < 0) {dirnext = dirnext*(-1); cosinus *= -1;} if (cosinus>1) cosinus = 1; //orientation of (dir, dirnext, normal) if ( (dir * CGAL::cross_product(dirnext, normal)) > 0) angle = acos(cosinus); else angle = -acos(cosinus); angleSum += angle; dir = dirnext; normal = CGAL::cross_product(get(d1,v), get(d2,v)); } while (itb != (itlast)); //angle (v_last, v_0) v = target(*umb.contour_list().begin(), P); dirnext = get(d1,v); cosinus = To_double(dir*dirnext); if (cosinus < 0) {dirnext = dirnext*(-1); cosinus *= -1;} if (cosinus>1) cosinus = 1; if ( (dir * CGAL::cross_product(dirnext, normal)) > 0) angle = acos(cosinus); else angle = -acos(cosinus); angleSum += angle; if ((angleSum > (CGAL_PI/2)) && (angleSum < (3*CGAL_PI/2))) umb.umbilic_type() = HYPERBOLIC_UMBILIC ; else if ((angleSum < (-CGAL_PI/2)) && (angleSum > (-3*CGAL_PI/2))) umb.umbilic_type() = ELLIPTIC_UMBILIC; else if ((angleSum <= (CGAL_PI/2)) && (angleSum >= (-CGAL_PI/2))) return 0;//is not considered as an umbilic else umb.umbilic_type() = NON_GENERIC_UMBILIC; return 1; } //Global function template < class TriangleMesh, class VertexFTMap, class VertexVectorMap, class OutputIterator> OutputIterator compute_umbilics(const TriangleMesh &P, const VertexFTMap& vertex2k1_pm, const VertexFTMap& vertex2k2_pm, const VertexVectorMap& vertex2d1_pm, const VertexVectorMap& vertex2d2_pm, OutputIterator it, double size) { typedef Umbilic_approximation < TriangleMesh, VertexFTMap, VertexVectorMap > Umbilic_approximation; Umbilic_approximation umbilic_approximation(P, vertex2k1_pm, vertex2k2_pm, vertex2d1_pm, vertex2d2_pm); return umbilic_approximation.compute(it, size); } } //namespace CGAL #endif