
    Oga                       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     W/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/math/_vector.py__init__zVec3.__init__H   s    $2DNND$9!$'    c                    | j                   S )zx-axis value)r   r   s    r   xzVec3.xK        ww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     ~~dggtww//r   c                H    | j                   | j                  | j                  fS )zVec3 as ``(x, y, z)`` tuple.r   r    s    r   xyzzVec3.xyz_   s     ww((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     TWWdgg&''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 zReturns 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     CLL'((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>        ,dD	,   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-    
 488E?V+TXXe_v-Es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    
 ~~dll516::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[7D$%ww00TQ;DAqAq["GAq!#OQxq5833q[DAq8U1Xs**q[GAq!8U1XuQx//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     NN2q!NN2q!NN2q!Aq!}&&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     DHH~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\     eU#344A:77NaZ77NaZ77N~eW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!     gggggg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       zz$''477++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     ''477DGGa11uq1u}q1u$$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     LG# (DGG'(DGG'	
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     ^^__zz"gwz? 
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#     yyDNN$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@       ||DJJ''r   c                    |r2| j                  | j                   | j                  | j                        S | j                  | j                  | j                   | j                        S )zReturns 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      NNDGG8TWWdgg6	
 $''477;	
r   c                d    | j                  |      | z
  t        |      z  }| j                  |      S )zReturns 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)U6]:||Ar   c                J    | j                         }||j                  |      z  S )z0Returns projected vector of `other` onto `self`.rf   r   r   r   uvs      r   projectzVec3.project^  !    ^^BFF5M!!r   c                >    | j                  || j                  z        S )z7Returns normalized vector, optional scaled by `length`.__mul__r   r   rS   s     r   rf   zVec3.normalizec  s    ||FT^^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'    ~~twwh477(;;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 )zReturns ``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     ..'1aLL!WgF KTWWa'JKTWWa'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     %&KEvv LTVVuww%6L466UWW;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     ..'1a77a<ww!|ww{"ww{"77Q;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    ..'1a~~dggk477Q;!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     ..'1a~~dggk477Q;!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    ..'1a~~a$''k1tww;DGG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~~dgg.&0@$''FBR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FA	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@     ..'1aww{TWWq[(477Q;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     ..'1a~~GGaK$''A+%GGaK$''A+%GGaK$''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$    NN5!yy(((r   c                    | j                         j                  | j                  |      j                               }|dk  rd}n|dkD  rd}t        j                  |      S )zReturns 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     NN$(()>)H)H)JK	tI_Iyy##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#--/#ZZ/#ZZ/zz,.@ADHH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     NN4664663/OOAGGeOQ[[9~~acc133//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& * * , , % %
 
 
 04e

',
>C
	
 7 7 0 0 , , ( (

"
5< G 
 04e

',
>C
	
"M E
#EE
T
#T
  7
)
$ M 	00r   rZ   c                6    t        |       j                  |      S )zReturns 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    		"SSDFSSDF 	"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     DFFDFFA&&r   c                v    | j                  t        | j                  |      t        | j                  |            S r2   )r(   r3   r!   r$   r4   s     r   r3   z
Vec2.roundS  s+    
 ~~eDFFG4eDFFG6LMMr   c                6    t        | j                  |            S r   r7   r:   s     r   r8   z	Vec2.listZ  s    CLL'((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)    488E?V+TXXe_v-EFFr   c                L    | j                  t        j                  |      |      S r   rV   rQ   s      r   rX   zVec2.from_deg_anglek  s    ~~dll516::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    TVVTVV$%%r   c                P    | j                  | j                  | j                  f      S r   r(   r!   r$   r    s    r   rt   z	Vec2.copy{  s    ~~tvvtvv.//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    	BtH%% 			A!"HR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    eU#344A:66MaZ66M~eW566r   c              #  D   K   | j                    | j                   y wr   r!   r$   r    s    r   r   zVec2.__iter__  s     ffff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       zz$&&$&&))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'    466{g%@#dff+*@@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=     >>466'46622>>$&&466'22r   c                    | j                   |j                   | j                   z
  |z  z   }| j                  |j                  | j                  z
  |z  z   }| j                  ||      S )zLinear 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     FFegg&&00FFegg&&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    ||FT^^344r   c                R    | j                  | j                   | j                         S r   r-  r    s    r   r   zVec2.reversed  s    ~~tvvg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     %&KE||FFEGGWg
 Nll466577GW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:    %&KEvv 6TVVuww%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    1q66Q;66A:66A: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>>$&&577"2DFFUWW4D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>>%''DFF"2EGGdff4DEE 	0.//	0rI  c                Z    | j                  | j                  |z  | j                  |z        S r   r-  r   s     r   r   zVec2.__mul__  #    ~~dffundffun==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  '    vv$&&577"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-    zz$&&577*DFFUWW,<==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    
 NN$(():;	tI_Iyy##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     ~~((JJe,,dnn
 	
r   c                6    t        dd      }| D ]  }||z  }	 |S )r   r   )r   r   s      r   r   zVec2.sum3  s,     AJ 	AFA	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0z 
aA	aA	aA
q!Q-!	%F Fr   