
    h]                       S SK Jr  S SKJrJrJrJr  S SKr " S S\5      r " S S5      r	\" S\S	9r
S'S
 jrS(S jrS)S jrS*S jrS+S jrS,S jrS-S jrS.S jrS/S jrS0S jrS1S jr        S2S jrS3S jrS4S5S jjr              S6S jrS7S jrS8S jrS9S jr                  S:S jrS;S jrS<S jrS=S jr S>S  jr!S?S! jr"S@S" jr#            SAS# jr$S3S$ jr%S,S% jr&S,S& jr'g)B    )annotations)SequenceOptionalProtocolTypeVarNc                  *    \ rS rSr% S\S'   S\S'   Srg)Point8   floatxy N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       K/var/www/html/env/lib/python3.13/site-packages/ezdxf/math/_mapbox_earcut.pyr	   r	   8   s    HHr   r	   c                  $    \ rS rSrSS jrS rSrg)Node=   c                    Xl         X l        UR                  U l        UR                  U l        S U l        S U l        SU l        S U l        S U l        SU l	        g )Nr   F)
ipointr   r   prevnextzprev_znext_zsteiner)selfr   r   s      r   __init__Node.__init__>   sX     
  		  !  #r   c                t    U R                   UR                   :H  =(       a    U R                  UR                  :H  $ Nr   r   )r#   others     r   __eq__Node.__eq__V   s'    vv 6TVVuww%66r   )
r   r   r!   r   r   r    r"   r   r   r   N)r   intr   r	   returnNone)r   r   r   r   r$   r*   r   r   r   r   r   r   =   s    #07r   r   T)boundc                    [        U SSS9n/ nUb  UR                  UR                  L a  U$ [        U5      S:  a  [	        U[        U 5      U5      nSnSnSn[        U 5      S:  a  U S   R
                  =pGU S   R                  =pXU  HG  n	U	R
                  n
U	R                  n[        XJ5      n[        X[5      n[        Xz5      n[        X5      nMI     [        Xt-
  X-
  5      nUS:w  a  SU-  OSn[        X#XEUS5        U$ )a  Implements a modified ear slicing algorithm, optimized by z-order
curve hashing and extended to handle holes, twisted polygons, degeneracies
and self-intersections in a way that doesn't guarantee correctness of
triangulation, but attempts to always produce acceptable results for
practical data.

Source: https://github.com/mapbox/earcut

Args:
    exterior: outer path as list of points as objects which provide a
        `x`- and a `y`-attribute
    holes: list of holes, each hole is list of points, a hole with
        a single points is a Steiner point

Returns:
    Returns a list of triangles, each triangle is a tuple of three points,
    the output points are the same objects as the input points.

r   Tccw        P   i  )
linked_listr   r   leneliminate_holesr   r   minmaxearcut_linked)exteriorholes
outer_node	trianglesmin_xmin_yinv_sizemax_xmax_yr   r   r   s               r   earcutrE   ]   s   * #8QD9J#%IZ__
?
5zA~$UCM:F
EEH 8}r % %EAAMEMEMEME  u}em4'/1}58#!*xCr   c                   SnU[        U 5      S:  L a  U  H  n[        XU5      nUS-  nM     O1U[        U 5      -   n[        U 5       H  n[        XTU5      nUS-  nM     U(       a&  X3R                  :X  a  [        U5        UR                  nU$ )zXCreate a circular doubly linked list from polygon points in the specified
winding order
Nr      )signed_areainsert_noder7   reversedr   remove_node)pointsstartr3   lastr   ends         r   r6   r6      s     D
{6"Q&'EuT2DQJE  c&k!f%Es40D1HC &
 		!DyyKr   c                    Sn[        U 5      (       d  U$ U S   nU  H:  nXR                  UR                  -
  UR                  UR                  -   -  -  nUnM<     U$ )Nr4   )r7   r   r   )rL   sr   r   s       r   rH   rH      s[    Av;;":D	gg577TVV#344 
 Hr   c                    UR                   U R                   -
  UR                  UR                  -
  -  UR                  U R                  -
  UR                   UR                   -
  -  -
  $ )z!Returns signed area of a triangle)r   r   pqrs      r   arearX      sG    CC!##I!##)$acc	accACCi'@@@r   c                ~   U R                   R                  UR                  :g  =(       Ga    U R                  R                  UR                  :g  =(       a    [        X5      (       + =(       a    [	        X5      =(       aa    [	        X5      =(       aO    [        X5      =(       a=    [        U R                  XR                  5      =(       d    [        XR                  U5      =(       dX    X:H  =(       aM    [        U R                  X R                   5      S:  =(       a#    [        UR                  XR                   5      S:  $ )zRCheck if a diagonal between two polygon nodes is valid (lies in polygon
