
    'j]                    l   d dl mZ d dlmZmZmZmZ d dlZ G d de          Z G d d          Z	 ede	          Z
dZdZd[dZd\dZd]dZd^d Zd_d!Zd`d#Zdad$Zdbd)Zdcd-Zddd/Zded2Zdfd4Zdgdhd7Zdid?Zdjd@ZdkdAZdldBZdmdKZdndMZdodNZdpdQZ dqdSZ!drdTZ"dsdUZ#dtdVZ$dfdWZ%d_dXZ&d_dYZ'dS )u    )annotations)SequenceOptionalProtocolTypeVarNc                  $    e Zd ZU ded<   ded<   dS )PointfloatxyN)__name__
__module____qualname____annotations__     S/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/math/_mapbox_earcut.pyr	   r	   8   s"         HHHHHHHHr   r	   c                      e Zd Zd
dZd Zd	S )Nodeiintpointr	   returnNonec                    || _         || _        |j        | _        |j        | _        d | _        d | _        d| _        d | _        d | _        d| _	        d S )Nr   F)
r   r   r   r   prevnextzprev_znext_zsteiner)selfr   r   s      r   __init__zNode.__init__>   s\     
  		  !  #r   c                B    | j         |j         k    o| j        |j        k    S Nr   r   )r"   others     r   __eq__zNode.__eq__V   s    v 6TVuw%66r   N)r   r   r   r	   r   r   )r   r   r   r#   r(   r   r   r   r   r   =   s7        # # # #07 7 7 7 7r   r   T)boundexteriorlist[T]holeslist[list[T]]r   list[Sequence[T]]c                6   t          | dd          }g }||j        |j        u r|S t          |          dk    rt	          |t          |           |          }d}d}d}t          |           dk    r| d         j        x}}| d         j        x}}| D ]P}	|	j        }
|	j        }t          ||
          }t          ||          }t          ||
          }t          ||          }Qt          ||z
  ||z
            }|dk    rd|z  nd}t          |||||d           |S )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ccwN        P   i  )
linked_listr   r   leneliminate_holesr   r   minmaxearcut_linked)r+   r-   
outer_node	trianglesmin_xmin_yinv_sizemax_xmax_yr   r   r   s               r   earcutrB   ]   s@   * #8QD999J#%IZ_
??
5zzA~~$UCMM:FF
EEH 8}}r % % 	" 	"EAAqMMEqMMEqMMEqMMEE uu}eem44'/1}}58##!*ixCCCr   pointsSequence[Point]startr   r2   boolc                &   d}|t          |           dk     u r| D ]}t          |||          }|dz  }n:|t          |           z   }t          |           D ]}t          |||          }|dz  }|r!||j        k    rt          |           |j        }|S )z`Create a circular doubly linked list from polygon points in the specified
    winding order
    Nr      )signed_areainsert_noder6   reversedr   remove_node)rC   rE   r2   lastr   ends         r   r5   r5      s     D
{6""Q&'' 	 	EueT22DQJEE	 c&kk!f%% 	 	EsE400D1HCC  	!!DyKr   r
   c                    d}t          |           s|S | d         }| D ]&}||j        |j        z
  |j        |j        z   z  z  }|}'|S )Nr3   )r6   r   r   )rC   sr   r   s       r   rI   rI      sa    Av;; ":D  	eg57TV#344 Hr   pqrc                    |j         | j         z
  |j        |j        z
  z  |j        | j        z
  |j         |j         z
  z  z
  S )z!Returns signed area of a triangle)r   r   rR   rS   rT   s      r   arearW      s7    C!#I!#)$ac	acACi'@@@r   abc                   | j         j        |j        k    o| j        j        |j        k    ot          | |           ot	          | |          rQt	          ||           rAt          | |          r1t          | j        | |j                  pt          | |j        |          pC| |k    o=t          | j        | | j                   dk    ot          |j        ||j                   dk    S )zZCheck if a diagonal between two polygon nodes is valid (lies in polygon
    interior)
    r   )r   r   r   intersects_polygonlocally_insidemiddle_insiderW   rX   rY   s     r   is_valid_diagonalr_      s    
 	
