a
    Df^#                     @  s   d dl mZ d dlmZ d dlZd dlmZ d dlm	Z	 d dl
mZmZ G dd de	ZG d	d
 d
eZdd Zdd Zdd ZdS )    )annotations)floorN)memoize)
_PointLike)isrealngjitc                      sZ   e Zd ZdZd fdd	Zedd Zedd	 Zd
d Zdd Z	dd Z
dd Z  ZS )_PolygonLikea  _PointLike class, with methods overridden for vertex-delimited shapes.

    Key differences from _PointLike:
        - added self.z as a list, representing vertex weights
        - constructor accepts additional kwargs:
            * weight_type (bool): Whether the weights are on vertices (True) or on the shapes
                                  (False)
            * interp (bool): Whether to interpolate (True), or to have one color per shape (False)
    NTc                   s8   t t| || |d u r"g | _n|| _|| _|| _d S N)superr   __init__zinterpolateweight_type)selfxyr   r   Zinterp	__class__ f/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/datashader/glyphs/trimesh.pyr      s    z_PolygonLike.__init__c                 C  s   d S r	   r   r   r   r   r   ndims   s    z_PolygonLike.ndimsc                 C  s&   t | j| jgt| j | j| jf S r	   )tupler   r   listr   r   r   r   r   r   r   inputs!   s    
z_PolygonLike.inputsc                 C  s@   | j | jgt| j D ]$}t|jt| std|qd S )Nz{} must be real)	r   r   r   r   r   Zmeasurestr
ValueErrorformat)r   Z	in_dshapecolr   r   r   validate&   s    z_PolygonLike.validatec                 C  s   | j | jgt| j S r	   )r   r   r   r   r   r   r   r   required_columns+   s    z_PolygonLike.required_columnsc                 C  s.   || j  j}| |t|j}| |S r	   )r   values_compute_boundsreshapenpprodshapemaybe_expand_bounds)r   dfxsboundsr   r   r   compute_x_bounds.   s    z_PolygonLike.compute_x_boundsc                 C  s.   || j  j}| |t|j}| |S r	   )r   r!   r"   r#   r$   r%   r&   r'   )r   r(   Zysr*   r   r   r   compute_y_bounds3   s    z_PolygonLike.compute_y_bounds)NTT)__name__
__module____qualname____doc__r   propertyr   r   r   r    r+   r,   __classcell__r   r   r   r   r   
   s   		

r   c                   @  s   e Zd ZdZedd ZdS )	TriangleszAn unstructured mesh of triangles, with vertices defined by ``xs`` and ``ys``.

    Parameters
    ----------
    xs, ys, zs : list of str
        Column names of x, y, and (optional) z coordinates of each vertex.
    c                   sF   t |\}}t||}	t|||	 | j| jd fdd	}
|
S )NTc                   s>   || d j d d }|s$J d |||j| | d S )Nr      z7There must be at least one column on which to aggregate)r&   r!   )aggsr(   vtr*   Z
plot_startcolsextend_trianglesinfor   r   r   r   extendK   s    z'Triangles._build_extend.<locals>.extend)T)_build_draw_triangle"_build_map_onto_pixel_for_triangle_build_extend_trianglesr   r   )r   x_mappery_mapperr:   appendZ_antialias_stage_2Z_antialias_stage_2_funcsdraw_triangledraw_triangle_interpmap_onto_pixelr;   r   r8   r   _build_extendA   s    
zTriangles._build_extendN)r-   r.   r/   r0   r   rE   r   r   r   r   r3   9   s   r3   c                   s8   t dd t  fdd}t  fdd}||fS )zISpecialize a triangle plotting kernel for a given append/axis combinationc                 S  s    ||  ||  || ||    S r	   r   )axaybxbycxcyr   r   r   	edge_funcV   s    z'_build_draw_triangle.<locals>.edge_funcc              	     sb  |\}}}}|\}	}
}||krN||krN ||g||	|
 | d f R   n| \\}}\}}\}}|\}}}||||||}t ||d D ]}t ||d D ]}||||||}||||||}||||||}|dks|dk r|dkr|dks|dk r|dkr|dks&|dk r|dkr||	 ||
  ||  | } ||g||f R   qqdS )z]Same as `draw_triangle()`, but with weights interpolated from vertex
        values.
              r   Nrange)vertsbboxbiasesr5   weightsminxmaxxminymaxyZw0Zw1Zw2rF   rG   rH   rI   rJ   rK   bias0bias1bias2areajig2g0g1Z
