
    ljiv                       d dl mZ d dlmZmZmZ d dlZd dlT d dl	m
Z
 d dlmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlT d dlmZmZ d d	lmZ d d
lmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% dZ&dZ'dZ(dZ)g dZ* G d de          Z+ G d de+          Z, G d de,          Z- G d de-          Z. G d de.          Z/ G d de,          Z0 G d de0          Z1 G d de0          Z2 G d d e,          Z3 G d! d"e3          Z4 G d# d$e0          Z5 G d% d&e+          Z6 G d' d(e6          Z7 G d) d*e6          Z8 G d+ d,e          Z9 G d- d.e6          Z: G d/ d0e:          Z; G d1 d2e:          Z< G d3 d4e          Z= G d5 d6e          Z> G d7 d8e>          Z? G d9 d:e?          Z@ G d; d<e@          ZA G d= d>e>          ZB G d? d@eB          ZC G dA dBeB          ZDdS )C    )annotations)AnySelfcastN)*)Mobject)OpenGLDashedVMobjectOpenGLMobjectOpenGLVGroupOpenGLVMobject)Point3DPoint3D_ArrayPoint3DLikeQuadraticSplineVector2DLikeVector3DVector3DLike)adjacent_n_tuplesadjacent_pairs)clip)angle_between_vectorsangle_of_vectorcompass_directionsfind_intersection	normalizerotate_vectorrotation_matrix_transposeg{Gz?皙?gffffff?)OpenGLTipableVMobject	OpenGLArcOpenGLArcBetweenPointsOpenGLCurvedArrowOpenGLCurvedDoubleArrowOpenGLCircle	OpenGLDotOpenGLEllipseOpenGLAnnularSectorOpenGLSectorOpenGLAnnulus
OpenGLLineOpenGLDashedLineOpenGLTangentLineOpenGLElbowOpenGLArrowOpenGLVectorOpenGLDoubleArrowOpenGLCubicBezierOpenGLPolygonOpenGLRegularPolygonOpenGLTriangleOpenGLArrowTipc                       e Zd ZdZeei fd% fd
Zd&d'dZd&d(dZd)dZ		 d&d*dZ
d+dZd+dZd,dZd,dZd-dZd-dZd.dZd/dZd0d Zd0d!Zd0 fd"Zd0 fd#Zd/d$Z xZS )1r   a  
    Meant for shared functionality between Arc and Line.
    Functionality can be classified broadly into these groups:

        * Adding, Creating, Modifying tips
            - add_tip calls create_tip, before pushing the new tip
                into the TipableVMobject's list of submobjects
            - stylistic and positional configuration

        * Checking for tips
            - Boolean checks for whether the TipableVMobject has a tip
                and a starting tip

        * Getters
            - Straightforward accessors, returning information pertaining
                to the TipableVMobject instance's tip(s), its length etc
    
