§
    Ñ»äjn)  ã                   ó°
  — d Z ddlZddlZddlZddlZej        d         dge_        ddlmZm	Z	 ddl
mZmZ  ej        d¬¦  «        d„ ¦   «         Z ej        d¬¦  «        d	„ ¦   «         Z ej        d¬¦  «        d
„ ¦   «         Z ej        d¬¦  «        d„ ¦   «         Zd„ Zej                             d¦  «        Zd„ Zd7d„Zd8d„Zd9d„Zd:d„Zedk    �r€ddlZddlZddlZg Z  ej!        ¦   «         D �]7\  Z"Z# ej$        e#d¬¦  «        Z% ej&        e%j'        ej(        ¦  «        Z) e*ej+         ,                    e) -                    d¦  «        e) .                    d¦  «        z
  ¦  «        ¦  «        Z/ ed„ ¦  «        Z0ej         1                    e%¦  «        \  Z2Z3 ed„ d¦  «        Z4ej5         6                    e%¦  «        \  Z7Z8 ed„ d¦  «        Z9ddl:m;Z; d„ Z< e<¦   «         \  Z=Z>ej+         ,                    e)e=z
  d¬¦  «         -                    ¦   «         e>d z  k    sJ ‚ ee<¦  «        Z?d!D �]ù\  Z@ZA ejB        e%eAe@d"¬#¦  «        ZC eeC¦  «        \  ZDZEZF ed$„ ¦  «        ZGd%„ d&D ¦   «         ZH eId'¦  «        D ]:ZJi ZK eeCeK¬(¦  «         eHD ]&ZLeHeL          M                    d)eKeL         z  ¦  «         Œ'Œ; eNd;e"e@eAe/ e* ejO        eDd         eDd         z
  ¦  «         ejO        e) -                    d¦  «        e) .                    d¦  «        z
  ¦  «        z  ¦  «        d* e* ejP        ejQ        eDd         e) .                    d¦  «        z
  eDd         e) -                    d¦  «        z
  f         ¦  «         -                    ¦   «         ¦  «        z  e/z  d* ee)eD¬+¦  «        z  e/z   e* ejO        d,eEd,         z  ¦  «         ejO        e3¦  «        z  ¦  «        d* ee)eE¬-¦  «        z  e/z   e* ejO        d,eEd,         z  ¦  «         ejO        e) -                    d¦  «        e) .                    d¦  «        z
  ¦  «        z  ¦  «         e* ejO        e3¦  «         ejO        e) -                    d¦  «        e) .                    d¦  «        z
  ¦  «        z  ¦  «        eFd         e>z  d* ee)eF¬.¦  «        z  e/z  e8e>z  eGd/œd0„ eH !                    ¦   «         D ¦   «         ¤e0e4e9e? eRe)¦  «        d1œ¤ŽZSe  M                    eS¦  «          eTd2„ eS !                    ¦   «         D ¦   «         d¬3¦  «         �Œû�Œ9 ejU        e ¦  «         V                    e	d4z  d5¬6¦  «         dS dS )<aV  Bounding volumes straight from the descriptor: AABB, OBB and the minimum enclosing sphere, from the vertices of the
descriptor's hull (fcp_hull: canonical, then the pose). Against the source mesh: its vertex AABB, trimesh's
oriented_bounds (minimum-volume OBB) and the exact smallest ball of the mesh (qhull, then min_sphere; trimesh's
minimum_nsphere is timed too but is not minimal on every object: 0.4 % too large on the horse). out/bounds.csv.

    env -u PYTHONPATH ~/code/fcp_devel/.venv/bin/python scripts/bounds.py

OBB: in two frames (the world axes and the descriptor's own axes, the principal axes), each axis kept in turn and the
other two turned to the minimum-area rectangle of the projected hull (one candidate per hull edge); the smallest box. Sphere: the exact
smallest ball of the hull vertices (randomized incremental, expected O(n)).
é    NÚx)ÚOBJECTSÚOUT)ÚlevelsÚ_loftT)Úcachec                 óŠ   — | |df         |d         z
  dz  | |df         |d         z
  dz  z   | |df         |d         z
  dz  z   S )Nr   é   é   © )ÚPÚiÚcs      ú;/home/joao/code/data/meshes/fcp_3010_hull/scripts/bounds.pyÚ_d2r      sQ   € àˆa�ˆdŒG�a˜”d‰N˜qÑ  A a¨ d¤G¨a°¬d¡N°qÑ#8Ñ8¸A¸aÀ¸d¼GÀaÈÄd¹NÈqÑ;PÑPÐPó    c                 ó  — | |df         | |df         z
  | |df         | |df         z
  | |df         | |df         z
  }}}| |df         | |df         z
  | |df         | |df         z
  | |df         | |df         z
  }
}	}||
z  ||	z  z
  ||z  ||
