
    ha                    (   S SK Jr  S SKJrJrJrJrJrJr  S SK	J
r
  S SKrS SKr\(       a  S SKJrJr  Sr\
" \R"                  \S9rSS	/r " S
 S5      r\" SS S 5      r\" S SS 5      r\" S S S5      r\" S S S 5      rSS jrSSS jjr " S S	5      rg)    )annotations)TupleIterableSequenceTYPE_CHECKINGIteratorOptional)partialN)UVecAnyVec-q=)abs_tolVec3Vec2c                     \ rS rSrSr/ SQrS r\SBS j5       r\SBS j5       r	\SBS j5       r
\SCS j5       r\SDS	 j5       r\SES
 j5       r   SF       SGS jjrSHSCS jjr\SIS j5       r\SJS j5       r\SKS j5       r\SLSMS jj5       r\SLSMS jj5       r\SNS j5       r\SOSPS jj5       rSQS jrSQS jrSRS jrSRS jrSCS jr\rSSS jrSTS jr SUS jr!SBS jr"\SBS j5       r#\SBS j5       r$\SBS  j5       r%\SVS! j5       r&S"S#S$.       SWS% jjr'\SBS& j5       r(\SBS' j5       r)\SBS( j5       r*\SBS) j5       r+SXSYS* jjr,SZS[S+ jjr-S[S, jr.SLSPS- jjr/SCS. jr0\0r1SVS/ jr2S"S#S$.       S\S0 jjr3S]S1 jr4S]S2 jr5S[S3 jr6S[S4 jr7S[S5 jr8S[S6 jr9S^S7 jr:S^S8 jr;S^S9 jr<\S_S: j5       r=S`S; jr>S[S< jr?S`S= jr@S`S> jrASaS? jrBSbS@ jrCSbSA jrDSrEg)cr      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    U R                   " U6 u  U l        U l        U l        g N	decomposer   r   r   )selfargss     D/var/www/html/env/lib/python3.13/site-packages/ezdxf/math/_vector.py__init__Vec3.__init__H   s    $(NND$9!$'    c                    U R                   $ )zx-axis value)r   r   s    r   xVec3.xK        wwr    c                    U R                   $ )zy-axis value)r   r"   s    r   yVec3.yP   r%   r    c                    U R                   $ )zz-axis value)r   r"   s    r   zVec3.zU   r%   r    c                N    U R                  U R                  U R                  5      $ )z1Vec3 as ``(x, y, 0)``, projected on the xy-plane.)	__class__r   r   r"   s    r   xyVec3.xyZ   s     ~~dggtww//r    c                H    U R                   U R                  U R                  4$ )zVec3 as ``(x, y, z)`` tuple.r   r"   s    r   xyzVec3.xyz_   s     ww((r    c                D    [        U R                  U R                  45      $ )z'Real 2D vector as :class:`Vec2` object.)r   r   r   r"   s    r   vec2	Vec3.vec2d   s     TWWdgg&''r    Nc                    Uc  U R                   nUc  U R                  nUc  U R                  nU R                  XU5      $ )z<Returns a copy of vector with replaced x-, y- and/or z-axis.)r   r   r   r-   r   r#   r'   r*   s       r   replaceVec3.replacei   s?     9A9A9A~~aA&&r    c                    U R                  [        U R                  U5      [        U R                  U5      [        U R                  U5      5      $ 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   r<   
Vec3.roundx   s?    
 ~~$''7#$''7#$''7#
 	
r    c                6    [        U R                  U5      5      $ )z(Returns a list of :class:`Vec3` objects.listgenerateclsitemss     r   rB   	Vec3.list   s     CLL'((r    c                6    [        U R                  U5      5      $ z)Returns a tuple of :class:`Vec3` objects.tuplerC   rD   s     r   rK   
Vec3.tuple        S\\%())r    c                   ^  U 4S jU 5       $ )z-Returns an iterable of :class:`Vec3` objects.c              3  4   >#    U  H  nT" U5      v   M     g 7fr    .0itemrE   s     r   	<genexpr> Vec3.generate.<locals>.<genexpr>        ,edD		e   rP   rD   s   ` r   rC   Vec3.generate   s     -e,,r    c                r    U " [         R                  " U5      U-  [         R                  " U5      U-  S5      $ )zXReturns a :class:`Vec3` object from `angle` in radians in the
xy-plane, z-axis = ``0``.
        mathcossinrE   anglelengths      r   
