
    'ja                    @   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dS )    )annotations)TupleIterableSequenceTYPE_CHECKINGIteratorOptional)partialN)UVecAnyVec-q=)abs_tolVec3Vec2c                  v   e Zd ZdZg dZd Zedcd            Zedcd            Zedcd            Z	eddd	            Z
eded            Zedfd            Z	 	 	 dgdhdZdidddZedjd            Zedkd            Zedld            Zedmdnd             Zedmdnd!            Zedod#            Zedpdqd%            Zdrd'Zdrd(Zdsd*Zdsd+Zddd,ZeZdtd/Zdud1Zdvd3Z dcd4Z!edcd5            Z"edcd6            Z#edcd7            Z$edwd9            Z%d:d;d<dxd@Z&edcdA            Z'edcdB            Z(edcdC            Z)edcdD            Z*dydzdGZ+d{d|dJZ,d|dKZ-dmdqdLZ.dddMZ/e/Z0dwdNZ1d:d;d<d}dOZ2d~dPZ3d~dQZ4d|dRZ5d|dSZ6d|dTZ7d|dUZ8ddVZ9ddWZ:ddXZ;eddY            Z<ddZZ=d|d[Z>dd\Z?dd]Z@dd`ZAddaZBddbZCdS )r   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                @     | j         | \  | _        | _        | _        d S N	decomposer   r   r   )selfargss     L/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/math/_vector.py__init__zVec3.__init__H   s!    $2DND$9!$'''    returnfloatc                    | j         S )zx-axis value)r   r   s    r   xzVec3.xK        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                B    |                      | j        | j                  S )z1Vec3 as ``(x, y, 0)``, projected on the xy-plane.)	__class__r   r   r"   s    r   xyzVec3.xyZ   s     ~~dgtw///r   tuple[float, float, float]c                *    | j         | j        | j        fS )zVec3 as ``(x, y, z)`` tuple.r   r"   s    r   xyzzVec3.xyz_   s     w((r   r   c                8    t          | j        | j        f          S )z'Real 2D vector as :class:`Vec2` object.)r   r   r   r"   s    r   vec2z	Vec3.vec2d   s     TWdg&'''r   Nr#   Optional[float]r&   r(   c                f    || 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   s>     9A9A9A~~aA&&&r   c                    |                      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   r7   z
Vec3.roundx   sG    
 ~~$'7##$'7##$'7##
 
 	
