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) 2009-2010 INRIA Sophia-Antipolis (France). // Copyright (c) 2014-2017 GeometryFactory Sarl (France) // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h $ // $Id: include/CGAL/Polyhedral_mesh_domain_with_features_3.h b26b07a1242 $ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Laurent Rineau, Stéphane Tayeb // //****************************************************************************** // File Description : // //****************************************************************************** #ifndef CGAL_POLYHEDRAL_MESH_DOMAIN_WITH_FEATURES_3_H #define CGAL_POLYHEDRAL_MESH_DOMAIN_WITH_FEATURES_3_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { /*! \ingroup PkgMesh3Domains The class `Polyhedral_mesh_domain_with_features_3` implements a domain whose boundary is a simplicial polyhedral surface. This surface must be free of intersections. It can either be closed, included inside another polyhedral surface which is closed and free of intersections, or open. In the latter case, the meshing process will only take care of the quality of the 1D (features and boundaries) and 2D (surfaces) components of the mesh. It is a model of the concept `MeshDomainWithFeatures_3`. It also provides a member function to automatically detect sharp features and boundaries from the input polyhedral surface(s). \note When the given surface(s) are not closed, the surface only will be meshed. It is then recommended to use the parameter `parameters::surface_only()` to speedup the meshing process. \tparam IGT stands for a geometric traits class providing the types and functors required to implement the intersection tests and intersection computations for polyhedral boundary surfaces. This parameter has to be instantiated with a model of the concept `IntersectionGeometricTraits_3`. \tparam Polyhedron stands for the type of the input polyhedral surface(s), model of `FaceListGraph`. \cgalModels{MeshDomainWithFeatures_3} \sa `CGAL::Mesh_domain_with_polyline_features_3` \sa `CGAL::Polyhedral_mesh_domain_3` \sa `CGAL::Mesh_polyhedron_3` */ #ifdef DOXYGEN_RUNNING template ::type> class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3 > #else template ::type, class TriangleAccessor = CGAL::Default, class Patch_id = int, class Use_exact_intersection_construction_tag = Tag_true> class Polyhedral_mesh_domain_with_features_3 : public Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3 > #endif { typedef Mesh_domain_with_polyline_features_3< Polyhedral_mesh_domain_3< Polyhedron_, IGT_, TriangleAccessor, Patch_id, Use_exact_intersection_construction_tag > > Base; typedef boost::adjacency_list< boost::setS, // this avoids parallel edges boost::vecS, boost::undirectedS, typename IGT_::Point_3, std::set > Featured_edges_copy_graph; public: typedef Polyhedron_ Polyhedron; typedef Polyhedron Polyhedron_type; // Index types typedef typename Base::Index Index; typedef typename Base::Corner_index Corner_index; typedef typename Base::Curve_index Curve_index; typedef typename Base::Surface_patch_index Surface_patch_index; typedef typename Base::Subdomain_index Subdomain_index; // Backward-compatibility #ifndef CGAL_NO_DEPRECATED_CODE typedef Curve_index Curve_segment_index; #endif typedef typename boost::property_map >::type Face_patch_id_pmap; typedef typename boost::property_traits< Face_patch_id_pmap>::value_type P_id; // Backward compatibility #ifndef CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX typedef Surface_patch_index Surface_index; #endif // CGAL_MESH_3_NO_DEPRECATED_SURFACE_INDEX typedef typename Base::R R; typedef typename Base::Point_3 Point_3; typedef typename Base::FT FT; typedef CGAL::Tag_true Has_features; typedef std::vector Bare_polyline; typedef Mesh_3::Polyline_with_context Polyline_with_context; /// \name Creation /// @{ /*! Constructor from a polyhedral surface. No feature detection is done at this level. Note that a copy of `polyhedron` will be done. The polyhedron `polyhedron` must be free of intersections. If `polyhedron` is closed, its inside will be meshed, otherwise there will be no interior and only the surface will be meshed. */ Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron #ifndef DOXYGEN_RUNNING , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.resize(1); stored_polyhedra[0] = polyhedron; get(face_patch_id_t(), stored_polyhedra[0]); this->add_primitives(stored_polyhedra[0]); this->build(); if(!is_closed(polyhedron)) this->set_surface_only(); } #ifndef CGAL_NO_DEPRECATED_CODE /*! \deprecated Constructor from an OFF file. No feature detection is done at this level. Users must read the file into a `Polyhedron` and call the constructor above. */ CGAL_DEPRECATED Polyhedral_mesh_domain_with_features_3(const std::string& filename #ifndef DOXYGEN_RUNNING , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) { load_from_file(filename.c_str()); } #ifndef DOXYGEN_RUNNING // The following is needed, because otherwise, when a "const char*" is // passed, the constructors templates are a better match, than the // constructor with `std::string`. CGAL_DEPRECATED Polyhedral_mesh_domain_with_features_3(const char* filename, CGAL::Random* p_rng = nullptr) : Base(p_rng) , borders_detected_(false) { load_from_file(filename); } #endif // DOXYGEN_RUNNING #endif // not CGAL_NO_DEPRECATED_CODE /*! Constructor from a polyhedral surface, and a bounding polyhedral surface. The first polyhedron should be entirely included inside `bounding_polyhedron`, which has to be closed and free of intersections. Using this constructor enables to mesh a polyhedral surface which is not closed, or has holes. The inside of `bounding_polyhedron` will be meshed. */ Polyhedral_mesh_domain_with_features_3(const Polyhedron& polyhedron, const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.resize(2); stored_polyhedra[0] = polyhedron; stored_polyhedra[1] = bounding_polyhedron; get(face_patch_id_t(), stored_polyhedra[0]); get(face_patch_id_t(), stored_polyhedra[1]); this->add_primitives(stored_polyhedra[0]); this->add_primitives(stored_polyhedra[1]); if(CGAL::is_empty(bounding_polyhedron)) { this->set_surface_only(); } else { this->add_primitives_to_bounding_tree(stored_polyhedra[1]); } } /*! * Constructor from a sequence of polyhedral surfaces, without a bounding * surface. The domain will always answer `false` to `is_in_domain()` * queries. * * @tparam InputPolyhedraPtrIterator must be a model of * `ForwardIterator` with value type `Polyhedron*` * * @param begin iterator for a sequence of pointers to polyhedra * @param end iterator for a sequence of pointers to polyhedra */ template Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin, InputPolyhedraPtrIterator end #ifndef DOXYGEN_RUNNING , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.reserve(std::distance(begin, end)); for (; begin != end; ++begin) { stored_polyhedra.push_back(**begin); get(face_patch_id_t(), stored_polyhedra.back()); this->add_primitives(stored_polyhedra.back()); } this->set_surface_only(); this->build(); } /*! * Constructor from a sequence of polyhedral surfaces, and a bounding * polyhedral surface. * * @tparam InputPolyhedraPtrIterator must be a model of * `ForwardIterator` with value type `Polyhedron*` * * @param begin iterator for a sequence of pointers to polyhedra * @param end iterator for a sequence of pointers to polyhedra * @param bounding_polyhedron the bounding surface */ template Polyhedral_mesh_domain_with_features_3(InputPolyhedraPtrIterator begin, InputPolyhedraPtrIterator end, const Polyhedron& bounding_polyhedron #ifndef DOXYGEN_RUNNING , CGAL::Random* p_rng = nullptr #endif ) : Base(p_rng) , borders_detected_(false) { stored_polyhedra.reserve(std::distance(begin, end)+1); if(begin != end) { for (; begin != end; ++begin) { stored_polyhedra.push_back(**begin); get(face_patch_id_t(), stored_polyhedra.back()); this->add_primitives(stored_polyhedra.back()); } } stored_polyhedra.push_back(bounding_polyhedron); get(face_patch_id_t(), stored_polyhedra.back()); this->add_primitives(stored_polyhedra.back()); if(CGAL::is_empty(bounding_polyhedron)) { this->set_surface_only(); } else { this->add_primitives_to_bounding_tree(stored_polyhedra.back()); } this->build(); } /// @} // Destructor ~Polyhedral_mesh_domain_with_features_3() {} // Detect features void initialize_ts(Polyhedron& p); void detect_borders(std::vector& p); void detect_features(FT angle_in_degree, std::vector& p); /// \name Operations /// @{ /*! detects sharp features and boundaries of the internal bounding polyhedron (and the potential internal polyhedra) and inserts them as features of the domain. @param angle_bound gives the maximum angle (in degrees) between the two normal vectors of adjacent triangles. For an edge of a polyhedron, if the angle between the two normal vectors of its incident facets is bigger than the given bound, then the edge is considered as a feature edge. */ void detect_features(FT angle_bound = FT(60)) { detect_features(angle_bound, stored_polyhedra); } /*! detects border edges of the bounding polyhedron and inserts them as features of the domain. This function should only be called alone, and not before or after `detect_features()`. */ void detect_borders() { detect_borders(stored_polyhedra); }; /// @} template void add_features(InputIterator first, InputIterator end) { auto max = 0; auto min = (std::numeric_limits::max)(); for(const auto& polyhedron: stored_polyhedra) { auto f_pid = get(face_patch_id_t(), polyhedron); for(auto fd : faces(polyhedron)) { const auto patch_id = get(f_pid, fd); min = (std::min)(patch_id, min); max = (std::max)(patch_id, max); } } boost::dynamic_bitset<> patch_ids_bitset; patch_ids_bitset.resize(max - min + 1); for(const auto& polyhedron: stored_polyhedra) { auto f_pid = get(face_patch_id_t(), polyhedron); for(auto fd : faces(polyhedron)) { const auto patch_id = get(f_pid, fd); patch_ids_bitset.set(patch_id - min); } } using Patch_ids_container = std::vector; Patch_ids_container all_patch_ids; all_patch_ids.reserve(patch_ids_bitset.count()); for(auto i = patch_ids_bitset.find_first(); i != patch_ids_bitset.npos; i = patch_ids_bitset.find_next(i)) { all_patch_ids.push_back(static_cast(i + min)); } using Polyline = typename std::iterator_traits::value_type; auto identity_property_map = boost::typed_identity_property_map(); auto all_patch_ids_pmap = boost::static_property_map(all_patch_ids); Base::add_features_and_incidences(first, end, identity_property_map, all_patch_ids_pmap); } // non-documented, provided to the FEniCS project const std::vector& polyhedra()const { return stored_polyhedra; } private: void load_from_file(const char* filename) { // Create input polyhedron std::ifstream input(filename); stored_polyhedra.resize(1); input >> stored_polyhedra[0]; get(face_patch_id_t(), stored_polyhedra[0]); this->add_primitives(stored_polyhedra[0]); this->build(); } void add_features_from_split_graph_into_polylines(Featured_edges_copy_graph& graph); template void add_featured_edges_to_graph(const Polyhedron& poly, const Edge_predicate& pred, Featured_edges_copy_graph& graph, P2Vmap& p2vmap); std::vector stored_polyhedra; bool borders_detected_; private: // Disabled copy constructor & assignment operator typedef Polyhedral_mesh_domain_with_features_3 Self; Polyhedral_mesh_domain_with_features_3(const Self& src); Self& operator=(const Self& src); }; // end class Polyhedral_mesh_domain_with_features_3 template < typename GT_, typename P_, typename TA_, typename Tag_, typename E_tag_> void Polyhedral_mesh_domain_with_features_3:: initialize_ts(Polyhedron& p) { typedef typename boost::property_map::type Vtmap; typedef typename boost::property_map::type Htmap; typedef typename boost::property_map::type Ftmap; Vtmap vtm = get(vertex_time_stamp,p); Htmap htm = get(halfedge_time_stamp,p); Ftmap ftm = get(face_time_stamp,p); std::size_t ts = 0; for(typename boost::graph_traits::vertex_descriptor vd : vertices(p)) { put(vtm,vd,ts++); } for(typename boost::graph_traits::face_descriptor fd : faces(p)) { put(ftm,fd,ts++); } for(typename boost::graph_traits::halfedge_descriptor hd : halfedges(p)) { put(htm,hd,ts++); } } template void dump_graph_edges(std::ostream& out, const Graph& g) { typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; out.precision(17); for(edge_descriptor e : make_range(edges(g))) { vertex_descriptor s = source(e, g); vertex_descriptor t = target(e, g); out << "2 " << g[s] << " " << g[t] << "\n"; } } template void dump_graph_edges(const char* filename, const Graph& g) { std::ofstream out(filename); dump_graph_edges(out, g); } template < typename GT_, typename P_, typename TA_, typename Tag_, typename E_tag_> void Polyhedral_mesh_domain_with_features_3:: detect_features(FT angle_in_degree, std::vector& poly) { CGAL_assertion(!borders_detected_); if (borders_detected_) return;//prevent from not-terminating typedef Featured_edges_copy_graph G_copy; G_copy g_copy; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::property_traits::type>::value_type Point; typedef std::map P2vmap; // TODO: replace this map by and unordered_map P2vmap p2vmap; namespace PMP = CGAL::Polygon_mesh_processing; std::size_t nb_of_patch_plus_one = 1; for(Polyhedron& p : poly) { initialize_ts(p); typedef typename boost::property_map >::type PIDMap; typedef typename boost::property_map >::type VIPMap; typedef typename boost::property_map::type EIFMap; PIDMap pid_map = get(face_patch_id_t(), p); VIPMap vip_map = get(vertex_incident_patches_t(), p); EIFMap eif_map = get(CGAL::edge_is_feature, p); // Get sharp features nb_of_patch_plus_one += PMP::sharp_edges_segmentation(p, angle_in_degree , eif_map , pid_map , CGAL::parameters::first_index(nb_of_patch_plus_one) .face_index_map(get_initialized_face_index_map(p)) .vertex_incident_patches_map(vip_map)); Mesh_3::internal::Is_featured_edge is_featured_edge(p); add_featured_edges_to_graph(p, is_featured_edge, g_copy, p2vmap); } add_features_from_split_graph_into_polylines(g_copy); borders_detected_ = true;/*done by PMP::detect_features*/ } template < typename GT_, typename P_, typename TA_, typename Tag_, typename E_tag_> void Polyhedral_mesh_domain_with_features_3:: detect_borders(std::vector& poly) { if (borders_detected_) return;//border detection has already been done detect_features(180, poly); borders_detected_ = true; } template < typename GT_, typename P_, typename TA_, typename Tag_, typename E_tag_> void Polyhedral_mesh_domain_with_features_3:: add_features_from_split_graph_into_polylines(Featured_edges_copy_graph& g_copy) { std::vector polylines; Mesh_3::internal::Extract_polyline_with_context_visitor< Polyline_with_context, Featured_edges_copy_graph > visitor(g_copy, polylines); Mesh_3::internal::Angle_tester angle_tester; split_graph_into_polylines( g_copy, visitor, angle_tester, [&](auto v1, auto v2) { return g_copy[v1] < g_copy[v2]; }); this->add_features_with_context(polylines.begin(), polylines.end()); #if CGAL_MESH_3_PROTECTION_DEBUG & 2 {//DEBUG std::ofstream og("polylines_graph.polylines.txt"); og.precision(17); for(const Polyline_with_context& poly : polylines) { og << poly.polyline_content.size() << " "; for(const Point_3& p : poly.polyline_content) og << p << " "; og << std::endl; } og.close(); } #endif // CGAL_MESH_3_PROTECTION_DEBUG & 2 } template < typename GT_, typename P_, typename TA_, typename Tag_, typename E_tag_> template void Polyhedral_mesh_domain_with_features_3:: add_featured_edges_to_graph(const Polyhedron& p, const Edge_predicate& pred, Featured_edges_copy_graph& g_copy, P2vmap& p2vmap) { typedef boost::filtered_graph Featured_edges_graph; Featured_edges_graph orig_graph(p, pred); typedef Featured_edges_graph Graph; typedef typename boost::graph_traits::edge_descriptor Graph_edge_descriptor; typedef Featured_edges_copy_graph G_copy; typedef typename boost::graph_traits::vertex_descriptor vertex_descriptor; typedef typename boost::graph_traits::edge_descriptor edge_descriptor; const Featured_edges_graph& graph = orig_graph; typedef typename boost::property_map::const_type Vpm; Vpm vpm = get(vertex_point, p); auto get_vertex = [&](auto point) { typename P2vmap::iterator it = p2vmap.find(point); vertex_descriptor v; if(it == p2vmap.end()) { v = add_vertex(g_copy); g_copy[v] = point; p2vmap[point] = v; } else { v = it->second; } return v; }; typedef typename boost::property_map >::type Face_patch_id_pmap; Face_patch_id_pmap fpm = get(face_patch_id_t(),p); for(Graph_edge_descriptor e : make_range(edges(graph))){ vertex_descriptor vs = get_vertex(get(vpm,source(e,graph))); vertex_descriptor vt = get_vertex(get(vpm,target(e,graph))); CGAL_warning_msg(vs != vt, "ignore self loop"); if(vs != vt) { const std::pair pair = add_edge(vs,vt,g_copy); typename boost::graph_traits::halfedge_descriptor he = halfedge(e, p); if(!is_border(he, p)) { g_copy[pair.first].insert(get(fpm, face(he,p))); } he = opposite(he,p); if(!is_border(he, p)) { g_copy[pair.first].insert(get(fpm, face(he,p))); } } } #if CGAL_MESH_3_PROTECTION_DEBUG & 2 {// DEBUG dump_graph_edges("edges-graph.polylines.txt", g_copy); } #endif } } //namespace CGAL #include #endif // CGAL_POLYHEDRAL_MESH_DOMAIN_WITH_FEATURES_3_H