§
    û‰áj�)  ã                   ó†  — d Z ddlZddlZddlZddlmZ ddlZ ej        d¦  «         ddlm	Z
 ddlZddlZddlmZ ddlm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 d	Zd
Z dZ!dZ"edz  Z#d„ Z$d„ Z%dd„Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+e,dk    r e*¦   «          dS dS )a²  Noisy versions of the report's meshes, topology kept: ../meshes/<name>_noise<pct>.ply for sigma = 0.2, 0.6, 1 % of the
bounding-box diagonal, and ../report/noisy.html (a validation table and renders).

Each mesh is first subdivided to edges of at most MAX_EDGE of the diagonal (same shape: a coarse mesh would otherwise
only move its few big faces). Every vertex x then moves by u(x), a smooth random 3D vector field: per component, white
noise on a grid Gaussian-filtered to a correlation length of CORR sigma, read at the vertices (trilinear), scaled to a
standard deviation of sigma (so the displacement along any direction, the normal included, has std sigma). The
correlation length is raised until the field's largest gradient (Frobenius norm over the grid, an upper bound of its
Lipschitz constant) is below LIP: then x -> x + u(x) is one-to-one in all of space, so the surface cannot cross itself
or turn a face over, and a thin wall moves as a whole. Faces are unchanged (same connectivity, watertight). Checked:
no face turned over, and the exact sections at the 128 layer centres along up are simple rings.

Tried first and dropped: per-vertex noise along the normal folds faces at this size, and noise along the normal (even
smooth) makes surfaces cross at sharp edges: a wall moving in and the floor next to it moving up meet.

    env -u PYTHONPATH PYTHONWARNINGS=ignore .venv/bin/python ~/code/data/meshes/fcp_2710_tests/scripts/make_noisy.py