z  z
  ||	z  ||z  z
  }}}||z  ||z  z   ||z  z   }|dk     rdS ||z  ||z  z   ||z  z   ||z  |	|	z  z   |
|
z  z   }}||z  ||z  z
  |z  |	|z  |
|z  z
  |z  z   d|z  z  }||z  ||z  z
  |z  |
|z  ||z  z
  |z  z   d|z  z  }||z  ||z  z
  |z  ||z  |	|z  z
  |z  z   d|z  z  }| |df         |z   | |df         |z   | |df         |z   c|d<   |d<   |d<   ||z  ||z  z   ||z  z   S )zpc <- the circumcentre of P[i], P[j], P[k] (the smallest ball with the three on its boundary); returns r^2 or -1.r   r   r
   çYóøÂn¥ç      ð¿r   )r   r   ÚjÚkr   ÚuxÚuyÚuzÚvxÚvyÚvzÚwxÚwyÚwzÚw2ÚuuÚvvÚoxÚoyÚozs                       r   Ú_ball3r'      s/  € ð �1�a�4”˜1˜Q ˜Tœ7Ñ" A a¨ d¤G¨a°°1°¬gÑ$5°q¸¸A¸´wÀÀ1ÀaÀ4ÄÑ7HˆBˆ€BØ�1�a�4”˜1˜Q ˜Tœ7Ñ" A a¨ d¤G¨a°°1°¬gÑ$5°q¸¸A¸´wÀÀ1ÀaÀ4ÄÑ7HˆBˆ€BØ�b‘˜2 ™7Ñ" B¨¡G¨b°2©gÑ$5°r¸B±wÀÀbÁÑ7HˆBˆ€BØ	ˆb‰�2˜‘7Ñ	˜R "™WÑ	$€BØ	ˆF‚{€{ØˆtØ�"‰W�r˜B‘wÑ  b¡Ñ(¨"¨r©'°B¸±GÑ*;¸bÀ2¹gÑ*Eˆ€Bà�‰7�R˜"‘WÑ Ñ
" b¨2¡g°°R±Ñ&7¸2Ñ%=Ñ
=À!ÀbÁ&Ñ	I€BØ�‰7�R˜"‘WÑ Ñ
" b¨2¡g°°R±Ñ&7¸2Ñ%=Ñ
=À!ÀbÁ&Ñ	I€BØ�‰7�R˜"‘WÑ Ñ
" b¨2¡g°°R±Ñ&7¸2Ñ%=Ñ
=À!ÀbÁ&Ñ	I€BØ˜˜A˜”w ‘| Q q¨! t¤W¨r¡\°1°Q¸°T´7¸R±<Ð€A€a�Dˆ!ˆA‰$��!‘Ø�‰7�R˜"‘WÑ˜r B™wÑ&Ð&r   c                 ó(  — t          j        d¦  «        }t          j        d¦  «        }t          |||f¦  «        D ]`\  }}	t          d¦  «        D ]}
| |	|
f         | ||
f         z
  |||
