Ë
    :vžj�V  ã                   ó  — d Z ddlmZ ddlm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mZ dd
lmZmZ  ee«      Zdedefd„Zdd„Zdd„Zd„ Zd„ Zd„ Ze G d„ d«      «       Z	 ddefd„Zd„ Zd„ Zdd„Zd d„Zd„ Z d!d„Z!d„ Z"d„ Z#y)"z`
triangles.py
-------------

Functions for dealing with triangle soups in (n, 3, 3) float form.
é    )Ú	dataclass)Ú	getLoggerNé   )Úutil)Útol)Úpoint_plane_distance)ÚNDArrayÚfloat64)Údiagonal_dotÚunitizeÚ	trianglesÚreturnc                 óh  — | dd…dd…dd…f   | dd…dd…dd…f   z
  }| j                   d   dk(  r$t        j                  |dd…df   |dd…df   «      S | j                   d   dk(  r9|dd…df   }|dd…df   }|dd…df   |dd…df   z  |dd…df   |dd…df   z  z
  S t        | j                   «      ‚)a  
    Returns the cross product of two edges from input triangles

    Parameters
    --------------
    triangles: (n, 3, 3) float
      Vertices of triangles

    Returns
    --------------
    crosses : (n, 3) float
      Cross product of two edge vectors
    Nr   é   é   r   )ÚshapeÚnpÚcrossÚ
ValueError)r   ÚvectorsÚaÚbs       úb/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/trimesh/triangles.pyr   r      sË   € ð š˜1™2šq˜Ñ! Iªa°°!°²Q¨hÑ$7Ñ7€GØ‡��qÑ˜QÒÜ�x‰x˜¢ 1 ™ wªq°!¨t¡}Ó5Ð5Ø	�‰˜Ñ	˜qÒ	 Ø’A�q�D‰MˆØ’A�q�D‰Mˆà’�A�‰w˜š1˜a˜4™Ñ  1¢Q¨ T¡7¨Qªq°!¨t©WÑ#4Ñ4Ð4ä
�Y—_‘_Ó
%Ð%ó    c                 ó  — |€.t        t        j                  | t        j                  ¬«      «      }t	        |j
                  «      dk(  rt        j                  |«      dz  S t        j                  |dz  j                  d¬«      «      dz  S )a¡  
    Calculates the sum area of input triangles

    Parameters
    ----------
    triangles : (n, 3, 3) float
      Vertices of triangles
    crosses : (n, 3) float or None
      As a speedup don't re- compute cross products
    sum : bool
      Return summed area or individual triangle area

    Returns
    ----------
    area : (n,) float or float
      Individual or summed area depending on `sum` argument
    ©Údtyper   g       @r   ©Úaxis)	r   r   Ú
asanyarrayr
   Úlenr   ÚabsÚsqrtÚsum)r   Úcrossess     r   Úarear&   0   sl   € ð$ €ÜœŸ™ i´r·z±zÔBÓCˆÜ
ˆ7�=‰=Ó˜QÒä�v‰v�g‹ Ñ$Ð$Ü�7‰7�G˜Q‘J×#Ñ#¨Ð#Ó+Ó,¨sÑ2Ð2r   c                 óT  — | �†t        j                  | t         j                  ¬«      } | j                  d   dk(  rOt        j                  g d¢| j                  d   df«      }t        j
                  t        | «      t        ¬«      }||fS |€t        | «      }t        |d¬«      \  }}||fS )	aV  
    Calculates the normals of input triangles

    Parameters
    ------------
    triangles : (n, 3, 3) float
      Vertex positions
    crosses : (n, 3) float
      Cross products of edge vectors

    Returns
    ------------
    normals : (m, 3) float
      Normal vectors
    valid : (n,) bool
      Was the face nonzero area or not
    r   éÿÿÿÿr   )ç        r)   ç      ð?r   r   T)Úcheck_valid)
r   r    r
   r   ÚtileÚonesr!   Úboolr   r   )r   r%   ÚunitÚvalids       r   Únormalsr1   J   s”   € ð$ ÐÜ—M‘M )´2·:±:Ô>ˆ	Ø�?‰?˜2Ñ !Ò#ä—7‘7š?¨Y¯_©_¸QÑ-?ÀÐ,CÓDˆDÜ—G‘GœC 	›N´$Ô7ˆEØ˜�;ÐØ€Ü˜	Ó"ˆä˜'¨tÔ4�K€Dˆ%Ø�ˆ;Ðr   c                 óð  — t        j                  | t         j                  ¬«      } t        | dd…df   | dd…df   z
  «      }t        | dd…df   | dd…df   z
  «      }t        | dd…df   | dd…df   z
  «      }t        j                  t        | «      dft         j                  ¬«      }t        j                  t        j                  t        ||«      dd«      «      |dd…df<   t        j                  t        j                  t        | |«      dd«      «      |dd…df<   t         j                  |dd…df   z
  |dd…df   z
  |dd…df<   d||t        j                  k  j                  d¬	«      dd…f<   |S )
a   
    Calculates the angles of input triangles.

    Parameters
    ------------
    triangles : (n, 3, 3) float
      Vertex positions

    Returns
    ------------
    angles : (n, 3) float
      Angles at vertex positions in radians
      Degenerate angles will be returned as zero
    r   Nr   r   r   r   r(   r)   r   )r   r    r
   r   Úzerosr!   ÚarccosÚclipr   Úpir   ÚmergeÚany)r   ÚuÚvÚwÚresults        r   Úanglesr=   j   sD  € ô  —‘˜i¬r¯z©zÔ:€Iô 	�	š!˜Q˜$‘ )ªA¨q¨D¡/Ñ1Ó2€AÜ�	š!˜Q˜$‘ )ªA¨q¨D¡/Ñ1Ó2€AÜ�	š!˜Q˜$‘ )ªA¨q¨D¡/Ñ1Ó2€Aô �X‰X”s˜9“~ qÐ)´·±Ô<€Fä—9‘9œRŸW™W¤\°!°QÓ%7¸¸QÓ?Ó@€FŠ1ˆaˆ4�LÜ—9‘9œRŸW™W¤\°1°"°aÓ%8¸"¸aÓ@ÓA€FŠ1ˆaˆ4�Lä—5‘5˜6¢! Q $™<Ñ'¨&²°A°©,Ñ6€FŠ1ˆaˆ4�Lð 36€FˆF”S—Y‘YÑ×#Ñ#¨Ð#Ó+ªQÐ.Ñ/à€Mr   c                 óp  — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚t        | «      d   }| d   d   }t        | dd j                  d«      ||¬«      }t        j                  t        j                  |«      t        j                  k  «      }|S )	a   
    Check to see if a list of triangles are all coplanar

    Parameters
    ----------------
    triangles: (n, 3, 3) float
      Vertices of triangles

    Returns
    ---------------
    all_coplanar : bool
      True if all triangles are coplanar
    r   ©r(   r   r   úTriangles must be (n, 3, 3)!r   r   N©r(   r   ©ÚpointsÚplane_normalÚplane_origin)r   r    r
   r   Úis_shaper   r1   r   ÚreshapeÚallr"   r   Úzero)r   Útest_normalÚtest_vertexÚ	distancesÚall_coplanars        r   rM   rM   �   sš   € ô —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ JÔ/ÜÐ7Ó8Ð8ä˜)Ó$ QÑ'€KØ˜A‘,˜q‘/€KÜ$Ø˜˜ˆ}×$Ñ$ WÓ-Ø Ø ô€Iô
 —6‘6œ"Ÿ&™& Ó+¬c¯h©hÑ6Ó7€LØÐr   c           	      ó¸  — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚t        | «      d   }| d   d   }t        | dd j                  d«      ||¬«      }t        j                  t        j                  t        j                  |j                  d«      t        j                  k  «      d¬	«      «      }|S )
z–
    For a list of triangles if the FIRST triangle is coplanar
    with ANY of the following triangles, return True.
    Otherwise, return False.
    r   r?   r@   r   r   NrA   rB   r   )r   r    r
   r   rF   r   r1   r   rG   r8   rH   r"   r   rI   )r   rJ   rK   rL   Úany_coplanars        r   rO   rO   ­   s±   € ô —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ JÔ/ÜÐ7Ó8Ð8ä˜)Ó$ QÑ'€KØ˜A‘,˜q‘/€KÜ$Ø˜˜ˆ}×$Ñ$ WÓ-Ø Ø ô€Iô
 —6‘6œ"Ÿ&™&¤§¡¨	×(9Ñ(9¸'Ó(BÄSÇXÁXÑ(MÓ!NÐUVÔWÓX€LØÐr   c                   ób   — e Zd ZU eed<   eed<   eed<   ee   ed<   dZee   dz  ed<   defd„Z	y)	ÚMassPropertiesÚdensityÚmassÚvolumeÚcenter_massNÚinertiaÚitemc                 ó   — t        | |«      S ©N)Úgetattr)ÚselfrW   s     r   Ú__getitem__zMassProperties.__getitem__Ô   s   € ä�t˜TÓ"Ð"r   )
Ú__name__Ú
__module__Ú__qualname__ÚfloatÚ__annotations__r	   r
   rV   Ústrr\   © r   r   rQ   rQ   Â   sF   … ð ƒNð ƒKð ƒMð ˜Ñ!Ó!ð (,€GˆW�WÑ Ñ$Ó+ð# ô #r   rQ   c                 óH  — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚|€t        | «      }|€d}| dd…ddd…f   | dd…ddd…f   z   | dd…ddd…f   z   }| dd…ddd…f   dz  | dd…ddd…f   dz  z   | dd…ddd…f   | dd…ddd…f   z  z   | dd…ddd…f   |z  z   }| dd…ddd…f   d	z  | dd…ddd…f   dz  | dd…ddd…f   z  z   | dd…ddd…f   | dd…ddd…f   dz  z  z   | dd…ddd…f   d	z  z   | dd…ddd…f   |z  z   }|| dd…ddd…f   |z   | dd…ddd…f   z  z   }|| dd…ddd…f   |z   | dd…ddd…f   z  z   }	|| dd…ddd…f   |z   | dd…ddd…f   z  z   }
t        j                  d
t        |«      f«      }|dd…df   |dd…df   z  |d<   ||z  j                  |dd ||z  j                  |dd t        d	«      D ]i  }t        j                  |dz   d	«      }|dd…|f   | dd…d|f   |dd…|f   z  | dd…d|f   |	dd…|f   z  z   | dd…d|f   |
dd…|f   z  z   z  ||dz   <   Œk |j                  d¬«      t        j                  g d¢t         j                  ¬«      z  }|d   }|€Ct        j                  |«      t        j                   k  rt"        j%                  d«       |dd |z  }t'        |||z  ||¬«      }|r|S t        j                  d«      }|d   |d   z   ||ddg   dz  j                  «       z  z
  |d<   |d   |d   z   ||ddg   dz  j                  «       z  z
  |d<   |d   |d   z   ||ddg   dz  j                  «       z  z
  |d<   |d   |t        j(                  |ddg   «      z  z
   |d<   |d   |t        j(                  |ddg   «      z  z
   |d<   |d   |t        j(                  |ddg   «      z  z
   |d<   |d   |d<   |d   |d<   |d   |d<   ||z  |_        |S )aL  
    Calculate the mass properties of a group of triangles.

    Implemented from:
    http://www.geometrictools.com/Documentation/PolyhedralMassProperties.pdf

    Parameters
    ----------
    triangles : (n, 3, 3) float
      Triangle vertices in space
    crosses : (n,) float
      Optional cross products of triangles
    density : float
      Optional override for density
    center_mass :  (3,) float
      Optional override for center mass
    skip_inertia : bool
      if True will not return moments matrix

    Returns
    ---------
    info : dict
      Mass properties
    r   r?   r@   Nr*   r   r   r   r   é
   é   é   r   )
é   é   ri   ri   é<   rj   rj   éx   rk   rk   z@volume is negative center of mass is almost certain to be wrong!)rR   rS   rT   rU   )r   r   é   rh   )r   r   )r   r   )r   r   )r   r   é   )r   r   é	   )r   r   )r   r   )r   r   )r   r   )r   r    r
   r   rF   r   r   r3   r!   ÚTÚrangeÚmodr$   Úarrayr"   r   rI   ÚlogÚdebugrQ   ÚprodrV   )r   r%   rR   rU   Úskip_inertiaÚf1Úf2Úf3Úg0Úg1Úg2ÚintegralÚiÚ
triangle_iÚ
integratedrT   r<   rV   s                     r   Úmass_propertiesr�   Ù   s  € ô6 —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ JÔ/ÜÐ7Ó8Ð8à€Ü˜	Ó"ˆØ€Øˆð 
’1�aš�7Ñ	˜iª¨1ªa¨Ñ0Ñ	0°9ºQÀÂ1¸WÑ3EÑ	E€Bð 	’!�Qš�'Ñ˜aÑØ
’A�qš!�GÑ
 Ñ
!ñ	"à
’A�qš!�GÑ
˜yª¨Aªq¨Ñ1Ñ
1ñ	2ð ’A�qš!�GÑ
˜rÑ
!ñ	"ð ð 
’1�aš�7Ñ	˜qÑ	 Ø’Q˜š1�WÑ Ñ" y²°A²q°Ñ'9Ñ
:ñ	;à’Q˜š1�WÑ )ªA¨q²!¨GÑ"4¸Ñ"9Ñ
:ñ	;ð ’Q˜š1�WÑ Ñ"ñ	$ð ’Q˜š1�WÑ Ñ"ñ		$ð ð 
ˆyš˜Ašq˜Ñ! BÑ&¨)²A°qº!°GÑ*<Ñ<Ñ	<€BØ	ˆyš˜Ašq˜Ñ! BÑ&¨)²A°qº!°GÑ*<Ñ<Ñ	<€BØ	ˆyš˜Ašq˜Ñ! BÑ&¨)²A°qº!°GÑ*<Ñ<Ñ	<€BÜ�x‰x˜œS ›W˜Ó&€HØš!˜Q˜$‘- "¢Q¨ T¡(Ñ*€HˆQ�KØ˜r‘\×$Ñ$€HˆQˆq€MØ˜r‘\×$Ñ$€HˆQˆq€MÜ�1ŽXˆÜ—V‘V˜A ™E 1Ó%ˆ
Ø!¢! Q $™-Ø’q˜!˜ZÐ'Ñ(¨2ªa°¨d©8Ñ3Øš˜A˜zÐ)Ñ*¨R²°1°©XÑ5ñ7àš˜A˜zÐ)Ñ*¨R²°1°©XÑ5ñ7ñ
ˆ��Q‘Šð ð —‘ 1�Ó%¬¯©Ú2¼"¿*¹*ô)ñ €Jð ˜‰]€Fð ÐÜ�6‰6�&‹>œCŸH™HÒ$ä�I‰IÐXÔYà   1�o¨Ñ.ˆäØØ�vÑØØô	€Fñ Øˆä�h‰h�vÓ€Gà�1‰˜
 1™Ñ%¨°;ÀÀ1¸vÑ3FÈ!Ñ3K×2PÑ2PÓ2RÑ)RÑSð ˆD�Mð 	�1‰˜
 1™Ñ%¨°;ÀÀ1¸vÑ3FÈ!Ñ3K×2PÑ2PÓ2RÑ)RÑSð ˆD�Mð 	�1‰˜
 1™Ñ%¨°;ÀÀ1¸vÑ3FÈ!Ñ3K×2PÑ2PÓ2RÑ)RÑSð ˆD�Mð ! ‘m v´·±¸ÀQÈÀFÑ8KÓ0LÑ'LÑMÐN€GˆD�MØ  ‘m v´·±¸ÀQÈÀFÑ8KÓ0LÑ'LÑMÐN€GˆD�MØ  ‘m v´·±¸ÀQÈÀFÑ8KÓ0LÑ'LÑMÐN€GˆD�MØ˜D‘M€GˆD�MØ˜D‘M€GˆD�MØ˜D‘M€GˆD�MØ˜wÑ&€F„Nà€Mr   c                 óØ  — t        j                  | t         j                  ¬«      } t        j                  | dd¬«      st        d| j                  ›�«      ‚t        j                  |t         j                  ¬«      }t        | «      \  }}|j                  dk(  rt        j                  ||«      }nt        |||   «      }t        j                  t        | «      t        ¬«      }|dkD  ||<   |S )a^  
    Given a list of triangles and a list of normals determine if the
    two are aligned

    Parameters
    ----------
    triangles : (n, 3, 3) float
      Vertex locations in space
    normals_compare : (n, 3) float
      List of normals to compare

    Returns
    ----------
    aligned : (n,) bool
      Are normals aligned with triangles
    r   r?   T)Úallow_zerosz)triangles must have shape (n, 3, 3), got )r   r)   )r   r    r
   r   rF   r   r   r1   Údotr   r3   r!   r.   )r   Únormals_compareÚ
calculatedr0   Ú
differenceÚaligneds         r   Úwindings_alignedr‰   O  s»   € ô" —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ J¸DÕAÜÐDÀYÇ_Á_ÐDWÐXÓYÐYÜ—m‘m O¼2¿:¹:ÔF€Oä 	Ó*Ñ€J�Ø×Ñ Ò$ä—V‘V˜J¨Ó8‰
ô " *¨o¸eÑ.DÓEˆ
ä�h‰h”s˜9“~¬TÔ2€GØ #Ñ%€GˆE�Nà€Nr   c                 ó*  — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚t        j                  | j                  d¬«      | j                  d¬«      f«      }t        j                  |«      }|S )a  
    Given a list of triangles, create an r-tree for broad- phase
    collision detection

    Parameters
    ---------
    triangles : (n, 3, 3) float
      Triangles in space

    Returns
    ---------
    tree : rtree.Rtree
      One node per triangle
    r   )r(   r   )r   r   r@   r   r   )
r   r    r
   r   rF   r   Úcolumn_stackÚminÚmaxÚbounds_tree)r   Útriangle_boundsÚtrees      r   rŽ   rŽ   s  ss   € ô —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ OÔ4ÜÐ7Ó8Ð8ô —o‘o y§}¡}¸! }Ó'<¸i¿m¹mÐQR¸mÓ>SÐ&TÓU€OÜ×Ñ˜OÓ,€DØ€Kr   c                 óö   — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚|€t        j                  }t        | |¬«      |kD  j                  d¬«      }|S )a  
    Find all triangles which have an oriented bounding box
    where both of the two sides is larger than a specified height.

    Degenerate triangles can be when:
    1) Two of the three vertices are colocated
    2) All three vertices are unique but colinear


    Parameters
    ----------
    triangles : (n, 3, 3) float
      Triangles in space
    height : float
      Minimum edge length of a triangle to keep

    Returns
    ----------
    nondegenerate : (n,) bool
      True if a triangle meets required minimum height
    r   r?   r@   )r   Úareasr   r   )
r   r    r
   r   rF   r   r   r7   ÚextentsrH   )r   r’   ÚheightÚoks       r   Únondegenerater–   Œ  sf   € ô, —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ JÔ/ÜÐ7Ó8Ð8à€~Ü—‘ˆô ˜I¨UÔ
3°fÑ
<×	AÑ	AÀqÐ	AÓ	I€Bà€Ir   c                 óf  — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚|€t        | ¬«      }| dd…df   | dd…df   z
  }| dd…df   | dd…df   z
  }|dz  j                  d¬	«      d
z  }|dz  j                  d¬	«      d
z  }|t        j                  kD  }|t        j                  kD  }t        j                  t        | «      dft         j                  ¬«      }||   dz  ||   z  |dd…df   |<   ||   dz  ||   z  |dd…df   |<   |S )a@  
    Return the 2D bounding box size of each triangle.

    Parameters
    ----------
    triangles : (n, 3, 3) float
      Triangles in space
    areas : (n,) float
      Optional area of input triangles

    Returns
    ----------
    box :  (n, 2) float
      The size of each triangle's 2D oriented bounding box
    r   r?   r@   N)r   r   r   r   r   g      à?)r   r    r
   r   rF   r   r&   r$   r   r7   r3   r!   )	r   r’   r   r   Úlength_aÚlength_bÚ	nonzero_aÚ	nonzero_bÚboxs	            r   r“   r“   °  s9  € ô  —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ JÔ/ÜÐ7Ó8Ð8à€}Ü˜yÔ)ˆð 	’!�Q�$‰˜)¢A q D™/Ñ)€AØ’!�Q�$‰˜)¢A q D™/Ñ)€Að �1‘�z‰z˜qˆzÓ! SÑ(€HØ�1‘�z‰z˜qˆzÓ! SÑ(€Hð œ3Ÿ9™9Ñ$€IØœ3Ÿ9™9Ñ$€Iô
 �(‰(”C˜	“N AÐ&¬b¯j©jÔ
9€CØ! )Ñ,¨qÑ0°H¸YÑ4GÑG€CŠˆ1ˆ�IˆiÑØ! )Ñ,¨qÑ0°H¸YÑ4GÑG€CŠˆ1ˆ�IˆiÑà€Jr   c                 ó*  — t        j                  |t         j                  ¬«      }t        j                  | t         j                  ¬«      } ||j	                  d¬«      j                  d«      z  }| |j                  d«      z  j	                  d¬«      }|S )aG  
    Convert a list of barycentric coordinates on a list of triangles
    to cartesian points.

    Parameters
    ------------
    triangles : (n, 3, 3) float
      Triangles in space
    barycentric : (n, 2) float
      Barycentric coordinates

    Returns
    -----------
    points : (m, 3) float
      Points in space
    r   r   r   ©r(   r   )r(   r   r   )r   rr   r
   r    r$   rG   )r   ÚbarycentricrC   s      r   Úbarycentric_to_pointsr    Ý  sv   € ô" —(‘(˜;¬b¯j©jÔ9€KÜ—‘˜i¬r¯z©zÔ:€Ið �;—?‘?¨�?Ó*×2Ñ2°7Ó;Ñ;€KØ˜+×-Ñ-¨jÓ9Ñ9×>Ñ>ÀAÐ>ÓF€Fà€Mr   c                 óR  ‡ ‡‡— ˆˆ ˆfd„}ˆˆ ˆfd„}t        j                  ‰ t         j                  ¬«      Š t        j                  |t         j                  ¬«      }t        ‰ j                  «      dk7  rt        d«      ‚‰ j                  d   }t        |j                  «      dk7  s1|j                  d   |k7  s|j                  d   ‰ j                  d   k7  rt        d	«      ‚‰ d
d
…dd
…f   ‰ d
d
…d
d…f   z
  Š|‰ d
d
…df   j                  d|f«      z
  Š|dk(  r |«       S  |«       S )a;  
    Find the barycentric coordinates of points relative to triangles.

    The Cramer's rule solution implements:
        http://blackpawn.com/texts/pointinpoly

    The cross product solution implements:
        https://www.cs.ubc.ca/~heidrich/Papers/JGT.05.pdf


    Parameters
    -----------
    triangles : (n, 3, 2 | 3) float
      Triangles vertices in space
    points : (n, 2 | 3) float
      Point in space associated with a triangle
    method :  str
      Which method to compute the barycentric coordinates with:
        - 'cross': uses a method using cross products, roughly 2x slower but
                  different numerical robustness properties
        - anything else: uses a cramer's rule solution

    Returns
    -----------
    barycentric : (n, 3) float
      Barycentric coordinates of each point
    c                  óÆ  •— t        j                  ‰d d …df   ‰d d …df   «      } t        | | «      }t        j                  t	        ‰«      dft         j
                  ¬«      }t        t        j                  ‰d d …df   ‰«      | «      |z  |d d …df<   t        t        j                  ‰‰d d …df   «      | «      |z  |d d …df<   d|d d …df   z
  |d d …df   z
  |d d …df<   |S )Nr   r   r   r   r   )r   r   r   r3   r!   r
   )ÚnÚdenominatorrŸ   Úedge_vectorsr   r;   s      €€€r   Úmethod_crossz+points_to_barycentric.<locals>.method_cross  sÚ   ø€ Ü�H‰H�\¢! Q $Ñ'¨²a¸°dÑ);Ó<ˆÜ" 1 aÓ(ˆä—h‘h¤ I£°Ð2¼"¿*¹*ÔEˆÜ(¬¯©°,ºqÀ!¸tÑ2DÀaÓ)HÈ!ÓLÈ{ÑZˆ’A�q�DÑÜ(¬¯©°!°\Â!ÀQÀ$Ñ5GÓ)HÈ!ÓLÈ{ÑZˆ’A�q�DÑØ ªA¨q¨DÑ 1Ñ1°KÂÀ1ÀÑ4EÑEˆ’A�q�DÑØÐr   c                  óú  •— t        ‰d d …df   ‰d d …df   «      } t        ‰d d …df   ‰d d …df   «      }t        ‰d d …df   ‰	«      }t        ‰d d …df   ‰d d …df   «      }t        ‰d d …df   ‰	«      }d| |z  ||z  z
  z  }t        j                  t        ‰«      dft        j                  ¬«      }| |z  ||z  z
  |z  |d d …df<   ||z  ||z  z
  |z  |d d …df<   d|d d …df   z
  |d d …df   z
  |d d …df<   |S )Nr   r   r*   r   r   r   )r   r   r3   r!   r
   )
Údot00Údot01Údot02Údot11Údot12Úinverse_denominatorrŸ   r¥   r   r;   s
          €€€r   Úmethod_cramerz,points_to_barycentric.<locals>.method_cramer  s.  ø€ Ü˜\ª!¨Q¨$Ñ/°ºaÀ¸dÑ1CÓDˆÜ˜\ª!¨Q¨$Ñ/°ºaÀ¸dÑ1CÓDˆÜ˜\ª!¨Q¨$Ñ/°Ó3ˆÜ˜\ª!¨Q¨$Ñ/°ºaÀ¸dÑ1CÓDˆÜ˜\ª!¨Q¨$Ñ/°Ó3ˆà! U¨U¡]°U¸U±]Ñ%BÑCÐä—h‘h¤ I£°Ð2¼"¿*¹*ÔEˆØ" U™]¨U°U©]Ñ:Ð>QÑQˆ’A�q�DÑØ" U™]¨U°U©]Ñ:Ð>QÑQˆ’A�q�DÑØ ªA¨q¨DÑ 1Ñ1°KÂÀ1ÀÑ4EÑEˆ’A�q�DÑØÐr   r   r   útriangles shape incorrectr   r   r   z$triangles and points must correspondNr(   r   )r   r    r
   r!   r   r   rG   )r   rC   Úmethodr¦   r®   Údimr¥   r;   s   `     @@r   Úpoints_to_barycentricr²   ø  s  ú€ ö:öô  —‘˜i¬r¯z©zÔ:€IÜ�]‰]˜6¬¯©Ô4€Fô ˆ9�?‰?Ó˜qÒ ÜÐ4Ó5Ð5ð �/‰/˜!Ñ
