Ë
    :vžj	1  ã                   ó’   — d dl Z d dlZd dlZddlmZ ddlmZ ddlmZ	 ddl
mZ ddlmZmZ dd	„Zdd
„Zd„ Zdd„Zdd„Zdd„Zdd„Zy)é    Né   )Úutil)Úlog)Útol_path)Úfit_nsphereé   )ÚarcÚentitiesc                 óŽ  — t        | «      dk  ryt        j                  | t        j                  ¬«      } t	        | |¬«      \  }}}t
        j                  ||z  cxk  rt
        j                  k  sn |rt        j                  d||z  «       y||z  }|t
        j                  kD  r"|rt        j                  dt        |«      «       yt        j                  | d¬«      }	t        j                  |	«      }
|
|z  }|t
        j                  kD  j!                  «       r"|rt        j                  d	t        |«      «       y|rD|t
        j"                  kD  j%                  «       dk  r t        j                  d
t        |«      «       y|
|z  }|t
        j&                  kD  j!                  «       r"|rt        j                  dt        |«      «       y| ddg   |	ddg   dz  z   }t        j(                  ||z
  «      }t        j(                  |	ddg   «      }t        j*                  t        j,                  t        j.                  ||«      «      «      }t        j*                  |t        j0                  dz  z
  «      j3                  «       }|t
        j4                  kD  r,|r)t        j                  dt        j6                  |«      «       y||dœ}|S )a?  
    Fit a circle, and reject the fit if:
    * the radius is larger than tol.radius_min*scale or tol.radius_max*scale
    * any segment spans more than tol.seg_angle
    * any segment is longer than tol.seg_frac*scale
    * the fit deviates by more than tol.radius_frac*radius
    * the segments on the ends deviate from tangent by more than tol.tangent

    Parameters
    ---------
    points :  (n, d)
      List of points which represent a path
    prior :  (center, radius) tuple
      Best guess or None if unknown
    scale : float
      What is the overall scale of the set of points
    verbose : bool
     Output log.debug messages for the reasons
     for fit rejection only suggested for manual debugging

    Returns
    -----------
    if fit is acceptable:
        (center, radius) tuple
    else:
        None
    é   N©Údtype)Úpriorzcircle fit error: R %fzcircle fit error: fit %sr   ©Úaxiszcircle fit error: angle %szfinal: angle %szcircle fit error: segment %séþÿÿÿéÿÿÿÿg      à?r   zcircle fit error: tangent %f)ÚcenterÚradius)ÚlenÚnpÚ
asanyarrayÚfloat64r   ÚtolÚ
radius_minÚ
radius_maxr   ÚdebugÚradius_fracÚstrÚdiffr   Úrow_normÚ	seg_angleÚanyÚseg_angle_minÚsumÚseg_fracÚunitizeÚabsÚarccosÚdiagonal_dotÚpiÚmaxÚtangentÚdegrees)ÚpointsÚscaler   ÚfinalÚverboseÚCÚRÚr_deviationÚr_errorÚvectorsÚsegmentÚangleÚscaledÚmid_ptÚradialÚendsr-   Úresults                     úf/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/path/simplify.pyÚfit_circle_checkr@      s/  € ô: ˆ6ƒ{�Q‚Øä�]‰]˜6¬¯©Ô4€Fô $ F°%Ô8Ñ€A€qˆ+ô �>‰>˜Q ™YÔ8¬#¯.©.Ô8ÙÜ�I‰IÐ.°°E±	Ô:Øð ˜A‰o€GØ”—‘Ò ÙÜ�I‰IÐ0´#°g³,Ô?Øä�g‰g�f 1Ô%€GÜ�m‰m˜GÓ$€Gð �a‰K€EØ”—‘Ñ×"Ñ"Ô$ÙÜ�I‰IÐ2´C¸³JÔ?Øá�%œ#×+Ñ+Ñ+×0Ñ0Ó2°QÒ6Ü�	‰	Ð#¤S¨£ZÔ0Øð �u‰_€Fà”—‘Ñ×"Ñ"Ô$ÙÜ�I‰IÐ4´c¸&³kÔBØð �Q˜�G‰_ ¨¨B¨Ñ 0°3Ñ 6Ñ7€FÜ�\‰\˜& 1™*Ó%€FÜ�<‰<˜  B Ñ(Ó)€DÜ�f‰f”R—Y‘Yœt×0Ñ0°¸Ó>Ó?Ó@€GÜ�f‰f�WœrŸu™u q™yÑ(Ó)×-Ñ-Ó/€Gà”—‘ÒÙÜ�I‰IÐ4´b·j±jÀÓ6IÔJØà QÑ'€Fà€Mó    c                 óª  — t        j                  | «      } t        |«      }t         j                  j	                  | d   | d   z
  «      t
        j                  kD  ryt        j                  | d¬«      }t        j                  |Ž }t        j                  |dz
  «      t
        j                  kD  ryt        | |¬«      }|€yt        j                  di |¤Ž}|S )a„  
    Given a set of points, quickly determine if they represent
    a circle or not.

    Parameters
    -------------
    points : (n,2 ) float
      Points in space
    scale : float
      Scale of overall drawing
    verbose : bool
      Print all fit messages or not

    Returns
    -------------
    control: (3,2) float, points in space, OR
              None, if not a circle
    r   r   Nr   ç      ð?©r0   © )r   r   ÚfloatÚlinalgÚnormr   ÚmergeÚptpÚdivider(   Úaspect_fracr@   r	   Úto_threepoint)r/   r0   r2   ÚboxÚaspectÚCRÚcontrols          r?   Ú	is_circlerR   h   s±   € ô* �]‰]˜6Ó"€FÜ�%‹L€Eô 