AC 	
FHO	
"1a(((	
 1a   q!$$a## QVQ''=4161+=+=	, Av ,QVQ''!+,QVQ''!+r   c                    | }	 |j         | j         k    rS|j        j         | j         k    r>|j         |j         k    r.|j        j         |j         k    rt          ||j        | |          rdS |j        }|| u rnpdS )z;Check if a polygon diagonal intersects any polygon segmentsTF)r   r   
intersects)rX   rY   rR   s      r   r[   r[      s    	AC13JJACqs

AC1afa++   4F66 5r   numc                &    | dk     rdS | dk    rdS dS )Nr3   rP   rH   r   r   )rb   s    r   signrd      s#    
Syyr
Syyq1r   c                   t          | j        |j                  |j        cxk    ot          | j        |j                  k    nc oDt          | j        |j                  |j        cxk    ot          | j        |j                  k    nc S r%   )r9   r   r8   r   rV   s      r   
on_segmentrf      s    qsAC==AC00003qsAC==0000 Sac]]ac 6 6 6 6S	QSN N 6 6 6 6 r   p1q1p2q2c                   t          t          | ||                    }t          t          | ||                    }t          t          |||                     }t          t          |||                    }||k    r||k    rdS |dk    rt          | ||          rdS |dk    rt          | ||          rdS |dk    rt          || |          rdS |dk    rt          |||          rdS dS )zcheck if two segments intersectTr   F)rd   rW   rf   )rg   rh   ri   rj   o1o2o3o4s           r   ra   ra      s    	d2r2		B	d2r2		B	d2r2		B	d2r2		B	RxxB"HHt	Qww:b"b))wt	Qww:b"b))wt	Qww:b"b))wt	Qww:b"b))wt5r   r   r   rM   c                    t          | |          }|||_        ||_        n&|j        |_        ||_        ||j        _        ||_        |S )zbcreate a node and optionally link it with previous one (in a circular
    doubly linked list)
    )r   r   r   )r   r   rM   rR   s       r   rJ   rJ     sK     	QA|		Hr   r   c                    | j         | j        _         | j        | j         _        | j        r| j        | j        _        | j        r| j        | j        _        d S d S r%   )r   r   r   r    )rR   s    r   rL   rL     sP    &AFK&AFKx #(x #(# #r   Sequence[Sequence[Point]]r;   c                @   g }| D ]l}t          |          dk     rt          ||d          }||j        u rd|_        |t          |          z  }|                    t          |                     m|                    d            |D ]}t          ||          }|S )z[link every hole into the outer loop, producing a single-ring polygon
    without holes
    rH   Fr1   Tc                    | j         | j        fS r%   r&   )nodes    r   <lambda>z!eliminate_holes.<locals>.<lambda>3  s     0 r   )key)r6   r5   r   r!   appendget_leftmostsorteliminate_hole)r-   rE   r;   queuehole_listhole_s          r   r7   r7   #  s     E * *t99q==D%U333EJ EMT\%(())))	JJ00J111  7 7#E:66

