
    (h;                         d dl Zd dlZd dlmZ d dlmZ d Zd Zd Z	d Z
d Zdd	Zd dlZd
 Zd Zd Zd Zd ZddZd Zd dl Zd dlmZ d dlZd Zd Zy)    N)savgol_filter)directed_hausdorffc           
         t        j                  |t              }t        j                  |d      }t        j                  |d      }|d   |d   z
  }|d   |d   z
  }d}||dz  z   }||dz  z   }	t        j
                  |	|dfd      dz  }
||z
  |z   }t        t        |      dz
        D ]6  }t        j                  |
t        ||         t        ||dz            d	d       8 t        j                  |
t        |d         t        |t        |      dz
           d	d       ||z
  |z   }t        j                  |
|gd
d	d       |
S )Nr   axis         uint8dtype   )r   r   r   T)isClosedcolor	thickness)nparrayintminmaxonesrangelencv2linetuple	polylines)arrpolpoints	min_point	max_pointwidthheightpaddingcanvas_widthcanvas_heightcanvasshifted_pointsis                D/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/pydep/util.pydraw_box_refr,      s`   XXc#F vA&IvA&I aL9Q<'Eq\IaL(F G7Q;&LWq[(M WWm\15WEKF i''1N 3~&*+ a~a015A9N3OQ\^_`aHHVU>!,-u^CDWZ[D[5\/]_jlmn 	/W
$C MM&3%$kQO M    c                    t        j                  | t         j                        } t        j                  | d      }t	        j
                  ||d      }| j                  ddd      }t	        j                  ||      j                  dd      }|S )Nr   r   r   g      ?r   r	   )r   r   float32meanr   getRotationMatrix2Dreshape	transform)r    angle_degreescenterrotation_matrixreshaped_pointsrotated_pointss         r+   rotate_points_clockwiser:   0   sz     XXfBJJ/F WWV!$F --fmSIO nnRA.O ]]?ODLLRQRSNr-   c                     t        j                  |       } t        j                  | d d df         }| d|gz
  }t        j                  |      j	                  t         j
                        }|S )Nr   r   )r   r   r   roundastypeint32)r    min_yoffset_pointss      r+   offset_points_toprA   D   s_     XXfF FF6!Q$< E aZ'MHH]+22288<M r-   c                 .   	 t        j                  | t         j                        } t        j                  | d d df         }t        j                  | d d df         }t        j                  | d d df         }t        j                  | d d df         }||z
  }||z
  }|dk(  s|dk(  r| S ||z  }	||z  }
| t        j                  |	|
g      z  }t        j                  |d d df         }t        j                  |d d df         }t        j                  |d d df         |z
  |k  r(|t        j                  |d d df         |z
  z
  dz  |z
  n| }t        j                  |d d df         |z
  |k  r(|t        j                  |d d df         |z
  z
  dz  |z
  n| }|t        j                  ||g      z   }t        j
                  |      j                  t         j                        }|S # t        $ r}t        d|        | cY d }~S d }~ww xY w)Nr   r   r   r	   zAn error occurred: )
r   r   r0   r   r   r<   r=   r>   	Exceptionprint)r    r#   r$   min_xr?   max_xmax_yoriginal_widthoriginal_heightx_scaley_scalescaled_pointsscaled_min_xscaled_min_yx_offsety_offsettransformed_pointses                     r+   transform_points_to_fitrS   U   s:   #&

