
    lj                        d dl mZ d dlmZ d dlZerd dlmZmZ  G d d          Z	 G d d          Z
 G d	 d
          Z G d d          Z G d d          ZdS )    )annotations)TYPE_CHECKINGN)PointNDPointND_Arrayc                  &    e Zd ZddZddZddZdS )QuickHullPointcoordinatesr   returnNonec                    || _         d S N)r	   selfr	   s     L/home/agentuser/manim-venv/lib/python3.11/site-packages/manim/utils/qhull.py__init__zQuickHullPoint.__init__   s    &    intc                N    t          | j                                                  S r   )hashr	   tobytesr   s    r   __hash__zQuickHullPoint.__hash__   s    D$,,..///r   otherobjectboolc                |    t          |t                    st          t          j        | j        |j                  }|S r   )
isinstancer   
ValueErrornparray_equalr	   )r   r   are_coordinates_equals      r   __eq__zQuickHullPoint.__eq__   s?    %00 	&(ne/'
 '
 %$r   Nr	   r   r
   r   r
   r   r   r   r
   r   __name__
__module____qualname__r   r   r"    r   r   r   r      sP        ' ' ' '0 0 0 0% % % % % %r   r   c                  &    e Zd ZddZddZddZdS )SubFacetr	   r   r
   r   c                P    || _         t          d |D                       | _        d S )Nc              3  4   K   | ]}t          |          V  d S r   )r   ).0cs     r   	<genexpr>z$SubFacet.__init__.<locals>.<genexpr>   s*      GGaq 1 1GGGGGGr   )r	   	frozensetpointsr   s     r   r   zSubFacet.__init__   s,    &GG;GGGGGr   r   c                *    t          | j                  S r   )r   r3   r   s    r   r   zSubFacet.__hash__!   s    DK   r   r   r   r   c                Z    t          |t                    st          | j        |j        k    S r   )r   r,   r   r3   r   r   s     r   r"   zSubFacet.__eq__$   s)    %** 	{el**r   Nr#   r$   r%   r&   r*   r   r   r,   r,      sT        H H H H! ! ! !+ + + + + +r   r,   c                  .    e Zd ZddZddZdd
ZddZdS )Facetr	   r   internalr   r
   r   c                     | _         t          j        |d           _                             |           _        t           fdt           j         j        d                   D                        _	        d S )Nr   axisc              3  j   K   | ]-}t          t          j        j        |d                     V  .dS )r   r;   N)r,   r   deleter	   )r/   ir   s     r   r1   z!Facet.__init__.<locals>.<genexpr>/   sS       #
 #
 RYt/;;;<<#
 #
 #
 #
 #
 #
r   )
r	   r   meancentercompute_normalnormalr2   rangeshape	subfacets)r   r	   r9   s   `  r   r   zFacet.__init__+   s    &!w{;;;))(33" #
 #
 #
 #
4+1!455#
 #
 #
 
 
r   c                   | j         | j        z
  }t          j                            |          \  }}}|dd d f         }|t          j                            |          z  }t          j        || j        |z
            dk     r|dz  }|S )Nr   )r	   rA   r   linalgsvdnormdot)r   r9   centered_vhrC   s         r   rB   zFacet.compute_normal4   s    #dk19==**1bRU)")..((( 6&$+011A55bLFr   r   c                *    t          | j                  S r   )r   rF   r   s    r   r   zFacet.__hash__@   s    DN###r   r   r   r   c                Z    t          |t                    st          | j        |j        k    S r   )r   r8   r   rF   r6   s     r   r"   zFacet.__eq__C   s)    %'' 	~00r   N)r	   r   r9   r   r
   r   )r9   r   r
   r   r$   r%   )r'   r(   r)   r   rB   r   r"   r*   r   r   r8   r8   *   sd        
 
 
 

 
 
 
$ $ $ $1 1 1 1 1 1r   r8   c                      e Zd ZddZdS )Horizonr
   r   c                :    t                      | _        g | _        d S r   )setfacetsboundaryr   s    r   r   zHorizon.__init__J   s    "%%%(*r   N)r
   r   )r'   r(   r)   r   r*   r   r   rS   rS   I   s(        + + + + + +r   rS   c                  D    e Zd ZdZdddZdd
ZddZddZddZddZ	dS )	QuickHulla  
    QuickHull algorithm for constructing a convex hull from a set of points.

    Parameters
    ----------
    tolerance
        A tolerance threshold for determining when points lie on the convex hull (default is 1e-5).

    Attributes
    ----------
    facets
        List of facets considered.
    removed
        Set of internal facets that have been removed from the hull during the construction process.
    outside
        Dictionary mapping each facet to its outside points and eye point.
    neighbors
        Mapping of subfacets to their neighboring facets. Each subfacet links precisely two neighbors.
    unclaimed
        Points that have not yet been classified as inside or outside the current hull.
    internal
        An internal point (i.e., the center of the initial simplex) used as a reference during hull construction.
    tolerance
        The tolerance used to determine if points are considered outside the current hull.
    h㈵>	tolerancefloatr
   r   c                    g | _         t                      | _        i | _        i | _        d | _        d | _        || _        d S r   )rV   rU   removedoutside	neighbors	unclaimedr9   r[   )r   r[   s     r   r   zQuickHull.__init__j   s;    #%#&55QS57/3(,"r   r3   r   c                x   t           j                                        }||                    |j        d         |j        d         dz   d                   }|| _        t          j        |d          }|| _        t          |j        d                   D ]W}t          t          j
        ||d          |          }|                     |           | j                            |           X| j        D ]F}|j        D ]<}| j                            |t#                                                    |           =Gd S )Nr      F)replacer;   r9   )r   randomdefault_rngchoicerE   ra   r@   r9   rD   r8   r>   classifyrV   appendrF   r`   
