a
    RG5d'                     @   s   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 deZdS )zCCurves in 2-dimensional Euclidean space.

Contains
========
Curve

    )sqrt)diff)Tuple)_symbol)GeometryEntityGeometrySet)Point)	integrate)Matrix	rot_axis3)is_sequence)prec_to_dpsc                   @   s   e Zd ZdZdd Zdd Zdd Zd%d	d
Zd&ddZe	dd Z
e	dd Ze	dd Ze	dd Ze	dd Ze	dd Zd'ddZd(ddZd)d!d"Zd*d#d$ZdS )+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                 C   s^   t |rt|dkr$tdt| t |r8t|dkrHtdt| t| 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limits r   P/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/geometry/curve.pyr   L   s    zCurve.__new__c                 C   s   |  | j|S N)subs	parameter)selffr   r   r   __call__V   s    zCurve.__call__c                    s(   | j kr$t fdd| jD  S d S )Nc                    s   g | ]}|  qS r   r   .0r   newoldr   r   
<listcomp>[       z$Curve._eval_subs.<locals>.<listcomp>)r   r   	functions)r   r%   r$   r   r#   r   
_eval_subsY   s    
zCurve._eval_subs   c                    s^   | j \}\}}}t| t fdd|D } fdd||fD \}}| ||||fS )Nc                    s    g | ]}|j f d  iqS nevalfr"   idpsoptionsr   r   r&   `   r'   z%Curve._eval_evalf.<locals>.<listcomp>c                    s    g | ]}|j f d  iqS r+   r-   r/   r1   r   r   r&   a   r'   )argsr   tuplefunc)r   precr3   r   tabr   r1   r   _eval_evalf]   s
    zCurve._eval_evalfr8   c                    sr   |du rt | j S t|| jdd| j j jkrXjdd | jD v rXtdj t  fdd| jD  S )	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

        NTrealc                 s   s   | ]}|j V  qd S r   )namer!   r   r   r   	<genexpr>   r'   z(Curve.arbitrary_point.<locals>.<genexpr>zFSymbol %s already appears in object and cannot be used as a parameter.c                    s   g | ]}|  qS r   r    )r"   wr8   tnewr   r   r&      r'   z)Curve.arbitrary_point.<locals>.<listcomp>)r   r(   r   r   r>   free_symbolsr   )r   r   r   rA   r   arbitrary_pointd   s    ,
zCurve.arbitrary_pointc                 C   s<   t  }| j| jdd  D ]}||jO }q|| 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   rC   
differencer   )r   freer9   r   r   r   rC      s
    zCurve.free_symbolsc                 C   s   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   r4   r   r   r   r   ambient_dimension   s    zCurve.ambient_dimensionc                 C   s
   | 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   r4   rI   r   r   r   r(      s    zCurve.functionsc                 C   s
   | 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

        rE   rK   rI   r   r   r   r      s    zCurve.limitsc                 C   s   | 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

        rE   r   rK   rI   r   r   r   r     s    zCurve.parameterc                    s(   t t fd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   s"   | ]}t | jd  d V  qdS )r   r   N)r   r   )r"   r6   rI   r   r   r?   ,  r'   zCurve.length.<locals>.<genexpr>)r   sumr(   r	   r   )r   	integrandr   rI   r   length  s    zCurve.lengthc                 C   s(   t || jdd}|gt| jdd  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

        Tr<   rE   N)r   r   listr   )r   r   r8   r   r   r   plot_interval/  s    !zCurve.plot_intervalr   Nc                 C   s   |rt |dd }n
t dd}| j|j }t|j}|d tdd|}|t|9 }| |dddf 	 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   rE   r   N)r   	translater4   rO   r(   appendr
   r   r6   tolistr   )r   angleptrvr   r   r   r   rotateS  s    


"zCurve.rotaterE   c                 C   sR   |r.t |dd}| j| j ||j|j S | j\}}| || || 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   rQ   )r   rS   r4   scaler(   r6   r   )r   xyrW   fxfyr   r   r   rZ   }  s
    
zCurve.scalec                 C   s$   | j \}}| || || 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(   r6   r   )r   r[   r\   r]   r^   r   r   r   rS     s    
zCurve.translate)r*   )r8   )r8   )r   N)rE   rE   N)r   r   )__name__
__module____qualname____doc__r   r   r)   r;   rD   propertyrC   rJ   r(   r   r   rN   rP   rY   rZ   rS   r   r   r   r   r      s,   5


7






$
*
r   N)rb   (sympy.functions.elementary.miscellaneousr   
sympy.corer   sympy.core.containersr   sympy.core.symbolr   Zsympy.geometry.entityr   r   sympy.geometry.pointr   sympy.integralsr	   sympy.matricesr
   r   sympy.utilities.iterablesr   mpmath.libmp.libmpfr   r   r   r   r   r   <module>   s   