Ë
    £èhµ  ã                  óÂ  — d dl mZ d dlmZmZmZmZmZ d dlZd dl	m
Z
mZmZmZ d dlmZmZ erd dlmZ d ej&                  d«      z  Z ej&                  d	«      d
z  Z ej,                  ej.                  d	z  «      dz  Zd ej2                  ej.                  d	z  «      z  Z G d„ d«      Z	 	 	 	 d	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Zy)é    )Úannotations)ÚTYPE_CHECKINGÚIterableÚSequenceÚIteratorÚOptionalN)ÚVec3ÚUVecÚMatrix44ÚUCS)ÚMeshVertexMergerÚMeshTransformer)ÚGenericLayoutTypeç      ð?ç       @g      @g      @ç      à?c                  óŒ   — e Zd ZdZ	 	 	 	 d
	 	 	 	 	 	 	 dd„Zdd„ZeZ	 	 	 	 	 	 dd„Zdd„Z	 	 	 	 d	 	 	 	 	 	 	 	 	 dd„Z	dd„Z
dd	„Zy)ÚSierpinskyPyramidz®
    Args:
        location: location of base center as (x, y, z) tuple
        length: side length
        level: subdivide level
        sides: sides of base geometry

    c                ó:   — || _         t        ||||¬«      | _        y )N)ÚlocationÚlengthÚlevelÚsides)r   Úsierpinsky_pyramidÚpyramid_definitions)Úselfr   r   r   r   s        ú?lib/python3.12/site-packages/ezdxf/addons/sierpinski_pyramid.pyÚ__init__zSierpinskyPyramid.__init__   s!   € ð ˆŒ
Ü#5Ø f°EÀô$
ˆÕ ó    c              #  ó\   K  — | j                   D ]  \  }}| j                  ||«      –— Œ y­w)z@Yields the pyramid vertices as list of :class:`ezdxf.math.Vec3`.N)r   Ú_calc_vertices)r   r   r   s      r   ÚverticeszSierpinskyPyramid.vertices*   s.   è ø€ à $× 8Ô 8ÑˆH�fØ×%Ñ% h°Ó7Ó7ñ !9ùs   ‚*,c                óä  — |dz  }|\  }}}| j                   dk(  r`t        ||z
  ||z
  |«      t        ||z   ||z
  |«      t        ||z   ||z   |«      t        ||z
  ||z   |«      t        ||||t        z  z   «      gS | j                   dk(  r]|t        z  }|t        z  }t        ||z
  ||z
  |«      t        ||z   ||z
  |«      t        |||z   |«      t        ||||t
        z  z   «      gS t        d«      ‚)zç
        Calculates the pyramid vertices.

        Args:
            location: location of the pyramid as center point of the base
            length: pyramid side length

        Returns: list of :class:`ezdxf.math.Vec3`

        r   é   é   úsides has to be 3 or 4.)r   r	   ÚHEIGHT4Ú
DY1_FACTORÚ
DY2_FACTORÚHEIGHT3Ú
ValueError)	r   r   r   Úlen2ÚxÚyÚzÚdy1Údy2s	            r   r!   z SierpinskyPyramid._calc_vertices1   s  € ð ˜‰|ˆØ‰ˆˆ1ˆaØ�:‰:˜Š?ä�Q˜‘X˜q 4™x¨Ó+Ü�Q˜‘X˜q 4™x¨Ó+Ü�Q˜‘X˜q 4™x¨Ó+Ü�Q˜‘X˜q 4™x¨Ó+Ü�Q˜˜1˜v¬Ñ/Ñ/Ó0ðð ð �Z‰Z˜1Š_Øœ:Ñ%ˆCØœ:Ñ%ˆCä�Q˜‘X˜q 3™w¨Ó*Ü�Q˜‘X˜q 3™w¨Ó*Ü�Q˜˜C™ Ó#Ü�Q˜˜1˜v¬Ñ/Ñ/Ó0ð	ð ô Ð6Ó7Ð7r   c                ód   — | j                   dk(  rg d¢S | j                   dk(  rg d¢S t        d«      ‚)z{Returns list of pyramid faces. All pyramid vertices have the same
        order, so one faces list fits them all.

        r$   ))r%   é   é   r   )r   r4   r$   )r4   r3   r$   )r3   r%   r$   )r%   r   r$   r%   ))r3   r4   r   )r   r4   r%   )r4   r3   r%   )r3   r   r%   r&   )r   r+   )r   s    r   ÚfaceszSierpinskyPyramid.facesT   s2   € ð
 �:‰:˜Š?ÚMÐMØ�Z‰Z˜1Š_Ú?Ð?äÐ6Ó7Ð7r   Nc                ó¨   — |r&| j                  «       }|j                  ||||¬«       y| j                  «       D ]  }|j                  ||||¬«       Œ y)a,  Renders the sierpinsky pyramid into layout, set `merge` to ``True``
        for rendering the whole sierpinsky pyramid into one MESH entity, set
        `merge` to ``False`` for individual pyramids as MESH entities.

        Args:
            layout: DXF target layout
            merge: ``True`` for one MESH entity, ``False`` for individual MESH
                entities per pyramid
            dxfattribs: DXF attributes for the MESH entities
            matrix: apply transformation matrix at rendering
            ucs: apply UCS at rendering

        )Ú
