a
    SicN)                     @   s6   d Z ddlZddlmZ ddlmZ G dd dZdS )z
Tools for triangular grids.
    N)_api)Triangulationc                   @   sL   e Zd ZdZdd Zedd ZdddZdd
dZdd Z	e
dd ZdS )TriAnalyzera  
    Define basic tools for triangular mesh analysis and improvement.

    A TriAnalyzer encapsulates a `.Triangulation` object and provides basic
    tools for mesh analysis and mesh improvement.

    Attributes
    ----------
    scale_factors

    Parameters
    ----------
    triangulation : `~matplotlib.tri.Triangulation`
        The encapsulated triangulation to analyze.
    c                 C   s   t jt|d || _d S )N)triangulation)r   check_isinstancer   _triangulation)selfr    r	   S/var/www/html/django/DPS/env/lib/python3.9/site-packages/matplotlib/tri/tritools.py__init__   s    zTriAnalyzer.__init__c                 C   sT   | j  }tjt|| j jjddk}dt| j j|  dt| j j|  fS )a-  
        Factors to rescale the triangulation into a unit square.

        Returns
        -------
        (float, float)
            Scaling factors (kx, ky) so that the triangulation
            ``[triangulation.x * kx, triangulation.y * ky]``
            fits exactly inside a unit square.
        	minlengthr      )	r   get_masked_trianglesnpbincountravelxsizeptpy)r   compressed_trianglesZ	node_usedr	   r	   r
   scale_factors    s    
zTriAnalyzer.scale_factorsTc                 C   s:  |r| j \}}nd\}}t| jj| | jj| gj}|| jj }|dddddf |dddddf  }|dddddf |dddddf  }|dddddf |dddddf  }t|dddf |dddf }t|dddf |dddf }t|dddf |dddf }|| | d }	|	|| |	  || |	  || |	  }
|
dk}t	|r|j
d }tj|tjd}tj||< || | }||  d	t|
|    || < n|| | d	t|
  }|| | d	| |	  }|| }| jj}|du r&|S tjj||d
S dS )aN  
        Return a measure of the triangulation triangles flatness.

        The ratio of the incircle radius over the circumcircle radius is a
        widely used indicator of a triangle flatness.
        It is always ``<= 0.5`` and ``== 0.5`` only for equilateral
        triangles. Circle ratios below 0.01 denote very flat triangles.

        To avoid unduly low values due to a difference of scale between the 2
        axis, the triangular mesh can first be rescaled to fit inside a unit
        square with `scale_factors` (Only if *rescale* is True, which is
        its default value).

        Parameters
        ----------
        rescale : bool, default: True
            If True, internally rescale (based on `scale_factors`), so that the
            (unmasked) triangles fit exactly inside a unit square mesh.

        Returns
        -------
        masked array
            Ratio of the incircle radius over the circumcircle radius, for
            each 'rescaled' triangle of the encapsulated triangulation.
            Values corresponding to masked triangles are masked out.

        )      ?r   Nr   r      g      ?g        dtypeg      @)mask)r   r   vstackr   r   r   T	triangleshypotanyshapeemptyfloat64infsqrtr   maarray)r   rescaleZkxkyptsZtri_ptsabcsprodZ	bool_flatntriZcircum_radiusabcZ	in_radiusZcircle_ratior   r	   r	   r
   circle_ratios2   s>    