r   r}   c                    t          | |          }||S t          ||           }t          ||j                   t          ||j                  S )zYFind 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{   ;  sT     dJ//F~"6400N .."5666---r   rN   Optional[Node]c                    | | S || }| }	 d}|j         sO||j        k    st          |j        ||j                  dk    r%t	          |           |j        x}}||j        u rnd}n|j        }|s||usng|S )z&eliminate colinear or duplicate pointsNTFr   )r!   r   rW   r   rL   )rE   rN   rR   agains       r   r   r   J  s    }
{Ay 		KK41622a77NNNfAAF{{EEA 	# Jr   earr<   list[Sequence[Point]]r=   r>   r?   pass_c                h   | d S |s|rt          | |||           | }| j        | j        ur| j        }| j        }|rt          | |||          nt	          |           }	|	rE|                    |j        | j        |j        f           t          |            |j        } |j        }|} | |u rw|s"t          t          |           ||||d           nQ|dk    r2t          t          |           |          } t          | ||||d           n|dk    rt          | ||||           d S | j        | j        ud S d S )NrH      )index_curver   r   is_ear_hashedis_earrx   r   rL   r:   r   cure_local_intersectionssplit_ear_cut)
r   r<   r=   r>   r?   r   stopr   r   _is_ears
             r   r:   r:   e  s    {  1X 1Cx000D (#(
"
"xx ;CSM#ueX666s 	  	dj#)TZ@AAA )C9D $;; F!#&&    !.}S/A/A9MMc9eUHaHHHH !c9eUHEEEEQ (#(
"
"
"
"
"
"r   c           
     2   | j         }| }| j        }t          |||          dk    rdS |j        }|j        }|j        }|j        }|j        }|j        }	t          |||          }
t          |||          }t          |||	          }t          |||	          }|j        }||urv|
|j        cxk    r|k    rYn nV||j        cxk    r|k    rDn nAt          ||||||	|j        |j                  r!t          |j         ||j                  dk    rdS |j        }||uvdS )zBcheck whether a polygon node forms a valid ear with adjacent nodesr   FT)r   r   rW   r   r   r8   r9   point_in_triangle)r   rX   rY   caxbxcxaybycyx0x1y0y1rR   s                  r   r   r     s:   hAAhAAq!}}u 
B	
B	
B	
B	
B	
B 
RRB	RRB	RRB	RRBfA
1**!#OOOOOOOOOacR!"b"b"b!#qsCC  QVQ''1,,5F 1** 4r   c           
     B   | j         }| }| j        }t          |||          dk    rdS |j        }|j        }|j        }	|j        }
|j        }|j        }t          |||	          }t          |||	          }t          |
||          }t          |
||          }t          |||||          }t          |||||          }| j        }| j	        }|r*|j
        |k    r|r|j
        |k    r||j        cxk    r|k    ran n^||j        cxk    r|k    rLn nI||urE||urAt          ||
|||	||j        |j                  r!t          |j         ||j                  dk    rdS |j        }||j        cxk    r|k    ran n^||j        cxk    r|k    rLn nI||urE||urAt          ||
|||	||j        |j                  r!t          |j         ||j                  dk    rdS |j	        }|r|j
        |k    r|r|j
        |k    |r|j
        |k    r||j        cxk    r|k    ran n^||j        cxk    r|k    rLn nI||urE||urAt          ||
|||	||j        |j                  r!t          |j         ||j                  dk    rdS |j        }|r|j
        |k    |r|j
        |k    r||j        cxk    r|k    ran n^||j        cxk    r|k    rLn nI||urE||urAt          ||
|||	||j        |j                  r!t          |j         ||j                  dk    rdS |j	        }|r|j
        |k    dS )Nr   FT)r   r   rW   r   r   r8   r9   z_orderr   r    r   r   )r   r=   r>   r?   rX   rY   r   r   r   r   r   r   r   r   r   r   r   min_zmax_zrR   ns                        r   r   r     s   hAAhAAq!}}u	
