
    |Le^#                        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e	          Z G d	 d
e          Zd Zd Zd ZdS )    )annotations)floorN)memoize)
_PointLike)isrealngjitc                  h     e Zd ZdZd fd	Zed             Zed             Zd Zd Z	d	 Z
d
 Z x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                    t          t          |                               ||           |g | _        n|| _        || _        || _        d S N)superr
   __init__zinterpolateweight_type)selfxyr   r   interp	__class__s         9lib/python3.11/site-packages/datashader/glyphs/trimesh.pyr   z_PolygonLike.__init__   sN    lD!!**1a0009DFFDF!&    c                    d S r    r   s    r   ndimsz_PolygonLike.ndims   s    tr   c                    t          | j        | j        gt          | j                  z             | j        | j        fz   S r   )tupler   r   listr   r   r   r   s    r   inputsz_PolygonLike.inputs!   s;    tvtv&df566!4#345 	6r   c                    | j         | j        gt          | j                  z   D ]K}t	          |j        t          |                             s"t          d                    |                    Ld S )Nz{} must be real)	r   r   r   r   r   measurestr
ValueErrorformat)r   	in_dshapecols      r   validatez_PolygonLike.validate&   sw    FDF#d46ll2 	@ 	@C)+CHH566 @ !2!9!9#!>!>???@	@ 	@r   c                H    | j         | j        gt          | j                  z   S r   )r   r   r   r   r   s    r   required_columnsz_PolygonLike.required_columns+   s    $tv,,..r   c                    || j                  j        }|                     |                    t	          j        |j                                      }|                     |          S r   )r   values_compute_boundsreshapenpprodshapemaybe_expand_bounds)r   dfxsboundss       r   compute_x_boundsz_PolygonLike.compute_x_bounds.   O    Z%%bjj1B1B&C&CDD''///r   c                    || j                  j        }|                     |                    t	          j        |j                                      }|                     |          S r   )r   r,   r-   r.   r/   r0   r1   r2   )r   r3   ysr5   s       r   compute_y_boundsz_PolygonLike.compute_y_bounds3   r7   r   )NTT)__name__
__module____qualname____doc__r   propertyr   r    r(   r*   r6   r:   __classcell__)r   s   @r   r
   r
   
   s         ' ' ' ' ' '   X 6 6 X6@ @ @
/ / /0 0 0
0 0 0 0 0 0 0r   r
   c                  (    e Zd ZdZe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                    t          |          \  }}t          ||          }	t          |||	          | j        | j        dfd	}
