
    \e4#                       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lmZmZmZmZmZmZ erd dlmZ d2dZd3dZd4dZd5dZd6dZd7dZd8dZd9d Zd:d$Zd:d%Zd9d&Z d;d'Z!d<d)Z"d=d*Z#d>d+Z$d7d,Z%d?d.Z&d@d/Z'dAd0Z(dBd1Z)dS )C    )annotations)chain)TYPE_CHECKINGN)check_code_arraycheck_offset_arraycheck_point_array)	CLOSEPOLYLINETOMOVETO
code_dtypeoffset_dtypepoint_dtypeoffsetscpy.OffsetArrayreturncpy.CodeArrayc                    t          |            | d         }t          j        |t          t                    }t
          || dd         <   t          || dd         dz
  <   |S )zSDetermine codes from offsets, assuming they all correspond to closed polygons.
    dtypeN   )r   npfullr
   r   r   r	   )r   ncodess      /lib/python3.11/site-packages/contourpy/array.pycodes_from_offsetsr      s^     wAGAvZ000E E'#2#,&E'!""+/L    pointscpy.PointArrayc                X   t          |            t          |           t          j        t	          |          t
          t                    }t          || dd         <   | dd         dz
  }t          j        || dd                  ||         k    d          }t          |||         <   |S )zDetermine codes from offsets and points, using the equality of the start and end points of
    each line to determine if lines are closed or not.
    r   Nr   r   axis)
r   r   r   r   lenr
   r   r   allr	   )r   r   r   end_offsetscloseds        r   codes_from_offsets_and_pointsr(      s     wfGCKKz:::E E'#2#,!""+/KVF73B3<(F;,??aHHHF!*E+f
Lr   c                    t          |            t          |           }t          j        |t          t
                    }t          |d<   t          j        | d         | d         k              r
t          |d<   |S )zDetermine codes for a single line, using the equality of the start and end points to
    determine if the line is closed or not.
    r   r   r   )	r   r$   r   r   r
   r   r   r%   r	   )r   r   r   s      r   codes_from_pointsr*   /   si     fFAGAvZ000EE!H	vfQi6":%&& b	Lr   list_of_codeslist[cpy.CodeArray]c                Z    | st          d          t          j        | t                    S )zAConcatenate a list of codes arrays into a single code array.
    z!Empty list passed to concat_codesr   )
ValueErrorr   concatenater   r+   s    r   concat_codesr1   =   s0      ><===>-z::::r   list_of_codes_or_nonelist[cpy.CodeArray | None]cpy.CodeArray | Nonec                @    d | D             }|rt          |          S dS )zQConcatenate a list of codes arrays or None into a single code array or None.
    c                    g | ]}||S N .0r   s     r   