f<   Œ||df         dz  ||df         dz  z   ||df         dz  z   dz  ||<   Œa|d         |d         |d         z  |d	         |d
         z  z
  z  |d         |d         |d         z  |d	         |d         z  z
  z  z
  |d         |d         |d
         z  |d         |d         z  z
  z  z   }t	          |¦  «        dk     rdS |d         |d         |d         z  |d	         |d
         z  z
  z  |d         |d         |d         z  |d	         |d         z  z
  z  z
  |d         |d         |d
         z  |d         |d         z  z
  z  z   |z  }|d         |d         |d         z  |d	         |d         z  z
  z  |d         |d         |d         z  |d	         |d         z  z
  z  z
  |d         |d         |d         z  |d         |d         z  z
  z  z   |z  }|d         |d         |d         z  |d         |d
         z  z
  z  |d         |d         |d         z  |d         |d         z  z
  z  z
  |d         |d         |d
         z  |d         |d         z  z
  z  z   |z  }| |df         |z   | |df         |z   | |df         |z   c|d<   |d<   |d<   ||z  ||z  z   ||z  z   S )zYc <- the centre of the sphere through the four points (Cramer's rule); returns r^2 or -1.©é   r*   r*   r   r
   r   )r   r   )r   r   )r
   r
   )r   r
   )r
   r   )r   r   )r   r   )r
   r   )r   r
   r   r   )ÚnpÚemptyÚ	enumerateÚrangeÚabs)r   r   r   r   Úlr   ÚaÚrÚqÚmÚtÚdetr   ÚyÚzs                  r   Ú_ball4r9   .   s}  € õ 	Œ�ÑÔ€AÝ
