a
    <b'                     @   s   d 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 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)sympifydiff)Tuple)_symbol)GeometryEntityGeometrySet)Point)	integrate)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   sf   t |}t|rt|dkr,tdt| t|r@t|dkrPt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   r   len
ValueErrorstrr   __new__r   )clsfunctionlimitsZfun r   d/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/sympy/geometry/curve.pyr   K   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Zevalfr!   iZdpsoptionsr   r   r%   `   r&   z%Curve._eval_evalf.<locals>.<listcomp>c                    s    g | ]}|j f d  iqS r*   r,   r-   r/   r   r   r%   a   r&   )argsr   tuplefunc)r   precr0   r   tabr   r/   r   _eval_evalf]   s
    zCurve._eval_evalfr5   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r5   Ztnewr   r   r%      r&   z)Curve.arbitrary_point.<locals>.<listcomp>)r	   r'   r   r   r;   free_symbolsr   )r   r   r   r>   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   r?   
differencer   )r   freer6   r   r   r   r?      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   r1   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   r1   rE   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

        rA   rG   rE   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

        rA   r   rG   rE   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!   r3   rE   r   r   r<   ,  r&   zCurve.length.<locals>.<genexpr>)r   sumr'   r
   r   )r   Z	integrandr   rE   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

        Tr9   rA   N)r   r   listr   )r   r   r5   r   r   r   plot_interval/  s    !zCurve.plot_intervalr   Nc                 C   s   ddl m}m} |r$t|dd }n
tdd}| j|j }t|j}|d |dd|}|||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   )Matrix	rot_axis3r   ZdimrA   r   N)Zsympy.matricesrL   rM   r	   	translater1   rJ   r'   appendr3   tolistr   )r   ZangleptrL   rM   rvr   r   r   r   rotateS  s    


"zCurve.rotaterA   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   rN   )r	   rO   r1   scaler'   r3   r   )r   xyrR   fxfyr   r   r   rU   ~  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'   r3   r   )r   rV   rW   rX   rY   r   r   r   rO     s    
zCurve.translate)r)   )r5   )r5   )r   N)rA   rA   N)r   r   )__name__
__module____qualname____doc__r   r   r(   r8   r@   propertyr?   rF   r'   r   r   rI   rK   rT   rU   rO   r   r   r   r   r      s,   5

7






$
+
r   N)r]   Z(sympy.functions.elementary.miscellaneousr   Z
sympy.corer   r   Zsympy.core.containersr   Zsympy.core.symbolr   Zsympy.geometry.entityr   r   Zsympy.geometry.pointr	   Zsympy.integralsr
   Zsympy.utilities.iterablesr   Zmpmath.libmp.libmpfr   r   r   r   r   r   <module>   s   