Ë
    £èhe  ã                  ó  — d dl mZ d dlmZmZmZmZmZmZ d dl	m
Z
 d dlZd dlZerd dlmZmZ dZ e
ej"                  e¬«      Zdd	gZ G d
„ d«      Z edd d «      Z ed dd «      Z ed d d«      Z ed d d «      Zdd„Zddd„Z G d„ d	«      Zy)é    )Úannotations)ÚTupleÚIterableÚSequenceÚTYPE_CHECKINGÚIteratorÚOptional)ÚpartialN)ÚUVecÚAnyVecçê-�™—q=)Úabs_tolÚVec3ÚVec2c                  ó  — e Zd ZdZg d¢Zd„ ZedAd„«       ZedAd„«       ZedAd„«       Z	edBd„«       Z
edCd„«       ZedDd	„«       Z	 	 	 dE	 	 	 	 	 	 	 dFd„ZdGdBd„ZedHd„«       ZedId„«       ZedJd„«       ZedKdLd„«       ZedKdLd„«       ZedMd„«       ZedNdOd„«       ZdPd„ZdPd„ZdQd„ZdQd„ZdBd„ZeZdRd„ZdSd„ZdTd„Z dAd„Z!edAd„«       Z"edAd„«       Z#edAd„«       Z$edUd „«       Z%d!d"d#œ	 	 	 	 	 	 	 dVd$„Z&edAd%„«       Z'edAd&„«       Z(edAd'„«       Z)edAd(„«       Z*dWdXd)„Z+dYdZd*„Z,dZd+„Z-dKdOd,„Z.dBd-„Z/e/Z0dUd.„Z1d!d"d#œ	 	 	 	 	 	 	 d[d/„Z2d\d0„Z3d\d1„Z4dZd2„Z5dZd3„Z6dZd4„Z7dZd5„Z8d]d6„Z9d]d7„Z:d]d8„Z;ed^d9„«       Z<d_d:„Z=dZd;„Z>d_d<„Z?d_d=„Z@d`d>„ZAdad?„ZBdad@„ZCy
)br   a–  Immutable 3D vector class.

    This class is optimized for universality not for speed.
    Immutable means you can't change (x, y, z) components after initialization::

        v1 = Vec3(1, 2, 3)
        v2 = v1
        v2.z = 7  # this is not possible, raises AttributeError
        v2 = Vec3(v2.x, v2.y, 7)  # this creates a new Vec3() object
        assert v1.z == 3  # and v1 remains unchanged


    :class:`Vec3` initialization:

        - ``Vec3()``, returns ``Vec3(0, 0, 0)``
        - ``Vec3((x, y))``, returns ``Vec3(x, y, 0)``
        - ``Vec3((x, y, z))``, returns ``Vec3(x, y, z)``
        - ``Vec3(x, y)``, returns ``Vec3(x, y, 0)``
        - ``Vec3(x, y, z)``, returns  ``Vec3(x, y, z)``

    Addition, subtraction, scalar multiplication and scalar division left and
    right-handed are supported::

        v = Vec3(1, 2, 3)
        v + (1, 2, 3) == Vec3(2, 4, 6)
        (1, 2, 3) + v == Vec3(2, 4, 6)
        v - (1, 2, 3) == Vec3(0, 0, 0)
        (1, 2, 3) - v == Vec3(0, 0, 0)
        v * 3 == Vec3(3, 6, 9)
        3 * v == Vec3(3, 6, 9)
        Vec3(3, 6, 9) / 3 == Vec3(1, 2, 3)
        -Vec3(1, 2, 3) == (-1, -2, -3)

    Comparison between vectors and vectors or tuples is supported::

        Vec3(1, 2, 3) < Vec3 (2, 2, 2)
        (1, 2, 3) < tuple(Vec3(2, 2, 2))  # conversion necessary
        Vec3(1, 2, 3) == (1, 2, 3)

        bool(Vec3(1, 2, 3)) is True
        bool(Vec3(0, 0, 0)) is False

    ©Ú_xÚ_yÚ_zc                óH   —  | j                   |Ž \  | _        | _        | _        y ©N©Ú	decomposer   r   r   )ÚselfÚargss     ú2lib/python3.12/site-packages/ezdxf/math/_vector.pyÚ__init__zVec3.__init__H   s   € Ø$2 D§N¡N°DÐ$9Ñ!ˆŒ�”˜$�'ó    c                ó   — | j                   S )zx-axis value)r   ©r   s    r   ÚxzVec3.xK   ó   € ð �w‰wˆr   c                ó   — | j                   S )zy-axis value)r   r    s    r   ÚyzVec3.yP   r"   r   c                ó   — | j                   S )zz-axis value)r   r    s    r   ÚzzVec3.zU   r"   r   c                óN   — | j                  | j                  | j                  «      S )z1Vec3 as ``(x, y, 0)``, projected on the xy-plane.)Ú	__class__r   r   r    s    r   ÚxyzVec3.xyZ   s   € ð �~‰~˜dŸg™g t§w¡wÓ/Ð/r   c                óH   — | j                   | j                  | j                  fS )zVec3 as ``(x, y, z)`` tuple.r   r    s    r   ÚxyzzVec3.xyz_   s   € ð �w‰w˜Ÿ™ §¡Ð(Ð(r   c                óD   — t        | j                  | j                  f«      S )z'Real 2D vector as :class:`Vec2` object.)r   r   r   r    s    r   Úvec2z	Vec3.vec2d   s   € ô �T—W‘W˜dŸg™gÐ&Ó'Ð'r   Nc                ó|   — |€| j                   }|€| j                  }|€| j                  }| j                  |||«      S )z<Returns a copy of vector with replaced x-, y- and/or z-axis.)r   r   r   r(   ©r   r!   r$   r&   s       r   ÚreplacezVec3.replacei   sA   € ð ˆ9Ø—‘ˆAØˆ9Ø—‘ˆAØˆ9Ø—‘ˆAØ�~‰~˜a  AÓ&Ð&r   c                ó    — | j                  t        | j                  |«      t        | j                  |«      t        | j                  |«      «      S ©z�Returns a new vector where all components are rounded to `ndigits`.

        Uses standard Python :func:`round` function for rounding.
        )r(   Úroundr   r   r   ©r   Úndigitss     r   r3   z
Vec3.roundx   s?   € ð
 �~‰~Ü�$—'‘'˜7Ó#Ü�$—'‘'˜7Ó#Ü�$—'‘'˜7Ó#ó
ð 	
r   c                ó6   — t        | j                  |«      «      S )z(Returns a list of :class:`Vec3` objects.©ÚlistÚgenerate©ÚclsÚitemss     r   r8   z	Vec3.listƒ   s   € ô �C—L‘L Ó'Ó(Ð(r   c                ó6   — t        | j                  |«      «      S ©z)Returns a tuple of :class:`Vec3` objects.©Útupler9   r:   s     r   r@   z
Vec3.tupleˆ   ó   € ô �S—\‘\ %Ó(Ó)Ð)r   c                ó   ‡ — ˆ fd„|D «       S )z-Returns an iterable of :class:`Vec3` objects.c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   © ©Ú.0Úitemr;   s     €r   Ú	<genexpr>z Vec3.generate.<locals>.<genexpr>�   ó   øè ø€ Ð,¡e˜d‘�D—	¡eùó   ƒrD   r:   s   ` r   r9   zVec3.generate�   s   ø€ ó -¡eÓ,Ð,r   c                ón   —  | t        j                  |«      |z  t        j                  |«      |z  d«      S )zhReturns a :class:`Vec3` object from `angle` in radians in the
        xy-plane, z-axis = ``0``.
        ç        ©ÚmathÚcosÚsin©r;   ÚangleÚlengths      r   Ú
from_anglezVec3.from_angle’   s-   € ñ
 ”4—8‘8˜E“? VÑ+¬T¯X©X°e«_¸vÑ-EÀsÓKÐKr   c                óL   — | j                  t        j                  |«      |«      S )zhReturns a :class:`Vec3` object from `angle` in degrees in the
        xy-plane, z-axis = ``0``.
        ©rT   rN   ÚradiansrQ   s      r   Úfrom_deg_anglezVec3.from_deg_angle™   s   € ð
 �~‰~œdŸl™l¨5Ó1°6Ó:Ð:r   c                 óÖ  — t        | «      }|dk(  ry|dk(  r‚| d   }t        |t        «      r#|j                  |j                  |j
                  fS t        |«      }|dk(  r|\  }}d}n|dk(  r|\  }}}nt        ‚t        |«      t        |«      t        |«      fS |dk(  r| \  }}t        |«      t        |«      dfS |dk(  r&| \  }}}t        |«      t        |«      t        |«      fS t        ‚)aÞ  Converts input into a (x, y, z) tuple.

        Valid arguments are:

            - no args: ``decompose()`` returns (0, 0, 0)
            - 1 arg: ``decompose(arg)``, `arg` is tuple or list, tuple has to be
              (x, y[, z]): ``decompose((x, y))`` returns (x, y, 0.)
            - 2 args: ``decompose(x, y)`` returns (x, y, 0)
            - 3 args: ``decompose(x, y, z)`` returns (x, y, z)

        Returns:
            (x, y, z) tuple

        (internal API)

        r   )rL   rL   rL   é   é   rL   é   )ÚlenÚ
isinstancer   r   r   r   Ú	TypeErrorÚfloat)r   rS   Údatar!   r$   r&   s         r   r   zVec3.decompose    sí   € ô$ �T“ˆØ�QŠ;Ø Ø�qŠ[Ø˜‘7ˆDÜ˜$¤Ô%Ø—w‘w §¡¨¯©Ð0Ð0ä˜T›�Ø˜Q’;Ø‘D�A�qØ‘AØ˜q’[Ø"‘G�A�q™!ä#�OÜ˜Q“x¤ q£¬5°«8Ð3Ð3Ø�qŠ[Ø‰DˆAˆqÜ˜“8œU 1›X sÐ*Ð*Ø�qŠ[Ø‰GˆAˆq�!Ü˜“8œU 1›X¤u¨Q£xÐ/Ð/Üˆr   c                ó¾   — t        j                  dd«      }t        j                  dd«      }t        j                  dd«      }t        |||«      j                  |«      S )zReturns a random vector.éÿÿÿÿrZ   )ÚrandomÚuniformr   Ú	normalize)r;   rS   r!   r$   r&   s        r   rd   zVec3.randomË   sM   € ô �N‰N˜2˜qÓ!ˆÜ�N‰N˜2˜qÓ!ˆÜ�N‰N˜2˜qÓ!ˆÜ�A�q˜!‹}×&Ñ& vÓ.Ð.r   c                ó$   — dj                  | «      S )z!Return ``'(x, y, z)'`` as string.z({0.x}, {0.y}, {0.z})©Úformatr    s    r   Ú__str__zVec3.__str__Ó   s   € à&×-Ñ-¨dÓ3Ð3r   c                ó(   — d| j                  «       z   S )z%Return ``'Vec3(x, y, z)'`` as string.r   ©rj   r    s    r   Ú__repr__zVec3.__repr__×   s   € à˜Ÿ™›Ñ&Ð&r   c                 ó   — y)zReturns always ``3``.r\   rD   r    s    r   Ú__len__zVec3.__len__Û   s   € àr   c                ó,   — t        | j                  «      S )zjReturns hash value of vector, enables the usage of vector as key in
        ``set`` and ``dict``.
        )Úhashr+   r    s    r   Ú__hash__zVec3.__hash__ß   s   € ô �D—H‘H‹~Ðr   c                ó   — | S )z1Returns a copy of vector as :class:`Vec3` object.rD   r    s    r   Úcopyz	Vec3.copyå   ó   € àˆr   c                ó   — | S )z:func:`copy.deepcopy` support.rD   )r   Úmemodicts     r   Ú__deepcopy__zVec3.__deepcopy__ë   ru   r   c                óº   — t        |t        «      rt        d«      ‚|dk(  r| j                  S |dk(  r| j                  S |dk(  r| j
                  S t        d|› �«      ‚)zbSupport for indexing:

        - v[0] is v.x
        - v[1] is v.y
        - v[2] is v.z

        úslicing not supportedr   rZ   r[   úinvalid index )r^   Úslicer_   r   r   r   Ú
IndexError©r   Úindexs     r   Ú__getitem__zVec3.__getitem__ï   s\   € ô �eœUÔ#ÜÐ3Ó4Ð4Ø�AŠ:Ø—7‘7ˆNØ�aŠZØ—7‘7ˆNØ�aŠZØ—7‘7ˆNä˜~¨e¨WÐ5Ó6Ð6r   c              #  ó`   K  — | j                   –— | j                  –— | j                  –— y­w)z&Returns iterable of x-, y- and z-axis.Nr   r    s    r   Ú__iter__zVec3.__iter__  s!   è ø€ à�g‰gŠØ�g‰gŠØ�g‰g‹ùs   ‚,.c                ó   — | j                   S )z%Returns length (magnitude) of vector.©Ú	magnituder    s    r   Ú__abs__zVec3.__abs__  s   € à�~‰~Ðr   c                ó    — | j                   dz  S )zLength of vector.ç      à?)Úmagnitude_squarer    s    r   r…   zVec3.magnitude  s   € ð ×$Ñ$ cÑ)Ð)r   c                óV   — t        j                  | j                  | j                  «      S )z!Length of vector in the xy-plane.)rN   Úhypotr   r   r    s    r   Úmagnitude_xyzVec3.magnitude_xy  ó   € ô �z‰z˜$Ÿ'™' 4§7¡7Ó+Ð+r   c                ól   — | j                   | j                  | j                  }}}||z  ||z  z   ||z  z   S )zSquare length of vector.r   r/   s       r   r‰   zVec3.magnitude_square  s8   € ð —'‘'˜4Ÿ7™7 D§G¡Gˆaˆ1ˆØ�1‰u�q˜1‘u‰}˜q 1™uÑ$Ð$r   c                ó²   — t        | j                  «      t        k  xr: t        | j                  «      t        k  xr t        | j                  «      t        k  S )z‚``True`` if all components are close to zero: ``Vec3(0, 0, 0)``.
        Has a fixed absolute testing tolerance of 1e-12!
        )Úabsr   ÚABS_TOLr   r   r    s    r   Úis_nullzVec3.is_null  sC   € ô �—‘‹LœGÑ#ò (Ü�D—G‘G“¤Ñ'ò(ä�D—G‘G“¤Ñ'ð	