é    N)ÚPathÚAgg)ÚPoly3DCollection)Úndimage)Ú
LinearRing)ÚCSSÚOBJÚREPORTÚROOTÚUP)gü©ñÒMb`?gú~j¼t“x?g{®Gáz„?g{®Gázt?g      @gš™™™™™é?Úmeshesc                 ó8   — d| z  d›                      dd¦  «        S )Néd   Úgú.Úp)Úreplace)Úss    ú@/home/joao/code/data/meshes/fcp_2710_tests/scripts/make_noisy.pyÚlabelr   *   s    € Ø�A‰gˆ>ˆ>×!Ò! # sÑ+Ô+Ð+ó    c                 ó(  — t          j        | |d d …df                  | |d d …df                  z
  | |d d …df                  | |d d …df                  z
  ¦  «        }|t          j        t           j                             |dd¬¦  «        d¦  «        z  S )Né   r   é   T)ÚaxisÚkeepdimsgYóøÂn¥)ÚnpÚcrossÚmaximumÚlinalgÚnorm)ÚVÚFÚns      r   Úface_normalsr%   .   sˆ   € Ý
Œ��1�Q�Q�Q˜�T”7”˜a  ! ! ! Q $¤œjÑ(¨!¨A¨a¨a¨a°¨d¬G¬*°q¸¸1¸1¸1¸a¸4¼´zÑ*AÑBÔB€AØ�rŒz�"œ)Ÿ.š.¨°¸T˜.ÑBÔBÀFÑKÔKÑKÐKr   é€   c                 ó²  — t          j        |t          ¦  «        }| j        |z  }|                     ¦   «         |                     ¦   «         }}|t          j        |¦  «        dz   ||z
  z  |z  z   }|                      ||z  |||z
  ¬¦  «        }dx}}	|D ]@}
|
€Œ|
j        D ]3}t          |¦  «        dk     rŒ|dz  }|	t          |¦  «        j         z  }	Œ4ŒA||	fS )zU(rings, rings that self-cross) over the exact sections at the layer centres along up.g      à?)Úplane_originÚplane_normalÚheightsr   Né   r   )r   ÚasarrayÚfloatÚverticesÚminÚmaxÚarangeÚsection_multiplaneÚdiscreteÚlenr   Ú	is_simple)ÚmeshÚupÚlayersÚhÚloÚhiÚzsÚsecr$   Úbadr   ÚLs               r   Úsections_okr@   3   sø   € å	Œ�B�Ñ	Ô	€BØŒ˜Ñ€AØ�UŠU‰WŒW�a—e’e‘g”gˆ€BØ	�rŒy˜Ñ Ô  3Ñ&¨2°©7Ñ3°fÑ<Ñ	<€BØ
×
!Ò
!¨r°B©wÀRÐQSÐVXÑQXÐ
!Ñ
YÔ
Y€CØ€K€AˆØð /ð /ˆØˆ9ØØ”ð 	/ð 	/ˆAÝ�1‰vŒv˜ŠzˆzØØ�‰FˆAØ•z !‘}”}Ô.Ð.Ñ.ˆCˆCð		/ð
 ˆcˆ6€Mr   c                 óD  ‡ ‡‡‡‡‡‡	— ‰dz  Š‰                       d¦  «        d‰z  z
  Št          t          j        ‰                      d¦  «        d‰z  z   ‰z
  ‰z  ¦  «                             t          ¦  «        dz   ¦  «        Š	ˆˆˆˆ	fd„t          d¦  «        D ¦   «         }ˆfd„|D ¦   «         }t          t          j	        t          ˆfd„|D ¦   «         ¦  «        ¦  «                             ¦   «         ¦  «        }t          j        ˆ ˆˆfd„|D ¦   «         d¦  «        }||fS )z²u at the points V: a smooth random 3D field, each component of standard deviation std, Gaussian correlation
    `length`; and its largest gradient (Frobenius norm over the grid).é   r   r   c                 ó¤   •— g | ]L}t          j        ‰                     ‰¦  «                             t          j        ¦  «        ‰‰z  d ¬¦  «        ‘ŒMS )Úwrap)ÚsigmaÚmode)r   Úgaussian_filterÚstandard_normalÚastyper   Úfloat32)Ú.0Ú_r9   ÚlengthÚrngÚshapes     €€€€r   ú
<listcomp>z vector_field.<locals>.<listcomp>L   sa   ø€ ð 	ð 	ð 	Øõ 
Ô	  ×!4Ò!4°UÑ!;Ô!;×!BÒ!BÅ2Ä:Ñ!NÔ!NÐV\Ð_`ÑV`ÐgmÐ	nÑ	nÔ	nð 	ð 	ð 	r   c                 óD   •— g | ]}|‰|                      ¦   «         z  z  ‘ŒS © )Ústd)rK   r   rS   s     €r   rP   z vector_field.<locals>.<listcomp>N   s*   ø€ Ð(Ð(Ð( ˆˆc�A—E’E‘G”G‰mÑ	Ð(Ð(Ð(r   c              3   óR   •K  — | ]!}t          j        |‰¦  «        D ]	}|d z  V — Œ
Œ"dS )r   N)r   Úgradient)rK   r   Úgrr9   s      €r   ú	<genexpr>zvector_field.<locals>.<genexpr>O   s@   øè è € ÐKÐK¨½¼ÀQÈÑ9JÔ9JÐKÐK°2˜B !™GÐKÐKÐKÐKÐKÐKÐKr   c                 óT   •— g | ]$}t          j        |‰‰z
  ‰z  j        d ¬¦  «        ‘Œ%S )r   )Úorder)r   Úmap_coordinatesÚT)rK   r   r"   r9   r:   s     €€€r   rP   z vector_field.<locals>.<listcomp>P   s6   ø€ ÐSÐSÐSÈA•'Ô)¨!¨q°2©v¸©lÔ-=ÀQÐGÑGÔGÐSÐSÐSr   )r/   Útupler   Úceilr0   rI   ÚintÚranger-   ÚsqrtÚsumÚstack)
r"   rS   rM   rN   ÚGÚlipÚur9   r:   rO   s
   ````   @@@r   Úvector_fieldrf   F   s@  øøøøøøø€ ð 	�‰
€AØ	
�Šˆq‰Œ�A˜‘JÑ	€BÝ•"”'˜1Ÿ5š5 ™8œ8 a¨&¡jÑ0°2Ñ5¸Ñ:Ñ;Ô;×BÒBÅ3ÑGÔGÈ!ÑKÑLÔL€Eð	ð 	ð 	ð 	ð 	ð 	ð 	Ý˜‘(”(ð	ñ 	ô 	€Aà(Ð(Ð(Ð( aÐ(Ñ(Ô(€AÝ
•”�ÐKÐKÐKÐK¨QÐKÑKÔKÑKÔKÑLÔL×PÒPÑRÔRÑ
SÔ
S€CÝ
ŒÐSÐSÐSÐSÐSÐSÐQRÐSÑSÔSÐUVÑWÔW€AØˆcˆ6€Mr   c           	      ój  — t           |z  |z  }	 t          | j        ||z  ||¦  «        \  }}|t          k     rn|dz  }Œ/ddlm} ddlm} | j        | j	        | j
        }}
}	|                     ¦   «         t          j        t          |¦  «        t          ¦  «        }}t          | j        |z   |	¦  «        |
z                       d¦  «        dk    x}                     ¦   «         �rbd||	|                              ¦   «         <   |||dd…df                  ||dd…df                  z           } | |t          j        t          |¦  «        ¦  «        |dd…df         |dd…df         fft          |¦  «        fdz  ¬	¦  «        d
¬¦  «        \  }}|                     ¦   «         }t          j        ||         ¦  «        D ]A}t          j        |||k    z  ¦  «        d         }||                              d¦  «        ||<   ŒBt          | j        |z   |	¦  «        |
z                       d¦  «        dk    x}                     ¦   «         �°b| j        |z   }t/          t          ||	¦  «        |
z                       d¦  «        dk                         ¦   «         ¦  «        }t1          j        ||	d
¬¦  «        |||z  ||fS )zo(noisy mesh, displacements u, correlation length used / diag, the field's largest gradient, faces turned over).Tg      ô?r   )Ú
coo_matrix)Úconnected_componentsr   Nr   )rO   F)Údirected©Úprocess)ÚCORRrf   r.   ÚLIPÚscipy.sparserh   Úscipy.sparse.csgraphri   Úfacesr%   Úedges_uniqueÚcopyr   Úzerosr4   Úboolra   ÚanyÚravelÚonesÚuniqueÚnonzeroÚmeanr^   ÚtrimeshÚTrimesh)r6   rE   ÚdiagrN   rM   re   rd   rh   ri   r#   Ún0ÚEÚu0ÚSÚtÚerL   ÚlabÚcÚvsr"   Úturneds                         r   Únoisyr‰   T   s±  € å�E‰\˜DÑ €FðÝ˜dœm¨U°T©\¸6À3ÑGÔG‰ˆˆ3Ø•Š9ˆ9ØØ�$‰ˆð	ð
 (Ð'Ð'Ð'Ð'Ð'Ø9Ð9Ð9Ð9Ð9Ð9àŒz˜4Ô,¨dÔ.?ˆ1€r€Að �FŠF‰HŒH•b”h�s 1™vœv¥tÑ,Ô,ˆ€BÝ˜dœm¨aÑ/°Ñ3Ô3°bÑ8×=Ò=¸aÑ@Ô@ÀAÒEÐEˆ1×
JÒ
JÑ
LÔ
Lñ #Øˆˆ!ˆAŒ$�*Š*‰,Œ,‰Øˆa��!�!�!�Q�$”Œj˜1˜Q˜q˜q˜q !˜tœWœ:Ñ%Ô&ˆØ%Ð% j jµ"´'½#¸a¹&¼&±/´/ÀAÀaÀaÀaÈÀdÄGÈQÈqÈqÈqÐRSÈtÌWÐCUÐ1VÕ_bÐcdÑ_eÔ_eÐ^gÐjkÑ^kÐ&lÑ&lÔ&lÐw|Ð}Ñ}Ô}‰ˆˆ3Ø�GŠG‰IŒIˆÝ”˜3˜qœ6Ñ"Ô"ð 	#ð 	#ˆAÝ”˜A ¨¢™NÑ+Ô+¨AÔ.ˆBØ�r”F—K’K ‘N”NˆAˆb‰EˆEõ ˜dœm¨aÑ/°Ñ3Ô3°bÑ8×=Ò=¸aÑ@Ô@ÀAÒEÐEˆ1×
JÒ
JÑ
LÔ
Lñ #ð 	Œ˜Ñ€AÝ•<  1Ñ%Ô%¨Ñ*×/Ò/°Ñ2Ô2°aÒ7×<Ò<Ñ>Ô>Ñ?Ô?€FÝŒ?˜1˜a¨Ð/Ñ/Ô/°°F¸T±MÀ3ÈÐNÐNr   c           
      ó   — t          j        dt          | ¦  «        z  dfd¬¦  «        }t          j        g d¢¦  «        }|t          j                             |¦  «        z  }| d         j        }|                     d¦  «        | 	                    d¦  «        }}||z   dz  ||z
   	                    ¦   «         dz  }	}t          t          | |¦  «        ¦  «        D �]h\  }
\  }}|                     dt          | ¦  «        |
dz   d	d
¬¦  «        }|j        }ddt          j        ||z  ¦  «        z  z   }|                     t!          |j        t          j        |||f         g d¢z  dd¬¦  «        ¦  «         |                     |d         |	z
  |d         |	z   ¦  «         |                     |d         |	z
  |d         |	z   ¦  «         |                     |d         |	z
  |d         |	z   ¦  «         |                     d¦  «         |                     ¦   «          |                     dd¦  «         |                     |d¬¦  «         �Œj|                     ¦   «          |                     |¦  «         t          j        |¦  «         d S )Nr+   gš™™™™™@r   )ÚfigsizeÚdpi)gÍÌÌÌÌÌÜ?g333333ã¿gÍÌÌÌÌÌä?r   r   r   Ú3dÚortho)Ú
projectionÚ	proj_typeg      Ð?ç      è?)g333333ë?g=
×£p=ê?r‘   Únone)Ú
facecolorsÚ
edgecolorsÚ
linewidths)r   r   r   é   iÄÿÿÿé	   )Úfontsize)ÚpltÚfigurer4   r   Úarrayr    r!   r.   r/   r0   Ú	enumerateÚzipÚadd_subplotr%   ÚabsÚadd_collection3dr   Ú	trianglesÚc_Úset_xlimÚset_ylimÚset_zlimÚset_box_aspectÚset_axis_offÚ	view_initÚ	set_titleÚtight_layoutÚsavefigÚclose)r   ÚtitlesÚpathÚfigÚlightÚallvr:   r;   ÚmÚrÚkr6   rƒ   ÚaxÚfnÚshades                   r   Úrenderr¸   q   s_  € Ý
Œ*˜a¥# f¡+¤+™o¨sÐ3¸Ð
=Ñ
=Ô
=€CÝŒHÐ'Ð'Ð'Ñ(Ô(€E¨%µ2´9·>²>À%Ñ3HÔ3HÑ*H¨%Ø�!Œ9Ô€DØ�XŠX�a‰[Œ[˜$Ÿ(š( 1™+œ+ˆ€BØ�‰G�q‰=˜2 ™7Ÿ-š-™/œ/¨AÑ-€q€AÝ!¥# f¨fÑ"5Ô"5Ñ6Ô6ð $ñ $‰ˆ‰9ˆD�!Ø�_Š_˜Q¥ F¡¤¨Q°©U¸tÈwˆ_ÑWÔWˆØÔˆØ�t�bœf R¨%¡ZÑ0Ô0Ñ0Ñ0ˆØ
×ÒÕ,¨T¬^ÍÌÈeÐUZÐ\aÐNaÔHbÐewÐewÐewÑHwØ8>È1ðNñ Nô Nñ 	Oô 	Oð 	Oà
�Š�A�a”D˜1‘H˜a œd Q™hÑ'Ô'Ð'¨¯ª°Q°q´T¸A±X¸qÀ¼tÀa¹xÑ)HÔ)HÐ)HÈ"Ï+Ê+ÐVWÐXYÔVZÐ]^ÑV^Ð`aÐbcÔ`dÐghÑ`hÑJiÔJiÐJiØ
×Ò˜)Ñ$Ô$Ð$ b§o¢oÑ&7Ô&7Ð&7¸¿ºÀbÈ#Ñ9NÔ9NÐ9NØ
�Š�Q ˆÑ#Ô#Ð#Ñ#Ø×ÒÑÔÐØ‡K‚K�ÑÔÐÝ„Iˆc�N„N€N€N€Nr   c                  óò  ‡— t                                d¬¦  «         g } t          j        ¦   «         D �](\  }}t	          j        ¦   «         }t          j        |d¬¦  «        }t          t          j
                             |j        ¦  «        ¦  «        }t          j                             |j        |j        t"          |z  d¬¦  «        \  }}t          j        ||d¬¦  «        }|j        r|j        s