‡y�y‡~�~�f˜Q‘i &¨¡*Ñ,Ó-´·	±	Ò9Øä
�&‰&�˜aÔ
 €Cô �Y‰Y˜ˆ_€FÜ	‡v�vˆf�s‰lÓœcŸo™oÒ-Øô 
˜&¨Ô	.€BØ	€zØô ×ÑÑ% "Ñ%€GØ€NrA   c                 óÐ  — t        j                  | t         j                  ¬«      } t        |«      }t	        | j
                  «      dk7  s| j
                  d   dk7  rt        d«      ‚t	        | «      dk  r| j                  «       S | dd | dd z
  }t        j                  |«      }|t        j                  kD  }t        j                  | d   | dd |   f«      } ||   }||   }| dd | dd	 z
  j                  ddd…   j                  }|dd…dfxx   dz  cc<   t        j                  |«      }|t        j                  kD  }||xx   ||   j                  d
«      z  cc<   t        j                  t        j                   ||dd «      «      }t        j"                  ||dd z  ||dd z  fd¬«      }	t        j$                  t	        | «      t&        ¬«      }
d|
dd |	d|z  k  <   | |
   }|S )ar  
    Given a set of points representing a path in space,
    merge points which are colinear.

    Parameters
    ----------
    points : (n, dimension) float
      Points in space
    scale : float
      Scale of drawing for precision

    Returns
    ----------
    merged : (j, d) float
      Points with colinear and duplicate
      points merged, where (j < n)
    r   r   r   zonly for 2D points!r   Nr   r   r   ©r   r   r   Fg-Cëâ6?)r   r   r   rF   r   ÚshapeÚ
ValueErrorÚcopyr   r!   r   rI   ÚvstackÚTÚreshaper(   r*   r,   ÚonesÚbool)r/   r0   Ú	directionÚdirection_normÚdirection_okÚperpÚ	perp_normÚperp_nonzeroÚ
projectionÚprojection_ratioÚmaskÚmergeds               r?   Úmerge_colinearrg   –   sà  € ô$ �]‰]˜6¬¯©Ô4€FÜ�%‹L€Eä
ˆ6�<‰<Ó˜AÒ §¡¨a¡°AÒ!5ÜÐ.Ó/Ð/ô ˆ6ƒ{�Q‚Ø�{‰{‹}Ðð �q�r�
˜V C R˜[Ñ(€Iä—]‘] 9Ó-€Nà!¤C§I¡IÑ-€Lô �Y‰Y˜˜q™	 6¨!¨" :¨lÑ#;Ð<Ó=€FØ˜,Ñ'€IØ# LÑ1€Nð �1�2ˆJ˜  ˜Ñ$×'Ñ'©¨"¨Ñ-×/Ñ/€DØŠˆAˆƒJ�"ÑƒJÜ—‘˜dÓ#€IØœsŸy™yÑ(€LØˆÓ˜) LÑ1×9Ñ9¸'ÓBÑBÓô —‘œ×)Ñ)¨$°	¸#¸2°Ó?Ó@€Jä—v‘vØ	�n Q RÐ(Ñ	(¨*°~ÀcÀrÐ7JÑ*JÐKÐRSôÐô �7‰7”3�v“;¤dÔ+€Dà27€Dˆˆ2€JÐ $¨¡,Ñ.Ñ/à�D‰\€FØ€MrA   c                 ó¨  — ddl m}m} |€t        | «      }t	        j
                  | «      } t        j                  j                  | d   | d   z
  «      t        j                  k  } || j                  ||¬«      d   }t	        j                  dd|«      }t	        j                   |||«      «      }	|r!|	ddg   j                  d¬«      }
