
    kjH                        d dl mZ d dlmZ d dlmZ d dlmZ d dlZ	ddl
mZmZmZ ddZe G d d                      Ze G d de                      ZddZd dZdS )!    )annotations)deque)	dataclass)IteratorN   )FuncPointValuedPointdimintpminr	   pmaxfnr   returnlist[ValuedPoint]c                V     |z
   fdt          d z            D             S )u-   Requires pmin.x ≤ pmax.x, pmin.y ≤ pmax.yc           
         g | ]Qt          t          j        fd t                    D                                                               RS )c                D    g | ]}|         |z	  d z  |         z  z   S )r    ).0dir   ws     K/home/agentuser/manim-venv/lib/python3.11/site-packages/isosurfaces/cell.py
<listcomp>z5vertices_from_extremes.<locals>.<listcomp>.<listcomp>   s3    PPPd1ga!qt(;;PPP    )r
   nparrayrangecalc)r   r   r   r   r   r   s    @r   r   z*vertices_from_extremes.<locals>.<listcomp>   si       `aBHPPPPPPU3ZZPPPQQRRWWXZ[[  r   r   )r   )r   r   r   r   r   s   `` `@r   vertices_from_extremesr!      sX    tA      ejklpsksetet   r   c                  4    e Zd ZU ded<   ded<   ddZddZdS )MinimalCellr   r   r   verticesaxisdirr   c                ~    d|z  t          | j        dz
  fdt          | j                  D                       S )zDGiven an n-cell, this returns an (n-1)-cell (with half the vertices)r   c                4    g | ]\  }}|z  d k    k    |S )r   r   )r   r   vr&   ms      r   r   z+MinimalCell.get_subcell.<locals>.<listcomp>   s5    )g)g)g1UVYZUZ]^U^cfTfTf!TfTfTfr   )r#   r   	enumerater$   )selfr%   r&   r*   s     `@r   get_subcellzMinimalCell.get_subcell   sE    I48a<)g)g)g)g)g	$-8P8P)g)g)ghhhr   r   r   r
   c                Z    t          j        | j        d         | j        d         |          S )Nr   )r
   midpointr$   )r,   r   s     r   get_dualzMinimalCell.get_dual    s%    #DM!$4dmB6GLLLr   N)r%   r   r&   r   r   r#   )r   r   r   r
   )__name__
