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) 2024 GeometryFactory SARL (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/Polygon_repair/include/CGAL/Polygon_repair/Boolean.h $ // $Id: include/CGAL/Polygon_repair/Boolean.h b26b07a1242 $ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Andreas Fabri #ifndef CGAL_POLYGON_REPAIR_BOOLEAN_H #define CGAL_POLYGON_REPAIR_BOOLEAN_H #include #include #include #include #include #include #include #include #include #include namespace CGAL { namespace Polygon_repair { /*! \ingroup PkgTriangulation2Miscellaneous \tparam Kernel must be */ template class Boolean { private: struct FaceInfo { FaceInfo() {} int label; int layers; bool processed; template bool in_domain(const Fct& fct) const { return fct(layers); } }; using K = Kernel; using Container = Container_; using Point_2 = typename K::Point_2; using Polygon_2 = CGAL::Polygon_2; using Polygon_with_holes_2 = CGAL::Polygon_with_holes_2; using Multipolygon_with_holes_2 = CGAL::Multipolygon_with_holes_2; using Itag = std::conditional_t, Exact_predicates_tag, Exact_intersections_tag>; using Vb = CGAL::Triangulation_vertex_base_2; using Fbb = CGAL::Triangulation_face_base_with_info_2; using Fb = CGAL::Constrained_triangulation_face_base_2; using Tds = CGAL::Triangulation_data_structure_2; using CDT = CGAL::Constrained_Delaunay_triangulation_2; using CDTplus = CGAL::Constrained_triangulation_plus_2; using Face_handle = typename CDTplus::Face_handle; using Face_circulator = typename CDTplus::Face_circulator; using Vertex_handle = typename CDTplus::Vertex_handle; using Constraint_id = typename CDTplus::Constraint_id; using Edge = typename CDTplus::Edge; using Context = typename CDTplus::Context; // @todo taken from Polygon_repair should be factorized struct Polygon_less { bool operator()(const Polygon_2& pa, const Polygon_2& pb) const { typename Polygon_2::Vertex_iterator va = pa.vertices_begin(); typename Polygon_2::Vertex_iterator vb = pb.vertices_begin(); while (va != pa.vertices_end() && vb != pb.vertices_end()) { if (*va != *vb) return *va < *vb; ++va; ++vb; } if (vb == pb.vertices_end()) return false; return true; } }; // @todo taken from Polygon_repair should be factorized struct Polygon_with_holes_less { Polygon_less pl; bool operator()(const Polygon_with_holes_2& pa, const Polygon_with_holes_2& pb) const { if (pl(pa.outer_boundary(), pb.outer_boundary())) return true; if (pl(pb.outer_boundary(), pa.outer_boundary())) return false; typename Polygon_with_holes_2::Hole_const_iterator ha = pa.holes_begin(); typename Polygon_with_holes_2::Hole_const_iterator hb = pb.holes_begin(); while (ha != pa.holes_end() && hb != pb.holes_end()) { if (pl(*ha, *hb)) return true; if (pl(*hb, *ha)) return false; } if (hb == pb.holes_end()) return false; return true; } }; CDTplus cdt; public: /*! default constructor. */ Boolean() = default; /*! sets the polygons as input of the %Boolean operation. */ void insert(const Polygon_2& pA) { cdt.insert_constraint(pA.vertices_begin(), pA.vertices_end(), true); } void insert(const Polygon_with_holes_2& pwh) { cdt.insert_constraint(pwh.outer_boundary().vertices_begin(), pwh.outer_boundary().vertices_end(), true); for(auto const& hole : pwh.holes()){ cdt.insert_constraint(hole.vertices_begin(), hole.vertices_end(), true); } } void insert(const Multipolygon_with_holes_2& pA) { for(const auto& pwh : pA.polygons_with_holes()){ cdt.insert_constraint(pwh.outer_boundary().vertices_begin(), pwh.outer_boundary().vertices_end(), true); for(auto const& hole : pwh.holes()){ cdt.insert_constraint(hole.vertices_begin(), hole.vertices_end(), true); } } } private: void mark_domains(Face_handle start, int index, std::list& border) { if(start->info().layers != -1){ return; } std::list queue; queue.push_back(start); while(! queue.empty()){ Face_handle fh = queue.front(); queue.pop_front(); if(fh->info().layers == -1){ fh->info().layers = index; for(int i = 0; i < 3; i++){ Edge e(fh,i); Face_handle n = fh->neighbor(i); if(n->info().layers == -1){ if(cdt.is_constrained(e)){ border.push_back(e); }else{ queue.push_back(n); } } } } } } public: // this marks how many multipolygon interiors overlap a cell of the arrangement of mutipolygons void mark_domains() { for(Face_handle f : cdt.all_face_handles()){ f->info().layers = -1; } int overlays = 0; std::list border; mark_domains(cdt.infinite_face(), overlays, border); while(! border.empty()){ Edge e = border.front(); border.pop_front(); Face_handle fh = e.first; int fi = e.second; Face_handle n = fh->neighbor(fi); if(n->info().layers == -1){ Vertex_handle u = fh->vertex(cdt.cw(fi)), v = fh->vertex(cdt.ccw(fi)); int delta = 0; for(Context c : cdt.contexts(u,v)){ if(*c.current() ==u && *std::next(c.current()) == v){ ++delta; }else if(*c.current() ==v && *std::next(c.current()) == u){ --delta; }else{ CGAL_assertion(false); } } mark_domains(n, fh->info().layers+delta, border); } } } private: template void label_domain(Face_handle start, int label, const Fct& fct) { std::list queue; start->info().label = label; queue.push_back(start); while(! queue.empty()){ Face_handle fh = queue.front(); queue.pop_front(); for(int i = 0; i < 3; i++){ Face_handle n = fh->neighbor(i); if(n->info().in_domain(fct)){ if(n->info().label == 0){ n->info().label = label; queue.push_back(n); } } } } } // this marks the domain for the Boolean operation applied on the two multipolygons template int label_domains(const Fct& fct) { for (auto const face: cdt.all_face_handles()) { face->info().processed = false; face->info().label = 0; } int label = 1; for (auto const face: cdt.all_face_handles()) { if(face->info().in_domain(fct) && face->info().label == 0){ label_domain(face, label, fct); ++label; } } return label; } // @todo taken from Polygon_repair and adapted; might be factorized // Reconstruct ring boundary starting from an edge (face + opposite vertex) that is part of it template void reconstruct_ring(std::list& ring, Face_handle face_adjacent_to_boundary, int opposite_vertex, const Fct& CGAL_assertion_code(fct)) { // Create ring Face_handle current_face = face_adjacent_to_boundary; int current_opposite_vertex = opposite_vertex; CGAL_assertion(face_adjacent_to_boundary->info().in_domain(fct)); do { CGAL_assertion(current_face->info().in_domain(fct) == face_adjacent_to_boundary->info().in_domain(fct)); current_face->info().processed = true; Vertex_handle pivot_vertex = current_face->vertex(current_face->cw(current_opposite_vertex)); // std::cout << "\tAdding point " << pivot_vertex->point() << std::endl; ring.push_back(pivot_vertex->point()); Face_circulator fc = cdt.incident_faces(pivot_vertex, current_face); do { ++fc; } while (fc->info().label != current_face->info().label); current_face = fc; current_opposite_vertex = fc->cw(fc->index(pivot_vertex)); } while (current_face != face_adjacent_to_boundary || current_opposite_vertex != opposite_vertex); // Start at lexicographically smallest vertex typename std::list::iterator smallest_vertex = ring.begin(); for (typename std::list::iterator current_vertex = ring.begin(); current_vertex != ring.end(); ++current_vertex) { if (*current_vertex < *smallest_vertex) smallest_vertex = current_vertex; } if (ring.front() != *smallest_vertex) { ring.splice(ring.begin(), ring, smallest_vertex, ring.end()); } } public: // @todo taken from Polygon_repair and adapted; might be factorized /*! performs the Boolean operation applying `fct` and returns the result as a multipolygon with holes. \tparam Fct must have the operator `bool operator()(bool, bool)`. */ template Multipolygon_with_holes_2 operator()(const Fct& fct) { int number_of_polygons = label_domains(fct) - 1; Multipolygon_with_holes_2 mp; std::vector polygons; // outer boundaries std::vector> holes; // holes are ordered (per polygon) polygons.resize(number_of_polygons); holes.resize(number_of_polygons); for (auto const face: cdt.all_face_handles()) { face->info().processed = false; } for (auto const &face: cdt.finite_face_handles()) { if (! face->info().in_domain(fct)) continue; // exterior triangle if (face->info().processed) continue; // already reconstructed for (int opposite_vertex = 0; opposite_vertex < 3; ++opposite_vertex) { if (face->info().in_domain(fct) == face->neighbor(opposite_vertex)->info().in_domain(fct)) continue; // not adjacent to boundary // Reconstruct ring std::list ring; reconstruct_ring(ring, face, opposite_vertex, fct); // Put ring in polygons Polygon_2 polygon; polygon.reserve(ring.size()); polygon.insert(polygon.vertices_end(), ring.begin(), ring.end()); if (polygon.orientation() == CGAL::COUNTERCLOCKWISE) { polygons[face->info().label-1] = std::move(polygon); } else { holes[face->info().label-1].insert(std::move(polygon)); } break; } } // Create polygons with holes and put in multipolygon std::set ordered_polygons; for (std::size_t i = 0; i < polygons.size(); ++i) { ordered_polygons.insert(Polygon_with_holes_2(std::move(polygons[i]), std::make_move_iterator(holes[i].begin()), std::make_move_iterator(holes[i].end()))); } for (auto const& polygon: ordered_polygons) { mp.add_polygon_with_holes(std::move(polygon)); } return mp; } /*! access to the underlying constrained triangulation. */ const CDTplus& triangulation() const { return cdt; } }; } // namespace Polygon_repair } //namespace CGAL #endif // CGAL_POLYGON_REPAIR_BOOLEAN_H