from_angleVec3.from_angle   s-    
 488E?V+TXXe_v-EsKKr    c                N    U R                  [        R                  " U5      U5      $ )zXReturns a :class:`Vec3` object from `angle` in degrees in the
xy-plane, z-axis = ``0``.
rb   r\   radiansr_   s      r   from_deg_angleVec3.from_deg_angle   s    
 ~~dll516::r    c                    [        U 5      nUS:X  a  gUS:X  a  U S   n[        U[        5      (       a#  UR                  UR                  UR
                  4$ [        U5      nUS:X  a  Uu  p4SnOUS:X  a  Uu  p4nO[        e[        U5      [        U5      [        U5      4$ US:X  a  U u  p4[        U5      [        U5      S4$ US:X  a%  U u  p4n[        U5      [        U5      [        U5      4$ [        e)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   )rZ   rZ   rZ         rZ      )len
isinstancer   r   r   r   	TypeErrorfloat)r   ra   datar#   r'   r*   s         r   r   Vec3.decompose   s    $ TQ; q[7D$%%ww00TQ;DAAq["GA!#OQxq5833q[DA8U1Xs**q[GA!8U1XuQx//r    c                    [         R                  " SS5      n[         R                  " SS5      n[         R                  " SS5      n[        X#U5      R                  U5      $ )zReturns a random vector.rj   )randomuniformr   	normalize)rE   ra   r#   r'   r*   s        r   ru   Vec3.random   sK     NN2q!NN2q!NN2q!A!}&&v..r    c                $    SR                  U 5      $ )z!Return ``'(x, y, z)'`` as string.z({0.x}, {0.y}, {0.z})formatr"   s    r   __str__Vec3.__str__   s    &--d33r    c                (    SU R                  5       -   $ )z%Return ``'Vec3(x, y, z)'`` as string.r   r|   r"   s    r   __repr__Vec3.__repr__   s    &&r    c                    g)zReturns always ``3``.rl   rP   r"   s    r   __len__Vec3.__len__   s    r    c                ,    [        U R                  5      $ )zZReturns hash value of vector, enables the usage of vector as key in
``set`` and ``dict``.
)hashr1   r"   s    r   __hash__Vec3.__hash__   s     DHH~r    c                    U $ )z1Returns a copy of vector as :class:`Vec3` object.rP   r"   s    r   copy	Vec3.copy       r    c                    U $ )z:func:`copy.deepcopy` support.rP   )r   memodicts     r   __deepcopy__Vec3.__deepcopy__   r   r    c                    [        U[        5      (       a  [        S5      eUS:X  a  U R                  $ US:X  a  U R                  $ US:X  a  U R
                  $ [        SU 35      e)zBSupport for indexing:

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

slicing not supportedr   rj   rk   invalid index )rn   slicero   r   r   r   
IndexErrorr   indexs     r   __getitem__Vec3.__getitem__   s_     eU##344A:77NaZ77NaZ77N~eW566r    c              #  `   #    U R                   v   U R                  v   U R                  v   g7f)z&Returns iterable of x-, y- and z-axis.Nr   r"   s    r   __iter__Vec3.__iter__  s      ggggggs   ,.c                    U R                   $ )z%Returns length (magnitude) of vector.	magnituder"   s    r   __abs__Vec3.__abs__  s    ~~r    c                     U R                   S-  $ )zLength of vector.      ?)magnitude_squarer"   s    r   r   Vec3.magnitude  s     $$c))r    c                X    [         R                  " U R                  U R                  5      $ )z!Length of vector in the xy-plane.)r\   hypotr   r   r"   s    r   magnitude_xyVec3.magnitude_xy       zz$''477++r    c                d    U R                   U R                  U R                  p2nX-  X"-  -   X3-  -   $ )zSquare length of vector.r   r7   s       r   r   Vec3.magnitude_square  s0     ''477DGGauqu}qu$$r    c                    [        U R                  5      [        :*  =(       a?    [        U R                  5      [        :*  =(       a    [        U R                  5      [        :*  $ )zr``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_nullVec3.is_null  sC     LG# (DGG'(DGG'	
r    &.>r   rel_tolr   c                   U R                  5       nUR                  5       nUR                  XRUS9=(       d    UR                  U* X#S9$ )z?Returns ``True`` if `self` and `other` are parallel to vectors.r   )rw   isclose)r   otherr   r   v1v2s         r   is_parallelVec3.is_parallel'  sP     ^^__zz"wz? 
2::C DN D
 	
r    c                p    [         R                  " [        R                  U R	                  5       5      5      $ )z3Spatial angle between vector and x-axis in radians.)r\   acosX_AXISdotrw   r"   s    r   spatial_angleVec3.spatial_angle1  s#     yyDNN$4566r    c                B    [         R                  " U R                  5      $ )z3Spatial angle between vector and x-axis in degrees.)r\   degreesr   r"   s    r   spatial_angle_degVec3.spatial_angle_deg6  s     ||D..//r    c                X    [         R                  " U R                  U R                  5      $ )z;Angle between vector and x-axis in the xy-plane in radians.)r\   atan2r   r   r"   s    r   r`   
Vec3.angle;  r   r    c                B    [         R                  " U R                  5      $ )z>Returns angle of vector and x-axis in the xy-plane in degrees.r\   r   r`   r"   s    r   	angle_degVec3.angle_deg@       ||DJJ''r    c                    U(       a2  U R                  U R                  * U R                  U R                  5      $ U R                  U R                  U R                  * U R                  5      $ )zqReturns orthogonal 2D vector, z-axis is unchanged.

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

)r-   r   r   r   r   ccws     r   
orthogonalVec3.orthogonalE  sQ      NNDGG8TWWdgg6	
 $''477;	
r    c                d    U R                  U5      U -
  [        U5      -  nU R                  U5      $ )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-   rp   __add__)r   r   factords       r   lerp	Vec3.lerpR  s.     ^^E"T)U6]:||Ar    c                H    U R                  5       nX"R                  U5      -  $ )z0Returns projected vector of `other` onto `self`.rw   r   r   r   uvs      r   projectVec3.project^      ^^FF5M!!r    c                <    U R                  XR                  -  5      $ )z7Returns normalized vector, optional scaled by `length`.__mul__r   r   ra   s     r   rw   Vec3.normalizec  s    ||F^^344r    c                j    U R                  U R                  * U R                  * U R                  * 5      $ )z!Returns negated vector (-`self`).)r-   r   r   r   r"   s    r   reversedVec3.reversedg  s'    ~~twwh477(;;r    c                $    U R                   (       + $ )z,Returns ``True`` if vector is not (0, 0, 0).r   r"   s    r   __bool__Vec3.__bool__m  s    <<r    c                  U R                  U5      u  pEn[        R                  " U R                  XBUS9=(       aG    [        R                  " U R                  XRUS9=(       a     [        R                  " U R
                  XbUS9$ )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   r\   r   r   r   r   )r   r   r   r   r#   r'   r*   s          r   r   Vec3.iscloseq  sc     ..'aLL!gF KTWWa'JKTWWa'J	
r    c                    [        U[        5      (       d  [        U5      nU R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ )zBEqual operator.

Args:
    other: :class:`Vec3` compatible object
)rn   r   r#   r'   r*   r   r   s     r   __eq__Vec3.__eq__  sQ     %&&KEvv LTVVuww%6L466UWW;LLr    c                    U R                  U5      u  p#nU R                  U:X  a.  U R                  U:X  a  U R                  U:  $ U R                  U:  $ U R                  U:  $ )zHLower than operator.

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

r   r   r   r#   r'   r*   s        r   __lt__Vec3.__lt__  sV     ..'a77a<ww!|ww{"ww{"77Q;r    c                    U R                  U5      u  p#nU R                  U R                  U-   U R                  U-   U R                  U-   5      $ )z-Add :class:`Vec3` operator: `self` + `other`.r   r-   r   r   r   r   s        r   r   Vec3.__add__  s?    ..'a~~dggk477Q;!DDr    c                $    U R                  U5      $ )z.RAdd :class:`Vec3` operator: `other` + `self`.)r   r   s     r   __radd__Vec3.__radd__      ||E""r    c                    U R                  U5      u  p#nU R                  U R                  U-
  U R                  U-
  U R                  U-
  5      $ )z-Sub :class:`Vec3` operator: `self` - `other`.r   r   s        r   __sub__Vec3.__sub__  sA     ..'a~~dggk477Q;!DDr    c                    U R                  U5      u  p#nU R                  X R                  -
  X0R                  -
  X@R                  -
  5      $ )z.RSub :class:`Vec3` operator: `other` - `self`.r   r   s        r   __rsub__Vec3.__rsub__  s9    ..'a~~a''k1ww;GGDDr    c                    [        U5      nU R                  U R                  U-  U R                  U-  U R                  U-  5      $ )z&Scalar Mul operator: `self` * `other`.rp   r-   r   r   r   r   r   scalars      r   r   Vec3.__mul__  9    u~~dgg.&0@$''FBRSSr    c                $    U R                  U5      $ )z'Scalar RMul operator: `other` * `self`.)r   r   s     r   __rmul__Vec3.__rmul__  r   r    c                    [        U5      nU R                  U R                  U-  U R                  U-  U R                  U-  5      $ )z&Scalar Div operator: `self` / `other`.r  r  s      r   __truediv__Vec3.__truediv__  r  r    c                ,    [         nU  H  nX-  nM	     U$ )Add all vectors in `items`.)NULLVECrF   svs      r   sumVec3.sum  s     AFA r    c                    U R                  U5      u  p#nU R                  U-  U R                  U-  -   U R                  U-  -   $ )zQDot operator: `self` . `other`

Args:
    other: :class:`Vec3` compatible object
r   r   s        r   r   Vec3.dot  s>     ..'aww{TWWq[(477Q;66r    c                    U R                  U5      u  p#nU R                  U R                  U-  U R                  U-  -
  U R                  U-  U R                  U-  -
  U R                  U-  U R                  U-  -
  5      $ )zSCross operator: `self` x `other`

Args:
    other: :class:`Vec3` compatible object
)r   r-   r   r   r   r   s        r   cross
Vec3.cross  so     ..'a~~GGaK$''A+%GGaK$''A+%GGaK$''A+%
 	
r    c                Z    U R                  U5      nUR                  U 5      R                  $ )z3Returns distance between `self` and `other` vector.)r-   r   r   )r   r   r  s      r   distanceVec3.distance  s$    NN5!yy(((r    c                    U R                  5       R                  U R                  U5      R                  5       5      nUS:  a  SnOUS:  a  Sn[        R                  " U5      $ )zReturns angle between `self` and `other` in radians. +angle is
counter clockwise orientation.

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

            ?)rw   r   r-   r\   r   r   r   	cos_thetas      r   angle_betweenVec3.angle_between  sU     NN$(()>)H)H)JK	tI_Iyy##r    c                   XR                  U5      -
  R                  5       nU R                  U5      R                  5       nUR                  U5      nUR                  U5      n[        R
                  " Xe5      [        R                  -  $ )zReturns 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   rw   r  r   r\   r   tau)r   basetargetx_axisy_axistarget_projected_xtarget_projected_ys          r   angle_aboutVec3.angle_about  sl     d++668F#--/#ZZ/#ZZ/zz,ADHHLLr    c                   U R                  U R                  U R                  S5      n[        R	                  UR
                  U-   UR                  5      nU R                  UR                  UR                  U R                  5      $ )z\Returns vector rotated about `angle` around the z-axis.

Args:
    angle: angle in radians

rZ   )r-   r#   r'   r   rb   r`   r   r*   )r   r`   r  s      r   rotateVec3.rotate  sY     NN4664663/OOAGGeOQ[[9~~acc133//r    c                L    U R                  [        R                  " U5      5      $ )z\Returns vector rotated about `angle` around the z-axis.

Args:
    angle: angle in degrees

)r1  r\   rf   r   r`   s     r   
rotate_degVec3.rotate_deg  s     {{4<<.//r    returnrp   r8  r   )r8  ztuple[float, float, float]r8  r   )NNN)r#   Optional[float]r'   r;  r*   r;  r8  r   r   )rF   Iterable[UVec]r8  z
list[Vec3])rF   r<  r8  zSequence[Vec3])rF   r<  r8  zIterator[Vec3]r!  )r`   rp   ra   rp   r8  r   )r8  zTuple[float, float, float])rj   )ra   rp   r8  r   r8  strr8  int)r   dictr8  r   r   rA  r8  rp   r8  zIterator[float]r8  bool)r   r   r   rp   r   rp   r8  rF  T)r   rF  r8  r   r   )r   r   r8  r   )r   r   r   rp   r   rp   r8  rF  r   r   r8  rF  )r   rp   r8  r   )rF   r<  r8  r   )r   r   r8  rp   )r(  r   r)  r   r8  rp   )r`   rp   r8  r   )F__name__
__module____qualname____firstlineno____doc__	__slots__r   propertyr#   r'   r*   r.   r1   r4   r8   r<   classmethodrB   rK   rC   rb   rg   staticmethodr   ru   r|   r   r   r   r   __copy__r   r   r   r   r   r   r   r   r   r   r   r`   r   r   r   r   rw   r   __neg__r   r   r   r   r   r   r   r  r   r
  r  r  r   r  r  r$  r.  r1  r5  __static_attributes__rP   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    rj   c                6    [        U 5      R                  U5      $ )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                6    [        U 5      R                  X5      $ )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   )rW  rX  r   s      r   r   r   '  s     8==$$r    c                  x   \ rS rSrSrSS/rS5S6S jjr\S7S j5       rS8S9S jjr	\
S:S	 j5       r\
S;S
 j5       r\