tip_lengthfloatnormal_vectorr   
tip_configdict[str, Any]kwargsr   c                d    || _         || _        || _         t                      j        di | d S N )r7   r9   r:   super__init__)selfr7   r9   r:   r<   	__class__s        _/home/agentuser/manim-venv/lib/python3.11/site-packages/manim/mobject/opengl/opengl_geometry.pyrA   zOpenGLTipableVMobject.__init__Z   s>     %*$""6"""""    Fat_startboolreturnr   c                     | j         |fi |}|                     ||           |                     ||           |                     |           | S )z
        Adds a tip to the TipableVMobject instance, recognising
        that the endpoints might need to be switched if it's
        a 'starting tip' or not.
        )
create_tipreset_endpoints_based_on_tipassign_tip_attraddrB   rF   r<   tips       rD   add_tipzOpenGLTipableVMobject.add_tipf   s]     doh11&11))#x888S(+++rE   r5   c                L     | j         di |}|                     ||           |S )zy
        Stylises the tip, positions it spacially, and returns
        the newly instantiated tip to the caller.
        r?   )get_unpositioned_tipposition_tiprN   s       rD   rJ   z OpenGLTipableVMobject.create_tipr   s7    
 (d'11&11#x(((
rE   c                |    i }|                     | j                   |                     |           t          di |S )z
        Returns a tip that has been stylistically configured,
        but has not yet been given a position in space.
        r?   )updater:   r5   )rB   r<   configs      rD   rR   z*OpenGLTipableVMobject.get_unpositioned_tip{   sC    
 do&&&f'''''rE   rO   c                   |r)|                                  }|                                 }n(|                                 }|                                 }|                    t          ||z
            t          z
  |                                z
             |                    ||	                                z
             |S N)
	get_startget_first_handleget_last_handleget_endrotater   PI	get_angleshiftget_tip_point)rB   rO   rF   anchorhandles        rD   rS   z"OpenGLTipableVMobject.position_tip   s    
  	$^^%%F**,,FF))++F\\^^F

?6F?33b83==??JKKK		&3,,...///
rE   c                   |                                  dk    r| S |r)|                                }|                                 }n(|                                 }|                                }|                     ||           | S Nr   )
get_lengthget_baser\   rY   put_start_and_end_on)rB   rO   rF   startends        rD   rK   z2OpenGLTipableVMobject.reset_endpoints_based_on_tip   sy    ??!! K 	!LLNNE,,..CCNN$$E,,..C!!%---rE   c                (    |r|| _         n|| _        | S rX   )	start_tiprO   )rB   rO   rF   s      rD   rL   z%OpenGLTipableVMobject.assign_tip_attr   s     	 DNNDHrE   c                4    t          | d          o| j        | v S )NrO   )hasattrrO   rB   s    rD   has_tipzOpenGLTipableVMobject.has_tip   s    tU##8D(88rE   c                4    t          | d          o| j        | v S )Nrl   )rn   rl   ro   s    rD   has_start_tipz#OpenGLTipableVMobject.has_start_tip   s    t[))Ddn.DDrE   r   c                   |                                  \  }}t                      }|                                 r4|                    | j                   |                     | j                   |                                 r4|                    | j                   |                     | j                   |                     ||           |S rX   )	get_start_and_endr   rp   rM   rO   removerr   rl   rh   )rB   ri   rj   results       rD   pop_tipszOpenGLTipableVMobject.pop_tips   s    ++--
s<<>> 	"JJtx   KK!!! 	(JJt~&&&KK'''!!%---rE   c                    t                      }t          | d          r|                    | j                   t          | d          r|                    | j                   |S )zt
        Returns a VGroup (collection of VMobjects) containing
        the TipableVMObject instance's tips.
        rO   rl   )r   rn   rM   rO   rl   )rB   rv   s     rD   get_tipszOpenGLTipableVMobject.get_tips   s^    
 4 	!JJtx   4%% 	'JJt~&&&rE   c                    |                                  }t          |          dk    rt          d          t          t          |d                   }|S )zcReturns the TipableVMobject instance's (first) tip,
        otherwise throws an exception.
        r   ztip not found)ry   len	Exceptionr   r5   )rB   tipsrvs      rD   get_tipzOpenGLTipableVMobject.get_tip   sF     }}t99>>O,,,nd1g..BIrE   c                    | j         S rX   )r7   ro   s    rD   get_default_tip_lengthz,OpenGLTipableVMobject.get_default_tip_length   s
    rE   r   c                    | j         d         S )N   pointsro   s    rD   rZ   z&OpenGLTipableVMobject.get_first_handle       {1~rE   c                    | j         d         S )Nr   ro   s    rD   r[   z%OpenGLTipableVMobject.get_last_handle   s    {2rE   c                    |                                  r| j                                        S t                                                      S rX   )rp   rO   rY   r@   r\   rB   rC   s    rD   r\   zOpenGLTipableVMobject.get_end   s;    <<>> 	%8%%'''77??$$$rE   c                    |                                  r| j                                        S t                                                      S rX   )rr   rl   rY   r@   r   s    rD   rY   zOpenGLTipableVMobject.get_start   sA     	'>++---77$$&&&rE   c                x    |                                  \  }}t          j                            ||z
            }|S rX   )rt   nplinalgnorm)rB   ri   rj   r~   s       rD   rf   z OpenGLTipableVMobject.get_length   s3    ++--
sINN53;//	rE   )r7   r8   r9   r   r:   r;   r<   r   )F)rF   rG   r<   r   rH   r   )rF   rG   r<   r   rH   r5   )r<   r   rH   r5   )rO   r5   rF   rG   rH   r5   )rO   r5   rF   rG   rH   r   )rH   rG   )rH   r   )rH   r5   rH   r8   rH   r   )__name__
__module____qualname____doc__DEFAULT_ARROW_TIP_LENGTHOUTrA   rP   rJ   rR   rS   rK   rL   rp   rr   rw   ry   r   r   rZ   r[   r\   rY   rf   __classcell__rC   s   @rD   r   r   E   s        , 5&)%'	
# 
# 
# 
# 
# 
# 
#
 
 
 
 
    ( ( ( ( 5:          9 9 9 9E E E E
 
 
 

 
 
 
	 	 	 	         % % % % % %' ' ' ' ' '       rE   r   c                  v     e Zd Zdedz  ddefd fdZddZe	 ddd            Zd dZ	d!dZ
d!dZd"dZ xZS )#r    r            ?   start_angler8   angleradiusn_componentsint
arc_centerr   r<   r   c                    || _         || _        || _        || _        || _         t                      j        di | d| _        d S )Nr?   )r   r   r   r   r   r@   rA   orientation)rB   r   r   r   r   r   r<   rC   s          rD   rA   zOpenGLArc.__init__   sU     '
($""6"""rE   rH   Nonec                    |                      t                              | j        | j        | j                             |                     | j        t                     | 	                    | j
                   d S )N)r   r   r   about_point)
