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) 2013, 2014, 2015 GeometryFactory (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/Polygon_mesh_processing/include/CGAL/Side_of_triangle_mesh.h $ // $Id: include/CGAL/Side_of_triangle_mesh.h b26b07a1242 $ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Sebastien Loriot and Ilker O. Yaz #ifndef CGAL_SIDE_OF_TRIANGLE_MESH_H #define CGAL_SIDE_OF_TRIANGLE_MESH_H #include #include #include #include #include #include #include #include namespace CGAL { /** * \ingroup PMP_predicates_grp * This class provides an efficient point location functionality with respect to a domain bounded * by one or several disjoint closed triangle meshes. * * A point is said to be on the bounded side of the domain * if an odd number of surfaces is crossed when walking from the point to infinity. * * The input triangle mesh is expected to contain no self-intersections * and to be free from self-inclusions. * * In case the triangle mesh has several connected components, * the same test is performed and returns correct results. * In case of self-inclusions, * the user should be aware that the predicate called * inside every other sub-volume bounded by a nested surface * will return in turns `CGAL::ON_BOUNDED_SIDE` and `CGAL::ON_UNBOUNDED_SIDE`, * following the aforementioned parity criterion. * * This class depends on the package \ref PkgAABBTree. * * @tparam TriangleMesh a triangulated surface mesh, model of `FaceListGraph` * @tparam GeomTraits a geometric traits class, model of `Kernel` * @tparam VertexPointMap a model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` as key type and `GeomTraits::Point_3` as value type. * The default is `typename boost::property_map::%type`. * * \cgalHeading{Implementation Details} * The current implementation is based on the number of triangles intersected by a ray * having the query point as source. The do-intersect predicate used to detect if a triangle * is intersected is able to detect if a triangle is intersected in its * interior or on its boundary. In case it is intersected on its boundary, another ray is picked. * In order to speed queries, the first ray used is an axis aligned one that depends on the extents of the * bbox of the input mesh. In case other rays are needed to conclude, the rays are generated * from a random uniform sampling of a sphere. */ template class Side_of_triangle_mesh { // typedefs template struct AABB_tree_default { typedef CGAL::AABB_face_graph_triangle_primitive Primitive; typedef CGAL::AABB_traits_3 Traits; typedef CGAL::AABB_tree type; }; typedef typename Default::Lazy_get >::type AABB_tree_; typedef typename Default::Get::const_type>::type VertexPointMap; typedef typename GeomTraits::Point_3 Point; //members typename GeomTraits::Construct_ray_3 ray_functor; typename GeomTraits::Construct_vector_3 vector_functor; const TriangleMesh* tm_ptr; std::optional opt_vpm; bool own_tree; CGAL::Bbox_3 box; #ifdef CGAL_HAS_THREADS mutable CGAL_MUTEX tree_mutex; mutable std::atomic atomic_tree_ptr; #else mutable const AABB_tree_* tree_ptr; #endif public: #ifndef DOXYGEN_RUNNING typedef AABB_tree_ AABB_tree; #else /// AABB-tree accepting faces of `TriangleMesh` typedef unspecified_type AABB_tree; #endif /** * Constructor with one triangulated surface mesh. * @param tmesh the triangulated surface mesh bounding the domain to be tested * @param vpmap the property map with the points associated to the vertices of `tmesh` * @param gt an instance of the geometric traits class * * @pre `CGAL::is_closed(tmesh) && CGAL::is_triangle_mesh(tmesh)` */ Side_of_triangle_mesh(const TriangleMesh& tmesh, VertexPointMap vpmap, const GeomTraits& gt=GeomTraits()) : ray_functor(gt.construct_ray_3_object()) , vector_functor(gt.construct_vector_3_object()) , tm_ptr(&tmesh) , opt_vpm(vpmap) , own_tree(true) #ifdef CGAL_HAS_THREADS , atomic_tree_ptr(nullptr) #else , tree_ptr(nullptr) #endif { CGAL_assertion(CGAL::is_triangle_mesh(tmesh)); box = Polygon_mesh_processing::bbox(tmesh, parameters::vertex_point_map(vpmap)); } /** * Constructor with one surface triangle mesh, using `get(boost::vertex_point, tmesh)` as * vertex point property map. * @param tmesh the triangulated surface mesh bounding the domain to be tested * @param gt an instance of the geometric traits class * * @pre `CGAL::is_closed(tmesh) && CGAL::is_triangle_mesh(tmesh)` */ Side_of_triangle_mesh(const TriangleMesh& tmesh, const GeomTraits& gt=GeomTraits()) : Side_of_triangle_mesh(tmesh, get(vertex_point, tmesh), gt) {} /** * Constructor that takes a pre-built \cgal `AABB_tree` * of the triangulated surface mesh primitives. * * @param tree a \cgal `AABB_tree` with `AABB_face_graph_triangle_primitive` as `Primitive` type * @param gt an instance of the geometric traits class * * @pre `tree` contains a set of triangle faces representing a closed surface mesh */ Side_of_triangle_mesh(const AABB_tree& tree, const GeomTraits& gt = GeomTraits()) : ray_functor(gt.construct_ray_3_object()) , vector_functor(gt.construct_vector_3_object()) , tm_ptr(nullptr) , own_tree(false) #ifdef CGAL_HAS_THREADS , atomic_tree_ptr(&tree) #else , tree_ptr(&tree) #endif { box = tree.bbox(); } /** * Constructor that takes a pre-built \cgal `AABB_tree` * of the triangulated surface mesh primitives, and moves it. * * @param tree a \cgal `AABB_tree` with `AABB_face_graph_triangle_primitive` as `Primitive` type * @param gt an instance of the geometric traits class * * @pre `tree` contains a set of triangle faces representing a closed surface mesh */ Side_of_triangle_mesh(AABB_tree&& tree, const GeomTraits& gt = GeomTraits()) : ray_functor(gt.construct_ray_3_object()) , vector_functor(gt.construct_vector_3_object()) , tm_ptr(nullptr) , own_tree(true) #ifdef CGAL_HAS_THREADS , atomic_tree_ptr(new AABB_tree(std::forward(tree))) #else , tree_ptr(new AABB_tree(std::forward(tree))) #endif { #ifdef CGAL_HAS_THREADS box = atomic_tree_ptr.load()->bbox(); #else box = tree_ptr->bbox(); #endif } /** * Constructor moving an instance of `Side_of_triangle_mesh` to a new memory * location with minimal memory copy. * @param other the instance to be moved */ Side_of_triangle_mesh(Side_of_triangle_mesh&& other) { *this = std::move(other); } ~Side_of_triangle_mesh() { if (own_tree) #ifdef CGAL_HAS_THREADS delete atomic_tree_ptr.load(); #else delete tree_ptr; #endif } public: /** * Assign operator moving an instance of `Side_of_triangle_mesh` to this * location with minimal memory copy. * @param other the instance to be moved * @return a reference to `this` */ Side_of_triangle_mesh& operator=(Side_of_triangle_mesh&& other) { tm_ptr = std::move(other.tm_ptr); opt_vpm = std::move(other.opt_vpm); own_tree = std::move(other.own_tree); box = std::move(other.box); other.own_tree = false; #ifdef CGAL_HAS_THREADS atomic_tree_ptr = atomic_tree_ptr.load(); #else tree_ptr = std::move(other.tree_ptr); #endif return *this; } /** * returns the location of a query point * @param point the query point to be located with respect to the input polyhedral surface * @return * - `CGAL::ON_BOUNDED_SIDE` if the point is inside the volume bounded by the input triangle mesh * - `CGAL::ON_BOUNDARY` if the point is on triangle mesh * - `CGAL::ON_UNBOUNDED_SIDE` if the point is outside triangle mesh */ Bounded_side operator()(const Point& point) const { CGAL_assertion(tm_ptr == nullptr || CGAL::is_closed(*tm_ptr)); if(point.x() < box.xmin() || point.x() > box.xmax() || point.y() < box.ymin() || point.y() > box.ymax() || point.z() < box.zmin() || point.z() > box.zmax()) { return CGAL::ON_UNBOUNDED_SIDE; } else { #ifdef CGAL_HAS_THREADS AABB_tree_* tree_ptr = const_cast(atomic_tree_ptr.load(std::memory_order_acquire)); #endif // Lazily build the tree only when needed if (tree_ptr==nullptr) { #ifdef CGAL_HAS_THREADS CGAL_SCOPED_LOCK(tree_mutex); tree_ptr = const_cast(atomic_tree_ptr.load(std::memory_order_relaxed)); #endif CGAL_assertion(tm_ptr != nullptr && opt_vpm!=std::nullopt); if (tree_ptr==nullptr) { tree_ptr = new AABB_tree(faces(*tm_ptr).first, faces(*tm_ptr).second, *tm_ptr, *opt_vpm); const_cast(tree_ptr)->build(); #ifdef CGAL_HAS_THREADS atomic_tree_ptr.store(tree_ptr, std::memory_order_release); #endif } } return internal::Point_inside_vertical_ray_cast()( point, *tree_ptr, ray_functor, vector_functor); } } #ifndef DOXYGEN_RUNNING template Bounded_side operator()(const typename K2::Point_3& point, const K2& k2) const { CGAL_assertion(tm_ptr == nullptr || CGAL::is_closed(*tm_ptr)); if(point.x() < box.xmin() || point.x() > box.xmax() || point.y() < box.ymin() || point.y() > box.ymax() || point.z() < box.zmin() || point.z() > box.zmax()) { return CGAL::ON_UNBOUNDED_SIDE; } #ifdef CGAL_HAS_THREADS AABB_tree_* tree_ptr = const_cast(atomic_tree_ptr.load(std::memory_order_acquire)); #endif // Lazily build the tree only when needed if (tree_ptr==nullptr) { #ifdef CGAL_HAS_THREADS CGAL_SCOPED_LOCK(tree_mutex); tree_ptr = const_cast(atomic_tree_ptr.load(std::memory_order_relaxed)); #endif CGAL_assertion(tm_ptr != nullptr && opt_vpm!=std::nullopt); if (tree_ptr==nullptr) { tree_ptr = new AABB_tree(faces(*tm_ptr).first, faces(*tm_ptr).second, *tm_ptr, *opt_vpm); const_cast(tree_ptr)->build(); #ifdef CGAL_HAS_THREADS atomic_tree_ptr.store(tree_ptr, std::memory_order_release); #endif } } typedef typename Kernel_traits::Kernel K1; typedef typename AABB_tree::AABB_traits AABB_traits; typedef internal::Default_tree_helper Helper; Helper helper; static const unsigned int seed = 1340818006; CGAL::Random rg(seed); // seed some value for make it easy to debug Random_points_on_sphere_3 random_point(1.,rg); typename K2::Construct_ray_3 ray = k2.construct_ray_3_object(); typename K2::Construct_vector_3 vector = k2.construct_vector_3_object(); do { //retry with a random ray typename K2::Ray_3 query = ray(point, vector(CGAL::ORIGIN,*random_point++)); std::pair status( boost::logic::tribool(boost::logic::indeterminate), 0); internal::K2_Ray_3_K1_Triangle_3_traversal_traits traversal_traits(status, tree_ptr->traits(), helper); tree_ptr->traversal(query, traversal_traits); if ( !boost::logic::indeterminate(status.first) ) { if (status.first) return (status.second&1) == 1 ? ON_BOUNDED_SIDE : ON_UNBOUNDED_SIDE; //otherwise the point is on the facet return ON_BOUNDARY; } } while (true); return ON_BOUNDARY; // should never be reached } #endif }; } // namespace CGAL #include #endif //CGAL_SIDE_OF_TRIANGLE_MESH_H