§
    …Ûg#  ã                  ó  — 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      úE/granary/edev/quantum/lib/python3.11/site-packages/contourpy/array.pyÚcodes_from_offsetsr      s^   € õ �wÑÔÐà�Œ€AÝŒG�A•v¥ZÐ0Ñ0Ô0€EÝ €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 )z–Determine 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ÑÔÐåŒG•C˜‘K”K¥­zÐ:Ñ:Ô:€EÝ €Eˆ'�#�2�#Œ,Ñà˜!˜"˜"”+ ‘/€KÝŒV�F˜7 3 B 3œ<Ô(¨F°;Ô,?Ò?ÀaÐHÑHÔH€FÝ!*€Eˆ+�fÔ
Ñà€Lr   c                óô   — t          | ¦  «         t          | ¦  «        }t          j        |t          t
          ¬¦  «        }t          |d<   t          j        | d         | d         k    ¦  «        r
t          |d<   |S )z…Determine 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ÝŒG�A•v¥ZÐ0Ñ0Ô0€EÝ€Eˆ!�HÝ	„vˆf�QŒi˜6 "œ:Ò%Ñ&Ô&ð Ýˆˆ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ÐS˜uÀÐAR�UÐARÐARÐARr   N)r2   )r3   r,   s     r   Úconcat_codes_or_noner=   F   s4   € ð TÐSÐ(=ÐSÑSÔS€MØð Ý˜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ÐG¨G˜G BœKÐ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Ô3°A°B°BÔ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Ýœ>Ø	˜Ô	Ð]Ð\Ð\Ð\Ð\Ð\ÕQVÐWXÐYZÑWZÑQ[Ô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\�wÐI\Ð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 ÀVÐEW�fÐEWÐEWÐEWr   N)rU   ©rV   rQ   s     r   Úconcat_points_or_noner^   t   s4   € ð
 YÐXÐ+AÐXÑXÔX€NØð Ý˜^Ñ,Ô,Ð,àˆ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ÔX€NØð Ý% 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Ð'T¸A¨°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Ô Ð å”W˜V¥R¤Vµ;Ð?Ñ?Ô?ˆ
Ø(¨Ô+ð XÝ¥Ð'TÐ'TÐ'TÐ'TÀÐPQÐPRÐPRÔASÐ'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ÒÐØˆå”X�rœv¥r¤vÐ.µkÐBÑBÔBˆ
åŒy˜ ¨¨2¨¤×!5Ò!5µb´hÑ!?Ô!?ÀÐ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ÑÔÐåŒ9•R”Z ­¢Ñ0Ô0°Ô3µS¸±Z´ZÑ@Ô@×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 ™IœIÐAÐAÐAr   r   ©r/   r   rG   r   rT   s    r   Úoffsets_from_lengthsry   ²   sG   € ð ð FÝÐDÑEÔEÐEåŒ9�a�SÐ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Ô,¨Uµfª_Ñ=Ô=ÐYÐYÐYr   r   rx   r1   s    r   Ú outer_offsets_from_list_of_codesr}   »   sP   € ð ð RÝÐPÑQÔQÐQåŒ9�a�SÐ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ÐJ¨w�C ™LœL¨™NÐJÐJÐJr   r   rx   )r>   s    r   Ú"outer_offsets_from_list_of_offsetsr�   Å   sH   € ð ð TÝÐRÑSÔSÐSåŒ9�a�SÐJÐJ¸/ÐJÑJÔJÑJÕR^Ð_Ñ_Ô_Ð_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ÑÔÐå”*�RœX f¨Q¨Q¨Q°¨T¤lÑ3Ô3Ñ4Ô4°QÔ7€KÝ
ˆ;ÑÔ˜1ÒÐØ•r”x ¥C¨¡K¤KÐ 0½ÐEÑEÔEÐEÐEå”˜6 ;°QÐ7Ñ7Ô7ˆØ•r”y¥ [Ñ!1Ô!1Ñ2Ô2Ñ2ˆÝ#%¤8­C°Ñ,<Ô,<¸QÑ,>ÅlÐ#SÑ#SÔ#SˆØˆ�‰
Ø#ˆ��"�‰Ý˜&‘k”kˆ�‰Ø�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˜˜w q¨ 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˜‘s˜1�u”Ð@Ð@Ð@r   )r	   r   rr   r„   r%   r0   r   )r    rˆ   s   ` r   Úsplit_points_at_nanr“   û   s™   ø€ õ �fÑÔÐå”*�RœX f¨Q¨Q¨Q°¨T¤lÑ3Ô3Ñ4Ô4°QÔ7€KÝ
ˆ;ÑÔ˜1ÒÐØˆxˆå”n r d¨K½#¸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   