set_pointsr    create_quadratic_bezier_pointsr   r   r   scaler   ORIGINr`   r   ro   s    rD   init_pointszOpenGLArc.init_points  su    44j ,!. 5  	
 	
 	
 	

4;F
333

4?#####rE   r   c           	     n   t          j        d t          j        ||| z   d|z  dz             D                       }| |z  }|dd dxx         t          j        |dz            z  cc<   t          j        d|z  df          }|ddd         |dd d<   |dd d         |dd d<   |dd d         |dd d<   |S )Nc                `    g | ]+}t          j        |          t          j        |          d g,S )r   )r   cossin).0as     rD   
<listcomp>z<OpenGLArc.create_quadratic_bezier_points.<locals>.<listcomp>  s?        BF1IIq)  rE      r      r   r   )r   arraylinspacer   zeros)r   r   r   samplesthetar   s         rD   r   z(OpenGLArc.create_quadratic_bezier_points  s     ( %'$q(   	
 	
 $1	***1|+Q/00qAvqt!tqt!t}qt!tqt!t}qt!trE   r   c                    | j         dd         \  }}}||z
  }||z
  }t          |t          dz            }t          |t          dz            }t          ||||          S )zl
        Looks at the normals to the first two
        anchors, and finds their intersection points
        Nr   r   )r   r   TAUr   )rB   a1ha2t1t2n1n2s           rD   get_arc_centerzOpenGLArc.get_arc_center%  se     KO	ArVV2sQw''2sQw'' RR000rE   c                    t          |                                 |                                 z
            }|t          z  }|S rX   )r   rY   r   r   rB   r   r~   s      rD   get_start_anglezOpenGLArc.get_start_angle4  s8     0 043F3F3H3H HIICK	rE   c                    t          |                                 |                                 z
            }|t          z  }|S rX   )r   r\   r   r   r   s      rD   get_stop_anglezOpenGLArc.get_stop_angle9  s6    1D1D1F1F FGGCK	rE   pointr   c                Z    |                      ||                                 z
             | S rX   )r`   r   )rB   r   s     rD   move_arc_center_tozOpenGLArc.move_arc_center_to>  s*    

54..000111rE   )r   r8   r   r8   r   r8   r   r   r   r   r<   r   rH   r   )r   r   )r   r8   r   r8   r   r   rH   r   r   r   )r   r   rH   r   )r   r   r   r   r   rA   r   staticmethodr   r   r   r   r   r   r   s   @rD   r    r       s         Qw"(      "
$ 
$ 
$ 
$ BC    \,1 1 1 1   
   
       rE   r    c                  *     e Zd Zedz  fd
 fd	Z xZS )r!   r   ri   r   rj   r   r8   r<   r   c                     t                      j        dd|i| |dk    r!|                     t          t          g           |                     ||           d S )Nr   r   r?   )r@   rA   set_points_as_cornersLEFTRIGHTrh   )rB   ri   rj   r   r<   rC   s        rD   rA   zOpenGLArcBetweenPoints.__init__D  sd     	//u////A::&&e}555!!%-----rE   )ri   r   rj   r   r   r8   r<   r   )r   r   r   r   rA   r   r   s   @rD   r!   r!   C  sK        
 Qw	
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
.rE   r!   c                        e Zd Zd fdZ xZS )r"   start_pointr   	end_pointr<   r   c                f     t                      j        ||fi | |                                  d S rX   r@   rA   rP   rB   r   r   r<   rC   s       rD   rA   zOpenGLCurvedArrow.__init__R  s5    i::6:::rE   r   r   r   r   r<   r   r   r   r   rA   r   r   s   @rD   r"   r"   Q  s=                 rE   r"   c                        e Zd Zd fdZ xZS )r#   r   r   r   r<   r   c                j     t                      j        ||fi | |                     d           d S NT)rF   r   r   s       rD   rA   z OpenGLCurvedDoubleArrow.__init__X  s>    i::6:::d#####rE   r   r   r   s   @rD   r#   r#   W  =        $ $ $ $ $ $ $ $ $ $rE   r#   c                  <     e Zd Zefd fdZddefddZddZ xZS )r$   colorParsableManimColorr<   r   c                L     t                      j        dt          fd|i| d S )Nr   r   )r@   rA   r   )rB   r   r<   rC   s      rD   rA   zOpenGLCircle.__init__^  s/    C77u777777rE   r   Fmobjectr
   dim_to_matchr   stretchrG   buffr8   rH   r   c                @   |                      |||           |                     |                                 d|z  z   |                                 z  d           |                     |                                 d|z  z   |                                 z  d           | S )Nr   r   r   )replacer   	get_width
get_height)rB   r   r   r   r   s        rD   surroundzOpenGLCircle.surrounda  s     	WlG444dnn&&T1T^^5E5EEqIIIdoo''!d(2doo6G6GGKKKrE   r   r   c                j    |                                  }|                     ||z
  t          z            S rX   )r   point_from_proportionr   )rB   r   r   s      rD   point_at_anglezOpenGLCircle.point_at_anglep  s1    **,,))5;+>#*EFFFrE   )r   r   r<   r   )
r   r
   r   r   r   rG   r   r8   rH   r   )r   r8   rH   r   )	r   r   r   REDrA   MED_SMALL_BUFFr   r   r   r   s   @rD   r$   r$   ]  s        36 8 8 8 8 8 8 8 $    G G G G G G G GrE   r$   c                  ,     e Zd Zeeddefd fdZ xZS )r%   r   r   r   r   r   r8   stroke_widthfill_opacityr   r   r<   r   c           	     F     t                      j        d|||||d| d S )N)r   r   r   r   r   r?   r@   rA   )rB   r   r   r   r   r   r<   rC   s          rD   rA   zOpenGLDot.__init__v  sM     	 	
%%	
 	
 	
 	
 	
 	
 	
rE   )r   r   r   r8   r   r8   r   r8   r   r   r<   r   )r   r   r   r   DEFAULT_DOT_RADIUSWHITErA   r   r   s   @rD   r%   r%   u  sS         $*!$)
 
 
 
 
 
 
 
 
 
 
rE   r%   c                  "     e Zd Zd	d
 fdZ xZS )r&   r   r   widthr8   heightr<   r   c                     t                      j        di | |                     |d           |                     |d           d S )NTr   r?   r@   rA   	set_width
set_height)rB   r   r   r<   rC   s       rD   rA   zOpenGLEllipse.__init__  sR    ""6"""ud+++-----rE   )r   r   )r   r8   r   r8   r<   r   r   r   s   @rD   r&   r&     sB        . . . . . . . . . . .rE   r&   c                  >     e Zd Zddedz  dddefd fdZddZ xZS )r'   r   r   r   r   inner_radiusr8   outer_radiusr   r   r   r   r   r   r<   r   c           	     b    || _         || _         t                      j        d|||||d| d S )N)r   r   r   r   r   r?   )r  r  r@   rA   )
rB   r  r  r   r   r   r   r   r<   rC   s
            rD   rA   zOpenGLAnnularSector.__init__  s]     )( 	
#%%	
 	
 	
 	
 	
 	
 	
rE   rH   r   c                R     fd j          j        fD             \  }}|                                                      |j                                        |j        d                                         |j                                        |j        d                    d S )Nc              3  \   K   | ]&}t          j        j        |j                   V  'dS ))r   r   r   r   N)r    r   r   r   )r   r   rB   s     rD   	<genexpr>z2OpenGLAnnularSector.init_points.<locals>.<genexpr>  s[        
  
   ,j?	   
  
  
  
  
  
rE   r   )r  r  reverse_pointsappend_pointsr   add_line_to)rB   	inner_arc	outer_arcs   `  rD   r   zOpenGLAnnularSector.init_points  s     
  
  
  
  ,d.?@ 
  
  
	9 	  """9+,,,)!,---9+,,,)!,-----rE   )r  r8   r  r8   r   r8   r   r8   r   r8   r   r8   r   r   r<   r   r   )r   r   r   r   r   rA   r   r   r   s   @rD   r'   r'     sq          Qw$)
 
 
 
 
 
 
,. . . . . . . .rE   r'   c                  "     e Zd Zd	d
 fdZ xZS )r(   r   r   r  r8   r  r<   r   c                @     t                      j        d||d| d S )N)r  r  r?   r   )rB   r  r  r<   rC   s       rD   rA   zOpenGLSector.__init__  s.    XlXXQWXXXXXrE   )r   r   )r  r8   r  r8   r<   r   r   r   s   @rD   r(   r(     sM        Y Y Y Y Y Y Y Y Y Y YrE   r(   c                  6     e Zd Zddddedfd fdZddZ xZS )r)   r   r   r   Fr  r8   r  r   r   r   r   mark_paths_closedrG   r<   r   c                l    || _         || _        || _         t                      j        d|||d| d S )N)r   r   r   r?   )r  r  r  r@   rA   )	rB   r  r  r   r   r   r  r<   rC   s	           rD   rA   zOpenGLAnnulus.__init__  s[     "3(( 	
%L	
 	
QW	
 	
 	
 	
 	
rE   rH   r   c                6   | j         | _        t          | j                   }t          | j                  }|                                 |                     |j                   |                     |j                   |                     | j                   d S )N)r   )	r  r   r$   r  r  r  r   r`   r   )rB   outer_circleinner_circles      rD   r   zOpenGLAnnulus.init_points  s    '#4+<===#4+<===##%%%<.///<.///

4?#####rE   )r  r8   r  r8   r   r8   r   r8   r   r   r  rG   r<   r   r   )r   r   r   r   rA   r   r   r   s   @rD   r)   r)     sj          $)"'
 
 
 
 
 
 
"$ $ $ $ $ $ $ $rE   r)   c                       e Zd Zeeddfd) fd
Zd*dZ	 d+d,dZd-dZd.dZ	d/dZ
	 d0d1dZd2 fdZd3dZd3dZd4dZd5d!Zd4d"Zd0d6d&Zd7d(Z xZS )8r*   r   ri   r   rj   r   r8   path_arcr<   r   c                    d| _         || _        || _        |                     ||            t	                      j        di | d S )Nr   r?   )dimr   r  set_start_and_end_attrsr@   rA   )rB   ri   rj   r   r  r<   rC   s         rD   rA   zOpenGLLine.__init__  sS     	 $$UC000""6"""""rE   rH   r   c                ^    |                      | j        | j        | j        | j                   d S rX   )set_points_by_endsri   rj   r   r  ro   s    rD   r   zOpenGLLine.init_points  s*    