r   ç•Ö&è.>r   ©Úrel_tolr   c               ó˜   — | j                  «       }|j                  «       }|j                  |||¬«      xs |j                  | ||¬«      S )z?Returns ``True`` if `self` and `other` are parallel to vectors.r”   )rf   Úisclose)r   Úotherr•   r   Úv1Úv2s         r   Úis_parallelzVec3.is_parallel'  sT   € ð �^‰^ÓˆØ�_‰_ÓˆØ�z‰z˜" g°wˆzÓ?ò 
À2Ç:Á:ØˆC˜¨'ð DNó D
ð 	
r   c                ón   — t        j                  t        j                  | j	                  «       «      «      S )z3Spatial angle between vector and x-axis in radians.)rN   ÚacosÚX_AXISÚdotrf   r    s    r   Úspatial_anglezVec3.spatial_angle1  s#   € ô �y‰yœŸ™ D§N¡NÓ$4Ó5Ó6Ð6r   c                ó@   — t        j                  | j                  «      S )z3Spatial angle between vector and x-axis in degrees.)rN   Údegreesr    r    s    r   Úspatial_angle_degzVec3.spatial_angle_deg6  s   € ô �|‰|˜D×.Ñ.Ó/Ð/r   c                óV   — t        j                  | j                  | j                  «      S )z;Angle between vector and x-axis in the xy-plane in radians.)rN   Úatan2r   r   r    s    r   rR   z
Vec3.angle;  r�   r   c                ó@   — t        j                  | j                  «      S )z>Returns angle of vector and x-axis in the xy-plane in degrees.©rN   r¢   rR   r    s    r   Ú	angle_degzVec3.angle_deg@  ó   € ô �|‰|˜DŸJ™JÓ'Ð'r   c                óÎ   — |r2| j                  | j                   | j                  | j                  «      S | j                  | j                  | j                   | j                  «      S )z‰Returns orthogonal 2D vector, z-axis is unchanged.

        Args:
            ccw: counter-clockwise if ``True`` else clockwise

        )r(   r   r   r   ©r   Úccws     r   Ú
orthogonalzVec3.orthogonalE  sQ   € ñ ð �N‰N˜DŸG™G˜8 T§W¡W¨d¯g©gÓ6ð	
ð —‘ §¡¨$¯'©'¨°4·7±7Ó;ð	
r   c                ód   — | j                  |«      | z
  t        |«      z  }| j                  |«      S )zñReturns linear interpolation between `self` and `other`.

        Args:
            other: end point as :class:`Vec3` compatible object
            factor: interpolation factor (0 = self, 1 = other,
                0.5 = mid point)

        )r(   r`   Ú__add__)r   r˜   ÚfactorÚds       r   Úlerpz	Vec3.lerpR  s.   € ð �^‰^˜EÓ" TÑ)¬U°6«]Ñ:ˆØ�|‰|˜A‹Ðr   c                óJ   — | j                  «       }||j                  |«      z  S )z0Returns projected vector of `other` onto `self`.©rf   rŸ   ©r   r˜   Úuvs      r   ÚprojectzVec3.project^  ó!   € à�^‰^ÓˆØ�B—F‘F˜5“MÑ!Ð!r   c                ó>   — | j                  || j                  z  «      S )z7Returns normalized vector, optional scaled by `length`.©Ú__mul__r…   ©r   rS   s     r   rf   zVec3.normalizec  s   € à�|‰|˜F T§^¡^Ñ3Ó4Ð4r   c                ój   — | j                  | j                   | j                   | j                   «      S )z!Returns negated vector (-`self`).)r(   r   r   r   r    s    r   ÚreversedzVec3.reversedg  s'   € à�~‰~˜tŸw™w˜h¨¯©¨°4·7±7°(Ó;Ð;r   c                ó   — | j                    S )z,Returns ``True`` if vector is not (0, 0, 0).©r’   r    s    r   Ú__bool__zVec3.__bool__m  s   € à—<‘<ÐÐr   c               ó  — | j                  |«      \  }}}t        j                  | j                  |||¬«      xrH t        j                  | j                  |||¬«      xr# t        j                  | j
                  |||¬«      S )zïReturns ``True`` if `self` is close to `other`.
        Uses :func:`math.isclose` to compare all axis.

        Learn more about the :func:`math.isclose` function in
        `PEP 485 <https://www.python.org/dev/peps/pep-0485/>`_.

        r”   )r   rN   r—   r   r   r   )r   r˜   r•   r   r!   r$   r&   s          r   r—   zVec3.iscloseq  sk   € ð —.‘. Ó'‰ˆˆ1ˆaä�L‰L˜Ÿ™ !¨W¸gÔFò KÜ—‘˜TŸW™W a°À'ÔJòKä—‘˜TŸW™W a°À'ÔJð	