J |¦   «         ‚|j        }	t-          j        |d¦  «        }
t1          ||
¦  «        \  }}|gd	t3          |j        ¦  «        d
›d�g}}t5          t6          ¦  «        D �]µ\  }}t9          |||t          j                             d|z   ¦  «        ¦  «        \  }}}}}|                     t           |› dtA          |¦  «        › d�z  ¦  «         t1          ||
¦  «        \  }}||	z   !                    d¦  «        }tE          ||t3          |j        ¦  «        tG          |j        ¦  «        t          |j$        |j$        z  ¦  «        t          | %                    ¦   «         |z  ¦  «        |||||||¬¦  «        }|  &                    |¦  «         | &                    |¦  «         | &                    dd|z  d›dd|d         z  d›d�¦  «         tO          |d›dd|z  d›dd|d         z  d›dd|z  d›d|d›d |› d!|› d"|› d#|› d"|› d$|d%         d&›�d¬'¦  «         �Œ·tQ          ||tR          d(|› d)�z  ¦  «         tO          d*|› d+t	          j        ¦   «         |z
  d›d,�d¬'¦  «         �Œ*t           d-z  }d.„ | D ¦   «         Š| *                    ¦   «         r2ˆfd/„tW          j,        | -                    ¦   «         ¦  «        D ¦   «         ng }|| z   } | .                    tW          j/        | d¬0¦  «        ¦  «         ta          | ¦  «         d S )1NT)Úexist_okr6   )Úforceé   )Úmax_iterrk   )r   r   r   zclean (subdivided, ú,z faces)iè  Ú_noisez.plyr   )ÚnamerE   rq   Ú