€CäˆF�L‰LÓ˜QÒØ�<‰<˜‰?˜cÒ!Ø�<‰<˜‰?˜iŸo™o¨aÑ0Ò0äÐ?Ó@Ð@àšQ ¡˜UÑ# i²°2°A°2°Ñ&6Ñ6€LØ�š1˜a˜4‘×(Ñ(¨"¨c¨Ó3Ñ3€Aà�ÒÙ‹~ÐÙ‹?Ðr   c                 ó	  — t        j                  | t         j                  ¬«      } t        j                  |t         j                  ¬«      }t        j                  | d«      st        d«      ‚t        j                  |t        | «      df«      st        d«      ‚t        j                  |«      }t        j                  t        |«      t        ¬«      }g d¢}| dd…ddd…f   }| dd…d	dd…f   }| dd…d
dd…f   }||z
  }||z
  }	||z
  }
t        j                  ||
z  |«      }t        j                  |	|
z  |«      }t        j                  |t        j                  k  |t        j                  k  «      }t        |«      r||   ||<   d||<   ||z
  }t        j                  ||z  |«      }t        j                  |	|z  |«      }|t        j                   kD  ||k  z  |z  }t        |«      r||   ||<   d||<   ||z  ||z  z
  }|t        j                  k  |t        j                   kD  z  |t        j                  k  z  |z  }t        |«      r6||   ||   ||   z
  z  j                  d«      }||   |||   z  z   ||<   d||<   ||z
  }t        j                  ||z  |«      }t        j                  |	|z  |«      }|t        j                   kD  ||k  z  |z  }t        |«      r||   ||<   d||<   ||z  ||z  z
  }|t        j                  k  |t        j                   kD  z  |t        j                  k  z  |z  }t        |«      r6||   ||   ||   z
  z  j                  d«      }||   ||	|   z  z   ||<   d||<   ||z  ||z  z
  }|t        j                  k  ||z
  t        j                   kD  z  ||z
  t        j                   kD  z  |z  }t        |«      rG||   ||   z
  }||||   ||   z
  z   z  j                  d«      }||   |||   ||   z
  z  z   ||<   d||<   t        |«      r\d||   ||   z   ||   z   z  }||   |z  j                  d«      }||   |z  j                  d«      }||   ||   |z  z   |	|   |z  z   ||<   |S )a  
    Return the closest point on the surface of each triangle for a
    list of corresponding points.

    Implements the method from "Real Time Collision Detection" and
    use the same variable names as "ClosestPtPointTriangle" to avoid
    being any more confusing.


    Parameters
    ----------
    triangles : (n, 3, 3) float
      Triangle vertices in space
    points : (n, 3) float
      Points in space

    Returns
    ----------
    closest : (n, 3) float
      Point on each triangle closest to each point
    r   r?   r¯   r   z)need same number of triangles and points!)r*   r*   r*   Nr   r   r   Frž   r*   )r   r    r
   r   rF   r   r!   Ú