r   c                óÖ   — t        |t        «      st        |«      }| j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S )zZEqual operator.

        Args:
            other: :class:`Vec3` compatible object
        )r^   r   r!   r$   r&   ©r   r˜   s     r   Ú__eq__zVec3.__eq__‚  sN   € ô ˜%¤Ô&Ü˜“KˆEØ�v‰v˜Ÿ™Ñ ÒL T§V¡V¨u¯w©wÑ%6ÒL¸4¿6¹6ÀUÇWÁWÑ;LÐLr   c                óÂ   — | j                  |«      \  }}}| j                  |k(  r-| j                  |k(  r| j                  |k  S | j                  |k  S | j                  |k  S )z`Lower than operator.

        Args:
            other: :class:`Vec3` compatible object

        r   ©r   r˜   r!   r$   r&   s        r   Ú__lt__zVec3.__lt__Œ  sX   € ð —.‘. Ó'‰ˆˆ1ˆaØ�7‰7�aŠ<Ø�w‰w˜!Š|Ø—w‘w ‘{Ð"à—w‘w ‘{Ð"à—7‘7˜Q‘;Ðr   c                ó    — | j                  |«      \  }}}| j                  | j                  |z   | j                  |z   | j                  |z   «      S )z-Add :class:`Vec3` operator: `self` + `other`.©r   r(   r   r   r   rÇ   s        r   r¯   zVec3.__add__œ  sA   € à—.‘. Ó'‰ˆˆ1ˆaØ�~‰~˜dŸg™g¨™k¨4¯7©7°Q©;¸¿¹À!¹ÓDÐDr   c                ó$   — | j                  |«      S )z.RAdd :class:`Vec3` operator: `other` + `self`.)r¯   rÄ   s     r   Ú__radd__zVec3.__radd__¡  ó   € à�|‰|˜EÓ"Ð"r   c                ó    — | j                  |«      \  }}}| j                  | j                  |z
  | j                  |z
  | j                  |z
  «      S )z-Sub :class:`Vec3` operator: `self` - `other`.rÊ   rÇ   s        r   Ú__sub__zVec3.__sub__¥  sC   € ð —.‘. Ó'‰ˆˆ1ˆaØ�~‰~˜dŸg™g¨™k¨4¯7©7°Q©;¸¿¹À!¹ÓDÐDr   c                ó    — | j                  |«      \  }}}| j                  || j                  z
  || j                  z
  || j                  z
  «      S )z.RSub :class:`Vec3` operator: `other` - `self`.rÊ   rÇ   s        r   Ú__rsub__zVec3.__rsub__«  sA   € à—.‘. Ó'‰ˆˆ1ˆaØ�~‰~˜a $§'¡'™k¨1¨t¯w©w©;¸¸D¿G¹G¹ÓDÐDr   c                óŒ   — t        |«      }| j                  | j                  |z  | j                  |z  | j                  |z  «      S )z&Scalar Mul operator: `self` * `other`.©r`   r(   r   r   r   ©r   r˜   Úscalars      r   r»   zVec3.__mul__°  ó9   € ä�u“ˆØ�~‰~˜dŸg™g¨Ñ.°·±¸&Ñ0@À$Ç'Á'ÈFÑBRÓSÐSr   c                ó$   — | j                  |«      S )z'Scalar RMul operator: `other` * `self`.)r»   rÄ   s     r   Ú__rmul__zVec3.__rmul__µ  rÍ   r   c                óŒ   — t        |«      }| j                  | j                  |z  | j                  |z  | j                  |z  «      S )z&Scalar Div operator: `self` / `other`.rÓ   rÔ   s      r   Ú__truediv__zVec3.__truediv__¹  rÖ   r   c                ó*   — t         }| D ]  }||z  }Œ	 |S )úAdd all vectors in `items`.)ÚNULLVEC©r<   ÚsÚvs      r   ÚsumzVec3.sum¾  s!   € ô ˆÛˆAØ�‰F‰Að àˆr   c                óŠ   — | j                  |«      \  }}}| j                  |z  | j                  |z  z   | j                  |z  z   S )ziDot operator: `self` . `other`

        Args:
            other: :class:`Vec3` compatible object
        r   rÇ   s        r   rŸ   zVec3.dotÆ  s@   € ð —.‘. Ó'‰ˆˆ1ˆaØ�w‰w˜‰{˜TŸW™W q™[Ñ(¨4¯7©7°Q©;Ñ6Ð6r   c                ó   — | j                  |«      \  }}}| j                  | j                  |z  | j                  |z  z
  | j                  |z  | j                  |z  z
  | j                  |z  | j                  |z  z
  «      S )zkCross operator: `self` x `other`

        Args:
            other: :class:`Vec3` compatible object
        )r   r(   r   r   r   rÇ   s        r   Úcrossz
Vec3.crossÏ  sq   € ð —.‘. Ó'‰ˆˆ1ˆaØ�~‰~Ø�G‰G�a‰K˜$Ÿ'™' A™+Ñ%Ø�G‰G�a‰K˜$Ÿ'™' A™+Ñ%Ø�G‰G�a‰K˜$Ÿ'™' A™+Ñ%ó
ð 	
r   c                óZ   — | j                  |«      }|j                  | «      j                  S )z3Returns distance between `self` and `other` vector.)r(   rÏ   r…   )r   r˜   rà   s      r   ÚdistancezVec3.distanceÜ  s$   € à�N‰N˜5Ó!ˆØ�y‰y˜‹×(Ñ(Ð(r   c                óÂ   — | j                  «       j                  | j                  |«      j                  «       «      }|dk  rd}n|dkD  rd}t        j                  |«      S )z±Returns angle between `self` and `other` in radians. +angle is
        counter clockwise orientation.

        Args:
            other: :class:`Vec3` compatible object

        ç      ð¿ç      ð?)rf   rŸ   r(   rN   r�   ©r   r˜   Ú	cos_thetas      r   Úangle_betweenzVec3.angle_betweená  sU   € ð —N‘NÓ$×(Ñ(¨¯©¸Ó)>×)HÑ)HÓ)JÓKˆ	à�tÒØ‰IØ˜Š_ØˆIÜ�y‰y˜Ó#Ð#r   c                ó  — || j                  |«      z
  j                  «       }| j                  |«      j                  «       }|j                  |«      }|j                  |«      }t	        j
                  ||«      t        j                  z  S )a  Returns counter-clockwise angle in radians about `self` from `base` to
        `target` when projected onto the plane defined by `self` as the normal
        vector.

        Args:
            base: base vector, defines angle 0
            target: target vector
        )r·   rf   rä   rŸ   rN   r¥   Útau)r   ÚbaseÚtargetÚx_axisÚy_axisÚtarget_projected_xÚtarget_projected_ys          r   Úangle_aboutzVec3.angle_aboutñ  sq   € ð ˜Ÿ™ dÓ+Ñ+×6Ñ6Ó8ˆØ—‘˜FÓ#×-Ñ-Ó/ˆØ#ŸZ™Z¨Ó/ÐØ#ŸZ™Z¨Ó/ÐÜ�z‰zÐ,Ð.@ÓAÄDÇHÁHÑLÐLr   c                ó  — | j                  | j                  | j                  d«      }t        j	                  |j
                  |z   |j                  «      }| j                  |j                  |j                  | j                  «      S )ztReturns vector rotated about `angle` around the z-axis.

        Args:
            angle: angle in radians

        rL   )r(   r!   r$   r   rT   rR   r…   r&   )r   rR   rà   s      r   ÚrotatezVec3.rotate  sY   € ð �N‰N˜4Ÿ6™6 4§6¡6¨3Ó/ˆÜ�O‰O˜AŸG™G e™O¨Q¯[©[Ó9ˆØ�~‰~˜aŸc™c 1§3¡3¨¯©Ó/Ð/r   c                óJ   — | j                  t        j                  |«      «      S )ztReturns vector rotated about `angle` around the z-axis.

        Args:
            angle: angle in degrees

        )r÷   rN   rW   ©r   rR   s     r   Ú