interior)
r   )r   r   r   intersects_polygonlocally_insidemiddle_insiderX   abs     r   is_valid_diagonalr`      s    
 	
ACC 	
 	
FFHHO	
"1((	
 1  q$a# QVVQ'=4661+=	, v ,QVVQ'!+,QVVQ'!+r   c                `   U n UR                   U R                   :w  a~  UR                  R                   U R                   :w  aZ  UR                   UR                   :w  a@  UR                  R                   UR                   :w  a  [        X"R                  X5      (       a  gUR                  nX L a   gM  )z;Check if a polygon diagonal intersects any polygon segmentsTF)r   r   
intersects)r^   r_   rU   s      r   rZ   rZ      s{    	A
CC133JACCqss
ACC1ffa++FF6 r   c                     U S:  a  gU S:  a  gg)Nr4   rQ   rG   r   r   )nums    r   signre      s    
Sy
Syr   c                |   [        U R                  UR                  5      UR                  s=:  =(       a#    [        U R                  UR                  5      :  Os  =(       a[    [        U R                  UR                  5      UR                  s=:  =(       a#    [        U R                  UR                  5      :  $ s  $ r'   )r:   r   r9   r   rT   s      r   
on_segmentrg      s    qssACC=ACC003qssACC=0 Sacc]acc 6 6S	QSSN 6  6 r   c                   [        [        XU5      5      n[        [        XU5      5      n[        [        X#U 5      5      n[        [        X#U5      5      nXE:w  a  Xg:w  a  gUS:X  a  [        XU5      (       a  gUS:X  a  [        XU5      (       a  gUS:X  a  [        X U5      (       a  gUS:X  a  [        X!U5      (       a  gg)zcheck if two segments intersectTr   F)re   rX   rg   )p1q1p2q2o1o2o3o4s           r   rb   rb      s    	d22	B	d22	B	d22	B	d22	B	xBH	Qw:bb))	Qw:bb))	Qw:bb))	Qw:bb))r   c                    [        X5      nUc  X3l        X3l        U$ UR                  Ul        X#l        X2R                  l        X2l        U$ )zZcreate a node and optionally link it with previous one (in a circular
doubly linked list)
)r   r   r   )r   r   rN   rU   s       r   rI   rI     sH     	QA| H	 			Hr   c                "   U R                   U R                  l         U R                  U R                   l        U R                  (       a  U R                  U R                  l        U R                  (       a  U R                  U R                  l        g g r'   )r   r   r    r!   )rU   s    r   rK   rK     sQ    &&AFFK&&AFFKxx((xx(( r   c                   / nU  H[  n[        U5      S:  a  M  [        XASS9nXUR                  L a  SUl        U[        U5      -  nUR	                  [        U5      5        M]     UR                  S S9  U H  n[        Xb5      nM     U$ )zSlink every hole into the outer loop, producing a single-ring polygon
without holes
rG   Fr2   Tc                2    U R                   U R                  4$ r'   r(   )nodes    r   <lambda>!eliminate_holes.<locals>.<lambda>3  s     0r   )key)r7   r6   r   r"   appendget_leftmostsorteliminate_hole)r=   rM   r>   queuehole_listhole_s          r   r8   r8   #  s     Et9q=DU3JJ EMT\%()  
JJ0J1 #E6
 r   c                    [        X5      nUc  U$ [        X 5      n[        X3R                  5        [        X"R                  5      $ )zQFind a bridge between vertices that connects hole with an outer ring and
link it
)find_hole_bridgesplit_polygonfilter_pointsr   )r~   r>   bridgebridge_reverses       r   r|   r|   ;  sB     d/F~"60N ."5"56--r   c                8   U c  U $ Uc  U nU n SnUR                   (       d_  X"R                  :X  d$  [        UR                  X"R                  5      S:X  a,  [	        U5        UR                  =p!X"R                  L a   U$ SnOUR                  nU(       d  X!Ld   U$ M  )z&eliminate colinear or duplicate pointsTFr   )r"   r   rX   r   rK   )rM   rO   rU   agains       r   r   r   J  s    }
{A
yyK4662a7NffAFF{ J EAJ r   c                   U c  g U(       d  U(       a  [        XX45        U nU R                  U R                  LGa  U R                  nU R                  nU(       a  [        XX45      O
[	        U 5      n	U	(       aW  UR                  UR                  U R                  UR                  45        [        U 5        UR                  n UR                  nM  Un XL a_  U(       d  [        [        U 5      UUUUS5        g US:X  a$  [        [        U 5      U5      n [        XX#US5        g US:X  a  [        XX#U5        g U R                  U R                  La  GM  g g )NrG      )index_curver   r   is_ear_hashedis_earry   r   rK   r;   r   cure_local_intersectionssplit_ear_cut)
earr?   r@   rA   rB   pass_stopr   r   _is_ears
             r   r;   r;   e  s0    { XC0D ((#((
"xxxx ;CM#e6s 	 djj#))TZZ@A ))C99D ;!#&"  !.}S/A9MceHaH
  !ceHEQ ((#((
"r   c           
        U R                   nU nU R                  n[        XU5      S:  a  gUR                  nUR                  nUR                  nUR                  nUR                  nUR                  n	[        XEU5      n
[        XEU5      n[        XxU	5      n[        XxU	5      nUR                  nXLa  XR                  s=::  a  U::  ai  O  OfXR                  s=::  a  U::  aP  O  OM[        XGXXXiUR                  UR                  5      (       a%  [        UR                   XR                  5      S:  a  gUR                  nXLa  M  g)zBcheck whether a polygon node forms a valid ear with adjacent nodesr   FT)r   r   rX   r   r   r9   r:   point_in_triangle)r   r^   r_   caxbxcxaybycyx0x1y0y1rU   s                  r   r   r     s   hhAAhhAA!} 
B	
B	
B	
B	
B	
B 
RRB	RRB	RRB	RRBffA
*##OOccR!"""!##qssCCQVVQ'1,FF * r   c           
        U R                   nU nU R                  n[        XEU5      S:  a  gUR                  nUR                  nUR                  n	UR                  n
UR                  nUR                  n[        XxU	5      n[        XxU	5      n[        XU5      n[        XU5      n[        XXU5      n[        UUXU5      nU R                  nU R                  nU(       Ga  UR                  U:  Gaz  U(       Gar  UR                  U::  Gaa  UUR                  s=::  a  U::  au  O  OrUUR                  s=::  a  U::  a[  O  OXUULaS  UULaN  [        XzXXUR                  UR                  5      (       a&  [        UR                   UUR                  5      S:  a  gUR                  nUUR                  s=::  a  U::  au  O  OrUUR                  s=::  a  U::  a[  O  OXUULaS  UULaN  [        XzXXUR                  UR                  5      (       a&  [        UR                   UUR                  5      S:  a  gUR                  nU(       a*  UR                  U:  a  U(       a  UR                  U::  a  GMa  U(       a  UR                  U:  a  UUR                  s=::  a  U::  au  O  OrUUR                  s=::  a  U::  a[  O  OXUULaS  UULaN  [        XzXXUR                  UR                  5      (       a&  [        UR                   UUR                  5      S:  a  gUR                  nU(       a  UR                  U:  a  M  U(       a  UR                  U::  a  UUR                  s=::  a  U::  au  O  OrUUR                  s=::  a  U::  a[  O  OXUULaS  UULaN  [        XzXXUR                  UR                  5      (       a&  [        UR                   UUR                  5      S:  a  gUR                  nU(       a  UR                  U::  a  M  g)Nr   FT)r   r   rX   r   r   r9   r:   z_orderr    r!   r   r   )r   r@   rA   rB   r^   r_   r   r   r   r   r   r   r   r   r   r   r   min_zmax_zrU   ns                        r   r   r     s   hhAAhhAA!}	
B	
B	
B	
B	
B	
B 
RRB	RRB	RRB	RRB BE(3EBE(3EjjAjjA uqsse|!##OOaccR

!"""!##qssCCQVVQ'1,HH !##OOaccR

!"""!##qssCCQVVQ'1,HH+ uqsse|0 u!##OOaccR

!"""!##qssCCQVVQ'1,HH u u!##OOaccR

!"""!##qssCCQVVQ'1,HH u r   c                    U nU n UR                   UR                   :  d4  UR                   UR                   :X  a  UR                  UR                  :  a  UnUR                  nXL a   U$ Me  )z(Find the leftmost node of a polygon ringr   r   r   )rM   rU   leftmosts      r   rz   rz     s]    AH
33xzz 1accHJJ6FHFF:O r   c                    XF-
  X-
  -  X-
  XW-
  -  :  =(       a-    X-
  X7-
  -  X&-
  X-
  -  :  =(       a    X&-
  XW-
  -  XF-
  X7-
  -  :  $ )z.Check if a point lies within a convex triangler   )r   r   r   r   r   r   pxpys           r   r   r   $  sa     
RW"'bg!66 	;W!bg"'%::	;W!bg"'%::r   c                    [        U R                  XR                  5      S:  =(       a#    [        UR                  X R                  5      S:  $ )zPWhether sector in vertex m contains sector in vertex p in the same
coordinates.
r   rX   r   r   )mrU   s     r   sector_contains_sectorr   6  s7     66"Q&F466+BQ+FFr   c                (   U n UR                   S:X  a'  [        UR                  UR                  XU5      Ul         UR                  Ul        UR                  Ul        UR                  nX@L a  OMl  SUR
                  l        SUl        [        U5        g)z"Interlink polygon nodes in z-orderr   N)	r   r   r   r   r   r    r   r!   sort_linked)rM   r@   rA   rB   rU   s        r   r   r   =  sv    A
33!8!##qssE(;AC6666FF:  AHHOAHNr   c                    [        X-
  U-  5      n[        X-
  U-  5      nXUS-  -  S-  nXUS-  -  S-  nXUS-  -  S-  nXUS-  -  S-  nXfS-  -  S-  nXfS-  -  S-  nXfS-  -  S-  nXfS-  -  S-  nXVS-  -  $ )	zMZ-order of a point given coords and inverse of the longer side of data
bbox.
   i     ir   i3333rG   iUUUU)r,   )r   r   r@   rA   rB   r   r   s          r   r   r   O  s    
 	RZ8#$ARZ8#$A	
1f#A	
1f#A	
1f#A	
1f#A	
1f#A	
1f#A	
1f#A	
1f#AQ<r   c                   Sn U nS n S nSnU(       a  US-  nUnSn[        U5       H  nUS-  nUR                  nU(       a  M    O   UnUS:  d  US:  a  U(       a  US:w  a;  US:X  d!  U(       a  UR                  UR                  ::  a  Un	UR                  nUS-  nOUn	UR                  nUS-  nU(       a  Xl        OU	n X9l        U	nUS:  a  Mt  US:  a	  U(       a  M  UnU(       a  M  S Ul        US-  nUS::  a   U $ M  )NrG   r   r   )ranger!   r   r    )
headin_sizerU   tail
num_mergesrV   p_sizer   q_sizees
             r   r   r   f  s   G

!OJAF7^!HHq	 $
 F1*!Q;FaKqACC133JAAaKFAAaKF"#KD 1*!  A5 a6 1?KI r   c                   [        U R                  U R                  5      n[        UR                  UR                  5      nU R                  nUR                  nXl        Xl        XBl        X$l        X#l        X2l        X5l        XSl        U$ )zLink two polygon vertices with a bridge.

If the vertices belong to the same ring, it splits polygon into two.
If one belongs to the outer ring and another to a hole, it merges it into a
single ring.
)r   r   r   r   r   )r^   r_   a2b2anbps         r   r   r     sk     
acc177	B	acc177	B	
B	
BFFGGGGGGIr   c                   U n UR                   nUR                  R                  nX4:X  d  [        X2UR                  U5      (       au  [        X45      (       ae  [        XC5      (       aU  UR	                  UR
                  UR
                  UR
                  45        [        U5        [        UR                  5        U=p UR                  nX L a  OM  [        U5      $ r'   )r   r   rb   r[   ry   r   rK   r   )rM   r?   rU   r^   r_   s        r   r   r     s    A
FFFFKK 1++q$$q$$aggqww89NMAFF:% & r   c                   U n UR                   R                   nXeR                  La  UR                  UR                  :w  ab  [        XV5      (       aR  [	        XV5      n[        XUR                   5      n[        XwR                   5      n[        XQX#US5        [        XqX#US5        gUR                   nXeR                  La  M  UR                   nXPL a  gM  )zATry splitting polygon into two and triangulate them independentlyr   N)r   r   r   r`   r   r   r;   )rM   r?   r@   rA   rB   r^   r_   r   s           r   r   r     s     	A
FFKKvvossaccz/55!!' "!VV,!!VV, aE(AFaE(AFA vvo FF:% r   c           
        UnU R                   nU R                  n[        R                  * nS n UR                  Us=:  a+  UR                  R                  s=:  a  UR                  :w  a  O  OUR                   XBR                  -
  UR                  R                   UR                   -
  -  UR                  R                  UR                  -
  -  -   nX7s=:  a  U:  a>  O  O;UnUR                   UR                  R                   :  a  UOUR                  nXs:X  a  U$ UR                  nX!L a  OM  Uc  g UnUR                   n	UR                  n
[        R                  nUn X2R                   s=:  a  U	:  a  O  OX2R                   :w  a  [        XJ:  a  UOUUU	U
XJ:  a  UOUUUR                   UR                  5      (       a  [        XBR                  -
  5      X2R                   -
  -  n[        X 5      (       aR  X:  dI  X:X  aH  UR                   UR                   :  d*  UR                   UR                   :X  a  [        Xb5      (       a  UnUnUR                  nX(L a   U$ M  r'   )	r   r   mathinfr   r   absr[   r   )r~   r>   rU   hxhyqxr   r   r   mxmytan_mintans                r   r   r     s   A	B	B
((BA 33"''ACC'rCCxAFFHHqssN3qvvxx!##~FFA||qvvxxAQVV7HFF?  	y
 D	
B	
BhhG	A
##OOcc	!g2g2	 	 b33h-28,Ca&&Nqssqssaccz6LQ6R6R FF9H= r   c                .   [        U R                  X R                  5      S:  a9  [        XU R                  5      S:  =(       a    [        X R                  U5      S:  $ [        XU R                  5      S:  =(       d    [        X R                  U5      S:  $ )z9Check if a polygon diagonal is locally inside the polygonr   r   r]   s     r   r[   r[   &  sy     66"Q& 	Q166a;DFFA$6!$; !!#=tAvvq'9A'=r   c                   U nSnU R                   UR                   -   S-  nU R                  UR                  -   S-  n UR                  U:  UR                  R                  U:  :w  a  UR                  R                  UR                  :w  am  XBR                  R                   UR                   -
  XRR                  -
  -  UR                  R                  UR                  -
  -  UR                   -   :  a  U(       + nUR                  nX L a   U$ M  )zECheck if the middle point of a polygon diagonal is inside the polygonFr   r   )r^   r_   rU   insider   r   s         r   r\   r\   /  s    	AF
##)qB
##)qB
ccBhAFFHHrM*ACCvvxx!##~"ss(3qvvxx!##~FLLZFFF6M r   )r<   zlist[T]r=   zlist[list[T]]r-   zlist[Sequence[T]])rL   Sequence[Point]rM   r,   r3   boolr-   r   )rL   r   r-   r   )rU   r   rV   r   rW   r   r-   r   )r^   r   r_   r   )r^   r   r_   r   r-   r   )rd   r   r-   r,   )rU   r   rV   r   rW   r   r-   r   )
ri   r   rj   r   rk   r   rl   r   r-   r   )r   r,   r   r	   rN   r   r-   r   )rU   r   r-   r.   )r=   zSequence[Sequence[Point]]rM   r,   r>   r   r-   r   )r~   r   r>   r   r-   r   r'   )rM   r   rO   zOptional[Node]r-   r   )r   r   r?   list[Sequence[Point]]r@   r   rA   r   rB   r   r   r,   r-   r.   )r   r   r-   r   )r   r   r@   r   rA   r   rB   r   )rM   r   r-   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r   )r   r   rU   r   )rM   r   r@   r   rA   r   rB   r   )r   r   r   r   r@   r   rA   r   rB   r   r-   r,   )r   r   r-   r   )r^   r   r_   r   r-   r   )rM   r   r?   r   r-   r   )rM   r   r?   r   r@   r   rA   r   rB   r   r-   r.   )(
__future__r   typingr   r   r   r   r   r	   r   r/   rE   r6   rH   rX   r`   rZ   re   rg   rb   rI   rK   r8   r|   r   r;   r   r   rz   r   r   r   r   r   r   r   r   r   r[   r\   r   r   r   <module>r      s  d # 8 8 H 
7 7: Cu5p,
A
,$*"#$-0>B	0.6:	:$: : 	:
 : : 
:z"JM`
 	 		
 	 	 	 	 
$G$.'T80$  	
  
@?Dr   