watertightÚvolume_ratiorS   Úcorrrd   rˆ   ÚringsÚrings_cleanÚ	bad_ringsÚ	bad_cleanu   Ïƒ = r   r   z % diag (along the normal rS   ú.2fz %)Ú16sz sigma z4.1fz%  normal std ú.3fz%  corr ú.1fz%  lip z	  turned z  self-crossing rings ú/z (clean z)  vol rÂ   ú.4f)Úflushz
img/noisy_z.pngz  z: z sznoisy_meshes.jsonc                 ó   — h | ]
}|d          ’ŒS )rÀ   rR   ©rK   r³   s     r   ú	<setcomp>zmain.<locals>.<setcomp>¤   s   € Ð$Ð$Ð$˜!ˆAˆfŒIÐ$Ð$Ð$r   c                 ó@   •— g | ]}|d          ‰v¯|d          dk    ¯|‘ŒS )rÀ   Úloaf_panrR   )rK   r³   Údones     €r   rP   zmain.<locals>.<listcomp>¥   s7   ø€ Ð
fÐ
fÐ
f�°A°f´IÀTÐ4IÐ4IÈaÐPVÌiÐ[eÒNeÐNeˆ1ÐNeÐNeÐNer   )Úindent)1ÚOUTÚmkdirr	   ÚitemsÚtimeÚperf_counterr|   Úloadr-   r   r    r!   ÚextentsÚremeshÚsubdivide_to_sizer.   rq   ÚMAX_EDGEr}   Úis_watertightÚis_winding_consistentÚvertex_normalsr   Úgetr@   r4   rœ   ÚSIGMASr‰   ÚrandomÚdefault_rngÚexportr   ra   Údictru   ÚvolumerS   ÚappendÚprintr¸   r
   ÚexistsÚjsonÚloadsÚ	read_textÚ
