
    wg'                         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      Y/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/geometry/curve.pyr   zCurve.__new__L   s    8$H(: "8}- . .6"c&kQ&6 "6{+ , , %%c5(+;UF^LL    c                 :    | j                  | j                  |      S N)subs	parameter)selffs     r   __call__zCurve.__call__V   s    yy++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166#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    yy9Aq!$a87177,S,G,8945q6:a)#)):1yyQ1I&& 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     @aff@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<NNII		@d.?.?@@ 57;yyA B B?1qvva?@@?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$++ab/1 	#AANN"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    * 499Q<  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 yy|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 yy|Ar   c                 ~     t        t         fd j                  D                    }t        | j                        S )zThe 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%     VtT$A7:Vs   &))r   sumr%   r
   r   )r!   	integrands   ` r   lengthzCurve.length  s/     Vt~~VVW	DKK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 It~~D9sT$++ab/***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^^RWW%	1aO	YuYYqBQBx(+T[[9Sr||RWW%%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    $ rq!BD>4>>RC::.44Q:DDbggNNByy"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yy"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40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8K R8r   