|
|	d<   |
|	d<   |	S )a“  
    Resample a path in space, smoothing along a b-spline.

    Parameters
    -----------
    points : (n, dimension) float
      Points in space
    smooth : float
      Smoothing distance
    count :  int or None
      Number of samples desired in output
    degree : int
      Degree of spline polynomial

    Returns
    ---------
    resampled : (count, dimension) float
      Points in space
    r   )ÚsplevÚsplprepr   )ÚsÚkg        rC   r   )Úscipy.interpolateri   rj   r   r   r   rG   rH   r   rI   rY   ÚlinspaceÚcolumn_stackÚmean)r/   ÚsmoothÚcountÚdegreeri   rj   ÚclosedÚtplÚiÚ	resampledÚshareds              r?   Úresample_splinery   Ø   s¿   € ÷( 1à€}Ü�F“ˆÜ�]‰]˜6Ó"€FÜ�Y‰Y�^‰^˜F 1™I¨¨r©
Ñ2Ó3´c·i±iÑ?€Fá
�&—(‘(˜f¨Ô
/°Ñ
2€CÜ
�‰�C˜˜eÓ$€AÜ—‘¡ a¨£Ó.€IáØ˜A˜r˜7Ñ#×(Ñ(¨aÐ(Ó0ˆØˆ	�!‰Øˆ	�"‰àÐrA   c                 ó  — ddl m} |€t        | «      }|€d}t        j                  | t        j
                  ¬«      } t        j                  j                  | d   | d   z
  «      t        j                  k  } || j                  |¬«      d   \  }}}t        j                  |«      }t        j                  t        |«      «      }|r'|ddg   j                  d¬«      |d<   |dd }|d   |d<   t        j                  |||¬	«      }	|	|fS )