3vad|$vad|$vad|$vad|$%-Q/Q"6M.(?* 7G*<!== vvmAqD12vvmAqD12_a_e_efstuvwtwfx_y  }I  `I  MR  _RERVVM!A#$67,FG!KlZ  Ye  Xe`b`f`fgtuvwxuxgy`z  ~J  aJ  NT  `TFbff]1Q3%78<GH1L|[  [g  Zg +RXXx6J-KKXX&89@@J!! #A3'(s%   B*G1 -EG1 1	H:H	HHc                     t        j                  | d      }t        j                  | d      }|d   |d   z
  }|d   |d   z
  }||fS )Nr   r   r   )r   r   r   )r    r!   r"   r#   r$   s        r+   get_width_heightrU   |   sR    vA&IvA&I aL9Q<'Eq\IaL(F<r-   c                     t        j                  | d d df         }t        j                  | d d df         }| j                         }|r|| d d df   z
  |d d df<   |r|| d d df   z
  |d d df<   |S Nr   r   )r   r   copy)r    flip_horizontalflip_verticalimage_widthimage_heightflipped_pointss         r+   flip_pointsr^      s{    &&1&K66&A,'L[[]N*VAqD\9q!t+fQTl:q!tr-   c                 x    t        d | D              }t        d | D              }||ffd}t        | |      S )Nc              3   &   K   | ]	  }|d      ywr   N .0ps     r+   	<genexpr>z.find_bottom_right_point_pix.<locals>.<genexpr>        %!%   c              3   &   K   | ]	  }|d      ywr   Nrb   rc   s     r+   rf   z.find_bottom_right_point_pix.<locals>.<genexpr>   rg   rh   c                 T    t        j                  | d   d   z
  | d   d   z
        S rW   mathhypotre   targets    r+   distancez-find_bottom_right_point_pix.<locals>.distance   .    zz!A$*AaD6!9,<==r-   keyr   r   )r    rF   rG   rq   rp   s       @r+   find_bottom_right_point_pixrv      @    %f%%E%f%%EU^F> v8$$r-   c                 x    t        d | D              }t        d | D              }||ffd}t        | |      S )Nc              3   &   K   | ]	  }|d      ywra   rb   rc   s     r+   rf   z*find_top_left_point_pix.<locals>.<genexpr>   rg   rh   c              3   &   K   | ]	  }|d      ywrj   rb   rc   s     r+   rf   z*find_top_left_point_pix.<locals>.<genexpr>   rg   rh   c                 T    t        j                  | d   d   z
  | d   d   z
        S rW   rl   ro   s    r+   rq   z)find_top_left_point_pix.<locals>.distance   rr   r-   rs   )r   )r    rE   r?   rq   rp   s       @r+   find_top_left_point_pixr|      rw   r-   c                 x    t        d | D              }t        d | D              }||ffd}t        | |      S )Nc              3   &   K   | ]	  }|d      ywra   rb   rc   s     r+   rf   z.find_bottom_right_point_geo.<locals>.<genexpr>   rg   rh   c              3   &   K   | ]	  }|d      ywrj   rb   rc   s     r+   rf   z.find_bottom_right_point_geo.<locals>.<genexpr>   rg   rh   c                 T    t        j                  | d   d   z
  | d   d   z
        S rW   rl   ro   s    r+   rq   z-find_bottom_right_point_geo.<locals>.distance   rr   r-   rs   )r   r   )r    rE   rG   rq   rp   s       @r+   find_bottom_right_point_geor      @    %f%%E%f%%EU^F> v8$$r-   c                 x    t        d | D              }t        d | D              }||ffd}t        | |      S )Nc              3   &   K   | ]	  }|d      ywra   rb   rc   s     r+   rf   z*find_top_left_point_geo.<locals>.<genexpr>   rg   rh   c              3   &   K   | ]	  }|d      ywrj   rb   rc   s     r+   rf   z*find_top_left_point_geo.<locals>.<genexpr>   rg   rh   c                 T    t        j                  | d   d   z
  | d   d   z
        S rW   rl   ro   s    r+   rq   z)find_top_left_point_geo.<locals>.distance   rr   r-   rs   ru   )r    rF   r?   rq   rp   s       @r+   find_top_left_point_geor      r   r-   c                    t        j                  | t         j                        }t        j                  |t         j                        }|d d ddgf   }t        j                  ||d      \  }}t        j                  |ggt         j                        }t        j
                  ||      }	|	d   \  }
}t        |      t        |
      fS )Nr   r   r   )methodr   r   )r   r   r0   r   findHomographyperspectiveTransformfloat)polygon_pixpolygon_geoquery_pointsrcdstdst_swappedH_ptmappedlonlats               r+   pixel_to_geor      s     ((;bjj
1C
((;bjj
1C a!Qi.K c;q9DAq 
K=/	4B%%b!,Fc{HC:uSz!!r-   c                 *   t        j                  |      }t        j                  t        j                  |      t        j                  |       gt        j                  |      t        j                  |      gg      }| |z
  |j
                  z  |z   }|S )z0Rotate points around center by angle in degrees.)r   deg2radr   cossinT)r    	angle_degr6   	angle_radR
points_rots         r+   rotate_pointsr      sv    

9%I
266)$rvvi'8&8966)$rvvi'89; 	<A6/QSS(61Jr-   c                    t        j                  | t         j                        } t        j                  |       }|\  }\  }}}t        | | |      }|j                  d      \  }	}
|j                  d      \  }}||	z
  }||
z
  }||z  }||z  }|t        j                  |	|
g      z
  t        j                  ||g      z  }|j                  d      |j                  d      z   dz  }t        j                  ddg      }|t        j                  |      |z
  z  }t        |||      }t        j                  |t         j                        j                  t        |      df      }|S )Nr   )r6   r   r   r	   )r   r   r0   r   minAreaRectr   r   r   r>   r3   r   )r    target_widthtarget_heightrectr6   whangler   rE   r?   rF   rG   current_widthcurrent_heightscale_xscale_ypoints_scaled
new_center
old_centerpoints_finals                        r+   resize_polygon_with_rotationr      s[   XXfBJJ/F ??6"D FFQE vvf=J >>q>)LE5>>q>)LE5EMMU]N ]*Gn,G"((E5>"::bhhQXGY>ZZM  ###+m.?.?Q.?.GG1LJ((Aa5/Jbhhv&34M !fEL88L9AA3|CTVWBXYLr-   )
ConvexHullc           	         t        j                  t        |       dz
  df      }t        t        |            D ]-  }| |dz   df   | |df   z
  }| |dz   df   | |df   z
  }||g||<   / t        j                  t        |            }t        t        |            D ]%  }t	        j
                  ||df   ||df         ||<   ' t        t        |            D ]'  }t        ||   t        j                  dz  z        ||<   ) t        j                  |      }dt        d      ddddddf}t        t        |            D ]E  }||   }t        j                  t	        j                  |      t	        j                  |t        j                  dz  z
        gt	        j                  |t        j                  dz  z         t	        j                  |      gg      }t        j                  || j                        }	t        j                  |	d   d      }