Œ�‰Œ€AÝ˜1˜a ˜)Ñ$Ô$ð @ð @‰ˆˆ1Ý�q‘”ð 	(ð 	(ˆAØ˜˜1˜”g  ! Q $¤Ñ'ˆAˆa�ˆd‰GˆGØ�!�Q�$”˜1‘˜q  A œw¨!™|Ñ+¨a°°1°¬g¸©lÑ:¸aÑ?ˆˆ!‰ˆØˆTŒ7�a˜”g  $¤Ñ'¨!¨D¬'°A°d´GÑ*;Ñ;Ñ<¸qÀ¼wÈ!ÈDÌ'ÐTUÐVZÔT[ÑJ[Ð^_Ð`dÔ^eÐhiÐjnÔhoÑ^oÑJoÑ?pÑpØˆtŒW˜˜$œ ! D¤'Ñ)¨A¨d¬G°a¸´gÑ,=Ñ=Ñ>ñ?€Cå
ˆ3�x„x�&ÒÐØˆtØ	
ˆ1Œ��4”˜1˜Tœ7Ñ" Q t¤W¨q°¬wÑ%6Ñ6Ñ	7¸!¸D¼'ÀQÀqÄTÈAÈdÌGÁ^ÐVWÐX\ÔV]Ð`aÐbcÔ`dÑVdÑEdÑ:eÑ	eØˆTŒ7�a˜”d˜Q˜tœW‘n q¨¤w°°1´¡~Ñ5Ñ6ñ
7Ø:=ñ	>€Aà	
ˆ4Œ�A�a”D˜1˜Tœ7‘N Q t¤W¨q°¬t¡^Ñ3Ñ	4°q¸´t¸qÀ¼wÈÈ4ÌÑ?PÐSTÐUYÔSZÐ]^Ð_cÔ]dÑSdÑ?dÑ7eÑ	eØˆTŒ7�a˜”g  !¤‘n q¨¤t¨a°¬g¡~Ñ5Ñ6ñ
7Ø:=ñ	>€Aà	
ˆ4Œ�A�d”G˜a œd‘N Q q¤T¨A¨d¬G¡^Ñ3Ñ	4°q¸´wÀ!ÀDÄ'ÈAÈaÌDÁ.ÐSTÐUVÔSWÐZ[Ð\`ÔZaÑSaÑBaÑ7bÑ	bØˆQŒ4�1�T”7˜Q˜tœWÑ$ q¨¤w°°4´Ñ'8Ñ8Ñ9ñ
:Ø=@ñ	A€Aà˜˜A˜”w ‘{ A a¨ d¤G¨a¡K°°1°a°4´¸1±Ð€A€a�Dˆ!ˆA‰$��!‘Øˆq‰5�1�q‘5‰=˜1˜q™5Ñ Ð r   c                 óD  — t          | ¦  «        }d}| d                              ¦   «         }t          j        d¦  «        }d}t	          d|¦  «        D �]8}t          | ||¦  «        |d|z   z  k    �r| |         |dd…<   d}t	          |¦  «        D ]ú}t          | ||¦  «        |d|z   z  k    rÝt	          d¦  «        D ]}| ||f         | ||f         z   dz  ||<   Œt          | ||¦  «        }t	          |¦  «        D ]�}	t          | |	|¦  «        |d|z   z  k    rrt          | |||	|¦  «        }
|
dk    r	||dd…<   |
}t	          |	¦  «        D ]@}t          | ||¦  «        |d|z   z  k    r#t          | |||	||¦  «        }|dk    r	||dd…<   |}ŒAŒ�Œû�Œ:|t          j        |¦  «        fS )z›Exact smallest enclosing ball of P (rows shuffled by the caller): the nested randomized incremental algorithm,
    scalar arithmetic only (no temporaries).gê-�™—q=r   r*   g        r   Nr
   )	ÚlenÚcopyr+   r,   r.   r   r'   r9   Úsqrt)r   ÚnÚtolr   r5   Úr2r   r   r3   r   Úq3r0   Úq4s                r   Ú
min_sphererC   E   sØ  € õ 	ˆA‰Œ€AØ
€CØ	ˆ!Œ�	Š	‰Œ€AÝ
Œ�‰Œ€AØ	€BÝ�1�a‰[Œ[ð 0ñ 0ˆÝˆq�!�Q‰<Œ<˜"  C¡™.Ò(Ñ(Ø�Q”4ˆAˆaˆaˆa‰DØˆBÝ˜1‘X”Xð 0ð 0�Ý�q˜!˜Q‘<”< "¨¨C©¡.Ò0Ð0Ý" 1™XœXð 7ð 7˜Ø ! ! Q $¤¨!¨A¨q¨D¬'Ñ 1°QÑ6˜˜!™˜Ý˜Q  1™œ�BÝ" 1™XœXð 0ð 0˜Ý˜q ! Q™<œ<¨"°°C±©.Ò8Ð8Ý!'¨¨1¨a°°AÑ!6Ô!6˜BØ! Qšw˜wØ'(  ! ! !¡Ø%' Ý%*¨1¡X¤Xð 0ð 0 Ý#& q¨!¨Q¡<¤<°"¸¸C¹±.Ò#@Ð#@Ý)/°°1°a¸¸A¸qÑ)AÔ)A BØ')¨Q¢w wØ/0¨¨!¨!¨!©Ø-/¨øøøùØ�bŒg�b‰kŒkˆ>Ðr   c           
      ó†  — ddl m} |  || ¦  «        j                 }t          j        |dd¦  «        |z
  }t          j        t          j        t          j        |dd…df         |dd…df         ¦  «        t          j        dz  ¦  «        ¦  «        }t          j	        |¦  «        t          j
        |¦  «        }}|dd…df         d         |dd…df         z  |dd…df         d         |dd…df         z  z   }|dd…df         d          |dd…df         z  |dd…df         d         |dd…df         z  z   }|                     d¦  «        |                     d¦  «        z
  |                     d¦  «        |                     d¦  «        z
  z  }	t          t          j        |	¦  «        ¦  «        }
||
         t          j        ||
                              ¦   «         ||
                              ¦   «         g¦  «        t          j        ||
                              ¦   «         ||
                              ¦   «         g¦  «        fS )z\Minimum-area rectangle of 2D points: (angle, lo (2,), hi (2,)) in the frame turned by angle.r   ©Ú
ConvexHulléÿÿÿÿNr   r
   )Úscipy.spatialrF   Úverticesr+   ÚrollÚuniqueÚmodÚarctan2ÚpiÚcosÚsinÚmaxÚminÚintÚargminÚarray)ÚxyrF   ÚHÚer1   r   ÚsÚXÚYÚarear   s              r   Úmin_rectr]   f   sé  € à(Ð(Ð(Ð(Ð(Ð(à
ˆ:ˆ:�b‰>Œ>Ô"Ô#€AÝ
Œ��2�qÑÔ˜AÑ€AÝ
Œ	•"”&�œ A a a a¨ d¤G¨Q¨q¨q¨q°!¨t¬WÑ5Ô5µr´u¸q±yÑAÔAÑBÔB€AÝŒ6�!‰9Œ9•b”f˜Q‘i”i€q€AØ	ˆ!ˆ!ˆ!ˆQˆ$Œ�Œ˜˜!˜!˜!˜T˜'œ
Ñ" Q q q q¨! t¤W¨T¤]°Q°q°q°q¸$°w´ZÑ%?Ñ?€AØ	
ˆ1ˆ1ˆ1ˆaˆ4Œ�Œˆ˜˜1˜1˜1˜d˜7œÑ# a¨¨¨¨1¨¤g¨d¤m°a¸¸¸¸4¸´jÑ&@Ñ@€AØ�EŠE�!‰HŒH�q—u’u˜Q‘x”xÑ A§E¢E¨!¡H¤H¨q¯uªu°Q©x¬xÑ$7Ñ8€DÝ�BŒI�d‰OŒOÑÔ€AØˆQŒ4•”˜1˜Qœ4Ÿ8š8™:œ: q¨¤t§x¢x¡z¤zÐ2Ñ3Ô3µR´X¸qÀ¼t¿xºx¹z¼zÈ1ÈQÌ4Ï8Ê8É:Ì:Ð>VÑ5WÔ5WÐWÐWr   c                 óp  ‡— d}|D �]`}| |j         z  }t          d¦  «        D �]BŠˆfd„t          d¦  «        D ¦   «         }t          |dd…|f         ¦  «        \  }}}t          j        ||z
  ¦  «        |dd…‰f                              ¦   «         |dd…‰f                              ¦   «         z
  z  }	|�|	|d         k     r¤t          j        |¦  «        t          j        |¦  «        }}