setdefaultrU   add)	r   r3   rngsimplexnew_internalr0   facetfsfs	            r   
initializezQuickHull.initializes   s7   i##%%JJv|AQ!(;UJKK
   "a 8 8 8$ w}Q'(( 	& 	&A")GQQ777,OOOEMM%   Ku%%%%  	< 	<Ak < <))"cee4488;;;;<	< 	<r   rp   r8   c                \   | j         
J d            | j         j        sd| j        |<   d S | j         |j        z
  |j        z  }t          j        |          }|| j        k    }||         | j        k    r| j         |         nd }| j         |         }||f| j        |<   | j         |          | _         d S )Nz,Call .initialize() before using .classify().)NN)ra   sizer_   rA   rC   r   argmaxr[   )r   rp   projectionsargmaskeyer_   s          r   ri   zQuickHull.classify   s    ~)): *)) ~" 	".DLF ~4Di$$T^+ &1%5%F%FdnS!!D.&&nU.r   rz   r   start_facetrS   c                P    t                      }|                     |||           |S r   )rS   _recursive_horizon)r   rz   r{   horizons       r   compute_horizonzQuickHull.compute_horizon   s(    ))[':::r   r~   r   c                \   t          j        |j        ||j        z
            dk    }|sdS |j                            |           |j        D ]_}| j        |         |hz
                                  }||j        vr1| 	                    |||          s|j
                            |           `dS )Nr   FT)r   rL   rC   rA   rV   rl   rF   r`   popr}   rW   rj   )r   rz   rp   r~   visiblesubfacetneighbors          r   r}   zQuickHull._recursive_horizon   s    &sU\'9::Q> 	5 	5!!! 	2 	2Hx0E7:??AAHw~--d6M6MXw7 7-  ''111tr   c                
   |j         \  }}|dk    s	||dz   k     rt          d          |dk    rt          d          |                     |           | j        J | j        J 	 d}| j        D ]}|| j        v r| j        |         \  }}|nd}|                     ||          }|j        D ]}	| j        |	         d         }
|
J t          j
        | j        |
f          | _        | j                            |	           |	j        D ]G}| j        |                             |	           | j        |         t                      k    r| j        |= H|j        D ]}t#          t          j
        |j        |f          | j                  }|                     |           | j                            |           |j        D ]<}| j                            |t                                                    |           =|sd S )Nr   rc   z0Not enough points supplied to build Convex Hull!z*The Convex Hull of 1D data is its min-max!TFre   )rE   r   rs   ra   r9   rV   r^   r_   r   r   vstackrl   rF   r`   discardrU   rW   r8   r	   ri   rj   rk   )r   r3   numdimupdatedrp   r_   rz   r~   rq   points_to_appendrr   nfnsfs                 r   buildzQuickHull.build   sI   <S1HH#a--OPPP!88IJJJ ~)))}(((	G J JDL((#|E2?"G"223>>G$^ 	7 	7+/<?1+=(/;;;)+DNDT3U)V)V((+++"#+ 7 7B N2.66q999#~b1SUU::$(N2$67 &. J J"Ir~s&;<<t}   b)))**2...#%< J JC N55c355AAEEbIIIIJ 9	r   N)rZ   )r[   r\   r
   r   )r3   r   r
   r   )rp   r8   r
   r   )rz   r   r{   r8   r
   rS   )rz   r   rp   r8   r~   rS   r
   r   )
r'   r(   r)   __doc__r   rs   ri   r   r}   r   r*   r   r   rY   rY   O   s         4# # # # #< < < <*/ / / /(   
   ") ) ) ) ) )r   rY   )
__future__r   typingr   numpyr   manim.typingr   r   r   r,   r8   rS   rY   r*   r   r   <module>r      s1   " " " " " "                 433333333% % % % % % % % + + + + + + + +1 1 1 1 1 1 1 1>+ + + + + + + +L L L L L L L L L Lr   