dxfattribsÚmatrixÚucs)r8   r9   N)ÚmeshÚrender_meshÚpyramids)r   ÚlayoutÚmerger7   r8   r9   r:   Úpyramids           r   ÚrenderzSierpinskyPyramid.render`   sW   € ñ* Ø—9‘9“;ˆDØ×ÑØ :°fÀ#ð õ ð  Ÿ=™=ž?�Ø×#Ñ# F¨J¸vÈ3Ð#ÕOñ +r   c              #  ó|   K  — | j                  «       }| D ]#  }t        «       }|j                  ||¬«       |–— Œ% y­w)znYields all pyramids of the sierpinsky pyramid as individual
        :class:`MeshTransformer` objects.
        ©r"   r5   N)r5   r   Úadd_mesh)r   r5   r"   r:   s       r   r<   zSierpinskyPyramid.pyramids~   s:   è ø€ ð —
‘
“ˆÛˆHÜ"Ó$ˆDØ�M‰M 8°5ˆMÔ9Ø‹Jñ ùs   ‚:<c                ó”   — | j                  «       }t        «       }| D ]  }|j                  ||¬«       Œ t        j                  |«      S )z8Returns geometry as one :class:`MeshTransformer` object.rB   )r5   r   rC   r   Úfrom_builder)r   r5   r:   r"   s       r   r:   zSierpinskyPyramid.meshˆ   s@   € à—
‘
“ˆÜÓ!ˆÛˆHØ�M‰M 8°5ˆMÕ9ð ä×+Ñ+¨DÓ1Ð1r   ©)ç        rG   rG   r   r4   r$   )r   r
   r   Úfloatr   Úintr   rI   )ÚreturnzIterator[list[Vec3]])r   r
   r   rH   rJ   z
list[Vec3])rJ   zlist[Sequence[int]])FNNN)
r=   r   r>   Úboolr8   zOptional[Matrix44]r9   zOptional[UCS]rJ   ÚNone)rJ   zIterable[MeshTransformer])rJ   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   Ú__iter__r!   r5   r@   r<   r:   © r   r   r   r      sÂ   „ ñð )ØØØð

àð

ð ð

ð ð	

ð
 ó

ó8ð
 €Hð!8Øð!8Ø&+ð!8à	ó!8óF
8ð ØØ%)Ø!ðPà!ðPð ðPð
 #ðPð ðPð 
óPó<ô2r   r   c           	     óæ   — t        | «      } t        |«      }|dk  rt        d«      ‚t        | ||«      }t	        |dz
  «      D ],  }g }|D ]!  \  } }|j                  t        | ||«      «       Œ# |}Œ. |S )a  Build a Sierpinski pyramid.

    Args:
        location: base center point of the pyramid
        length: base length of the pyramid
        level: recursive building levels, has to 1 or bigger
        sides: 3 or 4 sided pyramids supported

    Returns: list of pyramid vertices

    r4   zlevel has to be 1 or bigger.)r	   rI   r+   Ú_sierpinsky_pyramidÚrangeÚextend)r   r   r   r   r<   Ú_Únext_level_pyramidss          r   r   r   ‘   s‡   € ô" �H‹~€HÜ�‹J€EØˆq‚yÜÐ7Ó8Ð8Ü" 8¨V°UÓ;€HÜ�5˜1‘9ÖˆØ ÐÛ (ÑˆH�fØ×&Ñ&Ü# H¨f°eÓ<õð !)ð '‰ð ð €Or   c                ó\   — |dk(  rt        | |«      S |dk(  rt        | |«      S t        d«      ‚)Nr%   r$   r&   )Úsierpinsky_pyramid_3Úsierpinsky_pyramid_4r+   )r   r   r   s      r   rT   rT   ±   s8   € ð �‚zÜ# H¨fÓ5Ð5Ø	�!ŠÜ# H¨fÓ5Ð5äÐ2Ó3Ð3r   c                óö   — |dz  }|dz  }| \  }}}t        ||z
  ||z
  |«      |ft        ||z   ||z
  |«      |ft        ||z
  ||z   |«      |ft        ||z   ||z   |«      |ft        ||||t        z  z   «      |fgS )a  Build a 4-sided Sierpinski pyramid. Pyramid height = length of the base
    square!

    Args:
        location: base center point of the pyramid
        length: base length of the pyramid

    Returns: list of (location, length) tuples, representing the sierpinski pyramid

    r3   r$   )r	   r'   )r   r   r,   Úlen4r-   r.   r/   s          r   r[   r[   ¼   s©   € ð �A‰:€DØ�A‰:€DØ�G€A€qˆ!ä	ˆa�$‰h˜˜D™ !Ó	$ dÐ+Ü	ˆa�$‰h˜˜D™ !Ó	$ dÐ+Ü	ˆa�$‰h˜˜D™ !Ó	$ dÐ+Ü	ˆa�$‰h˜˜D™ !Ó	$ dÐ+Ü	ˆa��A˜œw™Ñ&Ó	'¨Ð.ðð r   c           
     óø   — |t         z  dz  }|t        z  dz  }|dz  }|dz  }| \  }}}t        ||z
  ||z
  |«      |ft        ||z   ||z
  |«      |ft        |||z   |«      |ft        ||||t        z  z   «      |fgS )zóBuild a 3-sided Sierpinski pyramid (tetraeder).

    Args:
        location: base center point of the pyramid
        length: base length of the pyramid

    Returns: list of (location, length) tuples, representing the sierpinski pyramid

    r   r3   r$   )r(   r)   r	   r*   )	r   r   r0   r1   r,   r]   r-   r.   r/   s	            r   rZ   rZ   Õ   sª   € ð ”:Ñ
 Ñ
#€CØ
”:Ñ
 Ñ
#€CØ�A‰:€DØ�A‰:€DØ�G€A€qˆ!ä	ˆa�$‰h˜˜C™ Ó	# TÐ*Ü	ˆa�$‰h˜˜C™ Ó	# TÐ*Ü	ˆa��S‘˜!Ó	˜dÐ#Ü	ˆa��A˜œw™Ñ&Ó	'¨Ð.ð	ð r   rF   )r   rH   r   rI   r   rI   rJ   úlist[tuple[Vec3, float]])r   r$   )r   r	   r   rH   r   rI   rJ   r_   )r   )r   r	   r   rH   rJ   r_   ) Ú
__future__r   Útypingr   r   r   r   r   ÚmathÚ
ezdxf.mathr	   r
   r   r   Úezdxf.render.meshr   r   Úezdxf.eztypesr   Úsqrtr'   r*   ÚtanÚpir(   Úcosr)   r   r   rT   r[   rZ   rR   r   r   Ú<module>rj      s9  ðõ #ß HÕ HÛ ß 0Ó 0ß ?áÝ/à
�	�—	‘	˜#“Ñ
€Ø
ˆ$�)‰)�C‹.˜3Ñ
€àˆT�X‰X�d—g‘g ‘mÓ$ sÑ*€
Ø�8�4—8‘8˜DŸG™G c™MÓ*Ñ*€
÷z2ñ z2ð| ØØØð	àðð ðð ð	ð
 óðB 78ð4Øð4Ø!ð4Ø03ð4àó4ð %(ðØðØ!ðàóð4 %(ðØðØ!ðàôr   