§
    'yâj³  ã                   óœ  — d Z ddlZddlZddlZddlmZ ddlZddlZddl	m
Z
 ej                             d e ee¦  «        j        ¦  «        ¦  «         ddlmZmZmZmZmZmZ ddlZddlmZ ddlmZmZ edz  Zg d	¢Zd
Zej        Z  ej!        ddej"        z  ed¬¦  «        Z#d„ Z$d„ Z%d„ Z&dd„Z'e e'dœZ(d„ Z)e*dk    r e)¦   «          dS dS )aÝ  tracked-fit with one change: a fit follows its part when every ring's shape is within the tolerance (nearest-point RMS
between the fitted ring and the sliced ring, both ways), not its coefficients (which also count the ring's start sliding
along it, a tangential drift that moves no surface; report: "Why the elephant is cut so much"). Tracking, the cut search,
the step rule, FIT_TOL, FIT_MIN and FIT_GAIN unchanged; plugged in through split_by_fit's `follows` (no package change).
Meshes only, default cap (KAPPA 1e2, M 24). Writes ../report/shape_test.csv and renders ../report/img/<object>_shape-fit_*.png.

    env -u PYTHONPATH PYTHONWARNINGS=ignore .venv/bin/python ~/code/data/meshes/fcp_2810_partition/scripts/shape_test.py
é    N)ÚPath)ÚcKDTree)ÚBUDGETSÚDEVICEÚOBJÚREPORTÚUPÚRef)Ú_parts)ÚIMGÚrenderzshape_test.csv)
ÚobjectÚtestÚatomsÚpartsÚmean_lenÚchamferÚp95Ún_meanÚn_over30Úsecondsé   é   F)Úendpointc           
      óB  — | j         d         }t          j        d|dz
  dz  dz   ¦  «        }t          j        t          j        dt
          f¦  «        t          j        |dd…df         t          z  ¦  «        t          j        |dd…df         t          z  ¦  «        g¦  «        }t          j	        dddt          j        t          |¦  «        ¦  «        z  z   ddt          j        t          |¦  «        ¦  «        z  z   f         }t          j        d| d|f         |¦  «        S )z9(R, 2, K) Fourier coefficients -> (R, NT, 2) ring points.éÿÿÿÿé   r   Nr   zrck,kt->rtc.)ÚshapeÚnpÚarangeÚconcatenateÚonesÚNTÚcosÚ_tÚsinÚr_ÚlenÚeinsum)ÚCÚKÚkÚBÚorders        úD/home/joao/code/data/meshes/fcp_2810_partition/scripts/shape_test.pyÚringsr0      sç   € à	Œ�Œ€AÝ