B	
B	
B	
B	
B	
B 
RRB	RRB	RRB	RRB BE5(33EBE5(33EjAjA  uqse||!#OOOOOOOOOacR



!"b"b"b!#qsCC QVQ''1,,5H !#OOOOOOOOOacR



!"b"b"b!#qsCC QVQ''1,,5H+  uqse||0  
u!#OOOOOOOOOacR



!"b"b"b!#qsCC QVQ''1,,5H  
u  
u!#OOOOOOOOOacR



!"b"b"b!#qsCC QVQ''1,,5H  
u 4r   c                    | }| }	 |j         |j         k     s |j         |j         k    r|j        |j        k     r|}|j        }|| u rn?|S )z(Find the leftmost node of a polygon ringr   r   r   )rE   rR   leftmosts      r   ry   ry     s`    AH3xz 1 1acHJ6F6FHF:: Or   r   r   r   r   r   r   pxpyc                    ||z
  ||z
  z  | |z
  ||z
  z  k    o/| |z
  ||z
  z  ||z
  ||z
  z  k    o||z
  ||z
  z  ||z
  ||z
  z  k    S )z.Check if a point lies within a convex triangler   )r   r   r   r   r   r   r   r   s           r   r   r   $  sy     
bR"W"r'b2g!66 	;"Wb!b2g"r'%::	;"Wb!b2g"r'%::r   mc                ~    t          | j        | |j                  dk     ot          |j        | | j                  dk     S )zXWhether sector in vertex m contains sector in vertex p in the same
    coordinates.
    r   rW   r   r   )r   rR   s     r   sector_contains_sectorr   6  s9     16""Q&F416+B+BQ+FFr   c                    | }	 |j         dk    r"t          |j        |j        |||          |_         |j        |_        |j        |_        |j        }|| u rnRd|j        _        d|_        t          |           dS )z"Interlink polygon nodes in z-orderTr   N)	r   r   r   r   r   r   r   r    sort_linked)rE   r=   r>   r?   rR   s        r   r   r   =  s}    A3!88!#qsE5(;;AC66F:: AHOAHNNNNNr   r   r   c                   t          | |z
  |z            }t          ||z
  |z            }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  dz  }||dz  z  S )	zUZ-order of a point given coords and inverse of the longer side of data
    bbox.
       i     ir   i3333rH   iUUUU)r   )r   r   r=   r>   r?   r   r   s          r   r   r   O  s    
 	R%Z8#$$AR%Z8#$$A	
a1f#A	
a1f#A	
a1f#A	
a1f#A	
a1f#A	
a1f#A	
a1f#A	
a1f#AQ<r   headc                   d}	 | }d } d }d}|r|dz  }|}d}t          |          D ]}|dz  }|j        }|s n|}|dk    s|dk    r`|r^|dk    r'|dk    s|r|j        |j        k    r|}	|j        }|dz  }n|}	|j        }|dz  }|r|	|_        n|	} ||	_        |	}|dk    V|dk    r|^|}|d |_        |dz  }|dk    rn| S )NrH   Tr   r   )ranger    r   r   )
r   in_sizerR   tail
num_mergesrS   p_sizer   q_sizees
             r   r   r   f  sO   G#
 	!OJAF7^^  !H EF1**!Q;;FaKKqKAC13JJAAaKFFAAaKF "#DKKD 1**!  A5  	6 1??G#H Kr   c                    t          | j        | j                  }t          |j        |j                  }| j        }|j        }|| _        | |_        ||_        ||_        ||_        ||_        ||_        ||_        |S )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   )rX   rY   a2b2anbps         r   r   r     su     
ac17		B	ac17		B	
B	
BAFAFBGBGBGBGBGBGIr   c                |   | }	 |j         }|j        j        }||k    st          |||j        |          rnt          ||          r^t          ||          rN|                    |j        |j        |j        f           t          |           t          |j                   |x}} |j        }|| u rnt          |          S r%   )r   r   ra   r\   rx   r   rL   r   )rE   r<   rR   rX   rY   s        r   r   r     s    AFFK Q1a++ q!$$  q!$$ 
 agqw8999NNNMAF::%& r   c                v   | }	 |j         j         }||j        ur|j        |j        k    rtt          ||          rdt	          ||          }t          ||j                   }t          ||j                   }t          |||||d           t          |||||d           dS |j         }||j        u|j         }|| u rdS )zATry splitting polygon into two and triangulate them independentlyTr   N)r   r   r   r_   r   r   r:   )rE   r<   r=   r>   r?   rX   rY   r   s           r   r   r     s     	AFKqvoosaczz/155z!!Q'' "!QV,,!!QV,, aE5(AFFFaE5(AFFFA qvoo F::E%r   c           
        |}| j         }| j        }t          j         }d }	 |j        |cxk    r|j        j        cxk    r|j        k    rwn nt|j         ||j        z
  |j        j         |j         z
  z  |j        j        |j        z
  z  z   }||cxk    r|k    r+n n(|}|j         |j        j         k     r|n|j        }||k    r|S |j        }||u rn|d S |}|j         }	|j        }