write_textÚdumpsÚ
write_html)ÚrowsrÀ   r   Út0r   r~   ÚvÚfÚbaser$   r7   Úr0Úb0r   r­   Úir   r²   re   rÃ   rd   rˆ   rÄ   r>   ÚdÚrowÚjsÚoldrÔ   s                               @r   Úmainrÿ   …   su  ø€ Ý‡I‚I�t€IÑÔÐØ€DÝ”9‘;”;ð Iñ I‰ˆˆaÝÔÑ Ô ˆÝŒL˜ &Ð)Ñ)Ô)ˆÝ•R”Y—^’^ A¤IÑ.Ô.Ñ/Ô/ˆÝŒ~×/Ò/°´
¸A¼GÅXÐPTÁ_Ð_aÐ/ÑbÔb‰ˆˆ1ÝŒ˜q !¨TÐ2Ñ2Ô2ˆØÔ!ÐF dÔ&@ÐFÐFÀ$ÑFÔFÐ@ØÔˆÝŒV�D˜)Ñ$Ô$ˆÝ˜T 2Ñ&Ô&‰ˆˆBØ˜Ð"R½¸D¼J¹¼Ð"RÐ"RÐ"RÐ"RÐ!S�ˆÝ�fÑ%Ô%ð 	@ñ 	@‰DˆAˆqÝ&+¨D°!°T½2¼9×;PÒ;PÐQUÐXYÑQYÑ;ZÔ;ZÑ&[Ô&[Ñ#ˆAˆq�$˜˜VØ�HŠH•S˜dÐ8Ð8­%°©(¬(Ð8Ð8Ð8Ñ8Ñ9Ô9Ð9Ý$ Q¨Ñ+Ô+‰JˆE�3Ø�Q‘—’˜A‘”ˆAÝ˜D¨µ°Q´W±´Í$ÈqÌÑJ_ÔJ_Ý$)¨!¬(°T´[Ñ*@Ñ$AÔ$AÅuÈQÏUÊUÉWÌWÐW[É^ÑG\ÔG\ÐcgÐmpØ$¨E¸rÈSÐ\^ð`ñ `ô `ˆCð �KŠK˜ÑÔÐØ�MŠM˜!ÑÔÐØ�MŠMÐ` #¨¡'Ð`Ð`Ð`ÀsÈSÐQVÌZÑGWÐ`Ð`Ð`Ð`ÑaÔaÐaÝ�TÐsð 3ð 3 c¨A¡gÐsð 3ð 3À#ÈÈEÌ
ÑBRÐsð 3ð 3Ð`cÐfjÑ`jÐsð 3ð 3ØÐjð3ð 3Ø+1ð3ð 3ØILð3ð 3ØOTð3ð 3Ø^`ð3ð 3Øceð3ð 3à˜^Ô,Ð2ð3ð 3à:>ð@ñ @ô @ð @ñ @õ 	ˆv�v�vÐ(?°TÐ(?Ð(?Ð(?Ñ?Ñ@Ô@Ð@ÝÐ;�4Ð;Ð;�4Ô,Ñ.Ô.°Ñ3Ð;Ð;Ð;Ð;À4ÐHÑHÔHÐHÑHÝ	Ð"Ñ	"€BØ$Ð$˜tÐ$Ñ$Ô$€DØjl×jsÒjsÑjuÔjuÐ
}Ð
fÐ
fÐ
fÐ
f•d”j §¢¡¤Ñ0Ô0Ð
fÑ
fÔ
fÐ
fÐ{}€CØ�‰:€DØ‡M‚M•$”*˜T¨!Ð,Ñ,Ô,Ñ-Ô-Ð-ÝˆtÑÔÐÐÐr   c                 óˆ  — d                      d„ | D ¦   «         ¦  «        }d                      d„ t                               d„ | D ¦   «         ¦  «        D ¦   «         ¦  «        }dt          › ddt          z  d›d	t
          d›d
t          d›dt          j        d¦  «        › d|› d|› d�}t          dz   
                    |¦  «         d S )NÚ c              3   óZ  K  — | ]¦}d |d         › dd|d         z  d›dd|d         z  d›dd|d	         z  d
›d|d         d›d|d         d›d|d         rdnd› d|d         › d|d         |d         k    rdnd› d|d         › d|d         › d|d         › d|d         › d|d         d›d�V — Œ§dS ) z<tr><td>rÀ   z	</td><td>r   rE   r   z %</td><td>rS   rÊ   rÃ   rË   rd   rÈ   rq   r¾   rÁ   Úyesz	<b>no</b>rˆ   z</td><td class='rÆ   rÇ   r>   r  ú'>z / rÄ   rÅ   rÂ   rÍ   z
</td></tr>NrR   rÐ   s     r   rW   zwrite_html.<locals>.<genexpr>¬   sª  è è € ð nð nð deð	_�1�V”9ð 	_ð 	_ s¨Q¨w¬ZÑ'7ð  	Bð 	_ð 	_ÀcÈAÈeÌHÁnð  	Bð 	_ð 	_ÐehÐklÐmsÔktÑetð  	Bð 	_ð 	_Ø�Œxð  	Dð	_ð 	_Ø&'¨¤jð  	Dð	_ð 	_ØFGÈÄoÐ=f¸U¸UÐ[fð	_ð 	_ØqrÐs{Ôq|ð	_ð 	_à  œ~°°+´Ò>Ð>�e�eÀBð	_ð 	_àJKÈKÌ.ð	_ð 	_à]^Ð_fÔ]gð	_ð 	_ð �Œ~ð	_ð 	_ð #$ MÔ"2ð	_ð 	_ð >?¸~Ô=NÐ^ð	_ð 	_ð 	_ðnð nð nð nð nð nr   c              3   ó.   K  — | ]}d |› d|› d|› d�V — ŒdS )z<h2 id='r  z</h2><img src='img/noisy_z.png' loading='lazy'>NrR   )rK   r$   s     r   rW   zwrite_html.<locals>.<genexpr>±   sW   è è € ð  Ið  IÐ\]ÐW˜aÐWÐW 1ÐWÐW¸qÐWÐWÐWð  Ið  Ið  Ið  Ið  Ið  Ir   c              3   ó&   K  — | ]}|d          V — ŒdS )rÀ   NrR   rÐ   s     r   rW   zwrite_html.<locals>.<genexpr>±   sJ   è è € ð  oHð  oHÐ}~ÐopÐqwÔoxð  oHð  oHð  oHð  oHð  oHð  oHr   z¡<!doctype html><html lang="en"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1"><title>Noisy meshes</title><style>u  </style></head><body>
<p><a href="index.html">â†� report</a></p>
<h1>Noisy meshes</h1>
<p class="mut">Files: <code>meshes/&lt;name&gt;_noise0p2.ply</code>, <code>_noise0p6</code>, <code>_noise1.ply</code>; script <code>scripts/make_noisy.py</code>.
Each mesh is subdivided to edges â‰¤ r   r   uâ    % of the diagonal (same shape), then every vertex x moves by u(x), a smooth random
3D vector field (seeded): each component Gaussian with std Ïƒ = 0.2 / 0.6 / 1 % of the diagonal and a Gaussian correlation length of at
least u8    Ïƒ, raised until the field's largest gradient is below u   . Then x â†’ x + u(x) is one-to-one, so the surface cannot
cross itself or turn a face over, whatever the wall thickness or the edges. Faces are unchanged (same connectivity, watertight).
"along the normal": the achieved displacement along the vertex normals, over the diagonal. Self-crossing rings: the exact sections
at the 128 layer centres along up that are not simple (red: more than the clean mesh). Generated z%Y-%m-%d %H:%Muö   .</p>
<table><tr><th>object</th><th>Ïƒ</th><th>along the normal</th><th>correlation length</th><th>max gradient</th><th>faces</th>
<th>watertight</th><th>faces turned over</th><th>self-crossing rings</th><th>clean</th><th>volume / clean</th></tr>z	</table>
z
</body></html>z
noisy.html)Újoinrè   Úfromkeysr   rß   rm   rn   rÙ   Ústrftimer
   rð   )ró   ÚtrÚimgsÚpages       r   rò   rò   «   sw  € Ø	�Šð nð nð imð	nñ nô nñ 
nô 
n€Bð
 �7Š7ð  Ið  IÕae×anÒanð  oHð  oHð  CGð  oHñ  oHô  oHñ  bHô  bHð  Iñ  Iô  Iñ  Iô  I€DðÝfiðð ð
 '*­H¡nðð ð õ ðð ð õ HKðð ð õ cgÔboð  qAñ  cBô  cBðð ð uwðð ð ðð ð €Dõ ˆlÑ×&Ò& tÑ,Ô,Ð,Ð,Ð,r   Ú__main__)r&   )-Ú__doc__rí   ÚsysrÙ   Úpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr™   Únumpyr   r|   Úmpl_toolkits.mplot3d.art3dr   Úscipyr   Úshapely.geometryr   r®   ÚinsertÚstrÚ__file__ÚparentÚparts_reportr   r	   r
   r   r   rä   rß   rm   rn   rÖ   r   r%   r@   rf   r‰   r¸   rÿ   rò   Ú__name__rR   r   r   ú<module>r     sÓ  ððð ð" €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €
„ˆuÑ Ô Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'à „‡‚��3�3�t�t˜H‘~”~Ô,Ñ-Ô-Ñ .Ô .Ð .Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à	€Ø€Ø
€Ø	€Ø
ˆX�o€ð,ð ,ð ,ðLð Lð Lð
ð ð ð ð&ð ð ðOð Oð Oð:ð ð ð(#ð #ð #ðL-ð -ð -ð2 ˆzÒÐØ€D�F„F€F€F€Fð Ðr   