Ë
    7^(hº'  ã                   óž   — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ  G d„ de«      Zy)zCCurves in 2-dimensional Euclidean space.

Contains
========
Curve

é    )Úsqrt)Údiff)ÚTuple)Ú_symbol)ÚGeometryEntityÚGeometrySet)ÚPoint)Ú	integrate)ÚMatrixÚ	rot_axis3)Úis_sequence)Úprec_to_dpsc                   ó²   — e Zd ZdZd„ Zd„ Zd„ Zdd„Zdd„Ze	d„ «       Z
e	d„ «       Ze	d	„ «       Ze	d
„ «       Ze	d„ «       Ze	d„ «       Zdd„Zdd„Zdd„Zdd„Zy)ÚCurvea,  A curve in space.

    A curve is defined by parametric functions for the coordinates, a
    parameter and the lower and upper bounds for the parameter value.

    Parameters
    ==========

    function : list of functions
    limits : 3-tuple
        Function parameter and lower and upper bounds.

    Attributes
    ==========

    functions
    parameter
    limits

    Raises
    ======

    ValueError
        When `functions` are specified incorrectly.
        When `limits` are specified incorrectly.

    Examples
    ========

    >>> from sympy import Curve, sin, cos, interpolate
    >>> from sympy.abc import t, a
    >>> C = Curve((sin(t), cos(t)), (t, 0, 2))
    >>> C.functions
    (sin(t), cos(t))
    >>> C.limits
    (t, 0, 2)
    >>> C.parameter
    t
    >>> C = Curve((t, interpolate([1, 4, 9, 16], t)), (t, 0, 1)); C
    Curve((t, t**2), (t, 0, 1))
    >>> C.subs(t, 4)
    Point2D(4, 16)
    >>> C.arbitrary_point(a)
    Point2D(a, a**2)

    See Also
    ========

    sympy.core.function.Function
    sympy.polys.polyfuncs.interpolate

    c                 ó  — t        |«      rt        |«      dk7  rt        dt        |«      z  «      ‚t        |«      rt        |«      dk7  rt        dt        |«      z  «      ‚t	        j
                  | t        |Ž t        |Ž «      S )Né   z3Function argument should be (x(t), y(t)) but got %sé   z3Limit argument should be (t, tmin, tmax) but got %s)r   ÚlenÚ