S<S j5       r\
S=S>S jj5       r\
S=S>S jj5       rS?S jrS?S jrS@S jrS@S jrS9S jr\rSAS jrSBS jrSCS jrSDS jr\SDS j5       r\SES j5       r\SDS j5       r\SDS j5       rSFSGS jjrSHSIS jjrSJS jr S=SKS jjr!S9S jr"\"r#SES  jr$S!S"S#.       SLS$ jjr%SMS% jr&SMS& jr'SJS' jr(SJS( jr)SJS) jr*SNS* jr+SNS+ jr,SNS, jr-SOS- jr.SOS. jr/SOS/ jr0SOS0 jr1SPS1 jr2SPS2 jr3\4SQS3 j5       r5S4r6g)Rr   i3  a3  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                     UR                   U l         UR                  U l        g ! [         aN    Uc(  [        US   5      U l         [        US   5      U l         g [        U5      U l         [        U5      U l         g f = f)Nr   rj   )r#   r'   AttributeErrorrp   )r   r  r'   s      r   r   Vec2.__init__B  se    		"SSDFSSDF 	"yqtqtqq	"s   "% 3A= A=<A=c                D    [        U R                  U R                  S5      $ )zReturns a 3D vector.r   )r   r#   r'   r"   s    r   vec3	Vec2.vec3N  s     DFFDFFA&&r    c                v    U R                  [        U R                  U5      [        U R                  U5      5      $ r;   )r-   r<   r#   r'   r=   s     r   r<   
Vec2.roundS  s+    
 ~~eDFFG4eDFFG6LMMr    c                6    [        U R                  U5      5      $ r   rA   rD   s     r   rB   	Vec2.listZ  s    CLL'((r    c                6    [        U R                  U5      5      $ rI   rJ   rD   s     r   rK   
Vec2.tuple^  rM   r    c                   ^  U 4S jU 5       $ )Nc              3  4   >#    U  H  nT" U5      v   M     g 7fr   rP   rQ   s     r   rT    Vec2.generate.<locals>.<genexpr>e  rV   rW   rP   rD   s   ` r   rC   Vec2.generatec  s    ,e,,r    c                p    U " [         R                  " U5      U-  [         R                  " U5      U-  5      $ r   r[   r_   s      r   rb   Vec2.from_angleg  s)    488E?V+TXXe_v-EFFr    c                N    U R                  [        R                  " U5      U5      $ r   re   r_   s      r   rg   Vec2.from_deg_anglek  s    ~~dll516::r    c                $    SR                  U 5      $ )Nz({0.x}, {0.y})rz   r"   s    r   r|   Vec2.__str__o  s    &&t,,r    c                (    SU R                  5       -   $ )Nr   r   r"   s    r   r   Vec2.__repr__r  s    &&r    c                    g)Nrk   rP   r"   s    r   r   Vec2.__len__u  s    r    c                D    [        U R                  U R                  45      $ r   )r   r#   r'   r"   s    r   r   Vec2.__hash__x  s    TVVTVV$%%r    c                P    U R                  U R                  U R                  45      $ r   r-   r#   r'   r"   s    r   r   	Vec2.copy{  s    ~~tvvtvv.//r    c                ~     U[        U 5         $ ! [         a"    U R                  5       nX![        U 5      '   Us $ f = fr   )idKeyErrorr   )r   r   r  s      r   r   Vec2.__deepcopy__  sA    	BtH%% 			A!"RXH	s    )<<c                    [        U[        5      (       a  [        S5      eUS:X  a  U R                  $ US:X  a  U R                  $ [        SU 35      e)Nr   r   rj   r   )rn   r   ro   r#   r'   r   r   s     r   r   Vec2.__getitem__  sM    eU##344A:66MaZ66M~eW566r    c              #  D   #    U R                   v   U R                  v   g 7fr   r#   r'   r"   s    r   r   Vec2.__iter__  s     ffffs    c                    U R                   $ r   r   r"   s    r   r   Vec2.__abs__  s    ~~r    c                X    [         R                  " U R                  U R                  5      $ )zReturns length of vector.r\   r   r#   r'   r"   s    r   r   Vec2.magnitude       zz$&&$&&))r    c                    [        U R                  5      [        :*  =(       a    [        U R                  5      [        :*  $ r   )r   r#   r   r'   r"   s    r   r   Vec2.is_null  s'    466{g%@#dff+*@@r    c                X    [         R                  " U R                  U R                  5      $ )zAngle of vector in radians.)r\   r   r'   r#   r"   s    r   r`   
Vec2.angle  r  r    c                B    [         R                  " U R                  5      $ )zAngle of vector in degrees.r   r"   s    r   r   Vec2.angle_deg  r   r    c                    U(       a'  U R                  U R                  * U R                  5      $ U R                  U R                  U R                  * 5      $ )zPOrthogonal vector

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

)r-   r'   r#   r   s     r   r   Vec2.orthogonal  s=     >>466'46622>>$&&466'22r    c                    U R                   UR                   U R                   -
  U-  -   nU R                  UR                  U R                  -
  U-  -   nU R                  X45      $ )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   	Vec2.lerp  sS     FFegg&&00FFegg&&00~~a##r    c                H    U R                  5       nX"R                  U5      -  $ )z#Project vector `other` onto `self`.r   r   s      r   r   Vec2.project  r   r    c                <    U R                  XR                  -  5      $ r   r   r   s     r   rw   Vec2.normalize  s    ||F^^344r    c                R    U R                  U R                  * U R                  * 5      $ r   rx  r"   s    r   r   Vec2.reversed  s    ~~tvvgw//r    c                $    U R                   (       + $ r   r   r"   s    r   r   Vec2.__bool__  s    <<r    r   r   r   c                   [        U[        5      (       d  [        U5      n[        R                  " U R                  UR                  X#S9=(       a*    [        R                  " U R
                  UR
                  X#S9$ )Nr   )rn   r   r\   r   r#   r'   )r   r   r   r   s       r   r   Vec2.isclose  sY     %&&KE||FFEGGW
 Nll466577GM	Nr    c                    [        U[        5      (       d  [        U5      nU R                  UR                  :H  =(       a    U R                  UR                  :H  $ r   )rn   r   r#   r'   r   s     r   r   Vec2.__eq__  s=    %&&KEvv 6TVVuww%66r    c                f    Utp#nU R                   U:X  a  U R                  U:  $ U R                   U:  $ r   r  )r   r   r#   r'   _s        r   r   Vec2.__lt__  s2    q66Q;66A:66A:r    c                     U R                  U R                  UR                  -   U R                  UR                  -   5      $ ! [         a    [	        S5      ef = fNzinvalid argumentr-   r#   r'   r\  ro   r   s     r   r   Vec2.__add__  M    	0>>$&&577"2DFFUWW4DEE 	0.//	0   ?A Ac                     U R                  U R                  UR                  -
  U R                  UR                  -
  5      $ ! [         a    [	        S5      ef = fr  r  r   s     r   r   Vec2.__sub__  r  r  c                     U R                  UR                  U R                  -
  UR                  U R                  -
  5      $ ! [         a    [	        S5      ef = fr  r  r   s     r   r  Vec2.__rsub__  sM    	0>>%''DFF"2EGGdff4DEE 	0.//	0r  c                Z    U R                  U R                  U-  U R                  U-  5      $ r   rx  r   s     r   r   Vec2.__mul__  #    ~~dffundffun==r    c                Z    U R                  U R                  U-  U R                  U-  5      $ r   rx  r   s     r   r
  Vec2.__rmul__  r  r    c                Z    U R                  U R                  U-  U R                  U-  5      $ r   rx  r   s     r   r  Vec2.__truediv__  r  r    c                h    U R                   UR                   -  U R                  UR                  -  -   $ r   r  r   s     r   r   Vec2.dot  '    vv$&&577"222r    c                h    U R                   UR                  -  U R                  UR                   -  -
  $ r   r  r   s     r   detVec2.det
  r  r    c                    [         R                  " U R                  UR                  -
  U R                  UR                  -
  5      $ r   r  r   s     r   r  Vec2.distance  s-    zz$&&577*DFFUWW,<==r    c                    U R                  5       R                  UR                  5       5      nUS:  a  SnOUS:  a  Sn[        R                  " U5      $ )zaCalculate angle between `self` and `other` in radians. +angle is
counter-clockwise orientation.

r   r!  )rw   r   r\   r   r"  s      r   r$  Vec2.angle_between  sJ    
 NN$(():;	tI_Iyy##r    c                h    U R                   R                  U R                  U-   U R                  5      $ )zARotate vector around origin.

Args:
    angle: angle in radians

)r-   rb   r`   r   r4  s     r   r1  Vec2.rotate  s(     ~~((e);T^^LLr    c                    U R                   R                  U R                  [        R                  " U5      -   U R
                  5      $ )zZRotate vector around origin.

Args:
    angle: angle in degrees

Returns: rotated vector

)r-   rb   r`   r\   rf   r   r4  s     r   r5  Vec2.rotate_deg&  s6     ~~((JJe,,dnn
 	
r    c                8    [        SS5      nU  H  nX-  nM	     U$ )r  r   )r   r  s      r   r  Vec2.sum3  s%     AJAFA r    r  ))rZ   rZ   N)r8  Noner9  r   r:  )rF   r<  r8  z
list[Vec2])rF   r<  r8  zSequence[Vec2])rF   r<  r8  zIterator[Vec2]r=  )r`   rp   ra   rp   r8  r   r>  r@  )r   rB  r8  r   rC  rD  r7  rE  rG  )r   rF  r8  r   rH  )r   r   r   rp   r8  r   )r   r   r8  r   )ra   rp   r8  r   )r   r   r   rp   r   rp   r8  rF  rI  )r   rp   r8  r   )r   r   r8  rp   )r`   rp   r8  r   )rF   zIterable[Vec2]r8  r   )7rJ  rK  rL  rM  rN  rO  r   rP  r_  r<   rQ  rB   rK   rC   rb   rg   r|   r   r   r   r   rS  r   r   r   r   r   r   r`   r   r   r   r   rw   r   rT  r   r   r   r   r   r   r  r   r
  r  r   r  r  r$  r1  r5  rR  r  rU  rP   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    )rW  r   rX  r   r8  rp   rH  )rW  r   rX  r   r   rp   r8  r   )
__future__r   typingr   r   r   r   r   r	   	functoolsr
   r\   ru   
ezdxf.mathr   r   r   r   __all__r   r   Y_AXISZ_AXISr  r  r   r   rP   r    r   <module>r     s    #    '

$,,
06
z0 z0z 
aA	aA	aA
q!Q-!	%F Fr    