r   itemsIterable[UVec]
list[Vec3]c                F    t          |                     |                    S )z(Returns a list of :class:`Vec3` objects.listgenerateclsr:   s     r   r?   z	Vec3.list   s     CLL''(((r   Sequence[Vec3]c                F    t          |                     |                    S z)Returns a tuple of :class:`Vec3` objects.tupler@   rA   s     r   rG   z
Vec3.tuple        S\\%(()))r   Iterator[Vec3]c                       fd|D             S )z-Returns an iterable of :class:`Vec3` objects.c              3  .   K   | ]} |          V  d S r    .0itemrB   s     r   	<genexpr>z Vec3.generate.<locals>.<genexpr>   +      ,,dD		,,,,,,r   rL   rA   s   ` r   r@   zVec3.generate   s     -,,,e,,,,r         ?anglelengthc                p     | 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rB   rS   rT   s      r   
from_anglezVec3.from_angle   s2    
 s48E??V+TXe__v-EsKKKr   c                R    |                      t          j        |          |          S )zhReturns a :class:`Vec3` object from `angle` in degrees in the
        xy-plane, z-axis = ``0``.
        r\   rX   radiansr[   s      r   from_deg_anglezVec3.from_deg_angle   s"    
 ~~dl5116:::r   Tuple[float, float, float]c                 *   t          |           }|dk    rdS |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    r2| \  }}}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   )rV   rV   rV         rV      )len
isinstancer   r   r   r   	TypeErrorr    )r   rT   datar#   r&   r(   s         r   r   zVec3.decompose   s   $ TQ;; =q[[7D$%% 4w00TQ;;DAqAAq[["GAq!!#OQxxq58833q[[DAq88U1XXs**q[[GAq!88U1XXuQxx//r   rc   c                    t          j        dd          }t          j        dd          }t          j        dd          }t          |||                              |          S )zReturns a random vector.rc   )randomuniformr   	normalize)rB   rT   r#   r&   r(   s        r   rl   zVec3.random   sU     N2q!!N2q!!N2q!!Aq!}}&&v...r   strc                ,    d                     |           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33r   c                0    d|                                  z   S )z%Return ``'Vec3(x, y, z)'`` as string.r   rs   r"   s    r   __repr__zVec3.__repr__   s    &&r   intc                    dS )zReturns always ``3``.re   rL   r"   s    r   __len__zVec3.__len__   s    qr   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     DH~~r   c                    | S )z1Returns a copy of vector as :class:`Vec3` object.rL   r"   s    r   copyz	Vec3.copy       r   memodictdictc                    | S )z:func:`copy.deepcopy` support.rL   )r   r   s     r   __deepcopy__zVec3.__deepcopy__   r   r   indexc                    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   rc   rd   invalid index )rg   slicerh   r   r   r   
IndexErrorr   r   s     r   __getitem__zVec3.__getitem__   sl     eU## 	53444A::7NaZZ7NaZZ7N5e55666r   Iterator[float]c              #  @   K   | j         V  | j        V  | j        V  dS )z&Returns iterable of x-, y- and z-axis.Nr   r"   s    r   __iter__zVec3.__iter__  s+      gggr   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                @    t          j        | j        | j                  S )z!Length of vector in the xy-plane.)rX   hypotr   r   r"   s    r   magnitude_xyzVec3.magnitude_xy       z$'47+++r   c                N    | j         | j        | j        }}}||z  ||z  z   ||z  z   S )zSquare length of vector.r   r3   s       r   r   zVec3.magnitude_square  s2     '47DGa11uq1u}q1u$$r   boolc                    t          | j                  t          k    o9t          | j                  t          k    o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     LLG# (DG'(DG'	
r   &.>r   rel_tolr   otherr   r   c                   |                                  }|                                 }|                    |||          p|                    | ||          S )z?Returns ``True`` if `self` and `other` are parallel to vectors.r   )rn   isclose)r   r   r   r   v1v2s         r   is_parallelzVec3.is_parallel'  sc     ^^__zz"gwz?? 
2::C' DN D
 D
 	
r   c                ~    t          j        t                              |                                                     S )z3Spatial angle between vector and x-axis in radians.)rX   acosX_AXISdotrn   r"   s    r   spatial_anglezVec3.spatial_angle1  s*     yDNN$4$455666r   c                4    t          j        | j                  S )z3Spatial angle between vector and x-axis in degrees.)rX   degreesr   r"   s    r   spatial_angle_degzVec3.spatial_angle_deg6  s     |D.///r   c                @    t          j        | j        | j                  S )z;Angle between vector and x-axis in the xy-plane in radians.)rX   atan2r   r   r"   s    r   rS   z
Vec3.angle;  r   r   c                4    t          j        | j                  S )z>Returns angle of vector and x-axis in the xy-plane in degrees.rX   r   rS   r"   s    r   	angle_degzVec3.angle_deg@       |DJ'''r   Tccwc                    |r'|                      | j         | j        | j                  n&|                      | 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   r   s     r   
orthogonalzVec3.orthogonalE  sI     <DNNDG8TWdg666$'47;;	
r   r   r   c                |    |                      |          | z
  t          |          z  }|                     |          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  s5     ^^E""T)U6]]:||Ar   c                Z    |                                  }||                    |          z  S )z0Returns projected vector of `other` onto `self`.rn   r   r   r   uvs      r   projectzVec3.project^  &    ^^BFF5MM!!r   c                <    |                      || j        z            S )z7Returns normalized vector, optional scaled by `length`.__mul__r   r   rT   s     r   rn   zVec3.normalizec  s    ||FT^3444r   c                T    |                      | j         | j         | j                   S )z!Returns negated vector (-`self`).)r*   r   r   r   r"   s    r   reversedzVec3.reversedg  s$    ~~twh47(;;;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                   |                      |          \  }}}t          j        | j        |||          o9t          j        | j        |||          o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   rX   r   r   r   r   )r   r   r   r   r#   r&   r(   s          r   r   zVec3.iscloseq  st     ..''1aL!WgFFF KTWa'JJJKTWa'JJJ	
r   c                    t          |t                    st          |          }| j        |j        k    o| j        |j        k    o| j        |j        k    S )zZEqual operator.

        Args:
            other: :class:`Vec3` compatible object
        )rg   r   r#   r&   r(   r   r   s     r   __eq__zVec3.__eq__  sL     %&& 	 KKEv LTVuw%6L46UW;LLr   c                    |                      |          \  }}}| 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__  sU     ..''1a7a<<w!||w{"w{"7Q;r   c                    |                      |          \  }}}|                     | 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~~dgk47Q;!DDDr   c                ,    |                      |          S )z.RAdd :class:`Vec3` operator: `other` + `self`.)r   r   s     r   __radd__zVec3.__radd__      ||E"""r   c                    |                      |          \  }}}|                     | j        |z
  | j        |z
  | j        |z
            S )z-Sub :class:`Vec3` operator: `self` - `other`.r   r   s        r   __sub__zVec3.__sub__  sC     ..''1a~~dgk47Q;!DDDr   c                    |                      |          \  }}}|                     || 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$'k1tw;DGDDDr   c                ~    t          |          }|                     | 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__  8    u~~dg.&0@$'FBRSSSr   c                ,    |                      |          S )z'Scalar RMul operator: `other` * `self`.)r   r   s     r   __rmul__zVec3.__rmul__  r   r   c                ~    t          |          }|                     | 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FAAr   c                t    |                      |          \  }}}| 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w{TWq[(47Q;66r   c                    |                      |          \  }}}|                     | 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  sm     ..''1a~~GaK$'A+%GaK$'A+%GaK$'A+%
 
 	
r   c                `    |                      |          }|                    |           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                    |                                                      |                     |                                                     }|dk     rd}n|dk    rd}t          j        |          S )zReturns angle between `self` and `other` in radians. +angle is
        counter clockwise orientation.

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

              rR   )rn   r   r*   rX   r   r   r   	cos_thetas      r   angle_betweenzVec3.angle_between  si     NN$$(()>)>)H)H)J)JKK	tII__Iy###r   basetargetc                <   ||                      |          z
                                  }|                     |                                          }|                    |          }|                    |          }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   rn   r   r   rX   r   tau)r   r   r   x_axisy_axistarget_projected_xtarget_projected_ys          r   angle_aboutzVec3.angle_about  s     d+++6688F##--//#ZZ//#ZZ//z,.@AADHLLr   c                    |                      | j        | j        d          }t                              |j        |z   |j                  }|                      |j        |j        | j                  S )ztReturns vector rotated about `angle` around the z-axis.

        Args:
            angle: angle in radians

        rV   )r*   r#   r&   r   r\   rS   r   r(   )r   rS   r   s      r   rotatezVec3.rotate  sT     NN46463//OOAGeOQ[99~~ac13///r   c                P    |                      t          j        |                    S )ztReturns vector rotated about `angle` around the z-axis.

        Args:
            angle: angle in degrees

        )r  rX   r_   r   rS   s     r   