interp_resrA   rL   r   r   rC   Z   s6    
(
z2_build_draw_triangle.<locals>.draw_triangle_interpc              	     s  |\}}}}||kr6||kr6 ||g||f R   n| \\}	}
\}}\}}|\}}}t ||d D ]}t ||d D ]}|	|
||||}||||||}|||	|
||}|dks|dk rv|dkrv|dks|dk rv|dkrv|dk s|dk rv|dkrv ||g||f R   qvqddS )zDraw a triangle on a grid.

        Plots a triangle with integer coordinates onto a pixel grid,
        clipping to the bounds. The vertices are assumed to have
        already been scaled and transformed.
        rN   r   NrO   )rQ   rR   rS   r5   valrU   rV   rW   rX   rF   rG   rH   rI   rJ   rK   rY   rZ   r[   r]   r^   r_   r`   ra   rb   r   r   rB   s   s0    
z+_build_draw_triangle.<locals>.draw_triangler   )rA   rC   rB   r   rb   r   r<   T   s    
r<   c                   s   t  fdd}|S )Nc           6        s,  |\}}}	}
t ||t |	|
 }}t||t|	|
 }}| |||\}}| |||\}}t|d |d  | d  d }t|d |d  | d  d }|d }|jd }td|dD ]j}|| }||d  }||d  }|d |d  }}|d |d  }}|d |d  }} || ||d  ||d    }!}"}#| |||\}$}%| |||\}&}'| ||| \}(})t|$|&|(}*t |$|&|(}+t|%|'|)},t |%|'|)}-|*|ks|+|k s|,|ks|-|k rqt |*|}*t|+|}+t |,|},t|-|}-t t|*d d}*t t|,d d},tt|+d |}+tt|-d |}-d\}.}/}0|%|'k s\|'|%kr`|$|&k r`d}.|'|)k s~|)|'kr|&|(k rd}/|)|%k s|%|)kr|(|$k rd}0|*|+|,|-f}1|.|/|0f}2|$|%f|&|'f|(|)ff}3|r|!|"|#f}4|3|1|2||4 q|| ||d   ||d   d }5 |3|1|2||5 qdS )zAggregate along an array of triangles formed by arrays of CW
        vertices. Each row corresponds to a single triangle definition.

        `weight_type == True` means "weights are on vertices"
        rN   r   rM   r4         ?)rf   rf   N)maxminroundr&   rP   r   )6r6   r*   rQ   r   r   r5   r7   ZxminZxmaxZyminZymaxZcmax_xZcmax_yZcmin_xZcmin_yZvmax_xZvmax_yZvmin_xZvmin_yZmax_x_pixelsZmax_y_pixelsr   Zn_trisnabcZaxnZaynZbxnZbynZcxnZcynZcol0Zcol1Zcol2rF   rG   rH   rI   rJ   rK   rU   rV   rW   rX   rY   rZ   r[   rR   rS   Zmapped_vertsrT   rc   rB   rC   rD   r   r   r9      sn      
$






$z1_build_extend_triangles.<locals>.extend_trianglesrd   )rB   rC   rD   r9   r   rn   r   r>      s    Nr>   c                   s   t  fdd}|S )Nc           
        s<   | \}}}} || | d }|| | d }	||	fS )z$Map points onto pixel grid.
        re   r   )
r6   r*   r   r   ZsxZtxZsytyxxyyr?   r@   r   r   rD      s    z:_build_map_onto_pixel_for_triangle.<locals>.map_onto_pixelrd   )r?   r@   rD   r   rr   r   r=      s    	r=   )
__future__r   mathr   numpyr$   Ztoolzr   Zdatashader.glyphs.pointsr   Zdatashader.utilsr   r   r   r3   r<   r>   r=   r   r   r   r   <module>   s   /;S