ValueErrorÚstrr   Ú__new__r   )ÚclsÚfunctionÚlimitss      úR/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/geometry/curve.pyr   zCurve.__new__L   s„   € Ü˜8Ô$¬¨H«¸Ò(:Üð Ü" 8›}ñ-ó .ð .ä˜6Ô"¤c¨&£k°QÒ&6Üð Ü" 6›{ñ+ó ,ð ,ô ×%Ñ% c¬5°(Ð+;¼UÀF¸^ÓLÐLó    c                 ó:   — | j                  | j                  |«      S ©N)ÚsubsÚ	parameter)ÚselfÚfs     r   Ú__call__zCurve.__call__V   s   € Ø�y‰y˜Ÿ™¨Ó+Ð+r   c           	      óŒ   — || j                   k(  r0t        | j                  D �cg c]  }|j                  ||«      ‘Œ c}Ž S y c c}w r   )r    r	   Ú	functionsr   )r!   ÚoldÚnewr"   s       r   Ú
_eval_subszCurve._eval_subsY   s;   € Ø�$—.‘.Ò Ü°T·^±^ÖD°˜1Ÿ6™6 # sÕ+ÒDÐEÐEð !ùÚDs   £Ac           
      ó   — | j                   \  }\  }}}t        |«      }t        |D �cg c]  } |j                  dd|i|¤Ž‘Œ c}«      }||fD �cg c]  } |j                  dd|i|¤Ž‘Œ c}\  }}| j	                  ||||f«      S c c}w c c}w )NÚn© )Úargsr   ÚtupleÚevalfÚfunc)	r!   ÚprecÚoptionsr"   ÚtÚaÚbÚdpsÚis	            r   Ú_eval_evalfzCurve._eval_evalf]   s‘   € Ø—y‘y‰ˆ‰9ˆAˆq�!Ü˜$ÓˆÜ°aÖ8°�7�1—7‘7Ñ,˜SÐ, GÓ,Ò8Ó9ˆØ45°q°6Ö:¨a��—‘Ñ)˜#Ð) Ó)Ò:‰ˆˆ1Ø�y‰y˜˜Q  1˜IÓ&Ð&ùò 9ùÚ:s   ¨BÁBc           	      ó|  — |€t        | j                  Ž S t        || j                  d¬«      }| j                  }|j                  |j                  k7  r7|j                  d„ | j
                  D «       v rt        d|j                  z  «      ‚t        | j                  D �cg c]  }|j                  ||«      ‘Œ c}Ž S c c}w )aã  A parameterized point on the curve.

        Parameters
        ==========

        parameter : str or Symbol, optional
            Default value is 't'.
            The Curve's parameter is selected with None or self.parameter
            otherwise the provided symbol is used.

        Returns
        =======

        Point :
            Returns a point in parametric form.

        Raises
        ======

        ValueError
            When `parameter` already appears in the functions.

        Examples
        ========

        >>> from sympy import Curve, Symbol
        >>> from sympy.abc import s
        >>> C = Curve([2*s, s**2], (s, 0, 2))
        >>> C.arbitrary_point()
        Point2D(2*t, t**2)
        >>> C.arbitrary_point(C.parameter)
        Point2D(2*s, s**2)
        >>> C.arbitrary_point(None)
        Point2D(2*s, s**2)
        >>> C.arbitrary_point(Symbol('a'))
        Point2D(2*a, a**2)

        See Also
        ========

        sympy.geometry.point.Point

        T©Úrealc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr   )Úname)Ú.0r"   s     r   ú	<genexpr>z(Curve.arbitrary_point.<locals>.<genexpr>–   s   è ø€ Ò@¨˜aŸf�fÑ@ùs   ‚zFSymbol %s already appears in object and cannot be used as a parameter.)r	   r%   r   r    r<   Úfree_symbolsr   r   )r!   r    Útnewr2   Úws        r   Úarbitrary_pointzCurve.arbitrary_pointd   s¥   € ðX ÐÜ˜$Ÿ.™.Ð)Ð)ä�y $§.¡.°tÔ<ˆØ�N‰NˆØ�I‰I˜Ÿ™ÒØ—	‘	Ñ@¨d×.?Ñ.?Ô@Ñ@Üð 5Ø7;·y±yñAó Bð Bä°·±Ö?¨1�q—v‘v˜a •Ò?Ð@Ð@ùÒ?s   ÂB9c                 ó²   — t        «       }| j                  | j                  dd z   D ]  }||j                  z  }Œ |j	                  | j
                  h«      }|S )aÄ  Return a set of symbols other than the bound symbols used to
        parametrically define the Curve.

        Returns
        =======

        set :
            Set of all non-parameterized symbols.

        Examples
        ========

        >>> from sympy.abc import t, a
        >>> from sympy import Curve
        >>> Curve((t, t**2), (t, 0, 2)).free_symbols
        set()
        >>> Curve((t, t**2), (t, a, 2)).free_symbols
        {a}

        é   N)Úsetr%   r   r?   Ú
