
    fMh#                       d dl mZ d dlmZ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pairwise)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      O/var/www/html/test/jupyter/venv/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_codesr2   =   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)r2   )r3   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   r9   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   Nr9   )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   r0   range)r>   r   retrE   s   `  @r   concat_offsetsrJ   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 r8   r9   rB   s     r   r<   z*concat_offsets_or_none.<locals>.<listcomp>d   s    ]]]7I\wI\I\I\r   N)rJ   )rK   r>   s     r   concat_offsets_or_nonerP   _   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   r0   r   rQ   s    r   concat_pointsrU   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 r8   r9   r;   r    s     r   r<   z)concat_points_or_none.<locals>.<listcomp>y       XXXVEWfEWEWEWr   N)rU   rV   rQ   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 r8   r9   r[   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_nanrb      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 r8   r9   )r;   x
nan_spacers     r   rF   z)concat_points_with_nan.<locals>.<genexpr>   s'      'T'TAQ'T'T'T'T'T'Tr   N)	r/   r%   r   r   nanr   listr   rU   )rQ   rg   s    @r   ra   ra      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.
    rd   r   r   r   r   r#   )
r	   r   r%   r   arrayrh   r   insertastypeint64)r    r   rg   s      r   insert_nan_at_offsetsro      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%   rm   r   )r   s    r   offsets_from_codesrs      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 r9   r%   )r;   lines     r   r<   z(offsets_from_lengths.<locals>.<listcomp>   s    AAA$CIIAAAr   r   r/   r   rG   r   rT   s    r   offsets_from_lengthsry      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 r9   )r   count_nonzeror   r:   s     r   r<   z4outer_offsets_from_list_of_codes.<locals>.<listcomp>   s'    YYY%B,Uf_==YYYr   r   rx   r1   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   rv   rB   s     r   r<   z6outer_offsets_from_list_of_offsets.<locals>.<listcomp>   s"    JJJwCLLNJJJr   r   rx   )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#   rd   r   r   )
r	   r   rr   isnanr%   rk   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.
    rd   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.
    rd   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             S )z>Split a points array at NaNs into a list of point arrays.
    Nr   r   c                0    g | ]\  }}|d z   |         S r   r9   )r;   ser    s      r   r<   z'split_points_at_nan.<locals>.<listcomp>  s)    @@@$!Qqs1u@@@r   )r	   r   rr   r   r%   r0   r   )r    r   s   ` r   split_points_at_nanr      s     f*RXfQQQTl3344Q7K
;1xnrdK#f++%GHH@@@@(;*?*?@@@@r   )r   r   r   r   )r   r   r    r!   r   r   )r    r!   r   r   )r,   r-   r   r   )r3   r4   r   r5   )r>   r?   r   r   )rK   rL   r   rM   )rQ   rR   r   r!   )rV   rW   r   rX   )r    r!   r   r   r   r!   )r   r   r   r   )rQ   rR   r   r   )r,   r-   r   r   )r    r!   r   r   )r   r   r   r   r   r-   )r    r!   r   r   r   rR   )r    r!   r   rR   )+
__future__r   	itertoolsr   r   typingr   numpyr   contourpy.typecheckr   r   r	   contourpy.typesr
   r   r   r   r   r   contourpy._contourpy
_contourpycpyr   r)   r+   r2   r=   rJ   rP   rU   r^   rb   ra   ro   rs   ry   r}   r   r   r   r   r   r9   r   r   <module>r      se   " " " " " " % % % % % % % %                 W W W W W W W W W W \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ '&&&&&&	 	 	 	   (   ; ; ; ;      	 	 	 	= = = =	 	 	 	
 
 
 
- - - -U U U UV V V VW W W W) ) ) )` ` ` `   $	 	 	 	   
A 
A 
A 
A 
A 
Ar   