rotate_degzVec3.rotate_deg  s   € ð �{‰{œ4Ÿ<™<¨Ó.Ó/Ð/r   ©Úreturnr`   ©rü   r   )rü   ztuple[float, float, float]©rü   r   )NNN)r!   úOptional[float]r$   rÿ   r&   rÿ   rü   r   r   )r<   úIterable[UVec]rü   z
list[Vec3])r<   r   rü   zSequence[Vec3])r<   r   rü   zIterator[Vec3]©ré   )rR   r`   rS   r`   rü   r   )rü   zTuple[float, float, float])rZ   )rS   r`   rü   r   ©rü   Ústr©rü   Úint)rw   Údictrü   r   ©r   r  rü   r`   ©rü   zIterator[float]©rü   Úbool)r˜   r   r•   r`   r   r`   rü   r
  ©T)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   )r<   r   rü   r   )r˜   r   rü   r`   )rï   r   rð   r   rü   r`   )rR   r`   rü   r   )DÚ__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   Úpropertyr!   r$   r&   r)   r+   r-   r0   r3   Úclassmethodr8   r@   r9   rT   rX   Ústaticmethodr   rd   rj   rm   ro   rr   rt   Ú__copy__rx   r€   r‚   r†   r…   rŒ   r‰   r’   r›   r    r£   rR   r¨   r­   r²   r·   rf   r¾   Ú__neg__rÁ   r—   rÅ   rÈ   r¯   rÌ   rÏ   rÑ   r»   rØ   rÚ   rá   rŸ   rä   ræ   rì   rõ   r÷   rú   rD   r   r   r   r      s  „ ñ*òX #€Iò:ð òó ðð òó ðð òó ðð ò0ó ð0ð ò)ó ð)ð ò(ó ð(ð "Ø!Ø!ð	'àð'ð ð'ð ð	'ð
 