t          j        }|}	 ||j         cxk    r|	k    rn n||j         k    rt          ||
k     r|n|||	|
||
k     r|n|||j         |j                  rrt          ||j        z
            ||j         z
  z  }t          ||           r@||k     s6||k    r4|j         |j         k    s |j         |j         k    rt          ||          r|}|}|j        }||u rn|S r%   )	r   r   mathinfr   r   absr\   r   )r}   r;   rR   hxhyqxr   r   r   mxmytan_mintans                r   r   r     s!   A	B	B
(BA3"''''''''AC'''''rACxAFHqsN3qvx!#~FFAQ|||||||||qvxAAQV77HF
?? 	yt
 D	
B	
BhG	A!#OOOOOOOOOac		!2gg22gg2	 	  b13h--28,Ca&& g7NNqsqsaczz6LQPQ6R6Rz F99;< Hr   c                   t          | j        | | j                  dk     r4t          | || j                  dk    ot          | | j        |          dk    n3t          | || j                  dk     pt          | | j        |          dk     S )z9Check if a polygon diagonal is locally inside the polygonr   r   r^   s     r   r\   r\   &  s     16""Q&& 	Q16a;DAFA$6$6!$;!Q!#=tAqvq'9'9A'=r   c                \   | }d}| j         |j         z   dz  }| j        |j        z   dz  }	 |j        |k    |j        j        |k    k    rX|j        j        |j        k    rC||j        j         |j         z
  ||j        z
  z  |j        j        |j        z
  z  |j         z   k     r| }|j        }|| u rn|S )zECheck if the middle point of a polygon diagonal is inside the polygonFr   r   )rX   rY   rR   insider   r   s         r   r]   r]   /  s    	AF
#)qB
#)qB	cBhAFHrM**ACqvx!#~"qs(3qvx!#~FLLLZFF66	 Mr   )r+   r,   r-   r.   r   r/   )rC   rD   rE   r   r2   rF   r   r   )rC   rD   r   r
   )rR   r   rS   r   rT   r   r   r
   )rX   r   rY   r   )rX   r   rY   r   r   rF   )rb   r
   r   r   )rR   r   rS   r   rT   r   r   rF   )
rg   r   rh   r   ri   r   rj   r   r   rF   )r   r   r   r	   rM   r   r   r   )rR   r   r   r   )r-   rr   rE   r   r;   r   r   r   )r}   r   r;   r   r   r   r%   )rE   r   rN   r   r   r   )r   r   r<   r   r=   r
   r>   r
   r?   r
   r   r   r   r   )r   r   r   rF   )r   r   r=   r
   r>   r
   r?   r
   )rE   r   r   r   )r   r
   r   r
   r   r
   r   r
   r   r
   r   r
   r   r
   r   r
   r   rF   )r   r   rR   r   )rE   r   r=   r
   r>   r
   r?   r
   )r   r
   r   r
   r=   r
   r>   r
   r?   r
   r   r   )r   r   r   r   )rX   r   rY   r   r   r   )rE   r   r<   r   r   r   )rE   r   r<   r   r=   r
   r>   r
   r?   r
   r   r   )(
__future__r   typingr   r   r   r   r   r	   r   r)   rB   r5   rI   rW   r_   r[   rd   rf   ra   rJ   rL   r7   r{   r   r:   r   r   ry   r   r   r   r   r   r   r   r   r   r\   r]   r   r   r   <module>r      s  d # " " " " " 8 8 8 8 8 8 8 8 8 8 8 8     H   
7 7 7 7 7 7 7 7: GCu5 5 5 5p   ,
 
 
 
A A A A
   ,   $         *   "# # # #   0. . . .    6: : : :z" " " "JM M M M`
 
 
 
   $G G G G   $   .' ' ' 'T   8   0   @? ? ? ?D        r   