DHdiOOOOOrE   c                    |rD|                      t                              |                     |                     ||           n|                     ||g           |                     | j                   d S rX   )r   r    r   rh   r   account_for_buffr   )rB   ri   rj   r   r  s        rD   r  zOpenGLLine.set_points_by_ends  sy      	5OOIDDXNNOOO%%eS1111&&s|444di(((((rE   	new_valuec                <    || _         |                                  d S rX   )r  r   )rB   r!  s     rD   set_path_arczOpenGLLine.set_path_arc  s!    !rE   r   c                    |dk    r| S | j         dk    r|                                 n|                                 }|d|z  k     r| S ||z  }|                     | |d|z
             | S )Nr   r   r   )r  rf   get_arc_lengthpointwise_become_partial)rB   r   length	buff_props       rD   r   zOpenGLLine.account_for_buff  sz    199K&*mq&8&8"""d>Q>Q>S>SAHK6M	%%dIq9}EEErE   Mobject | Point3DLikec                   |                      |          }|                      |          }t          ||z
            }|                      ||          | j        |z  z   | _        |                      ||           | j        |z  z
  | _        d S rX   )pointifyr   r   ri   rj   )rB   ri   rj   rough_start	rough_endvects         rD   r  z"OpenGLLine.set_start_and_end_attrs  s    
 mmE**MM#&&	[011 ]]5$//$)d2BB
==te,,ty4/??rE   Nmob_or_point	directionr   r   c                    t          |t                    r-|}||                                S |                    |          S |}t	          j        | j                  }||dt          |          <   |S )zf
        Take an argument passed into Line (or subclass) and turn
        it into a 3d point.
        N)
isinstancer   
get_center!get_continuous_bounding_box_pointr   r   r  r{   )rB   r/  r0  mobr   rv   s         rD   r+  zOpenGLLine.pointify  st     lG,, 
	C ~~'''<<YGGG EXdh''F#(F<SZZ< MrE   c                    |                                  \  }}||k                                    r|                     ||| j                   t	                                          ||          S rX   )rt   allr  r  r@   rh   )rB   ri   rj   
curr_startcurr_endrC   s        rD   rh   zOpenGLLine.put_start_and_end_on&  sf    #5577
H("'')) 	?##E3>>>ww++E3777rE   r   c                T    |                                  |                                 z
  S rX   )r\   rY   ro   s    rD   
get_vectorzOpenGLLine.get_vector,  s    ||~~ 0 000rE   c                D    t          |                                           S rX   )r   r;  ro   s    rD   get_unit_vectorzOpenGLLine.get_unit_vector/  s    **+++rE   c                D    t          |                                           S rX   r   r;  ro   s    rD   r_   zOpenGLLine.get_angle2      t00111rE   r   c                    |                                  }|                                 }|t          j        ||z
  |          |z  z   S )z*Return projection of a point onto the line)r=  rY   r   dot)rB   r   	unit_vectri   s       rD   get_projectionzOpenGLLine.get_projection5  sB    ((**	  rveemY77)CCCrE   c                R    t          j        |                                           }|S rX   )r   tanr_   rB   r~   s     rD   	get_slopezOpenGLLine.get_slope;  s     F4>>++,,	rE   r   r   Point3DLike | Nonec                    ||                                  }|                     ||                                 z
  |           | S Nr   )rY   r]   r_   )rB   r   r   s      rD   	set_anglezOpenGLLine.set_angle?  sN    ..**KDNN$$$# 	 	
 	
 	
 rE   r'  c                Z    |                      ||                                 z             d S rX   )r   rf   )rB   r'  s     rD   
set_lengthzOpenGLLine.set_lengthH  s)    

6DOO---.....rE   )
ri   r   rj   r   r   r8   r  r8   r<   r   r   r   r   
ri   r   rj   r   r   r8   r  r8   rH   r   )r!  r8   rH   r   )r   r8   rH   r   )ri   r)  rj   r)  rH   r   rX   )r/  r)  r0  r   rH   r   ri   r   rj   r   rH   r   rH   r   r   )r   r   rH   r   )r   r8   r   rI  rH   r   )r'  r8   rH   r   )r   r   r   r   r   rA   r   r  r#  r   r  r+  rh   r;  r=  r_   rD  rH  rL  rN  r   r   s   @rD   r*   r*     s        " # # # # # # #P P P P XY) ) ) ) )   
 
 
 
@ @ @ @ NR    &8 8 8 8 8 81 1 1 1, , , ,2 2 2 2D D D D       / / / / / / / /rE   r*   c                  X     e Zd Zeddd fd	ZddZd fdZd fdZddZddZ	 xZ
S )r+         ?)dash_lengthdashed_ratioargsr   rU  r8   rV  r<   c                   || _         || _         t                      j        |i | | j         }|                     |          }t          | ||          }|                                   | j        |  d S )N)
num_dashesrV  )rV  rU  r@   rA   calculate_num_dashesr	   clear_pointsrM   )rB   rU  rV  rW  r<   rY  dashesrC   s          rD   rA   zOpenGLDashedLine.__init__M  s     )&$)&)))(..|<<
%!%
 
 

 	&rE   rH   r   c           	         t          dt          t          j        |                                 | j        z  |z                                S )Nr   )maxr   r   ceilrf   rU  )rB   rV  s     rD   rZ  z%OpenGLDashedLine.calculate_num_dashesa  sC    **T-==MNNOO
 
 	
rE   r   c                    t          | j                  dk    r| j        d                                         S t                                                      S re   )r{   submobjectsrY   r@   r   s    rD   rY   zOpenGLDashedLine.get_startg  sI    t  1$$#A&0022277$$&&&rE   c                    t          | j                  dk    r| j        d                                         S t                                                      S )Nr   r   )r{   ra  r\   r@   r   s    rD   r\   zOpenGLDashedLine.get_endm  sG    t  1$$#B'//11177??$$$rE   c                2    | j         d         j        d         S Nr   r   ra  r   ro   s    rD   rZ   z!OpenGLDashedLine.get_first_handles  s    ")!,,rE   c                2    | j         d         j        d         S )Nr   r   re  ro   s    rD   r[   z OpenGLDashedLine.get_last_handlev  s    #*2..rE   )rW  r   rU  r8   rV  r8   r<   r   )rV  r8   rH   r   r   )r   r   r   DEFAULT_DASH_LENGTHrA   rZ  rY   r\   rZ   r[   r   r   s   @rD   r+   r+   L  s         1!	       (
 
 
 
' ' ' ' ' '% % % % % %- - - -/ / / / / / / /rE   r+   c                  &     e Zd Z	 	 dd fdZ xZS )r,   r   ư>vmobr   alphar8   r'  d_alphar<   r   c                b   || _         || _        | j        }t          ||z
  dd          }t          ||z   dd          } t                      j        |                    |          |                    |          fi | |                     | j         |                                 z             d S rd  )r'  rl  r   r@   rA   pfpr   rf   )
rB   rj  rk  r'  rl  r<   dar   r   rC   s
            rD   rA   zOpenGLTangentLine.__init__{  s     \%"*a##%"*a##"txx||>>v>>>

4;!2!2233333rE   )r   ri  )
rj  r   rk  r8   r'  r8   rl  r8   r<   r   r   r   s   @rD   r,   r,   z  sJ        
 4 4 4 4 4 4 4 4 4 4 4rE   r,   c                  "     e Zd Zd	d
 fdZ xZS )r-   皙?r   r   r8   r   r<   r   c                "   || _          t                      j        | fi | |                     t          t          t
          z   t
          g           |                     |t                     |                     | j         t                     d S rK  )	r   r@   rA   r   UPr   r  r   r]   )rB   r   r   r<   rC   s       rD   rA   zOpenGLElbow.__init__  s|    
(((((""BU
E#:;;;u&111DJF33333rE   )rq  r   )r   r8   r   r8   r<   r   r   r   s   @rD   r-   r-     sB        4 4 4 4 4 4 4 4 4 4 4rE   r-   c                       e Zd Zeededdeddedz  ddfd' fdZ	 d(d) fdZ	d*dZ
d+d Zd+d!Zd,d"Zd- fd$Zd.d%Zd/d&Z xZS )0r.   r   r   r      r   rT  g?ri   r   rj   r  r8   
fill_colorr   r   r   r   	thicknesstip_width_ratio	tip_anglemax_tip_length_to_length_ratiomax_width_to_length_ratior<   r   c                    || _         |	| _        |
| _        || _        || _         t                      j        d|||||||d| d S )N)ri   rj   r   r  rv  r   r   r?   )rw  rx  ry  rz  r{  r@   rA   )rB   ri   rj   r  rv  r   r   r   rw  rx  ry  rz  r{  r<   rC   s                 rD   rA   zOpenGLArrow.__init__  sy      #.".L+)B& 		
!%%		
 		
 		
 		
 		
 		
 		
rE   rH   r   c                P   t          j        |          t          j        |          z
  }t          t           j                            |          d          }| j        }| j        ||z  z  }|dk     r||z  }| j        |z  }	|	dt          j        | j	        dz            z  z  }
| j
        |
|z  z  }|dk     r
|
|z  }
|	|z  }	|dk    rW||
z
  t          j        t          dt          z  t          g          z  }||t          z  dz  z  }|d d d         |t          z  z   }nddt          j        |          z
  z  }d|
z  t          j        |          z  }|
dz  |dz  z
  }| t          j        |dz  d|z  |z  z
            z   d|z  z  }t&                              |          }t          j        |d d d                   }|||dz  z   z  }|||dz  z
  z  }|dk     r|
dz  }
t+          t,          dz  |z
  t.                    }||fD ])}t          j        ||          |d d <   ||t          z  z  }*|                     |           |                     |	t          z  dz             |                     |
t6          z             t9          | j                  dz
  | _        |                     |	t          z  dz             |                     |d                    |                     |           |                     |d                    |dk    r6tA                      !                    || "                                z             | #                    tI          |          | %                                z
             | #                    t,          dz  t          j&        tO          |          d                   z
  tQ          | )                                t,           dz            	           | *                    || +                                z
             | ,                                 d S )
Ng:0yE>r   r   r   rT  r   r   r   )axis)-r   asarrayr^  r   r   rw  r{  rx  rF  ry  rz  r   r   r   rs  DOWNr   r   sqrtr    r   r   r^   r   rB  r   r  r   r{   r   	tip_indexr  r@   r   rf   r]   r   r_   arccosr   r   r=  r`   rY   refresh_triangulation)rB   ri   rj   r   r  r.  r'  rw  w_ratio	tip_widthr7   t_ratiopoints1points2r   bcRrot_Tr   rC   s                       rD   r  zOpenGLArrow.set_points_by_ends  s    z#E!2!22RY^^D))400N	0I4FGQ;; I(94	!bfT^a-?&@&@"@A
5f9LMQ;;'!J I q==
*bhsU{F7S.T.TTGy2~))Gdddmi$&66GG Q)))*AZ"&"2"22AA	)AbgadQUQY.///AE:A  >>xHHGhwttt}--Gq9q=((Gq9q=((G!||b 
-b1fx.?EEE!7* # #F6511qqq	!d("   R!+,,,d*+++T[))A-T)A-...$$$7###$$$A::GGMM&4??#4#44555OD))DNN,<,<<===FRYyq1222t3355sQw?? 	 	
 	
 	
 	

54>>+++,,,""$$$$$rE   r   c                    |                      |                                 |                                 | j                   | S )N)r  )r  rY   r\   r  ro   s    rD   reset_points_around_endsz$OpenGLArrow.reset_points_around_ends  sC    NNLLNN] 	  	
 	
 	

 rE   r   c                H    | j         }| j        }|d         ||          z   dz  S )Nr   r   )n_points_per_curver   )rB   nppcr   s      rD   rY   zOpenGLArrow.get_start  s+    &q	FD5M)Q..rE   c                &    | j         | j                 S rX   )r   r  ro   s    rD   r\   zOpenGLArrow.get_end  s    {4>**rE   c                B    |                      ||d| j                   | S )Nr   )r   r  )r  r  )rB   ri   rj   s      rD   rh   z OpenGLArrow.put_start_and_end_on  s&    sT]KKKrE   rW  c                b     t                      j        |i | |                                  | S rX   )r@   r   r  rB   rW  r<   rC   s      rD   r   zOpenGLArrow.scale  s5    t&v&&&%%'''rE   c                <    || _         |                                  | S rX   )rw  r  )rB   rw  s     rD   set_thicknesszOpenGLArrow.set_thickness  s     "%%'''rE   c                <    || _         |                                  d S rX   )r  r  )rB   r  s     rD   r#  zOpenGLArrow.set_path_arc  s!     %%'''''rE   )ri   r   rj   r   r  r8   rv  r   r   r8   r   r8   r   r8   rw  r8   rx  r8   ry  r8   rz  r8   r{  r8   r<   r   rO  rP  )rH   r   r   rQ  )rW  r   r<   r   rH   r   )rw  r8   rH   r   )r  r8   rH   r   )r   r   r   r   r   GREY_Ar   r^   rA   r  r  rY   r\   rh   r   r  r#  r   r   s   @rD   r.   r.     s.        " )/$!"603+.
 
 
 
 
 
 
B XY?% ?% ?% ?% ?% ?% ?%B   / / / /
+ + + +        
   
( ( ( ( ( ( ( (rE   r.   c                  &     e Zd Zedfd	 fdZ xZS )
r/   r   r0  Vector2DLike | Vector3DLiker   r8   r<   r   c                    || _         t          |          dk    rt          j        |dg          } t	                      j        t          |fd|i| d S )Nr   r   r   )r   r{   r   hstackr@   rA   r   )rB   r0  r   r<   rC   s       rD   rA   zOpenGLVector.__init__  s\     	y>>Q	9a.11I@@@@@@@@rE   )r0  r  r   r8   r<   r   )r   r   r   r   rA   r   r   s   @rD   r/   r/     sU         27	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	ArE   r/   c                        e Zd Zd fdZ xZS )r0   rW  r   r<   c                f     t                      j        |i | |                     d           d S r   r   r  s      rD   rA   zOpenGLDoubleArrow.__init__)  s9    $)&)))d#####rE   )rW  r   r<   r   r   r   s   @rD   r0   r0   (  r   rE   r0   c                        e Zd Zd	 fdZ xZS )
r1   a0r   h0h1r   r<   r   c                j     t                      j        di | |                     ||||           d S r>   )r@   rA   add_cubic_bezier_curve)rB   r  r  r  r   r<   rC   s         rD   rA   zOpenGLCubicBezier.__init__/  sB     	""6"""##BB33333rE   )
r  r   r  r   r  r   r   r   r<   r   r   r   s   @rD   r1   r1   .  s=        	4 	4 	4 	4 	4 	4 	4 	4 	4 	4rE   r1   c                  :     e Zd Zd fdZddZdd
ZdddZ xZS )r2   verticesr   r<   r   c                l    t          j        |          | _         t                      j        di | d S r>   )r   r   r  r@   rA   )rB   r  r<   rC   s      rD   rA   zOpenGLPolygon.__init__<  s7    ')x'9'9""6"""""rE   rH   r   c                R    | j         }|                     g ||d                    d S re   )r  r   )rB   vertss     rD   r   zOpenGLPolygon.init_points@  s2    ""#5U#5E!H#566666rE   r   c                *    |                                  S rX   )get_start_anchorsro   s    rD   get_verticeszOpenGLPolygon.get_verticesD  s    %%'''rE   rT  r   r8   r   c                   |                                  }g }t          |d          D ]\  }}}||z
  }||z
  }t          |          }	t          |          }