__module____qualname____annotations__r-   r1   r   r   r   r#   r#      s]         HHHi i i i
M M M M M Mr   r#   c                  X    e Zd ZU ded<   ded<   d ed<   ded<   ddZddZddZddZdS )Cellr   depthz
list[Cell]childrenparentchild_directionr   r   r   Nonec           	     l   | j         g k    sJ t          | j                  D ]\  }}| j        d         j        |j        z   dz  }| j        d         j        |j        z   dz  }t	          | j        |||          }t          | j        || j        dz   g | |          }| j                             |           d S )Nr      r/   r   )	r9   r+   r$   posr!   r   r7   r8   append)r,   r   r   vertexr   r   r$   new_quads           r   compute_childrenzCell.compute_children,   s    }"""""4=11 	+ 	+IAvM!$(6:5:DM"%)FJ6!;D-dhdBGGHDHh
QD!LLHM  ****	+ 	+r   r%   r&   Iterator[Cell]c              #     K   | j         rUd|z  }t          d| j        z            D ]6}||z  dk    |k    r'| j         |                             ||          E d{V  7dS | V  dS )zS
        Axis = 0,1,2,etc for x,y,z,etc.
        Dir = 0 for -x, 1 for +x.
        r   r   N)r9   r   r   get_leaves_in_direction)r,   r%   r&   r*   r   s        r   rF   zCell.get_leaves_in_direction5   s      
 = 	T	A1=)) S SEAI#%%#}Q/GGcRRRRRRRRRS S JJJJJr   Cell | Nonec                    d|z  }| j         |z  dk    |k    rD| j        dS | j                            ||          }|r|j        r|j        | j         |z           S |S | j        dS | j        j        | j         |z           S )z
        Same arguments as get_leaves_in_direction.

        Returns the quad (with depth <= self.depth) that shares a (dim-1)-cell
        with self, where that (dim-1)-cell is the side of self defined by
        axis and dir.
        r   r   N)r;   r:   walk_in_directionr9   )r,   r%   r&   r*   parent_walkeds        r   rI   zCell.walk_in_directionB   s     I 1$q(S00 {"t K99$DDM %!7 %$-d.BQ.FGG %${"t;'(<q(@AAr   Iterator[Cell | None]c              #  ~   K   |                      ||          }||                    ||          E d {V  d S d V  d S N)rI   rF   )r,   r%   r&   walkeds       r   walk_leaves_in_directionzCell.walk_leaves_in_direction\   s\      ''c2255dC@@@@@@@@@@@JJJJJr   N)r   r   r   r<   )r%   r   r&   r   r   rD   )r%   r   r&   r   r   rG   )r%   r   r&   r   r   rK   )r2   r3   r4   r5   rC   rF   rI   rO   r   r   r   r7   r7   $   s         JJJLLL+ + + +   B B B B4     r   r7   celltol
np.ndarrayboolc                T    t          j         j        d         j         j        d         j        z
  d|z  k               rdS t          d  j        D                       rdS t	          d  j        D                       rdS t	           fd j        d	d          D                       S )
Nr/   r   
   Fc              3  H   K   | ]}t          j        |j                  V  d S rM   r   isnanvalr   r)   s     r   	<genexpr>z+should_descend_deep_cell.<locals>.<genexpr>j   ,      44RXae__444444r   c              3  H   K   | ]}t          j        |j                  V  d S rM   rW   rZ   s     r   r[   z+should_descend_deep_cell.<locals>.<genexpr>m   r\   r   Tc              3     K   | ]C}t          j        |j                  t          j        j        d          j                  k    V  DdS )r   N)r   signrY   r$   )r   r)   rP   s     r   r[   z+should_descend_deep_cell.<locals>.<genexpr>t   sF      ^^q2715>>RWT]1-=-A%B%BB^^^^^^r   r   )r   allr$   r?   any)rP   rQ   s   ` r   should_descend_deep_cellrb   d   s    	vdmB#dmA&6&::R#XEFF _ u	44dm444	4	4 
_u	44dm444	4	4 _t
 ^^^^DMZ[Z\Z\L]^^^^^^r   	min_depth	max_cellsc                   d| z  }t          ||z  |          }t          | |||          }t          | |dg d d          x}	}
t          |
g          }d}t	          |          dk    r||k     r|                                }	|	j        |k     st          |	|          r7|	                    |           |	                    |	j
                   ||dz
  z  }t	          |          dk    r||k     |
S )Nr   r   )maxr!   r7   r   lenpopleftr8   rb   rC   extendr9   )r   r   r   r   rc   rd   rQ   branching_factorr$   current_quadroot
quad_queue
leaf_counts                r   
build_treero   w   s    Cx$i/;;I%c4r::HsHaT1===L4vJJ
j//A

*y"8"8!))++	))-ElTW-X-X)))"---l3444*Q..J j//A

*y"8"8 Kr   )
r   r   r   r	   r   r	   r   r   r   r   )rP   r7   rQ   rR   r   rS   )r   r   r   r   r   r	   r   r	   rc   r   rd   r   rQ   rR   r   r7   )
__future__r   collectionsr   dataclassesr   typingr   numpyr   pointr   r	   r
   r!   r#   r7   rb   ro   r   r   r   <module>rv      s4   " " " " " "       ! ! ! ! ! !           + + + + + + + + + +    M M M M M M M M < < < < <; < < <~_ _ _ _&     r   