rotate_degzVec3.rotate_deg  s      {{4<..///r   r   r    r   r   )r   r,   r   r   )NNN)r#   r1   r&   r1   r(   r1   r   r   r   )r:   r;   r   r<   )r:   r;   r   rC   )r:   r;   r   rI   rR   )rS   r    rT   r    r   r   )r   ra   )rc   )rT   r    r   r   r   ro   r   rw   )r   r   r   r   r   rw   r   r    r   r   r   r   )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    )rS   r    r   r   )D__name__
__module____qualname____doc__	__slots__r   propertyr#   r&   r(   r+   r.   r0   r4   r7   classmethodr?   rG   r@   r\   r`   staticmethodr   rl   rs   rv   ry   r|   r~   __copy__r   r   r   r   r   r   r   r   r   r   r   rS   r   r   r   r   rn   r   __neg__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  rL   r   r   r   r      s<       * *X #""I: : :    X    X    X 0 0 0 X0 ) ) ) X) ( ( ( X( "!!	' ' ' ' '	
 	
 	
 	
 	
 ) ) ) [) * * * [* - - - [- L L L L [L ; ; ; ; [; ( ( ( \(T / / / / [/4 4 4 4' ' ' '          H   7 7 7 7&       * * * X* , , , X, % % % X%
 
 
 
 X
 04e
 
 
 
 
 
 7 7 7 X7 0 0 0 X0 , , , X, ( ( ( X(
 
 
 
 

 
 
 
 
" " " "
5 5 5 5 5< < < < G       
 04e
 
 
 
 
 
"M M M M    E E E E
# # # #E E E EE E E E
T T T T
# # # #T T T T
    \7 7 7 7
 
 
 
) ) ) )
$ $ $ $ M M M M 	0 	0 	0 	00 0 0 0 0 0r   rc   p1r   p2r   r    c                F    t          |                               |          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   )r  r  s     r   r   r     s     88R   r   r   r   c                H    t          |                               ||          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     88==V$$$r   c                  @   e Zd ZdZddgZdQdRdZedSd
            ZdTdUdZe	dVd            Z
e	dWd            Ze	dXd            Ze	dYdZd            Ze	dYdZd            Zd[dZd[dZd\dZd\dZdUd ZeZd]d#Zd^d%Zd_d'Zd`d(Zed`d)            Zedad+            Zed`d,            Zed`d-            Zdbdcd0Zddded5Zdfd6ZdYdgd7Z dUd8Z!e!Z"dad9Z#d:d;d<dhd?Z$didAZ%didBZ&dfdCZ'dfdDZ(dfdEZ)djdFZ*djdGZ+djdHZ,dkdIZ-dkdJZ.dkdKZ/dkdLZ0dldMZ1dldNZ2e3dmdP            Z4dS )nr   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&   rV   rV   Nr   Nonec                   	 |j         | _         |j        | _        d S # t          $ re |7t          |d                   | _         t          |d                   | _        Y d S t          |          | _         t          |          | _        Y d S w xY w)Nr   rc   )r#   r&   AttributeErrorr    )r   r   r&   s      r   r   zVec2.__init__B  s    		"SDFSDFFF 	" 	" 	"yqtqtqq	"s    A B(B
Br   c                8    t          | j        | j        d          S )zReturns a 3D vector.r   )r   r#   r&   r"   s    r   vec3z	Vec2.vec3N  s     DFDFA&&&r   c                z    |                      t          | j        |          t          | j        |                    S r6   )r*   r7   r#   r&   r8   s     r   r7   z
Vec2.roundS  s0    
 ~~eDFG44eDFG6L6LMMMr   r:   r;   
list[Vec2]c                F    t          |                     |                    S r   r>   rA   s     r   r?   z	Vec2.listZ  s    CLL''(((r   Sequence[Vec2]c                F    t          |                     |                    S rE   rF   rA   s     r   rG   z
Vec2.tuple^  rH   r   Iterator[Vec2]c                       fd|D             S )Nc              3  .   K   | ]} |          V  d S r   rL   rM   s     r   rP   z Vec2.generate.<locals>.<genexpr>e  rQ   r   rL   rA   s   ` r   r@   zVec2.generatec  s    ,,,,e,,,,r   rR   rS   r    rT   c                n     | t          j        |          |z  t          j        |          |z            S r   rW   r[   s      r   r\   zVec2.from_angleg  s.    s48E??V+TXe__v-EFFFr   c                R    |                      t          j        |          |          S r   r^   r[   s      r   r`   zVec2.from_deg_anglek  s     ~~dl5116:::r   ro   c                ,    d                     |           S )Nz({0.x}, {0.y})rq   r"   s    r   rs   zVec2.__str__o  s    &&t,,,r   c                0    d|                                  z   S )Nr   ru   r"   s    r   rv   zVec2.__repr__r  s    &&r   rw   c                    dS )Nrd   rL   r"   s    r   ry   zVec2.__len__u  s    qr   c                8    t          | j        | j        f          S r   )r{   r#   r&   r"   s    r   r|   zVec2.__hash__x  s    TVTV$%%%r   c                D    |                      | j        | j        f          S r   r*   r#   r&   r"   s    r   r~   z	Vec2.copy{  s    ~~tvtv.///r   r   r   c                    	 |t          |                    S # t          $ r+ |                                 }||t          |           <   |cY S w xY wr   )idKeyErrorr~   )r   r   r   s      r   r   zVec2.__deepcopy__  sY    	BtHH%% 	 	 			A!"HRXXHHH	s    2AAr   c                    t          |t                    rt          d          |dk    r| j        S |dk    r| j        S t          d|           )Nr   r   rc   r   )rg   r   rh   r#   r&   r   r   s     r   r   zVec2.__getitem__  sZ    eU## 	53444A::6MaZZ6M5e55666r   r   c              #  .   K   | j         V  | j        V  d S r   r#   r&   r"   s    r   r   zVec2.__iter__  s       ffr   c                    | j         S r   r   r"   s    r   r   zVec2.__abs__  s
    ~r   c                @    t          j        | j        | j                  S )zReturns length of vector.rX   r   r#   r&   r"   s    r   r   zVec2.magnitude       z$&$&)))r   r   c                v    t          | j                  t          k    ot          | j                  t          k    S r   )r   r#   r   r&   r"   s    r   r   zVec2.is_null  s'    46{{g%@#df++*@@r   c                @    t          j        | j        | j                  S )zAngle of vector in radians.)rX   r   r&   r#   r"   s    r   rS   z
Vec2.angle  rA  r   c                4    t          j        | j                  S )zAngle of vector in degrees.r   r"   s    r   r   zVec2.angle_deg  r   r   Tr   c                    |r!|                      | j         | j                  S |                      | j        | j                   S )zhOrthogonal vector

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

        )r*   r&   r#   r   s     r   r   zVec2.orthogonal  s@      	3>>46'46222>>$&46'222r   r   r   r   r   c                    | j         |j         | j         z
  |z  z   }| j        |j        | j        z
  |z  z   }|                     ||          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  sL     Feg&&00Feg&&00~~a###r   c                Z    |                                  }||                    |          z  S )z#Project vector `other` onto `self`.r   r   s      r   r   zVec2.project  r   r   c                <    |                      || j        z            S r   r   r   s     r   rn   zVec2.normalize  s    ||FT^3444r   c                F    |                      | j         | j                   S r   r7  r"   s    r   r   zVec2.reversed  s    ~~tvgw///r   c                    | j          S r   r   r"   s    r   r   zVec2.__bool__  s    <r   r   r   r   r   r   c                   t          |t                    st          |          }t          j        | j        |j        ||          o!t          j        | j        |j        ||          S )Nr   )rg   r   rX   r   r#   r&   )r   r   r   r   s       r   r   zVec2.isclose  sh     %&& 	 KKE|FEGWg
 
 
 Nl4657GWMMM	Nr   r   c                    t          |t                    st          |          }| j        |j        k    o| j        |j        k    S r   )rg   r   r#   r&   r   s     r   r   zVec2.__eq__  s<    %&& 	 KKEv 6TVuw%66r   c                N    |^}}}| j         |k    r| j        |k     S | j         |k     S r   r=  )r   r   r#   r&   _s        r   r   zVec2.__lt__  s0    1q6Q;;6A:6A:r   c                    	 |                      | j        |j        z   | j        |j        z             S # t          $ r t	          d          w xY wNzinvalid argumentr*   r#   r&   r%  rh   r   s     r   r   zVec2.__add__  W    	0>>$&57"2DFUW4DEEE 	0 	0 	0.///	0	   /2 Ac                    	 |                      | j        |j        z
  | j        |j        z
            S # t          $ r t	          d          w xY wrP  rQ  r   s     r   r   zVec2.__sub__  rR  rS  c                    	 |                      |j        | j        z
  |j        | j        z
            S # t          $ r t	          d          w xY wrP  rQ  r   s     r   r   zVec2.__rsub__  sW    	0>>%'DF"2EGdf4DEEE 	0 	0 	0.///	0rS  c                N    |                      | j        |z  | j        |z            S r   r7  r   s     r   r   zVec2.__mul__  "    ~~dfundfun===r   c                N    |                      | j        |z  | j        |z            S r   r7  r   s     r   r   zVec2.__rmul__  rW  r   c                N    |                      | j        |z  | j        |z            S r   r7  r   s     r   r   zVec2.__truediv__  rW  r   c                @    | j         |j         z  | j        |j        z  z   S r   r=  r   s     r   r   zVec2.dot      v$&57"222r   c                @    | j         |j        z  | j        |j         z  z
  S r   r=  r   s     r   detzVec2.det
  r[  r   c                `    t          j        | j        |j        z
  | j        |j        z
            S r   r@  r   s     r   r   zVec2.distance  s&    z$&57*DFUW,<===r   c                    |                                                      |                                           }|dk     rd}n|dk    rd}t          j        |          S )zqCalculate angle between `self` and `other` in radians. +angle is
        counter-clockwise orientation.

        r   rR   )rn   r   rX   r   r   s      r   r   zVec2.angle_between  s[    
 NN$$(():):;;	tII__Iy###r   c                R    | j                             | j        |z   | j                  S )zYRotate vector around origin.

        Args:
            angle: angle in radians

        )r*   r\   rS   r   r  s     r   r  zVec2.rotate  s%     ~((e);T^LLLr   c                v    | j                             | j        t          j        |          z   | j                  S )zzRotate vector around origin.

        Args:
            angle: angle in degrees

        Returns: rotated vector

        )r*   r\   rS   rX   r_   r   r  s     r   r  zVec2.rotate_deg&  s6     ~((Je,,,dn
 
 	
r   Iterable[Vec2]c                :    t          dd          }| D ]}||z  }|S )r   r   )r   r   s      r   r   zVec2.sum3  s0     AJJ 	 	AFAAr   )r"  N)r   r#  r  r   r	  )r:   r;   r   r)  )r:   r;   r   r+  )r:   r;   r   r-  r
  )rS   r    rT   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   )rT   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:   rb  r   r   )5r  r  r  r  r  r   r  r'  r7   r  r?   rG   r@   r\   r`   rs   rv   ry   r|   r~   r  r   r   r   r   r   r   rS   r   r   r   r   rn   r   r  r   r   r   r   r   r   r   r   r   r   r   r]  r   r   r  r  r  r   rL   r   r   r   r   3  sc       
 
 c
I
" 
" 
" 
" 
" ' ' ' X'N N N N N ) ) ) [) * * * [* - - - [- G G G G [G ; ; ; ; [;- - - -' ' ' '   & & & &0 0 0 0 H   7 7 7 7       * * * X* A A A XA * * * X* ( ( ( X(
3 
3 
3 
3 
3$ $ $ $ $" " " "
5 5 5 5 50 0 0 0 G        26N N N N N N7 7 7 7
   0 0 0 00 0 0 00 0 0 0> > > >> > > >> > > >3 3 3 33 3 3 3> > > >$ $ $ $M M M 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
   rX   rl   
ezdxf.mathr   r   r   r   __all__r   r   Y_AXISZ_AXISr   r   r   r   rL   r   r   <module>rk     s   # " " " " "                        (''''''''

'$,
0
0
06
z0 z0 z0 z0 z0 z0 z0 z0z 
aA	aA	aA
$q!Q--! ! ! !	% 	% 	% 	% 	%F F F F F F F F F Fr   