
    Mi                     V    S SK r S SKJrJr  S SKrS SKJrJrJ	r	  S SK
r
 " S S\5      rg)    N)ListOptional)	BaseModelfield_validatorcomputed_fieldc                      \ rS rSr% \\\      \S'   Sr\\   \S'   \	" SSS9\
S 5       5       r\S 5       r\S	 5       r\S
 5       r\\S\\   4S j5       5       rS rS rS rS rS rS rS\S\4S jrS\\\      4S jrS$S jrS%S jrS%S jrS$S jrS&S\S-  S\S-  4S jjrS\\   4S jr\S  5       r S! r!S" r"S#r#g)'
PolygonBox	   polygonN
confidencebefore)modec                 \   [        U[        [        45      (       a  [        U5      S:X  a  [	        S U 5       5      (       a,  U Vs/ s H  n[        U5      PM     nnUu  p4pVX4/XT/XV/X6//nU$ [	        S U 5       5      (       a/  U VVs/ s H  o Vs/ s H  n[        U5      PM     snPM      nnnU$ O?[        U[        R                  5      (       a   UR                  S:X  a  UR                  5       $ [        SU S[        U5       S[        US   5       S	35      es  snf s  snf s  snnf )
N   c              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fN)
isinstancenumbersNumber).0xs     n/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/surya/common/polygon.py	<genexpr>5PolygonBox.convert_bbox_to_polygon.<locals>.<genexpr>   s     @%Q:a00%s   ')c              3   x   #    U  H0  n[        U[        [        45      =(       a    [        U5      S :H  v   M2     g7f)   N)r   listtuplelen)r   points     r   r   r      s/      RW
54-0DSZ1_DRWs   8:)r   r   zInput must be either a bbox [x_min, y_min, x_max, y_max] or a polygon with 4 corners [(x,y), (x,y), (x,y), (x,y)].  All values must be numeric. You passed z	 of type z.  The first value is of type r   .)r   r   r   r   allfloatnpndarrayshapetolist
ValueErrortype)	clsvaluevx_miny_minx_maxy_maxr   r    s	            r   convert_bbox_to_polygon"PolygonBox.convert_bbox_to_polygon   s}    edE]++E
a@%@@@+015aq51-2*eNNNN	  RW   AFFuE2Eq%(E2F	
 rzz**{{f$||~% j  kp  jq  qz  {  @E  {F  zG  Ge  fj  kp  qr  ks  ft  eu  uv  w
 	
% 2 3Fs   D
	D(D#(D(#D(c                 @    U R                   S   U R                   S   -
  $ )N      bboxselfs    r   heightPolygonBox.height(       yy|diil**    c                 @    U R                   S   U R                   S   -
  $ )Nr   r   r6   r8   s    r   widthPolygonBox.width,   r<   r=   c                 4    U R                   U R                  -  $ r   )r?   r:   r8   s    r   areaPolygonBox.area0   s    zzDKK''r=   returnc                     U R                    Vs/ s H  oS   PM	     nnU R                    Vs/ s H  oS   PM	     nn[        U5      [        U5      [        U5      [        U5      /$ s  snf s  snf Nr   r5   )r   minmax)r9   r    x_coordsy_coordss       r   r7   PolygonBox.bbox4   s_     +/,,7,!H,7*.,,7,!H,7Hs8}c(mS]KK 87s
   A'A,c                     Uu  p4Uu  pVXS-  nXd-  nU R                    H+  n	[        U	S   U-  5      U	S'   [        U	S   U-  5      U	S'   M-     g rF   r   int)
r9   processor_size
image_size
page_widthpage_height	img_width
img_heightwidth_scalerheight_scalercorners
             r   rescalePolygonBox.rescale;   s^    "0
 *	 -"0llFF1I45F1IF1I56F1I #r=   c                     U R                    H1  n[        US   U-  5      U-  US'   [        US   U-  5      U-  US'   M3     g rF   rM   )r9   divisorrW   s      r   roundPolygonBox.roundG   sH    llFF1I/07:F1IF1I/07:F1I #r=   c                     [         R                  " U R                  5      nU HG  n[        [	        US   US   5      US   5      US'   [        [	        US   US   5      US   5      US'   MI     X l        g Nr   r   r5   r4   )copydeepcopyr   rH   rG   )r9   boundsnew_cornersrW   s       r   fit_to_boundsPolygonBox.fit_to_boundsL   sk    mmDLL1!FCq	6!95vayAF1ICq	6!95vayAF1I " #r=   c                 R   [        U R                  S   UR                  S   5      n[        U R                  S   UR                  S   5      n[        U R                  S   UR                  S   5      n[        U R                  S   UR                  S   5      nX#/XC/XE/X%//U l        g Nr   r5   r   r4   )rG   r7   rH   r   )r9   otherx1y1x2y2s         r   mergePolygonBox.mergeS   s    1uzz!}-1uzz!}-1uzz!}-1uzz!}-2(RHrh?r=   c                     [        U R                  S   UR                  S   5      nX R                  S   S'   X R                  S   S'   g )Nr   r4   )rG   r7   r   )r9   rh   ri   s      r   
merge_leftPolygonBox.merge_leftZ   >    1uzz!}-QQr=   c                     [        U R                  S   UR                  S   5      nX R                  S   S'   X R                  S   S'   g )Nr   r5   r   )rH   r7   r   )r9   rh   rk   s      r   merge_rightPolygonBox.merge_right_   rr   r=   x_marginy_marginc                 P   / nXR                   -  nX R                  -  n[        U R                  5       H  u  pEUS:X  a3  UR	                  [        US   U-
  5      [        US   U-
  5      /5        M>  US:X  a3  UR	                  [        US   U-   5      [        US   U-
  5      /5        Mw  US:X  a3  UR	                  [        US   U-   5      [        US   U-   5      /5        M  US:X  d  M  UR	                  [        US   U-
  5      [        US   U-   5      /5        M     X0l        g rg   )r?   r:   	enumerater   appendrN   )r9   rv   rw   new_polygonidxpolys         r   expandPolygonBox.expandd   s   jj(kk)"4<<0ICax""CQ((:$;Sa8AS=T#UV""CQ((:$;Sa8AS=T#UV""CQ((:$;Sa8AS=T#UV""CQ((:$;Sa8AS=T#UV 1 #r=   c                 L   / n[        S5       GH  nUS:X  aZ  [        U R                  S   S   UR                  S   S   5      [        U R                  S   S   UR                  S   S   5      /nGOUS:X  aY  [        U R                  S   S   UR                  S   S   5      [        U R                  S   S   UR                  S   S   5      /nOUS:X  aY  [        U R                  S   S   UR                  S   S   5      [        U R                  S   S   UR                  S   S   5      /nO^US:X  aX  [        U R                  S   S   UR                  S   S   5      [        U R                  S   S   UR                  S   S   5      /nUR	                  W5        GM     U$ )Nr   r   r5   r   r4   )rangerH   r   rG   rz   )r9   rh   new_polyi
new_corners        r   intersection_polygonPolygonBox.intersection_polygons   s   qAAvQ*EMM!,<Q,?@Q*EMM!,<Q,?@
 aQ*EMM!,<Q,?@Q*EMM!,<Q,?@
 aQ*EMM!,<Q,?@Q*EMM!,<Q,?@
 aQ*EMM!,<Q,?@Q*EMM!,<Q,?@
 OOJ'+ . r=   c                 N    U R                  X5      nU R                  X5      nXE-  $ r   )	x_overlap	y_overlap)r9   rh   rv   rw   r   r   s         r   intersection_areaPolygonBox.intersection_area   s'    NN53	NN53	$$r=   c           	          [        S[        U R                  S   U-   UR                  S   U-   5      [        U R                  S   U-
  UR                  S   U-
  5      -
  5      $ )Nr   r   rH   rG   r7   )r9   rh   rv   s      r   r   PolygonBox.x_overlap   `    		!x'A)AB$))A,)5::a=8+CDE
 	
r=   c           	          [        S[        U R                  S   U-   UR                  S   U-   5      [        U R                  S   U-
  UR                  S   U-
  5      -
  5      $ )Nr   r4   r5   r   )r9   rh   rw   s      r   r   PolygonBox.y_overlap   r   r=   c                 x   SUs=::  a  S::  d   e   eSUs=::  a  S::  d   e   eU R                   S:X  a  gU(       a,  [        [        U R                  UR                  5      U-  5      nU(       a,  [        [        U R                  UR                  5      U-  5      nU R                  XU5      nX@R                   -  $ rF   )rB   rN   rG   r?   r:   r   )r9   rh   rv   rw   intersections        r   intersection_pctPolygonBox.intersection_pct   s    H!!!!!!H!!!!!!99>3tzz5;;7(BCH3t{{ELL9HDEH--exHii''r=   x_shifty_shiftc                     Ub   U R                    H  nUS==   U-  ss'   M     Ub!  U R                    H  nUS==   U-  ss'   M     g g rF   r   )r9   r   r   rW   s       r   shiftPolygonBox.shift   sK    ,,q	W$	 ',,q	W$	 ' r=   r7   c                     U R                    HG  n[        [        US   US   5      US   5      US'   [        [        US   US   5      US   5      US'   MI     g r_   )r   rH   rG   )r9   r7   rW   s      r   clampPolygonBox.clamp   sV    llFCq	473T!W=F1ICq	473T!W=F1I #r=   c                     U R                   S   U R                   S   -   S-  U R                   S   U R                   S   -   S-  /$ r_   r6   r8   s    r   centerPolygonBox.center   sB    1		!,1DIIaL499Q<4OST3TUUr=   c                 r    U R                   nUR                   nUS   US   -
  S-  US   US   -
  S-  -   S-  $ )Nr   r   r5   g      ?)r   )r9   rh   r   other_centers       r   distancePolygonBox.distance   sP    || AYa(Q.&)l1o2MRS1SS 	r=   c                 >    [        [        U R                  5      5      $ r   )hashr   r7   r8   s    r   __hash__PolygonBox.__hash__   s    E$))$%%r=   r   )r   r   )r   )NN)$__name__
__module____qualname____firstlineno__r   r#   __annotations__r   r   r   classmethodr1   propertyr:   r?   rB   r   r7   rX   r\   rd   rm   rp   rt   r~   r   r   r   r   r   r   r   r   r   r   __static_attributes__ r=   r   r	   r	   	   sL   $u+"&J&YX.
  /
2 + + + + ( ( Ld5k L  L

7;
#@ 
 
#u # #T$u+-> 6%


(%UT\ %54< %>$u+ >
 V V&r=   r	   )r`   typingr   r   numpyr$   pydanticr   r   r   r   r	   r   r=   r   <module>r      s%     !  ? ? @& @&r=   