
    Og]                       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
d'd
Zd(dZd)dZd*dZd+dZd,dZd-dZd.dZd/dZd0dZd1dZ	 	 	 	 	 	 	 	 d2dZd3dZd4d5dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6dZd7dZd8dZd9dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d:dZd;dZd<dZd=dZ d>d Z!d?d!Z"d@d"Z#	 	 	 	 	 	 	 	 	 	 	 	 dAd#Z$d3d$Z%d,d%Z&d,d&Z'y)B    )annotations)SequenceOptionalProtocolTypeVarNc                  "    e Zd ZU ded<   ded<   y)PointfloatxyN)__name__
__module____qualname____annotations__     ^/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/math/_mapbox_earcut.pyr	   r	   8   s    HHr   r	   c                      e Zd ZddZd Zy)Nodec                    || _         || _        |j                  | _        |j                  | _        d | _        d | _        d| _        d | _        d | _        d| _	        y )Nr   F)
ipointr   r   prevnextzprev_znext_zsteiner)selfr   r   s      r   __init__zNode.__init__>   s\     
  		  !  #r   c                j    | j                   |j                   k(  xr | j                  |j                  k(  S Nr   r   )r   others     r   __eq__zNode.__eq__V   s'    vv 6TVVuww%66r   N)r   intr   r	   returnNone)r   r   r   r    r%   r   r   r   r   r   =   s    #07r   r   T)boundc                   t        | dd      }g }||j                  |j                  u r|S t        |      dkD  rt	        |t        |       |      }d}d}d}t        |       dkD  r| d   j
                  x}}| d   j                  x}}| D ]J  }	|	j
                  }
|	j                  }t        ||
      }t        ||      }t        ||
      }t        ||      }L t        ||z
  ||z
        }|dk7  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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   earcutr?   ]   s   * #8QD9J#%IZ__