ó'ô	
ð ò)ó ð)ð ò*ó ð*ð ò-ó ð-ð óLó ðLð ó;ó ð;ð ò(ó ð(ðT ó/ó ð/ó4ó'óóóð €Hóó7ó&óð ò*ó ð*ð ò,ó ð,ð ò%ó ð%ð
 ò
ó ð
ð 04Àeñ
Øð
Ø',ð
Ø>Cð
à	ó
ð ò7ó ð7ð ò0ó ð0ð ò,ó ð,ð ò(ó ð(ô
ô
ó"ô
5ó<ð €Gó ð
 04Àeñ
Øð
Ø',ð
Ø>Cð
à	ó
ó"Móó Eó
#óEóEó
Tó
#óTð
 òó ðó7ó
ó)ó
$ó Mó 	0ô0r   rZ   c                ó6   — t        | «      j                  |«      S )z¶Returns distance between points `p1` and `p2`.

    Args:
        p1: first point as :class:`Vec3` compatible object
        p2: second point as :class:`Vec3` compatible object

    )r   ræ   )Úp1Úp2s     r   ræ   ræ     s   € ô �‹8×Ñ˜RÓ Ð r   c                ó8   — t        | «      j                  ||«      S )a+  Returns linear interpolation between points `p1` and `p2` as :class:`Vec3`.

    Args:
        p1: first point as :class:`Vec3` compatible object
        p2: second point as :class:`Vec3` compatible object
        factor:  interpolation factor (``0`` = `p1`, ``1`` = `p2`, ``0.5`` = mid point)

    )r   r²   )r  r  r°   s      r   r²   r²   '  s   € ô �‹8�=‰=˜˜VÓ$Ð$r   c                  ó
  — e Zd ZdZddgZd3d4d„Zed5d„«       Zd6d7d„Ze	d8d„«       Z