|
S )NTc           	          || d         j         d d                   }|s
J d             |||j        	| |           d S )Nr      z7There must be at least one column on which to aggregate)r1   r,   )
aggsr3   vtr5   
plot_startcolsextend_trianglesinfor   r   s
         r   extendz'Triangles._build_extend.<locals>.extendK   s^    4DGM"1"-..DRRRRRRRKdTXYYYYYr   )T)_build_draw_triangle"_build_map_onto_pixel_for_triangle_build_extend_trianglesr   r   )r   x_mappery_mapperrK   append_antialias_stage_2_antialias_stage_2_funcsdraw_triangledraw_triangle_interpmap_onto_pixelrL   rJ   r   r   s      `       @@@r   _build_extendzTriangles._build_extendA   s     /C6.J.J++;HhOO2=BV3AC C&&	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z 	Z r   N)r;   r<   r=   r>   r   rX   r   r   r   rB   rB   9   s9            W  r   rB   c                z     t           d             t            fd            }t            fd            }||fS )zISpecialize a triangle plotting kernel for a given append/axis combinationc                0    || z
  ||z
  z  ||z
  || z
  z  z
  S r   r   )axaybxbycxcys         r   	edge_funcz'_build_draw_triangle.<locals>.edge_funcV   s'    RBG$RBG'<<<r   c           
        |\  }}}}|\  }	}
}||k    r||k    r ||g||	|
z   |z   dz  fz   R   dS | \  \  }}\  }}\  }}|\  }}} ||||||          }t          ||dz             D ]}t          ||dz             D ]} ||||||          } ||||||          } ||||||          }|dk    s|dk     rL|dk    rF|dk    s|dk     r:|dk    r4|dk    s|dk     r(|dk    r"||	z  ||
z  z   ||z  z   |z  } ||g||fz   R   dS )z]Same as `draw_triangle()`, but with weights interpolated from vertex
        values.
              r   Nrange)vertsbboxbiasesrF   weightsminxmaxxminymaxyw0w1w2r[   r\   r]   r^   r_   r`   bias0bias1bias2areajig2g0g1
interp_resrR   ra   s                               r   rV   z2_build_draw_triangle.<locals>.draw_triangle_interpZ   s   
 "&dD$
B4<<DDLLF4?"r'B,!);(=!=??????+0(HRhr2R"(E5%9RRR44D4a(( 	> 	>tT!V,, > >A"2r2r1a88B"2r2r1a88B"2r2r1a88BaEAII"''aEAII"''aEAII"''&(2gR&7"r'&AT%I
q!=tzm';====>	> 	>r   c           
        |\  }}}}||k    r||k    r ||g||fz   R   dS | \  \  }	}
\  }}\  }}|\  }}}t          ||dz             D ]}t          ||dz             D ]v} |	|
||||          } ||||||          } |||	|
||          }|dk    s|dk     r8|dk    r2|dk    s|dk     r&|dk    r |dk    s|dk     r|dk    r ||g||fz   R   wd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.
        rd   r   Nre   )rg   rh   ri   rF   valrk   rl   rm   rn   r[   r\   r]   r^   r_   r`   rr   rs   rt   rv   rw   rx   ry   rz   rR   ra   s                          r   rU   z+_build_draw_triangle.<locals>.draw_triangles   sn    "&dD$4<<DDLLF40000000+0(HRhr2R"(E5%4a(( 7 7tT!V,, 7 7A"2r2r1a88B"2r2r1a88B"2r2r1a88BaEAII"''aEAII"''aEAII"''q!6tsf}666677 7r   r   )rR   rV   rU   ra   s   `  @r   rM   rM   T   s    
= = U= > > > > > U>0 7 7 7 7 7 U70 ...r   c                4     t            fd            }|S )Nc                   |\  }}}	}
t          ||          t          |	|
          }}t          ||          t          |	|
          }} 8| |||          \  }} 8| |||          \  }}t          |d         |d         z
  | d         z            dz
  }t          |d         |d         z
  | d         z            dz
  }|d         }|j        d         }t	          d|d          D ]a}||         }||dz            }||dz            }|d         |d         }}|d         |d         }}|d         |d         } }||         ||dz            ||dz            }#}"}! 8| |||          \  }$}% 8| |||          \  }&}' 8| |||           \  }(})t          |$|&|(          }*t          |$|&|(          }+t          |%|'|)          },t          |%|'|)          }-|*|k    s|+|k     s|,|k    s|-|k     rt          |*|          }*t          |+|          }+t          |,|          },t          |-|          }-t          t          |*dz             d          }*t          t          |,dz             d          },t          t          |+dz             |          }+t          t          |-dz             |          }-d\  }.}/}0|%|'k     s|'|%k    r|$|&k     rd}.|'|)k     s|)|'k    r|&|(k     rd}/|)|%k     s|%|)k    r|(|$k     rd}0|*|+|,|-f}1|.|/|0f}2|$|%f|&|'f|(|)ff}3|r|!|"|#f}4 7|3|1|2||4           /||         ||dz            z   ||dz            z   dz  }5 6|3|1|2||5           cd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"
        rd   r   rc   rE         ?)r   r   N)maxminroundr1   rf   r   )9rG   r5   rg   r   r   rF   rI   xminxmaxyminymaxcmax_xcmax_ycmin_xcmin_yvmax_xvmax_yvmin_xvmin_ymax_x_pixelsmax_y_pixelsr'   n_trisnabcaxnaynbxnbyncxncyncol0col1col2r[   r\   r]   r^   r_   r`   rk   rl   rm   rn   rr   rs   rt   rh   ri   mapped_vertsrj   r}   rU   rV   rW   s9                                                         r   rJ   z1_build_extend_triangles.<locals>.extend_triangles   s    "(dD$T4#dD//T4#dD//'FFFCC'FFFCCfQi&)3RU:;;a?fQi&)3RU:;;a?1gQq&!$$ ;	E ;	EAaAac
Aac
AtQqTCtQqTCtQqTC"1vs1Q3xQqS$D $^BS99FB#^BS99FB#^BS99FB r2r??Dr2r??Dr2r??Dr2r??D 6MMFNN6MM tV$$DtV$$DtV$$DtV$$D uT#X**DuT#X**DuT#X55DuT#X55D #-E5%Bww288RBww288RBww288RtT)DE5(F8b"XBx7L  Ed*$$\4wOOOO1vAaC(3qs83q8lD&$DDDDw;	E ;	Er   r~   )rU   rV   rW   rJ   s   ``` r   rO   rO      sI    
LE LE LE LE LE LE ULE\ r   c                0     t            fd            }|S )Nc                j    | \  }}}} 
|          |z  |z   dz
  } |          |z  |z   dz
  }	||	fS )z$Map points onto pixel grid.
        r   r   )rG   r5   r   r   sxtxsytyxxyyrP   rQ   s             r   rW   z:_build_map_onto_pixel_for_triangle.<locals>.map_onto_pixel   sQ    
 BBXa[[^b 3&Xa[[^b 3&2vr   r~   )rP   rQ   rW   s   `` r   rN   rN      s4    
     U r   )
__future__r   mathr   numpyr/   toolzr   datashader.glyphs.pointsr   datashader.utilsr   r   r
   rB   rM   rO   rN   r   r   r   <module>r      s   " " " " " "                 / / / / / / * * * * * * * *,0 ,0 ,0 ,0 ,0: ,0 ,0 ,0^       68/ 8/ 8/vP P Pf    r   