<listcomp>z(concat_codes_or_none.<locals>.<listcomp>I   s    SSSuARUARARARr   N)r1   )r2   r+   s     r   concat_codes_or_noner<   F   s4     TS(=SSSM M***tr   list_of_offsetslist[cpy.OffsetArray]c                     st          d          t                     }t          j        d  D             t                    t          j         d         g fdt          |dz
            D             R t                    }|S )zEConcatenate a list of offsets arrays into a single offset array.
    z#Empty list passed to concat_offsetsc                    g | ]
}|d          S )r   r8   r:   r   s     r   r;   z"concat_offsets.<locals>.<listcomp>W   s    GGGGGBKGGGr   r   r   c              3  P   K   | ] }|d z            d d         |         z   V  !dS )r   Nr8   )r:   i
cumulativer=   s     r   	<genexpr>z!concat_offsets.<locals>.<genexpr>Y   s>      \\Aqs3ABB7*Q-G\\\\\\r   r   )r.   r$   r   cumsumr   r/   range)r=   r   retrD   s   `  @r   concat_offsetsrI   P   s      @>???OAGGGGG|\\\J>		]\\\\\QVWXYZWZQ[Q[\\\]]  C Jr   list_of_offsets_or_nonelist[cpy.OffsetArray | None]cpy.OffsetArray | Nonec                @    d | D             }|rt          |          S dS )zUConcatenate a list of offsets arrays or None into a single offset array or None.
    c                    g | ]}||S r7   r8   rA   s     r   r;   z*concat_offsets_or_none.<locals>.<listcomp>d   s    ]]]7I\wI\I\I\r   N)rI   )rJ   r=   s     r   concat_offsets_or_nonerO   _   s4    
 ^].E]]]O o...tr   list_of_pointslist[cpy.PointArray]c                Z    | st          d          t          j        | t                    S )zBConcatenate a list of point arrays into a single point array.
    z"Empty list passed to concat_pointsr   )r.   r   r/   r   rP   s    r   concat_pointsrT   k   s0      ?=>>>>.<<<<r   list_of_points_or_nonelist[cpy.PointArray | None]cpy.PointArray | Nonec                @    d | D             }|rt          |          S dS )zRConcatenate a list of point arrays or None into a single point array or None.
    c                    g | ]}||S r7   r8   r:   r   s     r   r;   z)concat_points_or_none.<locals>.<listcomp>y       XXXVEWfEWEWEWr   N)rT   rU   rP   s     r   concat_points_or_noner]   t   s4    
 YX+AXXXN ^,,,tr   c                @    d | D             }|rt          |          S dS )zvConcatenate a list of points or None into a single point array or None, with NaNs used to
    separate each line.
    c                    g | ]}||S r7   r8   rZ   s     r   r;   z2concat_points_or_none_with_nan.<locals>.<listcomp>   r[   r   N)concat_points_with_nanr\   s     r   concat_points_or_none_with_nanra      s4     YX+AXXXN %n555tr   c           	     ,   | st          d          t          |           dk    r| d         S t          j        dt          j        t
                    | d         gt          t          fd| dd         D                        } t          |           S )zaConcatenate a list of points into a single point array with NaNs used to separate each line.
    z+Empty list passed to concat_points_with_nanr   r   )r      r   c              3      K   | ]}|fV  	d S r7   r8   )r:   x
nan_spacers     r   rE   z)concat_points_with_nan.<locals>.<genexpr>   s'      'T'TAQ'T'T'T'T'T'Tr   N)	r.   r$   r   r   nanr   listr   rT   )rP   rf   s    @r   r`   r`      s      HFGGG
>aa  WVRV;???
(+ X'T'T'T'TPQPRPRAS'T'T'T UVVX^,,,r   c                D   t          |            t          |           t          |          dk    r| S t          j        t          j        t          j        gt                    }t          j        | |dd                             t          j	                  |d          S )zNInsert NaNs into a point array at locations specified by an offset array.
    rc   r   r   r   r   r"   )
r   r   r$   r   arrayrg   r   insertastypeint64)r   r   rf   s      r   insert_nan_at_offsetsrn      s     fw
7||qXrvrv.kBBB
y2!5!5bh!?!?RSTTTTr   r   c                    t          |            t          j        t          j        | t          k              d         t          |                                         t                    S )zBDetermine offsets from codes using locations of MOVETO codes.
    r   )r   r   appendnonzeror   r$   rl   r   )r   s    r   offsets_from_codesrr      sK     U9RZ003SZZ@@GGUUUr   c                v    | st          d          t          j        dgd | D             z   t                    S )z4Determine offsets from lengths of point arrays.
    z)Empty list passed to offsets_from_lengthsr   c                ,    g | ]}t          |          S r8   r$   )r:   lines     r   r;   z(offsets_from_lengths.<locals>.<listcomp>   s    AAA$CIIAAAr   r   r.   r   rF   r   rS   s    r   offsets_from_lengthsrx      sG      FDEEE9aSAA.AAAAVVVVr   c                v    | st          d          t          j        dgd | D             z   t                    S )zHDetermine outer offsets from codes using locations of MOVETO codes.
    z5Empty list passed to outer_offsets_from_list_of_codesr   c                H    g | ]}t          j        |t          k               S r8   )r   count_nonzeror   r9   s     r   r;   z4outer_offsets_from_list_of_codes.<locals>.<listcomp>   s'    YYY%B,Uf_==YYYr   r   rw   r0   s    r    outer_offsets_from_list_of_codesr|      sP      RPQQQ9aSYY=YYYY') ) ) )r   c                v    | st          d          t          j        dgd | D             z   t                    S )z4Determine outer offsets from a list of offsets.
    z7Empty list passed to outer_offsets_from_list_of_offsetsr   c                2    g | ]}t          |          d z
  S r   ru   rA   s     r   r;   z6outer_offsets_from_list_of_offsets.<locals>.<listcomp>   s"    JJJwCLLNJJJr   r   rw   )r=   s    r   "outer_offsets_from_list_of_offsetsr      sH      TRSSS9aSJJ/JJJJR^____r   &tuple[cpy.PointArray, cpy.OffsetArray]c                   t          |            t          j        t          j        | dddf                             d         }t	          |          dk    r,| t          j        dt	          |           gt                    fS t          j        | |d          } |t          j        t	          |                    z  }t          j	        t	          |          dz   t                    }d|d<   ||dd<   t	          |           |d<   | |fS )z^Remove NaN from a points array, also return the offsets corresponding to the NaN removed.
    Nr   r   r"   rc   r   r   )
r   r   rq   isnanr$   rj   r   deletearangeempty)r   nan_offsetsr   s      r   
remove_nanr      s     f*RXfQQQTl3344Q7K
;1rxCKK 0EEEEE6;Q777ry[!1!1222#%8C,<,<Q,>l#S#S#S
#"&kkwr   c                    t          |            t          |           t          |          dk    rt          j        | |dd                   S | gS )z]Split a code array at locations specified by an offset array into a list of code arrays.
    rc   r   r   )r   r   r$   r   split)r   r   s     r   split_codes_by_offsetsr      sR     Uw
7||axwqt}---wr   c                    t          |            t          |           t          |          dk    rt          j        | |dd                   S | gS )z_Split a point array at locations specified by an offset array into a list of point arrays.
    rc   r   r   )r   r   r$   r   r   )r   r   s     r   split_points_by_offsetsr      sR     fw
7||ax"...xr   c                ^    t                      t          j        t          j         dddf                             d         }t	          |          dk    r gS t          j        dg|t	                     gf          } fdt          |dd         |dd                   D             S )z>Split a points array at NaNs into a list of point arrays.
    Nr   r   c                0    g | ]\  }}|d z   |         S r   r8   )r:   ser   s      r   r;   z'split_points_at_nan.<locals>.<listcomp>  s)    QQQ$!Qqs1uQQQr   r   )r   r   rq   r   r$   r/   zip)r   r   s   ` r   split_points_at_nanr      s     f*RXfQQQTl3344Q7K