Œ	�!�a˜!‘e ‘\ AÑ%Ñ&Ô&€AÝ
Œ�œ ¥B Ñ(Ô(­"¬&°°1°1°1°d°7´½b±Ñ*AÔ*AÅ2Ä6È!ÈAÈAÈAÈtÈGÌ*ÕWYÉ/ÑCZÔCZÐ[Ñ\Ô\€AÝŒE�!�Q˜�RœY¥s¨1¡v¤vÑ.Ô.Ñ.Ñ.°°A½¼	Å#ÀaÁ&Ä&Ñ8IÔ8IÑ4IÑ0IÐIÔJ€EÝŒ9�] A c¨5 j¤M°1Ñ5Ô5Ð5ó    c                 óp  — t          |¦  «                             | ¦  «        d         }t          j        t	          | ¦  «        t          j        ¦  «        }dD ]Þ}|||z   t	          |¦  «        z           |||z   dz   t	          |¦  «        z           }}||z
  }t          j        t          j        d| |z
  |¦  «        t          j        t          j        d||¦  «        d¦  «        z  dd¦  «        }t          j	        |t          j
                             | |z
  |dd…df         |z  z
  d¬¦  «        ¦  «        }Œß|S )zËDistance of each point P to the closed polyline Q: its nearest vertex's two segments (the nearest vertex alone
    leaves a floor of up to half a sample spacing, as large as the tolerance on a big ring).r   )r   r   zij,ij->ig ÂëþKH´9r   N)Úaxis)r   Úqueryr   Úfullr(   ÚinfÚclipr)   ÚmaximumÚminimumÚlinalgÚnorm)	ÚPÚQÚjÚdÚsÚaÚbÚabÚus	            r/   Úto_polylinerE   (   s  € õ 	�‰
Œ
×Ò˜ÑÔ˜AÔ€AÝ
Œ•�A‘”�œÑÔ€AØð Kð KˆØ�!�a‘%�3˜q™6œ6Ñ!Ô" A q¨1¡u¨q¡yµC¸±F´FÑ&:Ô$;ˆ1ˆØ�‰UˆÝŒG•B”I˜j¨!¨a©%°Ñ4Ô4µr´zÅ"Ä)ÈJÐXZÐ\^ÑB_ÔB_ÐafÑ7gÔ7gÑgÐijÐlmÑnÔnˆÝŒJ�q�"œ)Ÿ.š.¨¨Q©°°1°1°1°d°7´¸b±Ñ)@Àq˜.ÑIÔIÑJÔJˆˆØ€Hr1   c                 óH  — t          j        t          | ¦  «        ¦  «        }t          t	          | |¦  «        ¦  «        D ]b\  }\  }}t          j        t          j        t           j        t          ||¦  «        t          ||¦  «        f         dz  ¦  «        ¦  «        ||<   Œc|S )zoPer ring: RMS distance between rings A and B (R, NT, 2), each one's samples to the other's polyline, both ways.r   )	r   Úemptyr(   Ú	enumerateÚzipÚsqrtÚmeanr'   rE   )ÚAr-   ÚoutÚrr<   r=   s         r/   Ú
shape_missrO   5   sŠ   € å
Œ(•3�q‘6”6Ñ
Ô
€CÝ�s 1 a™yœyÑ)Ô)ð Tð T‰	ˆ‰6ˆAˆqÝ”�œ¥¤¥{°1°aÑ'8Ô'8½+ÀaÈÑ:KÔ:KÐ'KÔ!LÐPQÑ!QÑRÔRÑSÔSˆˆA‰ˆØ€Jr1   c                 ót   ‡‡— ‰€t           j        n‰Šd„ |D ¦   «         Šˆˆfd„}t          | |||‰|¬¦  «        S )Nc                 ó\   — g | ])}t          t          j        |t          ¦  «        ¦  «        ‘Œ*S © )r0   r   ÚasarrayÚfloat)Ú.0r*   s     r/   ú
<listcomp>zshape_split.<locals>.<listcomp>?   s,   € Ð:Ð:Ð:¨a�e•B”J˜q¥%Ñ(Ô(Ñ)Ô)Ð:Ð:Ð:r1   c           	      ó¶   •— t          ‰|          ||…         t          t          j        |t          ¦  «        ¦  «        ¦  «                             ¦   «         ‰k    S )N)rO   r0   r   rS   rT   Úmax)ÚirA   rB   ÚCfÚslicedÚtols       €€r/   Úfollows_shapez"shape_split.<locals>.follows_shapeA   sE   ø€ Ý˜& œ) A a Cœ.­%µ´
¸2½uÑ0EÔ0EÑ*FÔ*FÑGÔG×KÒKÑMÔMÐQTÒTÐTr1   )Úfollows)r   ÚFIT_TOLÚ_split)r   ÚcoeffsÚareasÚMr\   r^   r]   r[   s       `  @r/   Úshape_splitrd   =   sg   øø€ Ø˜K�&Œ.ˆ.¨S€CØ:Ð:°6Ð:Ñ:Ô:€FðUð Uð Uð Uð Uð Uõ �%˜ ¨¨3¸ÐFÑFÔFÐFr1   )Úcoefr   c                  ó–  — t          j        dd¬¦  «         t                               dd¬¦  «        5 } t	          j        | ¦  «        }|                     t          ¦  «         t          j	        ¦   «         D �]9\  }}t          j        |d¬¦  «        }t          |¦  «        }t           	                    ¦   «         D �]ó\  }}|t          _        t!          j        ¦   «         }t%          j        |t)          t*          ¦  «        t,          dt.          ¬	¦  «        }	t!          j        ¦   «         |z
  }
t0          t          _        d
„ |	j        D ¦   «         }t*          D �]}t%          j        |	                     |¦  «        t.          ¬¦  «        }|                     |||t9          |	j        ¦  «        t;          t=          t?          j         |¦  «        ¦  «        d¦  «        gd„ | !                    |¦  «        D ¦   «         ¢t;          |
d¦  «        ‘¦  «         |dk    rR|dv rNtE          |	                     |¦  «        |t           |› d|› d�z  |› d|› dt9          |	j        ¦  «        › d�¦  «         �Œ|  #                    ¦   «          tI          |d›d|d›dt9          |	j        ¦  «        d›d|
d›d�d¬¦  «         �Œõ�Œ;	 d d d ¦  «         d S # 1 swxY w Y   d S )NT)ÚparentsÚexist_okÚwÚ )ÚnewlineÚmesh)Úforceztracked-fit)r   Úupr   Údevicec                 ó&   — g | ]\  }}}||z
  d z   ‘ŒS )r   rR   )rU   Ú_Úh0Úh1s       r/   rV   zmain.<locals>.<listcomp>X   s&   € Ð=Ð=Ð=©	¨¨2¨r˜˜R™ !™Ð=Ð=Ð=r1   )ro   r   c                 óH   — g | ]}t          t          |¦  «        d ¦  «        ‘Œ S )é   )ÚroundrT   )rU   Úvs     r/   rV   zmain.<locals>.<listcomp>\   s(   € Ð!MÐ!MÐ!M¸¥%­¨a©¬°!Ñ"4Ô"4Ð!MÐ!MÐ!Mr1   é   r   )i   i   z_shape-fit_k100_M24_az.pngu)   : tracked-fit, shape test, Îº 100, M 24, z atoms, z partsÚ16sÚ Ú6sz parts=Ú3dz.2fz s)Úflush)%r   ÚmkdirÚOUTÚopenÚcsvÚwriterÚwriterowÚFIELDSr   ÚitemsÚtrimeshÚloadr
   ÚTESTSr   Úsplit_by_fitÚtimeÚperf_counterÚfcpÚencoderX   r   r	   r   r`   r   ÚdecodeÚprefixr(   rv   rT   r   rK   Úmeasurer   r}   Úprint)Úfri   ÚnameÚpathÚgÚrefr   ÚfnÚtr?   ÚsecÚlensÚTÚms                 r/   Úmainr�   J   s  € Ý„I�d TÐ*Ñ*Ô*Ð*Ý	�Š�#˜rˆÑ	"Ô	"ð _ aÝŒJ�q‰MŒMˆØ	�
Š
•6ÑÔÐÝœ)™+œ+ð 	_ñ 	_‰JˆD�$Ý”˜T¨Ð0Ñ0Ô0ˆAÝ�a‘&”&ˆCÝ!ŸKšK™MœMð _ñ _‘��bØ&(•Ô#ÝÔ%Ñ'Ô'�Ý”J˜q­­G©¬½À=ÕY_Ð`Ñ`Ô`�ÝÔ'Ñ)Ô)¨AÑ-�Ý&,•Ô#Ø=Ð=°Q´WÐ=Ñ=Ô=�Ý ð rñ r�AÝœ
 1§8¢8¨A¡;¤;µvÐ>Ñ>Ô>�AØ—J’J  d¨A­s°1´7©|¬|½UÅ5ÍÌÐQUÉÌÑCWÔCWÐYZÑ=[Ô=[ð  ^Ø!MÐ!M¸c¿kºkÈ!¹n¼nÐ!MÑ!MÔ!Mð ^ÝOTÐUXÐZ[É}Ì}ð ^ñ _ô _ð _à˜w’�¨1°Ð+<Ð+<Ý˜qŸxšx¨™{œ{¨A­s¸Ð5ZÐ5ZÐSTÐ5ZÐ5ZÐ5ZÑ/ZØ"&ÐpÐpÐQRÐpÐpÕ\_Ð`aÔ`gÑ\hÔ\hÐpÐpÐpñrô rð rùà—’‘	”	�	Ý˜ÐQÐQÐQ DÐQÐQÐQµC¸¼±L´LÐQÐQÐQÀcÐQÐQÐQÐQÐY]Ð^Ñ^Ô^Ð^Ñ^ñ_ð	_ð_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _ð _ð _s   ³I=J>Ê>KËKÚ__main__)NN)+Ú__doc__r�   ÚsysrŠ   Úpathlibr   Únumpyr   r†   Úscipy.spatialr   r”   ÚinsertÚstrÚ__file__ÚparentÚdegree_sweepr   r   r   r   r	   r
   rŒ   r   Úrendersr   r   r   r„   r#   r‰   r`   ÚlinspaceÚpir%   r0   rE   rO   rd   rˆ   r�   Ú__name__rR   r1   r/   ú<module>r­      sÀ  ððð ð €
€
€
Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !à „‡‚��3�3�t�t˜H‘~”~Ô,Ñ-Ô-Ñ .Ô .Ð .Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð àÐÑ€Ø	lÐ	lÐ	l€Ø€Ø	Ô	€Ø€R„[��A˜œ‘I˜r¨EÐ2Ñ2Ô2€ð6ð 6ð 6ð
ð 
ð 
ðð ð ðGð Gð Gð Gð  +Ð.Ð.€ð_ð _ð _ð4 ˆzÒÐØ€D�F„F€F€F€Fð Ðr1   