o
    hO)                     @   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	   l/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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_triangles	node_usedr	   r	   r
   scale_factors    s   
zTriAnalyzer.scale_factorsTc                 C   s4  |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 )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   rescalekxkyptstri_ptsabcsprod	bool_flatntricircum_radiusabc	in_radiuscircle_ratior   r	   r	   r
   circle_ratios2   sB   
,,,$$$(



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rftj|dddk| @ }	|	|@ }
|
|B }t|
}d||
ddf< d||
< t|dkd|| }|dks2t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$   r;   r   r   zerosboolcopy	neighborsarangeint32minsumwherer)   filled)r   min_circle_ratior+   r6   mask_bad_ratiocurrent_maskvalid_neighborsrenum_neighborsnadd	wavefront
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r| | }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   rC   rD   r   r   r   r   r   )	r   tri_maskr   r6   	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)
        r=   r   )r   fullr   rD   rF   rC   )validrenumn_validr	   r	   r
   rR      s   
z$TriAnalyzer._total_to_compress_renumN)T)r<   T)__name__
__module____qualname____doc__r   propertyr   r;   rQ   rY   staticmethodrR   r	   r	   r	   r
   r      s    


CK1r   )ra   numpyr   
matplotlibr   matplotlib.trir   r   r	   r	   r	   r
   <module>   s
    