;1xnrdK#f++%GHHQQQQ#k#2#.>ABB*P*PQQQQr   )r   r   r   r   )r   r   r   r    r   r   )r   r    r   r   )r+   r,   r   r   )r2   r3   r   r4   )r=   r>   r   r   )rJ   rK   r   rL   )rP   rQ   r   r    )rU   rV   r   rW   )r   r    r   r   r   r    )r   r   r   r   )rP   rQ   r   r   )r+   r,   r   r   )r   r    r   r   )r   r   r   r   r   r,   )r   r    r   r   r   rQ   )r   r    r   rQ   )*
__future__r   	itertoolsr   typingr   numpyr   contourpy.typecheckr   r   r   contourpy.typesr	   r
   r   r   r   r   contourpy._contourpy
_contourpycpyr   r(   r*   r1   r<   rI   rO   rT   r]   ra   r`   rn   rr   rx   r|   r   r   r   r   r   r8   r   r   <module>r      s_   " " " " " "                       W W W W W W W W W W \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ '&&&&&&	 	 	 	   (   ; ; ; ;      	 	 	 	= = = =	 	 	 	
 
 
 
- - - -U U U UV V V VW W W W) ) ) )` ` ` `   $	 	 	 	   
R 
R 
R 
R 
R 
Rr   