t        j                  |	d   d      }t        j                  |	d   d      }t        j                  |	d   d      }||
z
  }||z
  }||z  }||d   k  s9||   ||||
|||f}H |d   }t        j                  t	        j                  |      t	        j                  |t        j                  dz  z
        gt	        j                  |t        j                  dz  z         t	        j                  |      gg      }|d   }
|d   }|d   }|d	   }|
|z   dz  }||z   dz  }t        j                  ||g|      }t        j                  d
      }t        j                  ||g|      |d<   t        j                  |
|g|      |d<   t        j                  |
|g|      |d<   t        j                  ||g|      |d<   ||d   |d   |d   ||fS )z
    Adapted from the gist: https://gist.github.com/kchr/77a0ee945e581df7ed25
    Computes the minimum area bounding rectangle for the given convex hull points.
    r   r	   r   infr               )r   r	   r
   )r   zerosr   r   rm   atan2abspiuniquer   r   r   dotr   nanminnanmax)hull_points_2dedgesr*   edge_xedge_yedge_anglesmin_bboxthetar   
rot_pointsrE   rF   r?   rG   r#   r$   arear   center_xcenter_ycenter_pointcorner_pointss                         r+   min_bounding_rectr     s    HHc.)!+Q/0E3u: $!Q'.A*>>!Q'.A*>>F#a$ ((CJ(K3{#$ >E!Q$Kq!t=A> 3{#$ =[^tww{;<A= ))K(K 5<Aq!Q2H3{#$ Y AHHtxx11D(EFxx! 34dhhuoFH I VVA~//0
 		*Q-a0		*Q-a0		*Q-a0		*Q-a0 v~ (1+#AeVUE5RWXH/Y4 QKE
488E?DHHUTWWq[-@$AB88EDGGaK/0$((5/BD 	EA QKEQKEQKEQKE "H"H668X.2L HHV$Mvvuena0M!vvuena0M!vvuena0M!vvuena0M!8A;Xa[,VVr-   c                    | t        |       dk(  r5t        j                  g t        j                        j	                  dd      S t        j                  | t        j
                        j	                  dd      }t        |      dk  r?t        j                  | t        j                        j	                  t        |       df      S 	 t        |      }||j                     }t        |      dk  r?t        j                  | t        j                        j	                  t        |       df      S t        j                  ||dd f      }t        |      \  }}}	}
}}|dk(  r?t        j                  | t        j                        j	                  t        |       df      S |	|
kD  r||	z  }||
z  }n
||	z  }||
z  }t        j                  t        j                  |      t        j                  |t        j                  dz  z
        gt        j                  |t        j                  dz  z         t        j                  |      gg      }g }|D ]t  }||z
  }t        j                  ||      }t        j                  |d   |z  |d   |z  g      }t        j                  |j                  |      |z   }|j                  |       v t        j                  |t        j                        j	                  t        |      df      }|S #  |}Y )xY w)aq  
    Scales the polygon so that its rotated bounding box matches the target width and height,
    considering the longest side as height and the shortest as width.
    Applies separate scaling factors along the axes of the rotated bounding box.
    
    Args:
    - polygon_points: List of (x, y) tuples or lists representing the polygon vertices.
    - target_bbox_width: Desired size for the shortest side of the rotated bounding box.
    - target_bbox_height: Desired size for the longest side of the rotated bounding box.
    
    Returns:
    - NumPy array of scaled (x, y) points with shape (n, 2) and dtype int32.
    r   r   r	   r/   r
   r   )r   r   r   r>   r3   float64r   verticesvstackr   rm   r   r   r   r   append)polygon_pointstarget_bbox_widthtarget_bbox_heightr    hullhull_pointsr   r   r   r   r   r   r   scale_local_xscale_local_yr   rL   re   
translatedlocal_pscaled_localscaled_ps                         r+   scale_polygonr   b  s    ^!4!9xx"((+33Aq99XXnBJJ7??AFF
6{Qxxbhh7??^ATVW@XYY&!T]]+
 ;!xxbhh7??^ATVW@XYY YY[1-=>?N O``nNoKE4m qyxxbhh7??^ATVW@XYY ~%*]:)N:)M9*^; 	488E?DHHUTWWq[-@$AB88EDGGaK/0$((5/BD 	EA M '%
&&J' xxm!;WQZ-=W XY 66!##|,|;X&' HH]"((;CCSEWYZD[\M]s   	L L)FF)r   )numpyr   r   scipy.signalr   scipy.spatial.distancer   r,   r:   rA   rS   rU   r^   rm   rv   r|   r   r   r   r   r   scipy.spatialr   r   r   rb   r-   r+   <module>r      ss     
 & 5'R("%N6 %%%%"*B  $ JWXIr-   