t          ||          }|t	          j        |          z  }|t	          j        |dz            z  }t	          j        t	          j        ||          d                   }t          ||	|z  z
  ||
|z  z   ||z  d          }|	                    |           | 
                                 |d         g|d d         }t          |          D ]\  }}|                     |j                   t          |                                |                                          }|                                |                                z  }|                    t)          |                                |z                       |                     |j                   | S )Nr   r   )r   r   r   )r  r   r   r   r   signrF  crossr!   appendr[  r   r  r   r*   r\   rY   rf   r%  insert_n_curvesr   get_num_curves)rB   r   r  arcsv1v2v3vect1vect2
unit_vect1
unit_vect2r   cut_off_lengthr  arcarc1arc2line	len_ratios                      rD   round_cornerszOpenGLPolygon.round_cornersG  s   $$&&+Ha88 	 	JBBGEGE"5))J"5))J)%77ERWV__$E#bfUQY&7&77N728E511!455D(Z.00Z.00Ul	  C KKR%49%(.. 	, 	,JD$t{+++dllnndnn.>.>??D))D,?,?,A,AAI  T%8%8%:%:Y%F!G!GHHHt{++++rE   )r  r   r<   r   r   )rH   r   rT  )r   r8   rH   r   )r   r   r   rA   r   r  r  r   r   s   @rD   r2   r2   ;  s~        # # # # # #7 7 7 7( ( ( (! ! ! ! ! ! ! ! !rE   r2   c                  "     e Zd Zd
d fd	Z xZS )r3      Nnr   r   float | Noner<   r   c                    || _         | j          |dz  dk    rd| _         ndt          z  | _         t          t          | j                   }t	          ||          } t                      j        |i | d S )Nr   r   Z   )r   DEGREESr   r   r   r@   rA   )rB   r  r   r<   
start_vectr  rC   s         rD   rA   zOpenGLRegularPolygon.__init__l  s{    &#1uzz#$  #%< "5$*:;;
%a44(-f-----rE   )r  N)r  r   r   r  r<   r   r   r   s   @rD   r3   r3   k  sB        	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.rE   r3   c                        e Zd Zd fdZ xZS )r4   r<   r   c                >     t                      j        dddi| d S )Nr  r   r?   r   )rB   r<   rC   s     rD   rA   zOpenGLTriangle.__init__y  s+    ''1''''''rE   )r<   r   r   r   s   @rD   r4   r4   x  s=        ( ( ( ( ( ( ( ( ( (rE   r4   c                  V     e Zd Zdedeedfd fdZddZddZddZ	ddZ
ddZ xZS )r5   r   r   r   r8   rv  r   r   r   r'  r   r<   r   c                     t                      j        dd|||d| |                     |d           |                     |d           d S )Nr   )r   r   rv  r   Tr   r?   r  )	rB   r   rv  r   r   r'  r   r<   rC   s	           rD   rA   zOpenGLArrowTip.__init__~  st     	 	
%!%		
 	

 	
 	
 	
 	ud+++-----rE   rH   r   c                ,    |                      d          S )NrT  )r   ro   s    rD   rg   zOpenGLArrowTip.get_base  s    ))#...rE   c                    | j         d         S re   r   ro   s    rD   ra   zOpenGLArrowTip.get_tip_point  r   rE   r   c                T    |                                  |                                 z
  S rX   )ra   rg   ro   s    rD   r;  zOpenGLArrowTip.get_vector  s!    !!##dmmoo55rE   c                D    t          |                                           S rX   r?  ro   s    rD   r_   zOpenGLArrowTip.get_angle  r@  rE   c                h    t           j                            |                                           }|S rX   )r   r   r   r;  rG  s     rD   rf   zOpenGLArrowTip.get_length  s$    INN4??#4#455	rE   )r   r8   rv  r   r   r8   r   r8   r'  r8   r   r8   r<   r   r   rR  r   )r   r   r   r   DEFAULT_ARROW_TIP_WIDTHr   rA   rg   ra   r;  r_   rf   r   r   s   @rD   r5   r5   }  s          )..0. . . . . . .(/ / / /   6 6 6 62 2 2 2       rE   r5   c                  (     e Zd Zeddfd fd
Z xZS )OpenGLRectangleg      @       @r   r   r   r8   r   r<   r   c                     t                      j        t          t          t          t
          fd|i| |                     |d           |                     |d           d S )Nr   Tr   )r@   rA   URULDLDRr  r  )rB   r   r   r   r<   rC   s        rD   rA   zOpenGLRectangle.__init__  sa     	RR??u????ud+++-----rE   )r   r   r   r8   r   r8   r<   r   )r   r   r   r   rA   r   r   s   @rD   r  r    sM         %*	