a§  
    Create a spline entity from a curve in space

    Parameters
    -----------
    points : (n, dimension) float
      Points in space
    smooth : float
      Smoothing distance
    count :  int or None
      Number of samples desired in result

    Returns
    ---------
    entity : entities.BSpline
      Entity object with points indexed at zero
    control : (m, dimension) float
      New vertices for entity
    r   )rj   Ngü©ñÒMb`?r   r   )rk   r   )r/   Úknotsrt   )rm   rj   r   r   r   r   rG   rH   r   rI   rY   Ú	transposeÚarangerp   r
   ÚBSpline)
r/   rq   rr   rj   rt   r{   rQ   Ú_degreeÚindexÚentitys
             r?   Úpoints_to_spline_entityr‚   ÿ   sð   € õ* *à€}Ü�F“ˆØ€~Øˆä�]‰]˜6¬¯©Ô4€FÜ�Y‰Y�^‰^˜F 1™I¨¨r©
Ñ2Ó3´c·i±iÑ?€Fá% f§h¡h°&Ô9¸!Ñ<Ñ€Eˆ7�GÜ�l‰l˜7Ó#€GÜ�I‰I”c˜'“lÓ#€EáØ˜a ˜WÑ%×*Ñ*°Ð*Ó2ˆ�‰
Ø˜#˜2�,ˆØ˜!‘Hˆˆb‰	ä×Ñ U°%ÀÔG€Fà�7ˆ?ÐrA   c           	      óà  — t        d„ | j                  D «       «      rt        j                  d«       | S t	        j
                  | j                  «      }t        j                  «       }t        j                  «       }| j                  }| j                  D ]Ý  }t        ||¬«      }|�W|j                  t        j                  t        j                  d«      t!        |«      z   d¬«      «       |j#                  |«       Œit%        ||¬«      }	t        j                  t!        |	«      «      t!        |«      z   }
|
d   |
d<   |j                  t        j&                  |
¬	«      «       |j#                  |	«       Œß  t)        | «      ||t	        j
                  | j*                  «      |¬
«      }|j,                  j/                  t        j                  t!        |«      «      j1                  d«      t        j2                  t!        |«      t4        ¬«      t        j6                  g «      dœ«       d|j,                  v r|j,                  j9                  d«       ||_        |j                  j;                  «        |S )a  
    Merge colinear segments and fit circles.

    Parameters
    -----------
    drawing : Path2D
      Source geometry, will not be modified

    Returns
    -----------
    simplified : Path2D
      Original path but with some closed line-loops converted to circles
    c              3   óN   K  — | ]  }|j                   j                  d k7  –— Œ y­w)ÚLineN)Ú	__class__Ú__name__)Ú.0r�   s     r?   Ú	<genexpr>z!simplify_basic.<locals>.<genexpr>;  s$   è ø€ Ð
NÑ=M°6ˆ6×Ñ×$Ñ$¨Õ.Ñ=Mùs   ‚#%z3Skipping path containing entities other than `Line`rD   r   T©r/   rt   r   r   )r/   )r
   ÚverticesÚmetadataÚprocessrT   r   )ÚpathsÚ
path_validÚdanglingÚbounds)r#   r
   r   r   rW   ÚdeepcopyÚ_cacheÚcollectionsÚdequer0   ÚdiscreterR   ÚappendÚArcr   r}   r   Úextendrg   r…   ÚtyperŒ   ÚcacheÚupdaterZ   r[   r\   ÚarrayÚpopÚid_set)Údrawingr�   Úkwargsr›   Úvertices_newÚentities_newr0   r–   Úcircler/   ÚindexesÚ
simplifieds               r?   Úsimplify_basicr§   ,  så  € ô Ñ
N¸W×=MÒ=MÓ
NÔNÜ�	‰	ÐGÔHØˆô �M‰M˜'Ÿ.™.Ó)€Eô ×$Ñ$Ó&€LÜ×$Ñ$Ó&€Lð �M‰M€Eð ×$Ô$ˆä˜8¨5Ô1ˆØÐð ×ÑÜ—‘¤B§I¡I¨a£L´3°|Ó3DÑ$DÈTÔRôð ×Ñ Õ'ô $ H°EÔ:ˆFä—i‘i¤ F£Ó,¬s°<Ó/@Ñ@ˆGà! !™*ˆG�B‰Kà×Ñ¤§¡°WÔ =Ô>Ø×Ñ Õ'ð) %ð. ”�g“ØØÜ—‘˜w×/Ñ/Ó0Øô	€Jð 
‡K�K×Ñä—Y‘Yœs <Ó0Ó1×9Ñ9¸'ÓBÜŸ'™'¤# lÓ"3¼4Ô@ÜŸ™ ›ñ	
ôð �5—;‘;ÑØ�‰�‰˜Ô!à€JÔà×Ñ×ÑÔàÐrA   c           	      óÜ  — g }g }| j                   }| j                  D ]¹  }t        |||¬«      }|�W|j                  t	        j
                  t        j                  d«      t        |«      z   d¬«      «       |j                  |«       Œjt        ||¬«      \  }}	|xj                  t        |«      z  c_        |j                  |	«       |j                  |«       Œ»  t        | «      ||¬«      }
|
S )aJ  
    Replace discrete curves with b-spline or Arc and
    return the result as a new Path2D object.

    Parameters
    ------------
    path : trimesh.path.Path2D
      Input geometry
    smooth : float
      Distance to smooth

    Returns
    ------------
    simplified : Path2D
      Consists of Arc and BSpline entities
    )r0   r2   r   TrŠ   )rq   )r
   r‹   )r0   r–   rR   r—   r
   r˜   r   r}   r   r™   r‚   r/   rš   )Úpathrq   r2   Únew_verticesÚnew_entitiesr0   r–   r¤   r�   r‹   r¦   s              r?   Úsimplify_spliner¬   ~  sØ   € ð$ €LØ€LØ�J‰J€Eà—M”MˆÜ˜8¨5¸'ÔBˆØÐð ×ÑÜ—‘¤B§I¡I¨a£L´3°|Ó3DÑ$DÈTÔRôð ×Ñ Ô'Øô 3°8ÀFÔKÑˆ�à�Šœ˜\Ó*Ñ*�à×Ñ˜HÔ%Ø×Ñ˜FÕ#ð# "ð( ”�d“ \¸LÔI€JàÐrA   )NFF)F)gü©ñÒMbP?Nr   )NN)NF)r”   rW   Únumpyr   Ú r   Ú	constantsr   r   r   Únspherer   r	   r
   r@   rR   rg   ry   r‚   r§   r¬   rE   rA   r?   Ú<module>r±      sH   ðÛ Û ã å Ý Ý 'Ý !ß óXóv+ò\?óD$óN*óZOôd,rA   