differencer    )r!   Úfreer3   s      r   r?   zCurve.free_symbols›   sU   € ô, ‹uˆØ—‘ $§+¡+¨a¨b /Ñ1ò 	#ˆAØ�A—N‘NÑ"‰Dð	#à�‰ §¡Ð/Ó0ˆØˆr   c                 ó2   — t        | j                  d   «      S )a;  The dimension of the curve.

        Returns
        =======

        int :
            the dimension of curve.

        Examples
        ========

        >>> from sympy.abc import t
        >>> from sympy import Curve
        >>> C = Curve((t, t**2), (t, 0, 2))
        >>> C.ambient_dimension
        2

        r   )r   r,   ©r!   s    r   Úambient_dimensionzCurve.ambient_dimension·   s   € ô* �4—9‘9˜Q‘<Ó Ð r   c                 ó    — | j                   d   S )a“  The functions specifying the curve.

        Returns
        =======

        functions :
            list of parameterized coordinate functions.

        Examples
        ========

        >>> from sympy.abc import t
        >>> from sympy import Curve
        >>> C = Curve((t, t**2), (t, 0, 2))
        >>> C.functions
        (t, t**2)

        See Also
        ========

        parameter

        r   ©r,   rI   s    r   r%   zCurve.functionsÎ   ó   € ð2 �y‰y˜‰|Ðr   c                 ó    — | j                   d   S )a’  The limits for the curve.

        Returns
        =======

        limits : tuple
            Contains parameter and lower and upper limits.

        Examples
        ========

        >>> from sympy.abc import t
        >>> from sympy import Curve
        >>> C = Curve([t, t**3], (t, -2, 2))
        >>> C.limits
        (t, -2, 2)

        See Also
        ========

        plot_interval

        rD   rL   rI   s    r   r   zCurve.limitsé   rM   r   c                 ó&   — | j                   d   d   S )am  The curve function variable.

        Returns
        =======

        Symbol :
            returns a bound symbol.

        Examples
        ========

        >>> from sympy.abc import t
        >>> from sympy import Curve
        >>> C = Curve([t, t**2], (t, 0, 2))
        >>> C.parameter
        t

        See Also
        ========

        functions

        rD   r   rL   rI   s    r   r    zCurve.parameter  s   € ð2 �y‰y˜‰|˜A‰Ðr   c                 ó~   ‡ — t        t        ˆ fd„‰ j                  D «       «      «      }t        |‰ j                  «      S )zÃThe curve length.

        Examples
        ========

        >>> from sympy import Curve
        >>> from sympy.abc import t
        >>> Curve((t, t), (t, 0, 1)).length
        sqrt(2)

        c              3   óV   •K  — | ]   }t        |‰j                  d    «      dz  –— Œ" y­w)r   r   N)r   r   )r=   r/   r!   s     €r   r>   zCurve.length.<locals>.<genexpr>,  s%   øè ø€ ÒV¸tœT $¨¯©°A©Ó7¸Õ:ÑVùs   ƒ&))r   Úsumr%   r
   r   )r!   Ú	integrands   ` r   ÚlengthzCurve.length  s/   ø€ ô œÓVÀtÇ~Á~ÔVÓVÓWˆ	Ü˜ D§K¡KÓ0Ð0r   c                 ój   — t        || j                  d¬«      }|gt        | j                  dd «      z   S )aë  The plot interval for the default geometric plot of the curve.

        Parameters
        ==========

        parameter : str or Symbol, optional
            Default value is 't';
            otherwise the provided symbol is used.

        Returns
        =======

        List :
            the plot interval as below:
                [parameter, lower_bound, upper_bound]

        Examples
        ========

        >>> from sympy import Curve, sin
        >>> from sympy.abc import x, s
        >>> Curve((x, sin(x)), (x, 1, 2)).plot_interval()
        [t, 1, 2]
        >>> Curve((x, sin(x)), (x, 1, 2)).plot_interval(s)
        [s, 1, 2]

        See Also
        ========

        limits : Returns limits of the parameter interval

        Tr9   rD   N)r   r    Úlistr   )r!   r    r2   s      r   Úplot_intervalzCurve.plot_interval/  s3   € ôB �I˜tŸ~™~°DÔ9ˆØˆs”T˜$Ÿ+™+ a b˜/Ó*Ñ*Ð*r   Nc                 ó�  — |rt        |d¬«       }nt        dd«      } | j                  |j                  Ž }t        |j                  «      }|j                  d«       t        dd|«      }|t        |«      z  }| j                  |ddd…f   j                  «       d   | j                  «      }| } |j                  |j                  Ž S )aþ  This function is used to rotate a curve along given point ``pt`` at given angle(in radian).

        Parameters
        ==========

        angle :
            the angle at which the curve will be rotated(in radian) in counterclockwise direction.
            default value of angle is 0.

        pt : Point
            the point along which the curve will be rotated.
            If no point given, the curve will be rotated around origin.

        Returns
        =======

        Curve :
            returns a curve rotated at given angle along given point.

        Examples
        ========

        >>> from sympy import Curve, pi
        >>> from sympy.abc import x
        >>> Curve((x, x), (x, 0, 1)).rotate(pi/2)
        Curve((-x, x), (x, 0, 1))

        r   ©Údimr   rD   r   N)r	   Ú	translater,   rV   r%   Úappendr   r   r/   Útolistr   )r!   ÚangleÚptÚrvr"   s        r   ÚrotatezCurve.rotateS  s²   € ñ: Ü˜ Ô"Ð"‰Bä�q˜“ˆBØˆT�^‰^˜RŸW™WÐ%ˆÜ�—‘ÓˆØ	�‰�ŒÜ�1�a˜‹OˆØ	ŒY�uÓÑˆØ�Y‰Y�q˜˜B˜Q˜B˜‘x—‘Ó(¨Ñ+¨T¯[©[Ó9ˆØˆSˆØˆr�|‰|˜RŸW™WÐ%Ð%r   c                 ó  — |rNt        |d¬«      }  | j                  | j                  Ž j                  ||«      j                  |j                  Ž S | j                  \  }}| j                  ||z  ||z  f| j                  «      S )a^  Override GeometryEntity.scale since Curve is not made up of Points.

        Returns
        =======

        Curve :
            returns scaled curve.

        Examples
        ========

        >>> from sympy import Curve
        >>> from sympy.abc import x
        >>> Curve((x, x), (x, 0, 1)).scale(2)
        Curve((2*x, x), (x, 0, 1))

        r   rY   )r	   r[   r,   Úscaler%   r/   r   )r!   ÚxÚyr_   ÚfxÚfys         r   rc   zCurve.scale}  sv   € ñ$ Ü�r˜qÔ!ˆBØD�>�4—>‘> R C§:¡:Ð.×4Ñ4°Q¸Ó:×DÑDÀbÇgÁgÐNÐNØ—‘‰ˆˆBØ�y‰y˜"˜Q™$  1¡˜ t§{¡{Ó3Ð3r   c                 óh   — | j                   \  }}| j                  ||z   ||z   f| j                  «      S )aL  Translate the Curve by (x, y).

        Returns
        =======

        Curve :
            returns a translated curve.

        Examples
        ========

        >>> from sympy import Curve
        >>> from sympy.abc import x
        >>> Curve((x, x), (x, 0, 1)).translate(1, 2)
        Curve((x + 1, x + 2), (x, 0, 1))

        )r%   r/   r   )r!   rd   re   rf   rg   s        r   r[   zCurve.translate•  s3   € ð$ —‘‰ˆˆBØ�y‰y˜"˜q™& " q¡&Ð)¨4¯;©;Ó7Ð7r   )é   )r2   )r   N)rD   rD   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r(   r7   rB   Úpropertyr?   rJ   r%   r   r    rT   rW   ra   rc   r[   r+   r   r   r   r      s³   „ ñ3òjMò,òFó'ó5Aðn ñó ðð6 ñ!ó ð!ð, ñó ðð4 ñó ðð4 ñó ðð4 ñ1ó ð1ó"+óH(&óT4ô08r   r   N)rm   Ú(sympy.functions.elementary.miscellaneousr   Ú
sympy.corer   Úsympy.core.containersr   Úsympy.core.symbolr   Úsympy.geometry.entityr   r   Úsympy.geometry.pointr	   Úsympy.integralsr
   Úsympy.matricesr   r   Úsympy.utilities.iterablesr   Úmpmath.libmp.libmpfr   r   r+   r   r   ú<module>ry      s8   ðñõ :Ý Ý 'Ý %ß =Ý &Ý %ß ,Ý 1å +ôR8ˆKõ R8r   