zeros_liker-   r.   r„   Úlogical_andr   rI   r8   rG   ) r   rC   r<   Úremainr-   r   r   ÚcÚabÚacÚapÚd1Úd2Úis_aÚbpÚd3Úd4Úis_bÚvcÚis_abr:   ÚcpÚd5Úd6Úis_cÚvbÚis_acr;   ÚvaÚis_bcÚd43Údenoms                                    r   Úclosest_pointrÎ   G  s�  € ô0 —‘˜i¬r¯z©zÔ:€IÜ�]‰]˜6¬¯©Ô4€FÜ�=‰=˜ JÔ/ÜÐ4Ó5Ð5Ü�=‰=˜¤# i£.°!Ð!4Ô5ÜÐDÓEÐEô �]‰]˜6Ó"€Fä�W‰W”S˜“[¬Ô-€Fò €Dð 	’!�Qš�'Ñ€AØ’!�Qš�'Ñ€AØ’!�Qš�'Ñ€Að 
ˆQ‰€BØ	
ˆQ‰€BØ	�!‰€Bô 
�‰��R‘˜Ó	€BÜ	�‰��R‘˜Ó	€Bô �>‰>˜"œsŸx™x™-¨¬c¯h©h©Ó7€DÜ
ˆ4„yØ˜‘wˆˆt‰Øˆˆt‰ð 
�!‰€BÜ	�‰��R‘˜Ó	€BÜ	�‰��R‘˜Ó	€Bð ”#—(‘(�‰N˜r R™xÑ(¨6Ñ1€DÜ
ˆ4„yØ˜‘wˆˆt‰Øˆˆt‰ð ˆr‰'�b˜2‘gÑ	€BØ”#—(‘(‰]˜r¤S§X¡X I™~Ñ.°"´s·x±x±-Ñ@À6ÑI€EÜ
ˆ5„zØ�‰Y˜"˜U™) b¨¡iÑ/Ñ0×9Ñ9¸'ÓBˆØ˜%™ A¨¨5©	¡MÑ2ˆˆu‰Øˆˆu‰ð 
�!‰€BÜ	�‰��R‘˜Ó	€BÜ	�‰��R‘˜Ó	€BØ”#—(‘(�‰N˜r R™xÑ(¨6Ñ1€DÜ
ˆ4„yØ˜‘wˆˆt‰Øˆˆt‰ð ˆr‰'�b˜2‘gÑ	€BØ”#—(‘(‰]˜r¤S§X¡X I™~Ñ.°"´s·x±x±-Ñ@À6ÑI€EÜ
ˆ5„zØ�‰Y˜"˜U™) b¨¡iÑ/Ñ0×9Ñ9¸'ÓBˆØ˜%™ 1 r¨%¡y¡=Ñ0ˆˆu‰Øˆˆu‰ð ˆr‰'�b˜2‘gÑ	€BØ”#—(‘(‰]  R¡¬C¯H©H¨9Ñ4Ñ5¸"¸r¹'ÄcÇhÁhÀYÑ9NÑOÐRXÑX€EÜ
ˆ5„zØ�‰i˜"˜U™)Ñ#ˆØ�C˜2˜e™9 r¨%¡yÑ0Ñ1Ñ2×;Ñ;¸GÓDˆØ˜%™ 1¨¨%©°1°U±8Ñ(;Ñ#<Ñ<ˆˆu‰Øˆˆu‰ô ˆ6„{à�r˜&‘z B v¡JÑ.°°F±Ñ;Ñ<ˆØ�‰Z˜%Ñ×(Ñ(¨Ó1ˆØ�‰Z˜%Ñ×(Ñ(¨Ó1ˆà˜6™ b¨¡j°1¡nÑ5¸¸F¹Àa¹ÑHˆˆv‰à€Mr   c                 ó  — t        j                  | t         j                  ¬«      } t        j                  | d«      st        d«      ‚| j                  d«      }t        j                  t        |«      «      j                  d«      }||dœ}|S )a¤  
    Convert a list of triangles to the kwargs for the Trimesh
    constructor.

    Parameters
    ---------
    triangles : (n, 3, 3) float
      Triangles in space

    Returns
    ---------
    kwargs : dict
      Keyword arguments for the trimesh.Trimesh constructor
      Includes keys 'vertices' and 'faces'

    Examples
    ---------
    >>> mesh = trimesh.Trimesh(**trimesh.triangles.to_kwargs(triangles))
    r   r?   r@   rA   )ÚverticesÚfaces)	r   r    r
   r   rF   r   rG   Úaranger!   )r   rÐ   rÑ   Úkwargss       r   Ú	to_kwargsrÔ   ½  sn   € ô( —‘˜i¬r¯z©zÔ:€IÜ�=‰=˜ JÔ/ÜÐ7Ó8Ð8à× Ñ  Ó)€HÜ�I‰I”c˜(“mÓ$×,Ñ,¨WÓ5€EØ"¨UÑ3€Fà€Mr   )NN)NNNFrY   )Úcramer)$Ú__doc__Údataclassesr   Úloggingr   Únumpyr   Ú r   Ú	constantsr   rC   r   Útypedr	   r
   r   r   r]   rs   r   r&   r1   r=   rM   rO   rQ   r�   r‰   rŽ   r–   r“   r    r²   rÎ   rÔ   rc   r   r   Ú<module>rÝ      s»   ðñõ "Ý ã å Ý Ý (ß #ß 'á�Ó€ð&�Wð & ó &ó43ó4ò@#òLò:ð* ÷#ð #ó ð#ð. KPñsàósòl!òHó2!óH*òZó6Lò^sólr   