e	d9d	„«       Ze	d:d
„«       Ze	d;d<d„«       Ze	d;d<d„«       Zd=d„Zd=d„Zd>d„Zd>d„Zd7d„ZeZd?d„Zd@d„ZdAd„ZdBd„ZedBd„«       ZedCd„«       ZedBd„«       ZedBd„«       ZdDdEd„ZdFdGd„ZdHd„Zd;dId„Z d7d„Z!e!Z"dCd„Z#d d!d"œ	 	 	 	 	 	 	 dJd#„Z$dKd$„Z%dKd%„Z&dHd&„Z'dHd'„Z(dHd(„Z)dLd)„Z*dLd*„Z+dLd+„Z,dMd,„Z-dMd-„Z.dMd.„Z/dMd/„Z0dNd0„Z1dNd1„Z2e3dOd2„«       Z4y)Pr   aO  Immutable 2D vector class.

    Args:
        v: vector object with :attr:`x` and :attr:`y` attributes/properties or a
           sequence of float ``[x, y, ...]`` or x-axis as float if argument `y`
           is not ``None``
        y: second float for :code:`Vec2(x, y)`

    :class:`Vec2` implements a subset of :class:`Vec3`.

    r!   r$   Nc                óü   — 	 |j                   | _         |j                  | _        y # t        $ rM |€(t        |d   «      | _         t        |d   «      | _        Y y t        |«      | _         t        |«      | _        Y y w xY w)Nr   rZ   )r!   r$   ÚAttributeErrorr`   )r   rà   r$   s      r   r   zVec2.__init__B  se   € ð		"Ø—S‘SˆDŒFØ—S‘SˆD�FøÜò 	"ØˆyÜ˜q ™t›�”Ü˜q ™t›�–ä˜q›�”Ü˜q›�–ð	"ús   ‚"% ¥1A;Á A;Á:A;c                óD   — t        | j                  | j                  d«      S )zReturns a 3D vector.r   )r   r!   r$   r    s    r   Úvec3z	Vec2.vec3N  s   € ô �D—F‘F˜DŸF™F AÓ&Ð&r   c                óv   — | j                  t        | j                  |«      t        | j                  |«      «      S r2   )r(   r3   r!   r$   r4   s     r   r3   z
Vec2.roundS  s+   € ð
 �~‰~œe D§F¡F¨GÓ4´e¸D¿F¹FÀGÓ6LÓMÐMr   c                ó6   — t        | j                  |«      «      S r   r7   r:   s     r   r8   z	Vec2.listZ  s   € ä�C—L‘L Ó'Ó(Ð(r   c                ó6   — t        | j                  |«      «      S r>   r?   r:   s     r   r@   z