t          j	        d¦  «        }|
||d                  z  |||d                  z  z   ||d         <   | ||d                  z  |
||d                  z  z   ||d         <   |‰         |‰<   |	|f}�ŒD�Œb|d         }| |j         z  }|                     d¦  «        |                     d¦  «        }}||z   dz  |z  |||z
  dz  fS )zÍSmallest box over the candidate frames (rows: unit axes): in each frame, each axis kept in turn and the other two
    turned to the minimum-area rectangle. Returns (centre, axes (3, 3) rows, half extents).Nr*   c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r   r   )Ú.0r3   Úaxs     €r   ú
<listcomp>zmin_box.<locals>.<listcomp>   s   ø€ Ð0Ð0Ð0�q¨¨Rª¨�¨¨¨r   r   r)   r   r
   )
ÚTr.   r]   r+   ÚprodrQ   rR   rO   rP   r,   )ÚWÚframesÚbestÚFÚLÚor1   ÚloÚhiÚvolÚcaÚsaÚAra   s                @r   Úmin_boxrq   x   s¼  ø€ ð €DØð  ñ  ˆØ�”‰GˆÝ˜‘(”(ð 
	 ñ 
	 ˆBØ0Ð0Ð0Ð0�E !™HœHÐ0Ñ0Ô0ˆAÝ   1 1 1 a 4¤Ñ)Ô)‰IˆAˆr�2Ý”'˜"˜r™'Ñ"Ô" a¨¨¨¨2¨¤h§l¢l¡n¤n°q¸¸¸¸B¸´x·|²|±~´~Ñ&EÑFˆCØˆ|˜s T¨!¤Wš}˜}Ýœ ™œ¥B¤F¨1¡I¤I�B�Ý”H˜VÑ$Ô$�Ø˜q  1¤œw™,¨¨a°°!´¬g©Ñ5��!�A”$‘Ø˜#  ! A¤$¤™-¨"¨q°°1´¬w©,Ñ6��!�A”$‘Ø˜"œ��"‘Ø˜Q�x�ùñ
	 ð 	ˆQŒ€AØ	ˆAŒC‰€AØ�UŠU�1‰XŒX�q—u’u˜Q‘x”xˆ€BØ�‰G�q‰=˜1Ñ˜a " r¡'¨Q¡Ð.Ð.r   é@   é€   c                 óŒ   — t          | |¦  «        \  }}}}t          |||||¦  «        \  }}| j                             |¦  «        S ©N)r   r   ÚposeÚto_world)	ÚdÚMÚn_tr   r7   ÚstartÚzlÚVÚ_s	            r   Ú
hull_worldr   �   sD   € Ý˜Q ‘n”n�O€A€qˆ%�Ý��A�u˜b !Ñ$Ô$�D€A€qØŒ6�?Š?˜1ÑÔÐr   c                 ó–  — t          j        ¦   «         }t          | ||¦  «        }t          j        ¦   «         }|                     d¦  «        |                     d¦  «        f}t          j        ¦   «         }t          |t          j        d¦  «        t          j        | j	        j
        ¦  «        j        f¦  «        }	t          j        ¦   «         }
t          |t                               t          |¦  «        ¦  «                 ¦  «        \  }}t          j        ¦   «         }|�%|                     ||z
  ||z
  |
|z
  ||