?
5zA~$UCM:F
EEH 8}r % % 	"EAAqMEqMEqMEqME	" uu}eem4'/1}58#!*ixCr   c                   d}|t        |       dk  u r| D ]  }t        |||      }|dz  } n0|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_noder1   reversedr   remove_node)pointsstartr-   lastr   ends         r   r0   r0      s     D
{6"Q&' 	EueT2DQJE	 c&k!f% 	EsE40D1HC	
 		!DyyKr   c                    d}t        |       s|S | d   }| D ]:  }||j                  |j                  z
  |j                  |j                  z   z  z  }|}< |S )Nr.   )r1   r   r   )rF   sr   r   s       r   rB   rB      s`    Av;":D 	egg577TVV#344
 Hr   c                    |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   pqrs      r   arearR      sG    CC!##I!##)$acc	accACCi'@@@r   c                "   | j                   j                  |j                  k7  xr | j                  j                  |j                  k7  xr t        | |       xr t	        | |      xrV t	        ||       xrH t        | |      xr: t        | j                  | |j                        xs t        | |j                  |      xsQ | |k(  xrJ t        | j                  | | j                         dkD  xr$ t        |j                  ||j                         dkD  S )zZCheck if a diagonal between two polygon nodes is valid (lies in polygon
    interior)
    r   )r   r   r   intersects_polygonlocally_insidemiddle_insiderR   abs     r   is_valid_diagonalrZ      s    
 	
ACC 	
FFHHO	
"1a((	
 1a  q!$a# QVVQ'=41661+=	, Av ,QVVQ'!+,QVVQ'!+r   c                P   | }	 |j                   | j                   k7  rx|j                  j                   | j                   k7  rU|j                   |j                   k7  r<|j                  j                   |j                   k7  rt        ||j                  | |      ry|j                  }|| u r	 y)z;Check if a polygon diagonal intersects any polygon segmentsTF)r   r   
intersects)rX   rY   rO   s      r   rT   rT      s~    	A
CC133JACCqss
ACC1affa+FF6 r   c                    | dk  ry| dkD  ryy)Nr.   rK   rA   r   r   )nums    r   signr_      s    
Sy
Syr   c                ^   t        | j                  |j                        |j                  cxk\  xr# t        | j                  |j                        k\  nc xrV t        | j                  |j                        |j                  cxk\  xr# t        | j                  |j                        k\  S c S r"   )r4   r   r3   r   rN   s      r   
on_segmentra      sx    qssACC=ACC03qssACC=0 Sacc]acc 6S	QSSN 6  6 r   c                b   t        t        | ||            }t        t        | ||            }t        t        |||             }t        t        |||            }||k7  r||k7  ry|dk(  rt        | ||      ry|dk(  rt        | ||      ry|dk(  rt        || |      ry|dk(  rt        |||      ryy)zcheck if two segments intersectTr   F)r_   rR   ra   )p1q1p2q2o1o2o3o4s           r   r\   r\      s    	d2r2	B	d2r2	B	d2r2	B	d2r2	B	RxB"H	Qw:b"b)	Qw:b"b)	Qw:b"b)	Qw:b"b)r   c                    t        | |      }|||_        ||_        |S |j                  |_        ||_        ||j                  _        ||_        |S )zbcreate a node and optionally link it with previous one (in a circular
    doubly linked list)
    )r   r   r   )r   r   rH   rO   s       r   rC   rC     sT     	QA| H	 			Hr   c                   | j                   | j                  _         | j                  | j                   _        | j                  r| j                  | j                  _        | j                  r| j                  | j                  _        y y r"   )r   r   r   r   )rO   s    r   rE   rE     sQ    &&AFFK&&AFFKxx((xx(( r   c                   g }| D ]\  }t        |      dk  rt        ||d      }||j                  u rd|_        |t        |      z  }|j	                  t        |             ^ |j                  d        |D ]  }t        ||      } |S )z[link every hole into the outer loop, producing a single-ring polygon
    without holes
    rA   Fr,   Tc                2    | j                   | j                  fS r"   r#   )nodes    r   <lambda>z!eliminate_holes.<locals>.<lambda>3  s     0 r   )key)r1   r0   r   r   appendget_leftmostsorteliminate_hole)r7   rG   r8   queuehole_listhole_s          r   r2   r2   #  s     E *t9q=D%U3EJJ EMT\%()* 
JJ0J1  7#E:6
7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   )rw   r8   bridgebridge_reverses       r   ru   ru   ;  sJ     dJ/F~"640N .."5"56--r   c                    | | S || }| }	 d}|j                   s`||j                  k(  s$t        |j                  ||j                        dk(  r-t	        |       |j                  x}}||j                  u r	 |S d}n|j                  }|s||us	 |S )z&eliminate colinear or duplicate pointsTFr   )r   r   rR   r   rE   )rG   rI   rO   agains       r   r}   r}   J  s    }
{A
yyK41662a7NffAAFF{ J EA#J r   c                t   | y |s|rt        | |||       | }| j                  | j                  ur| j                  }| j                  }|rt        | |||      n
t	        |       }	|	rV|j                  |j                  | j                  |j                  f       t        |        |j                  } |j                  }|} | |u r\|st        t        |       ||||d       y |dk(  r&t        t        |       |      } t        | ||||d       y |dk(  rt        | ||||       y | j                  | j                  ury y )NrA      )index_curver   r   is_ear_hashedis_earrr   r   rE   r5   r}   cure_local_intersectionssplit_ear_cut)
earr9   r:   r;   r<   pass_stopr   r   _is_ears
             r   r5   r5   e  sB    { XCx0D ((#((
"xxxx ;CM#ueX6s 	 djj#))TZZ@A ))C99D $;!#&"  !.}S/A9Mc9eUHaH
  !c9eUHEQ ((#((
"r   c           
        | j                   }| }| j                  }t        |||      dk\  ry|j                  }|j                  }|j                  }|j                  }|j                  }|j                  }	t        |||      }
t        |||      }t        |||	      }t        |||	      }|j                  }||ur|
|j                  cxk  r|k  rfn nc||j                  cxk  r|k  rNn nKt        ||||||	|j                  |j                        r%t        |j                   ||j                        dk\  ry|j                  }||ury)zBcheck whether a polygon node forms a valid ear with adjacent nodesr   FT)r   r   rR   r   r   r3   r4   point_in_triangle)r   rX   rY   caxbxcxaybycyx0x1y0y1rO   s                  r   r   r     s   hhAAhhAAq!} 
B	
B	
B	
B	
B	
B 
RRB	RRB	RRB	RRBffA
1*!##OOaccR!"b"b"b!##qssCQVVQ'1,FF 1* r   c           
     V   | j                   }| }| j                  }t        |||      dk\  ry|j                  }|j                  }|j                  }	|j                  }