Vec2.tuple^  rA   r   c                ó   ‡ — ˆ fd„|D «       S )Nc              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr   rD   rE   s     €r   rH   z Vec2.generate.<locals>.<genexpr>e  rI   rJ   rD   r:   s   ` r   r9   zVec2.generatec  s   ø€ ã,¡eÓ,Ð,r   c                ól   —  | t        j                  |«      |z  t        j                  |«      |z  «      S r   rM   rQ   s      r   rT   zVec2.from_angleg  s)   € á”4—8‘8˜E“? VÑ+¬T¯X©X°e«_¸vÑ-EÓFÐFr   c                óL   — | j                  t        j                  |«      |«      S r   rV   rQ   s      r   rX   zVec2.from_deg_anglek  s   € à�~‰~œdŸl™l¨5Ó1°6Ó:Ð:r   c                ó$   — dj                  | «      S )Nz({0.x}, {0.y})rh   r    s    r   rj   zVec2.__str__o  s   € Ø×&Ñ& tÓ,Ð,r   c                ó(   — d| j                  «       z   S )Nr   rl   r    s    r   rm   zVec2.__repr__r  s   € Ø˜Ÿ™›Ñ&Ð&r   c                 ó   — y)Nr[   rD   r    s    r   ro   zVec2.__len__u  s   € Ør   c                óD   — t        | j                  | j                  f«      S r   )rq   r!   r$   r    s    r   rr   zVec2.__hash__x  s   € Ü�T—V‘V˜TŸV™VÐ$Ó%Ð%r   c                óP   — | j                  | j                  | j                  f«      S r   ©r(   r!   r$   r    s    r   rt   z	Vec2.copy{  s   € Ø�~‰~˜tŸv™v t§v¡vÐ.Ó/Ð/r   c                ó~   — 	 |t        | «         S # t        $ r# | j                  «       }||t        | «      <   |cY S w xY wr   )ÚidÚKeyErrorrt   )r   rw   rà   s      r   rx   zVec2.__deepcopy__€  sC   € ð	ØœB˜t›HÑ%Ð%øÜò 	Ø—	‘	“ˆAØ!"ˆH”R˜“XÑØŠHð	ús   ‚ �)<»<c                ó˜   — t        |t        «      rt        d«      ‚|dk(  r| j                  S |dk(  r| j                  S t        d|› �«      ‚)Nrz   r   rZ   r{   )r^   r|   r_   r!   r$   r}   r~   s     r   r€   zVec2.__getitem__ˆ  sJ   € Ü�eœUÔ#ÜÐ3Ó4Ð4Ø�AŠ:Ø—6‘6ˆMØ�aŠZØ—6‘6ˆMä˜~¨e¨WÐ5Ó6Ð6r   c              #  óD   K  — | j                   –— | j                  –— y ­wr   ©r!   r$   r    s    r   r‚   zVec2.__iter__’  s   è ø€ Ø�f‰fŠØ�f‰f‹ùs   ‚ c                ó   — | j                   S r   r„   r    s    r   r†   zVec2.__abs__–  s   € Ø�~‰~Ðr   c                óV   — t        j                  | j                  | j                  «      S )zReturns length of vector.©rN   r‹   r!   r$   r    s    r   r…   zVec2.magnitude™  ó   € ô �z‰z˜$Ÿ&™& $§&¡&Ó)Ð)r   c                óv   — t        | j                  «      t        k  xr t        | j                  «      t        k  S r   )r�   r!   r‘   r$   r    s    r   r’   zVec2.is_nullž  s'   € ä�4—6‘6‹{œgÑ%Ò@¬#¨d¯f©f«+¼Ñ*@Ð@r   c                óV   — t        j                  | j                  | j                  «      S )zAngle of vector in radians.)rN   r¥   r$   r!   r    s    r   rR   z
Vec2.angle¢  r7  r   c                ó@   — t        j                  | j                  «      S )zAngle of vector in degrees.r§   r    s    r   r¨   zVec2.angle_deg§  r©   r   c                ó¢   — |r'| j                  | j                   | j                  «      S | j                  | j                  | j                   «      S )zhOrthogonal vector

        Args:
            ccw: counter-clockwise if ``True`` else clockwise

        )r(   r$   r!   r«   s     r   r­   zVec2.orthogonal¬  s=   € ñ Ø—>‘> 4§6¡6 '¨4¯6©6Ó2Ð2à—>‘> $§&¡&¨4¯6©6¨'Ó2Ð2r   c                óÊ   — | j                   |j                   | j                   z
  |z  z   }| j                  |j                  | j                  z
  |z  z   }| j                  ||«      S )zàLinear interpolation between `self` and `other`.

        Args:
            other: target vector/point
            factor: interpolation factor (0=self, 1=other, 0.5=mid point)

        Returns: interpolated vector

        )r!   r$   r(   )r   r˜   r°   r!   r$   s        r   r²   z	Vec2.lerp¸  sU   € ð �F‰F�e—g‘g §¡Ñ&¨&Ñ0Ñ0ˆØ�F‰F�e—g‘g §¡Ñ&¨&Ñ0Ñ0ˆØ�~‰~˜a Ó#Ð#r   c                óJ   — | j                  «       }||j                  |«      z  S )z#Project vector `other` onto `self`.r´   rµ   s      r   r·   zVec2.projectÆ  r¸   r   c                ó>   — | j                  || j                  z  «      S r   rº   r¼   s     r   rf   zVec2.normalizeË  s   € Ø�|‰|˜F T§^¡^Ñ3Ó4Ð4r   c                óR   — | j                  | j                   | j                   «      S r   r-  r    s    r   r¾   zVec2.reversedÎ  s   € Ø�~‰~˜tŸv™v˜g¨¯© wÓ/Ð/r   c                ó   — | j                    S r   rÀ   r    s    r   rÁ   zVec2.__bool__Ó  s   € Ø—<‘<ÐÐr   r“   r   r”   c               óð   — t        |t        «      st        |«      }t        j                  | j                  |j                  ||¬«      xr- t        j                  | j
                  |j
                  ||¬«      S )Nr”   )r^   r   rN   r—   r!   r$   )r   r˜   r•   r   s       r   r—   zVec2.iscloseÖ  sZ   € ô ˜%¤Ô&Ü˜“KˆEÜ�|‰|Ø�F‰F�E—G‘G W°gô
ò Nä�l‰l˜4Ÿ6™6 5§7¡7°GÀWÔMð	Nr   c                ó    — t        |t        «      st        |«      }| j                  |j                  k(  xr | j                  |j                  k(  S r   )r^   r   r!   r$   rÄ   s     r   rÅ   zVec2.__eq__ß  s:   € Ü˜%¤Ô&Ü˜“KˆEØ�v‰v˜Ÿ™Ñ Ò6 T§V¡V¨u¯w©wÑ%6Ð6r   c                óf   — |^}}}| j                   |k(  r| j                  |k  S | j                   |k  S r   r3  )r   r˜   r!   r$   Ú_s        r   rÈ   zVec2.__lt__ä  s4   € àˆˆˆ1ˆqØ�6‰6�QŠ;Ø—6‘6˜A‘:Ðà—6‘6˜A‘:Ðr   c                ó´   — 	 | j                  | j                  |j                  z   | j                  |j                  z   «      S # t        $ r t	        d«      ‚w xY w©Nzinvalid argument©r(   r!   r$   r  r_   rÄ   s     r   r¯   zVec2.__add__ì  óM   € ð	0Ø—>‘> $§&¡&¨5¯7©7Ñ"2°D·F±F¸U¿W¹WÑ4DÓEÐEøÜò 	0ÜÐ.Ó/Ð/ð	0úó   ‚?A ÁAc                ó´   — 	 | j                  | j                  |j                  z
  | j                  |j                  z
  «      S # t        $ r t	        d«      ‚w xY wrF  rG  rÄ   s     r   rÏ   zVec2.__sub__ò  rH  rI  c                ó´   — 	 | j                  |j                  | j                  z
  |j                  | j                  z
  «      S # t        $ r t	        d«      ‚w xY wrF  rG  rÄ   s     r   rÑ   zVec2.__rsub__ø  sM   € ð	0Ø—>‘> %§'¡'¨D¯F©FÑ"2°E·G±G¸d¿f¹fÑ4DÓEÐEøÜò 	0ÜÐ.Ó/Ð/ð	0úrI  c                óZ   — | j                  | j                  |z  | j                  |z  «      S r   r-  rÄ   s     r   r»   zVec2.__mul__þ  ó#   € Ø�~‰~˜dŸf™f u™n¨d¯f©f°u©nÓ=Ð=r   c                óZ   — | j                  | j                  |z  | j                  |z  «      S r   r-  rÄ   s     r   rØ   zVec2.__rmul__  rM  r   c                óZ   — | j                  | j                  |z  | j                  |z  «      S r   r-  rÄ   s     r   rÚ   zVec2.__truediv__  rM  r   c                óh   — | j                   |j                   z  | j                  |j                  z  z   S r   r3  rÄ   s     r   rŸ   zVec2.dot  ó'   € Ø�v‰v˜Ÿ™Ñ $§&¡&¨5¯7©7Ñ"2Ñ2Ð2r   c                óh   — | j                   |j                  z  | j                  |j                   z  z
  S r   r3  rÄ   s     r   ÚdetzVec2.det
  rQ  r   c                óŠ   — t        j                  | j                  |j                  z
  | j                  |j                  z
  «      S r   r6  rÄ   s     r   ræ   zVec2.distance  s-   € Ü�z‰z˜$Ÿ&™& 5§7¡7Ñ*¨D¯F©F°U·W±WÑ,<Ó=Ð=r   c                ó¤   — | j                  «       j                  |j                  «       «      }|dk  rd}n|dkD  rd}t        j                  |«      S )zqCalculate angle between `self` and `other` in radians. +angle is
        counter-clockwise orientation.

        rè   ré   )rf   rŸ   rN   r�   rê   s      r   rì   zVec2.angle_between  sJ   € ð
 —N‘NÓ$×(Ñ(¨¯©Ó):Ó;ˆ	à�tÒØ‰IØ˜Š_ØˆIÜ�y‰y˜Ó#Ð#r   c                óh   — | j                   j                  | j                  |z   | j                  «      S )zYRotate vector around origin.

        Args:
            angle: angle in radians

        )r(   rT   rR   r…   rù   s     r   r÷   zVec2.rotate  s(   € ð �~‰~×(Ñ(¨¯©°eÑ);¸T¿^¹^ÓLÐLr   c                óŽ   — | j                   j                  | j                  t        j                  |«      z   | j
                  «      S )zzRotate vector around origin.

        Args:
            angle: angle in degrees

        Returns: rotated vector

        )r(   rT   rR   rN   rW   r…   rù   s     r   rú   zVec2.rotate_deg&  s6   € ð �~‰~×(Ñ(Ø�J‰JœŸ™ eÓ,Ñ,¨d¯n©nó
ð 	
r   c                ó6   — t        dd«      }| D ]  }||z  }Œ	 |S )rÜ   r   )r   rÞ   s      r   rá   zVec2.sum3  s'   € ô ��A‹JˆÛˆAØ�‰F‰Að àˆr   ))rL   rL   N)rü   ÚNonerý   r   rþ   )r<   r   rü   z
list[Vec2])r<   r   rü   zSequence[Vec2])r<   r   rü   zIterator[Vec2]r  )rR   r`   rS   r`   rü   r   r  r  )rw   r  rü   r   r  r  rû   r	  r  )r¬   r
  rü   r   r  )r˜   r   r°   r`   rü   r   )r˜   r   rü   r   )rS   r`   rü   r   )r˜   r   r•   r`   r   r`   rü   r
  r  )r˜   r`   rü   r   )r˜   r   rü   r`   )rR   r`   rü   r   )r<   zIterable[Vec2]rü   r   )5r  r  r  r  r  r   r  r   r3   r  r8   r@   r9   rT   rX   rj   rm   ro   rr   rt   r  rx   r€   r‚   r†   r…   r’   rR   r¨   r­   r²   r·   rf   r¾   r  rÁ   r—   rÅ   rÈ   r¯   rÏ   rÑ   r»   rØ   rÚ   rŸ   rS  ræ   rì   r÷   rú   r  rá   rD   r   r   r   r   3  sÎ  „ ñ