z
  ¬¦  «         ||	||ffS )zÁAABB (lo, hi), OBB (centre, axes rows, half extents) and the smallest sphere (centre, radius), world space, from
    the vertices of the descriptor's hull. times: a dict to receive per-step ms.r   r*   N©ÚhullÚaabbÚobbÚsphere)ÚtimeÚperf_counterr   rR   rQ   rq   r+   ÚeyeÚasarrayrv   Úrotationrc   rC   Ú_RNGÚpermutationr;   Úupdate)rx   ry   rz   ÚtimesÚt0re   Út1rƒ   Út2r„   Út3ÚscÚsrÚt4s                 r   Úboundsr–   •   s  € õ 
Ô	Ñ	Ô	€BÝ�1�a˜ÑÔ€AÝ	Ô	Ñ	Ô	€BØ�5Š5�‰8Œ8�Q—U’U˜1‘X”XÐ€DÝ	Ô	Ñ	Ô	€BÝ
�!•b”f˜Q‘i”i¥¤¨A¬F¬OÑ!<Ô!<Ô!>Ð?Ñ
@Ô
@€CÝ	Ô	Ñ	Ô	€BÝ˜�$×*Ò*­3¨q©6¬6Ñ2Ô2Ô3Ñ4Ô4�F€BˆÝ	Ô	Ñ	Ô	€BØÐØ�Š˜"˜r™'¨¨R©°R¸"±WÀRÈ"ÁWˆÑMÔMÐMØ��r˜2�hÐÐr   c           
      ó¨  — |�{t          t          j                             t          j        |d         | z
  d¦  «        t          j        | |d         z
  d¦  «        z   d¬¦  «                             ¦   «         ¦  «        S |�{|\  }}}| |z
  |j        z  }t          t          j                             t          j        t          j        |¦  «        |z
  d¦  «        d¬¦  «                             ¦   «         ¦  «        S |\  }}t          t          t          j                             | |z
  d¬¦  «                             ¦   «         |z
  d¦  «        ¦  «        S )zELargest distance of the points Q outside the bound (0 if all inside).Nr   r   ©Úaxis)Úfloatr+   ÚlinalgÚnormÚmaximumrQ   rc   r/   )	ÚQrƒ   r„   r…   r   rp   Úhri   r2   s	            r   Úoutsider    ¦   s  € àÐÝ•R”Y—^’^¥B¤J¨t°A¬w¸©{¸AÑ$>Ô$>ÅÄÈAÐPTÐUVÔPWÉKÐYZÑA[ÔA[Ñ$[Ðbc�^ÑdÔd×hÒhÑjÔjÑkÔkÐkØ
€Ø‰ˆˆ1ˆaØ�‰U�a”c‰MˆÝ•R”Y—^’^¥B¤J­r¬v°a©y¬y¸1©}¸aÑ$@Ô$@Àq�^ÑIÔI×MÒMÑOÔOÑPÔPÐPØ�D€A€qÝ••R”Y—^’^ A¨¡E°�^Ñ2Ô2×6Ò6Ñ8Ô8¸1Ñ<¸aÑ@Ô@ÑAÔAÐAr   é   c                 ó  —  | ¦   «          g }t          |¦  «        D ]H}t          j        ¦   «         } | ¦   «          |                     t          j        ¦   «         |z
  ¦  «         ŒIdt	          t          j        |¦  «        ¦  «        z  S )Nç     @�@)r.   r†   r‡   Úappendrš   r+   Úmedian)Úfr>   r5   r~   r�   s        r   Úmedr§   ²   s~   € Ø€A�C„C€CØ