|j                  }|j                  }t        |||	      }t        |||	      }t        |
||      }t        |
||      }t        |||||      }t        |||||      }| j                  }| j                  }|re|j                  |k\  rU|rR|j                  |k  rB||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                        r%t        |j                   ||j                        dk\  ry|j                  }||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                        r%t        |j                   ||j                        dk\  ry|j                  }|r"|j                  |k\  r|r|j                  |k  rB|r|j                  |k\  r||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                        r%t        |j                   ||j                        dk\  ry|j                  }|r|j                  |k\  r|r|j                  |k  r||j                  cxk  r|k  rnn nk||j                  cxk  r|k  rVn nS||urO||urKt        ||
|||	||j                  |j                        r%t        |j                   ||j                        dk\  ry|j                  }|r|j                  |k  ry)Nr   FT)r   r   rR   r   r   r3   r4   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_zrO   ns                        r   r   r     s   hhAAhhAAq!}	
B	
B	
B	
B	
B	
B 
RRB	RRB	RRB	RRB BE5(3EBE5(3EjjAjjA uqsse|!##OOaccR

!"b"b"b!##qssCQVVQ'1,HH !##OOaccR

!"b"b"b!##qssCQVVQ'1,HH+ uqsse|0 u!##OOaccR

!"b"b"b!##qssCQVVQ'1,HH u u!##OOaccR

!"b"b"b!##qssCQVVQ'1,HH u r   c                    | }| }	 |j                   |j                   k  s2|j                   |j                   k(  r|j                  |j                  k  r|}|j                  }|| u r	 |S a)z(Find the leftmost node of a polygon ringr   r   r   )rG   rO   leftmosts      r   rs   rs     s_    AH
33xzz 1accHJJ6FHFF:O r   c                    ||z
  ||z
  z  | |z
  ||z
  z  k\  xr0 | |z
  ||z
  z  ||z
  ||z
  z  k\  xr ||z
  ||z
  z  ||z
  ||z
  z  k\  S )z.Check if a point lies within a convex triangler   )r   r   r   r   r   r   pxpys           r   r   r   $  sy     
bR"W"r'b2g!66 	;"Wb!b2g"r'%::	;"Wb!b2g"r'%::r   c                    t        | j                  | |j                        dk  xr$ t        |j                  | | j                        dk  S )zXWhether sector in vertex m contains sector in vertex p in the same
    coordinates.
    r   rR   r   r   )mrO   s     r   sector_contains_sectorr   6  s;     166"Q&F4166+BQ+FFr   c                &   | }	 |j                   dk(  r(t        |j                  |j                  |||      |_         |j                  |_        |j                  |_        |j                  }|| u rnkd|j
                  _        d|_        t        |       y)z"Interlink polygon nodes in z-orderr   N)	r   r   r   r   r   r   r   r   sort_linked)rG   r:   r;   r<   rO   s        r   r   r   =  sz    A
33!8!##qssE5(;AC6666FF:  AHHOAHNr   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   i3333rA   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   c                   d}	 | }d } d }d}|r|dz  }|}d}t        |      D ]  }|dz  }|j                  }|r n |}|dkD  s|dkD  rq|ro|dk7  r4|dk(  s|r|j                  |j                  k  r|}	|j                  }|dz  }n|}	|j                  }|dz  }|r|	|_        n|	} ||	_        |	}|dkD  rg|dkD  r|ro|}|rd |_        |dz  }|dk  r	 | S )NrA   r   r   )ranger   r   r   )
headin_sizerO   tail
num_mergesrP   p_sizer   q_sizees
             r   r   r   f  s   G

!OJAF7^ !HH	
 F1*!Q;FaKqACC133JAAaKFAAaKF"#DKD 1*!  A5 6 1?KI r   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|     s{     
acc177	B	acc177	B	
B	
BAFAFBGBGBGBGBGBGIr   c                   | }	 |j                   }|j                  j                  }||k(  st        |||j                  |      rnt        ||      rbt        ||      rV|j	                  |j
                  |j
                  |j
                  f       t        |       t        |j                         |x}} |j                  }|| u r	 t        |      S r"   )r   r   r\   rU   rr   r   rE   r}   )rG   r9   rO   rX   rY   s        r   r   r     s    A
