o
    oh'                     @   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 |rt|dkr$t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   h/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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                        g | ]}|j dd  iqS nr   evalfr"   idpsoptionsr   r   r&   `        z%Curve._eval_evalf.<locals>.<listcomp>c                    r+   r,   r.   r0   r2   r   r   r&   a   r5   )argsr   tuplefunc)r   precr4   r   tabr   r2   r   _eval_evalf]   s
   zCurve._eval_evalfr:   c                    sr   |du r	t | j S t|| jdd| j j jkr,jdd | jD v r,t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>   s    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r:   tnewr   r   r&      r'   z)Curve.arbitrary_point.<locals>.<listcomp>)r   r(   r   r   r@   free_symbolsr   )r   r   r   rC   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   rE   
differencer   )r   freer;   r   r   r   rE      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   r6   r   r   r   r   ambient_dimension   s   zCurve.ambient_dimensionc                 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   r6   rK   r   r   r   r(         
zCurve.functionsc                 C   rM   )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

        rG   rN   rK   r   r   r   r      rO   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

        rG   r   rN   rK   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"   r8   rK   r   r   rA   ,  s   " zCurve.length.<locals>.<genexpr>)r   sumr(   r	   r   )r   	integrandr   rK   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>   rG   N)r   r   listr   )r   r   r:   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   rG   r   N)r   	translater6   rS   r(   appendr
   r   r8   tolistr   )r   angleptrvr   r   r   r   rotateS  s   


"zCurve.rotaterG   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   rU   )r   rW   r6   scaler(   r8   r   )r   xyr[   fxfyr   r   r   r^   }  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(   r8   r   )r   r_   r`   ra   rb   r   r   r   rW     s   
zCurve.translate)r*   )r:   )r   N)rG   rG   N)r   r   )__name__
__module____qualname____doc__r   r   r)   r=   rF   propertyrE   rL   r(   r   r   rR   rT   r]   r^   rW   r   r   r   r   r      s.    5


7







$
*r   N)rf   (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   r   <module>   s    