€AÝ�1‰XŒXð +ð +ˆÝÔÑ Ô ˆØ	ˆ‰ŒˆØ	�Š•Ô"Ñ$Ô$ rÑ)Ñ*Ô*Ð*Ð*Ø••r”y ‘|”|Ñ$Ô$Ñ$Ð$r   Ú__main__Úmesh)Úforcec                  ój   — t                                d¦  «        t                                d¦  «        fS )Nr   )ÚV0rR   rQ   r   r   r   ú<lambda>r­   È   s   € �bŸfšf Q™iœi­¯ª°©¬Ð3€ r   c                  óJ   — t           j                             t          ¦  «        S ru   )Útrimeshr–   Úoriented_boundsr4   r   r   r   r­   r­   Ê   s   € �GœN×:Ò:½1Ñ=Ô=€ r   é   c                  óJ   — t           j                             t          ¦  «        S ru   )r¯   ÚnsphereÚminimum_nspherer4   r   r   r   r­   r­   Ì   s   € �GœO×;Ò;½AÑ>Ô>€ r   rE   c                  ó¾   — t           t          t           ¦  «        j                 } t          | t                               t          | ¦  «        ¦  «                 ¦  «        S ru   )r¬   rF   rI   rC   r‹   rŒ   r;   )ÚHvs    r   Úexact_spherer·   Ð   s<   € Ý•J�r‘N”NÔ+Ô,ˆBÝ˜b¥×!1Ò!1µ#°b±'´'Ñ!:Ô!:Ô;Ñ<Ô<Ð<r   r   r˜   g0¸D   ð?))rs   i   )rs   é   )é   r¸   Úcpu)ÚatomsÚlayersÚdevicec                  ó*   — t          t          ¦  «        S ru   )r–   rx   r   r   r   r­   r­   Ù   s   € ¥¥q¡	¤	€ r   c                 ó   — i | ]}|g “ŒS r   r   )r`   r   s     r   ú
<dictcomp>rÀ   Ú   s   € ÐFÐFÐF˜q�Q˜ÐFÐFÐFr   r�   é   )rŽ   r£   éd   )rƒ   r
   )r„   )r…   )Úobjr¼   r»   ÚdiagÚaabb_vol_ratioÚaabb_side_max_pctÚaabb_out_pctÚobb_vol_ratioÚobb_out_pctÚobb_vs_mesh_aabbÚref_obb_vs_aabbÚsphere_r_ratioÚsphere_out_pctÚtrimesh_sphere_vs_exactÚfcp_msc                 ó`   — i | ]+\  }}d |› d�t          t          j        |¦  «        ¦  «        “Œ,S )Úfcp_Ú_ms)rš   r+   r¥   ©r`   r   Úvs      r   rÀ   rÀ   ê   s7   € Ð%cÐ%cÐ%cÉTÈQÐPQ m¨Q m m mµU½2¼9ÀQ¹<¼<Ñ5HÔ5HÐ%cÐ%cÐ%cr   )Úmesh_aabb_msÚmesh_obb_msÚmesh_sphere_msÚmesh_sphere_exact_msÚvertsc                 ód   — i | ]-\  }}|t          |t          ¦  «        rt          |d ¦  «        n|“Œ.S )é   )Ú
isinstancerš   ÚroundrÓ   s      r   rÀ   rÀ   í   s9   € ÐYÐYÐYÁtÀqÈ!�1¥j°µEÑ&:Ô&:ÐA•u˜Q ‘{”{�{ÀÐYÐYÐYr   )Úflushz
bounds.csvF)Úindex)rr   rs   )rr   rs   N)NNN)r¡   r   )WÚ__doc__Úsysr†   ÚnumbaÚnumpyr+   Úargvr‚   r   r   Úfcp_hullr   r   Únjitr   r'   r9   rC   r]   ÚrandomÚdefault_rngr‹   rq   r   r–   r    r§   Ú__name__ÚpandasÚpdr¯   ÚfcpÚrowsÚitemsÚnameÚpathÚloadr4   r‰   rI   Úfloat64r¬   rš   r›   rœ   rQ   rR   rÄ   ÚT_aabbr°   ÚTobÚextÚT_obbr³   r´   Úsc0Úsr0ÚT_sphrH   rF   r·   Úsc_exÚsr_exÚT_sph_exr¼   r»   Úencoderx   rƒ   r„   ÚsphÚt_allÚpartsr.   r~   Úttr   r¤   Údictrd   r/   Úr_r;   r2   ÚprintÚ	DataFrameÚto_csvr   r   r   ú<module>r     s  ðð
ð 
ð €
€
€
Ø €€€à €€€Ø Ð Ð Ð àŒH�QŒK˜Ð€„Ø Ð Ð Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "ð €„�$ÐÑÔðQð Qñ ÔðQð €„�$ÐÑÔð'ð 'ñ Ôð'ð" €„�$ÐÑÔð!ð !ñ Ôð!ð, €„�$ÐÑÔðð ñ Ôðð@Xð Xð Xð 
„y×Ò˜QÑÔ€ð/ð /ð /ð.ð ð ð ðð ð ð ð"	Bð 	Bð 	Bð 	Bð%ð %ð %ð %ð ˆzÒÑØÐÐÐØ€N€N€Nà€J€J€Jà€DØ#�g”m‘o”oð *gñ *g‰
ˆˆdØˆGŒL˜ VÐ,Ñ,Ô,ˆØˆRŒZ˜œ
 B¤JÑ/Ô/ˆØˆu�R”Y—^’^ B§F¢F¨1¡I¤I°·²°q±	´	Ñ$9Ñ:Ô:Ñ;Ô;ˆà�Ð3Ð3Ñ4Ô4ˆØ”>×1Ò1°!Ñ4Ô4‰ˆˆSØ�Ð=Ð=¸qÑAÔAˆØ”?×2Ò2°1Ñ5Ô5‰ˆˆSØ�Ð>Ð>ÀÑBÔBˆà,Ð,Ð,Ð,Ð,Ð,ð	=ð 	=ð 	=ð $�|‘~”~‰ˆˆuØŒy�~Š~˜b 5™j¨qˆ~Ñ1Ô1×5Ò5Ñ7Ô7¸5ÀHÑ;MÒMÐMÐMÐMØ�3�|Ñ$Ô$ˆØDð 	gñ 	g‰MˆF�EØ�”