FFFFKK Q1a+q!$q!$aggqww89NMAFF:' r   c                   | }	 |j                   j                   }||j                  ur|j                  |j                  k7  ret        ||      rYt	        ||      }t        ||j                         }t        ||j                         }t        |||||d       t        |||||d       y|j                   }||j                  ur|j                   }|| u ry)zATry splitting polygon into two and triangulate them independentlyr   N)r   r   r   rZ   r|   r}   r5   )rG   r9   r:   r;   r<   rX   rY   r   s           r   r   r     s     	A
FFKKqvvossaccz/15!!Q' "!QVV,!!QVV, aE5(AFaE5(AFA qvvo FF:% r   c           
        |}| j                   }| j                  }t        j                   }d }	 |j                  |cxk\  r)|j                  j                  cxk\  r|j                  k7  rn n|j                   ||j                  z
  |j                  j                   |j                   z
  z  |j                  j                  |j                  z
  z  z   }||cxk\  r|kD  r=n n:|}|j                   |j                  j                   k  r|n|j                  }||k(  r|S |j                  }||u rn|y |}|j                   }	|j                  }
t        j                  }|}	 ||j                   cxk\  r|	k\  rn n||j                   k7  rt        ||
k  r|n|||	|
||
k  r|n|||j                   |j                        rt        ||j                  z
        ||j                   z
  z  }t        ||       rL||k  sC||k(  rB|j                   |j                   kD  s%|j                   |j                   k(  rt        ||      r|}|}|j                  }||u r	 |S r"   )	r   r   mathinfr   r   absrU   r   )rw   r8   rO   hxhyqxr   r   r   mxmytan_mintans                r   r{   r{     s   A	B	B
((BA 33"''ACC'rACCxAFFHHqssN3qvvxx!##~FFAQ||qvvxxAQVV7HFF
?  	y
 D	
B	
BhhG	A
!##OOacc	!2g22g2	 b133h-28,Ca&g7Nqssqssaccz6LQPQ6R FF9H= r   c                "   t        | j                  | | j                        dk  r6t        | || j                        dk\  xr t        | | j                  |      dk\  S t        | || j                        dk  xs t        | | j                  |      dk  S )z9Check if a polygon diagonal is locally inside the polygonr   r   rW   s     r   rU   rU   &  s     166"Q& 	Q166a;DAFFA$6!$; !Q!#=tAqvvq'9A'=r   c                   | }d}| j                   |j                   z   dz  }| j                  |j                  z   dz  }	 |j                  |kD  |j                  j                  |kD  k7  r|j                  j                  |j                  k7  rj||j                  j                   |j                   z
  ||j                  z
  z  |j                  j                  |j                  z
  z  |j                   z   k  r| }|j                  }|| u r	 |S )zECheck if the middle point of a polygon diagonal is inside the polygonFr   r   )rX   rY   rO   insider   r   s         r   rV   rV   /  s    	AF
##)qB
##)qB
ccBhAFFHHrM*ACCqvvxx!##~"qss(3qvvxx!##~FLLZFFF6M r   )r6   zlist[T]r7   zlist[list[T]]r'   zlist[Sequence[T]])rF   Sequence[Point]rG   r&   r-   boolr'   r   )rF   r   r'   r
   )rO   r   rP   r   rQ   r   r'   r
   )rX   r   rY   r   )rX   r   rY   r   r'   r   )r^   r
   r'   r&   )rO   r   rP   r   rQ   r   r'   r   )
rc   r   rd   r   re   r   rf   r   r'   r   )r   r&   r   r	   rH   r   r'   r   )rO   r   r'   r(   )r7   zSequence[Sequence[Point]]rG   r&   r8   r   r'   r   )rw   r   r8   r   r'   r   r"   )rG   r   rI   zOptional[Node]r'   r   )r   r   r9   list[Sequence[Point]]r:   r
   r;   r
   r<   r
   r   r&   r'   r(   )r   r   r'   r   )r   r   r:   r
   r;   r
   r<   r
   )rG   r   r'   r   )r   r
   r   r
   r   r
   r   r
   r   r
   r   r
   r   r
   r   r
   r'   r   )r   r   rO   r   )rG   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   )rG   r   r9   r   r'   r   )rG   r   r9   r   r:   r
   r;   r
   r<   r
   r'   r(   )(
__future__r   typingr   r   r   r   r   r	   r   r)   r?   r0   rB   rR   rZ   rT   r_   ra   r\   rC   rE   r2   ru   r}   r5   r   r   rs   r   r   r   r   r   r|   r   r   r{   rU   rV   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   