o
    hz3                     @   sN   d Z ddlZddlmZ ddlmZ ddlZG dd dZG dd deZ	dS )	z'
Mesh refinement for triangular grids.
    N)_api)Triangulationc                   @   s   e Zd ZdZdd ZdS )
TriRefinera{  
    Abstract base class for classes implementing mesh refinement.

    A TriRefiner encapsulates a Triangulation object and provides tools for
    mesh refinement and interpolation.

    Derived classes must implement:

    - ``refine_triangulation(return_tri_index=False, **kwargs)`` , where
      the optional keyword arguments *kwargs* are defined in each
      TriRefiner concrete implementation, and which returns:

      - a refined triangulation,
      - optionally (depending on *return_tri_index*), for each
        point of the refined triangulation: the index of
        the initial triangulation triangle to which it belongs.

    - ``refine_field(z, triinterpolator=None, **kwargs)``, where:

      - *z* array of field values (to refine) defined at the base
        triangulation nodes,
      - *triinterpolator* is an optional `~matplotlib.tri.TriInterpolator`,
      - the other optional keyword arguments *kwargs* are defined in
        each TriRefiner concrete implementation;

      and which returns (as a tuple) a refined triangular mesh and the
      interpolated values of the field at the refined triangulation nodes.
    c                 C   s   t jt|d || _d S )N)triangulation)r   check_isinstancer   _triangulationselfr    r
   m/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/tri/_trirefine.py__init__*   s   
zTriRefiner.__init__N)__name__
__module____qualname____doc__r   r
   r
   r
   r   r      s    r   c                       sB   e Zd ZdZ fddZdddZdd	d
ZedddZ  Z	S )UniformTriRefinerz
    Uniform mesh refinement by recursive subdivisions.

    Parameters
    ----------
    triangulation : `~matplotlib.tri.Triangulation`
        The encapsulated triangulation (to be refined)
    c                    s   t  | d S N)superr   r   	__class__r
   r   r   =   s   zUniformTriRefiner.__init__F   c                 C   s   | j }|jjd }tj|tjd}t|D ]
}| ||\}}q|jjd }|j}|r~tj	|dtjd}	| j j
}
|
du rLt|ddd|	|< ||	fS |
| }t|| ddd|	||ddf < t||  ddd|	|| ddf < ||	fS |S )a  
        Compute a uniformly refined triangulation *refi_triangulation* of
        the encapsulated :attr:`triangulation`.

        This function refines the encapsulated triangulation by splitting each
        father triangle into 4 child sub-triangles built on the edges midside
        nodes, recursing *subdiv* times.  In the end, each triangle is hence
        divided into ``4**subdiv`` child triangles.

        Parameters
        ----------
        return_tri_index : bool, default: False
            Whether an index table indicating the father triangle index of each
            point is returned.
        subdiv : int, default: 3
            Recursion level for the subdivision.
            Each triangle is divided into ``4**subdiv`` child triangles;
            hence, the default results in 64 refined subtriangles for each
            triangle of the initial triangulation.

        Returns
        -------
        refi_triangulation : `~matplotlib.tri.Triangulation`
            The refined triangulation.
        found_index : int array
            Index of the initial triangulation containing triangle, for each
            point of *refi_triangulation*.
            Returned only if *return_tri_index* is set to True.
        r   dtypeNr   )r   	trianglesshapenparangeint32range_refine_triangulation_oncexfullmaskrepeatreshape)r	   return_tri_indexsubdivrefi_triangulationntri	ancestors_	refi_nptsrefi_trianglesfound_indextri_maskancestor_maskr
   r
   r   refine_triangulation@   s@   

z&UniformTriRefiner.refine_triangulationNc                 C   sb   |du rt j| j|}ntjt jj|d |}| j|dd\}}|j|j	|j
|dd }||fS )a  
        Refine a field defined on the encapsulated triangulation.

        Parameters
        ----------
        z : (npoints,) array-like
            Values of the field to refine, defined at the nodes of the
            encapsulated triangulation. (``n_points`` is the number of points
            in the initial triangulation)
        triinterpolator : `~matplotlib.tri.TriInterpolator`, optional
            Interpolator used for field interpolation. If not specified,
            a `~matplotlib.tri.CubicTriInterpolator` will be used.
        subdiv : int, default: 3
            Recursion level for the subdivision.
            Each triangle is divided into ``4**subdiv`` child triangles.

        Returns
        -------
        refi_tri : `~matplotlib.tri.Triangulation`
             The returned refined triangulation.
        refi_z : 1D array of length: *refi_tri* node count.
             The returned interpolated field (at *refi_tri* nodes).
        N)triinterpolatorT)r'   r&   )	tri_indexr   )
matplotlibtriCubicTriInterpolatorr   r   r   TriInterpolatorr1   _interpolate_multikeysr!   y)r	   zr2   r'   interprefi_trir.   refi_zr
   r
   r   refine_field   s"   


zUniformTriRefiner.refine_fieldc           $   
   C   s  | j }| j}| j}| j}t|d }t|d }|dur;t|}t||fkr;tdt| dt| t|dk}d| | d }	||	 }
t	|
}t	|
}||d|< ||d|< t
tj|tjdd}ttjdtjd|}|||f }||k}|| }|| }||||f  ||||d	 d f   d
 }||||f  ||||d	 d f   d
 }|||d< |||d< |}tj|dgtjd}|}tdD ]%}||k}t|}|| }tj|tjd| |dd|f |< ||7 }qt|}|| }|| }t||ddf t|tjdtjd }tj|d	d} || }!||| f |||!f< tj|d dgtjd}"t|dddf |dddf |dddf gj|"dddddf< t|ddd	f |ddd	f |dddf gj|"d	ddddf< t|dddf |dddf |ddd	f gj|"dddddf< t|dddf |ddd	f |dddf gj|"dddddf< t|||"}#| jdur|#t| jd |du r|#S |#t|dfS )a  
        Refine a `.Triangulation` by splitting each triangle into 4
        child-masked_triangles built on the edges midside nodes.

        Masked triangles, if present, are also split, but their children
        returned masked.

        If *ancestors* is not provided, returns only a new triangulation:
        child_triangulation.

        If the array-like key table *ancestor* is given, it shall be of shape
        (ntri,) where ntri is the number of *triangulation* masked_triangles.
        In this case, the function returns
        (child_triangulation, child_ancestors)
        child_ancestors is defined so that the 4 child masked_triangles share
        the same index as their father: child_ancestors.shape = (4 * ntri,).
        r   NzNIncompatible shapes provide for triangulation.masked_triangles and ancestors: z and r   r      r      g      ?)axis   )r!   r9   	neighborsr   r   r   asarray
ValueErrorsumzerostiler   r   r$   emptyr   logical_notabsouteronesargminvstackTr   r#   set_mask)$r   r*   r!   r9   rC   r   nptsr)   borders	added_ptsr,   refi_xrefi_y
edge_elemsedge_apexesedge_neighborsmask_mastersmastersapex_mastersx_addy_addnew_pt_cornernew_pt_midsidecum_sumimidmask_st_locn_masters_locelem_masters_locmask_slavesslavesslaves_masters
diff_tableslave_masters_apexslaves_apexchild_triangleschild_triangulationr
   r
   r   r       s   






z,UniformTriRefiner._refine_triangulation_once)Fr   )Nr   r   )
r   r   r   r   r   r1   r>   staticmethodr    __classcell__r
   r
   r   r   r   /   s    

E&r   )
r   numpyr   r4   r   matplotlib.tri._triangulationr   matplotlib.tri._triinterpolater   r   r
   r
   r
   r   <module>   s    #