ð �c�
€Iô
"ð ò'ó ð'ôNð ò)ó ð)ð ò*ó ð*ð ò-ó ð-ð óGó ðGð ó;ó ð;ó-ó'óó&ó0ð €Hóó7óóð ò*ó ð*ð òAó ðAð ò*ó ð*ð ò(ó ð(ô
3ô$ó"ô
5ó0ð €Gó ð 26ÈñNØðNØ).ðNØ@EðNà	óNó7ó
ó0ó0ó0ó>ó>ó>ó3ó3ó>ó$óMó
ð òó ñr   )r  r   r  r   rü   r`   r  )r  r   r  r   r°   r`   rü   r   )Ú
__future__r   Útypingr   r   r   r   r   r	   Ú	functoolsr
   rN   rd   Ú
ezdxf.mathr   r   r‘   r—   Ú__all__r   rž   ÚY_AXISÚZ_AXISrÝ   ræ   r²   r   rD   r   r   Ú<module>ra     s�   ðõ #÷÷ õ Û Û áß'à
€Ù
�$—,‘,¨Ô
0€à�6Ð
€÷z0ñ z0ñz 
ˆa��A‹€Ù	ˆa��A‹€Ù	ˆa��A‹€Ù
ˆq�!�Q‹-€ó!ô	%÷Fò Fr   