,,,$$$(


zTriAnalyzer.circle_ratios{Gz?c                 C   s   | j jjd }| ||k }| j j}|du r:tj|td}t| j j	}tj
|tjd}d}|dkrtj|dddk| @ }	|	|@ }
|
|B }t|
}d||
ddf< d||
< t|dkd|| }q\tj|dS )a  
        Eliminate excessively flat border triangles from the triangulation.

        Returns a mask *new_mask* which allows to clean the encapsulated
        triangulation from its border-located flat triangles
        (according to their :meth:`circle_ratios`).
        This mask is meant to be subsequently applied to the triangulation
        using `.Triangulation.set_mask`.
        *new_mask* is an extension of the initial triangulation mask
        in the sense that an initially masked triangle will remain masked.

        The *new_mask* array is computed recursively; at each step flat
        triangles are removed only if they share a side with the current mesh
        border. Thus no new holes in the triangulated domain will be created.

        Parameters
        ----------
        min_circle_ratio : float, default: 0.01
            Border triangles with incircle/circumcircle radii ratio r/R will
            be removed if r/R < *min_circle_ratio*.
        rescale : bool, default: True
            If True, first, internally rescale (based on `scale_factors`) so
            that the (unmasked) triangles fit exactly inside a unit square
            mesh.  This rescaling accounts for the difference of scale which
            might exist between the 2 axis.

        Returns
        -------
        array of bool
            Mask to apply to encapsulated triangulation.
            All the initially masked triangles remain masked in the
            *new_mask*.

        Notes
        -----
        The rationale behind this function is that a Delaunay
        triangulation - of an unstructured set of points - sometimes contains
        almost flat triangles at its border, leading to artifacts in plots
        (especially for high-resolution contouring).
        Masked with computed *new_mask*, the encapsulated
        triangulation would contain no more unmasked border triangles
        with a circle ratio below *min_circle_ratio*, thus improving the
        mesh quality for subsequent plots or interpolation.
        r   Nr   r   )axisT)r   r    r#   r4   r   r   zerosboolcopy	neighborsarangeint32minsumwherer(   filled)r   Zmin_circle_ratior*   r2   Zmask_bad_ratiocurrent_maskZvalid_neighborsZrenum_neighborsZnaddZ	wavefrontZ
added_maskr	   r	   r
   get_flat_tri_masku   s&    0
zTriAnalyzer.get_flat_tri_maskc           	      C   s   | j j}| j  }| j jjd }|dur6| | }ntj|tjd}tj	t
|| j jjddk}| j j| }| j j| }| |}|| }|||||fS )a  
        Compress (if masked) the encapsulated triangulation.

        Returns minimal-length triangles array (*compressed_triangles*) and
        coordinates arrays (*compressed_x*, *compressed_y*) that can still
        describe the unmasked triangles of the encapsulated triangulation.

        Returns
        -------
        compressed_triangles : array-like
            the returned compressed triangulation triangles
        compressed_x : array-like
            the returned compressed triangulation 1st coordinate
        compressed_y : array-like
            the returned compressed triangulation 2nd coordinate
        tri_renum : int array
            renumbering table to translate the triangle numbers from the
            encapsulated triangulation into the new (compressed) renumbering.
            -1 for masked triangles (deleted from *compressed_triangles*).
        node_renum : int array
            renumbering table to translate the point numbers from the
            encapsulated triangulation into the new (compressed) renumbering.
            -1 for unused points (i.e. those deleted from *compressed_x* and
            *compressed_y*).

        r   Nr   r   )r   r   r   r    r#   _total_to_compress_renumr   r<   r=   r   r   r   r   r   )	r   Ztri_maskr   r2   	tri_renum
valid_nodecompressed_xcompressed_y
node_renumr	   r	   r
   _get_compressed_triangulation   s$    

z)TriAnalyzer._get_compressed_triangulationc                 C   s:   t jt | dt jd}t | }t j|t jd|| < |S )a  
        Parameters
        ----------
        valid : 1D bool array
            Validity mask.

        Returns
        -------
        int array
            Array so that (`valid_array` being a compressed array
            based on a `masked_array` with mask ~*valid*):

            - For all i with valid[i] = True:
              valid_array[renum[i]] = masked_array[i]
            - For all i with valid[i] = False:
              renum[i] = -1 (invalid value)
        r6   r   )r   fullr   r=   r?   r<   )validZrenumZn_validr	   r	   r
   rD      s    
z$TriAnalyzer._total_to_compress_renumN)T)r5   T)__name__
__module____qualname____doc__r   propertyr   r4   rC   rJ   staticmethodrD   r	   r	   r	   r
   r      s   

C
K1r   )rP   numpyr   
matplotlibr   matplotlib.trir   r   r	   r	   r	   r
   <module>   s   