. 
. 
. 
. 
. 
. 
. 
. 
. 
. 
.rE   r  c                  "     e Zd Zdd fdZ xZS )	OpenGLSquarer  side_lengthr8   r<   r   c                N    || _          t                      j        d||d| d S )N)r   r   r?   )r  r@   rA   )rB   r  r<   rC   s      rD   rA   zOpenGLSquare.__init__  s5    &I;II&IIIIIrE   )r  )r  r8   r<   r   r   r   s   @rD   r  r    sM        J J J J J J J J J J JrE   r  c                  "     e Zd Zdd fdZ xZS )	OpenGLRoundedRectanglerT  corner_radiusr8   r<   r   c                |    || _          t                      j        di | |                     | j                    d S r>   )r  r@   rA   r  )rB   r  r<   rC   s      rD   rA   zOpenGLRoundedRectangle.__init__  sE    *""6"""4-.....rE   r  )r  r8   r<   r   r   r   s   @rD   r  r    sB        / / / / / / / / / / /rE   r  )E
__future__r   typingr   r   r   numpyr   manim.constantsmanim.mobject.mobjectr   .manim.mobject.opengl.opengl_vectorized_mobjectr	   r
   r   r   manim.typingr   r   r   r   r   r   r   manim.utils.colormanim.utils.iterablesr   r   manim.utils.simple_functionsr   manim.utils.space_opsr   r   r   r   r   r   r   r   rg  r   r  __all__r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r  r  r  r?   rE   rD   <module>r     sN   " " " " " " " " " " " " " " " "         ) ) ) ) ) )                                  C C C C C C C C - - - - - -                        6h h h h hN h h hVP P P P P% P P Pf. . . . .Y . . .    .   $ $ $ $ $/ $ $ $G G G G G9 G G G0
 
 
 
 
 
 
 
(. . . . .L . . .%. %. %. %. %.) %. %. %.PY Y Y Y Y& Y Y Y
$ $ $ $ $L $ $ $8p/ p/ p/ p/ p/& p/ p/ p/f+/ +/ +/ +/ +/z +/ +/ +/\4 4 4 4 4
 4 4 4$4 4 4 4 4. 4 4 4B( B( B( B( B(* B( B( B(L
A 
A 
A 
A 
A; 
A 
A 
A$ $ $ $ $ $ $ $
4 
4 
4 
4 
4 
4 
4 
4- - - - -N - - -`
. 
. 
. 
. 
.= 
. 
. 
.( ( ( ( () ( ( (
# # # # #^ # # #L. . . . .m . . .J J J J J? J J J/ / / / /_ / / / / /rE   