˜1 E°&ÀÐGÑGÔGˆAØ#˜V A™YœY‰NˆD�#�sØ�CÐ)Ð)Ñ*Ô*ˆEØFÐFÐ$EÐFÑFÔFˆEØ�U˜2‘Y”Yð 1ð 1�Ø�Ø��q Ð#Ñ#Ô#Ð#Øð 1ð 1�AØ˜!”H—O’O C¨"¨Q¬%¡KÑ0Ô0Ð0Ð0ð1à�ð A˜ f°EÀØ$) E¨'¨"¬'°$°q´'¸DÀ¼GÑ2CÑ*DÔ*DÀwÀrÄwÈrÏvÊvÐVWÉyÌyÐ[]×[aÒ[aÐbcÑ[dÔ[dÑOdÑGeÔGeÑ*eÑ$fÔ$fØ'*¨U¨U°6°2´6¸"¼%ÀÀQÄÈ"Ï&Ê&ÐQRÉ)Ì)Ñ@SÐUYÐZ[ÔU\Ð_a×_eÒ_eÐfgÑ_hÔ_hÑUhÐ@hÔ:iÑ3jÔ3j×3nÒ3nÑ3pÔ3pÑ-qÔ-qÑ'qÐtxÑ'xØ"%¨¨°¸Ð(>Ñ(>Ô(>Ñ">ÀÑ"EØ#( 5¨¨¬°°S¸´V±Ñ)<Ô)<¸w¸r¼wÀs¹|¼|Ñ)KÑ#LÔ#LØ!$ w w¨r°sÐ';Ñ';Ô';Ñ!;¸dÑ!BØ&+ e¨G¨B¬G°A¸¸A¼±JÑ,?Ô,?À'À"Ä'È"Ï&Ê&ÐQRÉ)Ì)ÐVX×V\ÒV\Ð]^ÑV_ÔV_ÑJ_ÑB`ÔB`Ñ,`Ñ&aÔ&aØ%* U¨7¨2¬7°3©<¬<¸'¸"¼'À"Ç&Â&ÈÁ)Ä)ÈbÏfÊfÐUVÉiÌiÑBWÑ:XÔ:XÑ+XÑ%YÔ%YØ$'¨¤F¨U¡NÀ3ÈÈÐQSÐ\_ÐI`ÑI`ÔI`ÑC`ÐcgÑCgØ-0°5©[Ø!ðAð Að &dÐ%cÐUZ×U`ÒU`ÑUbÔUbÐ%cÑ%cÔ%cðAð #)°eÈEÐhpÐx{Ðx{Ð|~ÑxÔxðAð Að Að AˆAð �KŠK˜‰NŒNˆNØˆEÐYÐYÈqÏwÊwÉyÌyÐYÑYÔYÐaeÐfÑfÔfÐfÑfñ/	gð0 €B„L�ÑÔ×Ò˜c LÑ0¸ÐÑ>Ô>Ð>Ð>Ð>ðe Ðr   