a
    RG5dj)                     @   s   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZmZ ddlmZmZmZ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 )z4Parabolic geometrical entity.

Contains
* Parabola

    )S)ordered)_symbolsymbols)GeometryEntityGeometrySet)PointPoint2D)LineLine2DRay2D	Segment2DLinearEntity3D)Ellipse)sign)simplify)solvec                   @   s   e Zd ZdZdddZedd Zedd Zed	d
 Zedd Z	dddZ
edd Zedd Zdd Zedd Zedd ZdS )Parabolaa  A parabolic GeometryEntity.

    A parabola is declared with a point, that is called 'focus', and
    a line, that is called 'directrix'.
    Only vertical or horizontal parabolas are currently supported.

    Parameters
    ==========

    focus : Point
        Default value is Point(0, 0)
    directrix : Line

    Attributes
    ==========

    focus
    directrix
    axis of symmetry
    focal length
    p parameter
    vertex
    eccentricity

    Raises
    ======
    ValueError
        When `focus` is not a two dimensional point.
        When `focus` is a point of directrix.
    NotImplementedError
        When `directrix` is neither horizontal nor vertical.

    Examples
    ========

    >>> from sympy import Parabola, Point, Line
    >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7,8)))
    >>> p1.focus
    Point2D(0, 0)
    >>> p1.directrix
    Line2D(Point2D(5, 8), Point2D(7, 8))

    Nc                 K   sL   |rt |dd}n
t dd}t|}||r6tdtj| ||fi |S )N   )dimr   z*The focus must not be a point of directrix)r   r
   contains
ValueErrorr   __new__)clsfocus	directrixkwargs r   S/var/www/html/django/DPS/env/lib/python3.9/site-packages/sympy/geometry/parabola.pyr   A   s    

zParabola.__new__c                 C   s   dS )aX  Returns the ambient dimension of parabola.

        Returns
        =======

        ambient_dimension : integer

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> f1 = Point(0, 0)
        >>> p1 = Parabola(f1, Line(Point(5, 8), Point(7, 8)))
        >>> p1.ambient_dimension
        2

        r   r   selfr   r   r   ambient_dimensionO   s    zParabola.ambient_dimensionc                 C   s   | j | jS )a  Return the axis of symmetry of the parabola: a line
        perpendicular to the directrix passing through the focus.

        Returns
        =======

        axis_of_symmetry : Line

        See Also
        ========

        sympy.geometry.line.Line

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))
        >>> p1.axis_of_symmetry
        Line2D(Point2D(0, 0), Point2D(0, 1))

        )r   perpendicular_liner   r   r   r   r   axis_of_symmetryd   s    zParabola.axis_of_symmetryc                 C   s
   | j d S )a  The directrix of the parabola.

        Returns
        =======

        directrix : Line

        See Also
        ========

        sympy.geometry.line.Line

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> l1 = Line(Point(5, 8), Point(7, 8))
        >>> p1 = Parabola(Point(0, 0), l1)
        >>> p1.directrix
        Line2D(Point2D(5, 8), Point2D(7, 8))

           argsr   r   r   r   r   ~   s    zParabola.directrixc                 C   s   t jS )a  The eccentricity of the parabola.

        Returns
        =======

        eccentricity : number

        A parabola may also be characterized as a conic section with an
        eccentricity of 1. As a consequence of this, all parabolas are
        similar, meaning that while they can be different sizes,
        they are all the same shape.

        See Also
        ========

        https://en.wikipedia.org/wiki/Parabola


        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))
        >>> p1.eccentricity
        1

        Notes
        -----
        The eccentricity for every Parabola is 1 by definition.

        )r   Oner   r   r   r   eccentricity   s    !zParabola.eccentricityxyc           
      C   s   t |dd}t |dd}| jj}|tju rRd| j || jj  }|| jj d }n|dkrd| j || jj  }|| jj d }nX| j	\}}| jj
dd \}}	|| d || d  }| j||d |d |	d   }|| S )az  The equation of the parabola.

        Parameters
        ==========
        x : str, optional
            Label for the x-axis. Default value is 'x'.
        y : str, optional
            Label for the y-axis. Default value is 'y'.

        Returns
        =======
        equation : SymPy expression

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))
        >>> p1.equation()
        -x**2 - 16*y + 64
        >>> p1.equation('f')
        -f**2 - 16*y + 64
        >>> p1.equation(y='z')
        -x**2 - 16*z + 64

        Treal   r   r   N)r   r   sloper   Infinityp_parametervertexr)   r*   r   coefficientsequation)
r    r)   r*   mt1t2abcdr   r   r   r3      s    

"zParabola.equationc                 C   s   | j | j}|d }|S )aY  The focal length of the parabola.

        Returns
        =======

        focal_lenght : number or symbolic expression

        Notes
        =====

        The distance between the vertex and the focus
        (or the vertex and directrix), measured along the axis
        of symmetry, is the "focal length".

        See Also
        ========

        https://en.wikipedia.org/wiki/Parabola

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))
        >>> p1.focal_length
        4

        r   )r   distancer   )r    r;   focal_lengthr   r   r   r<      s    zParabola.focal_lengthc                 C   s
   | j d S )a  The focus of the parabola.

        Returns
        =======

        focus : Point

        See Also
        ========

        sympy.geometry.point.Point

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> f1 = Point(0, 0)
        >>> p1 = Parabola(f1, Line(Point(5, 8), Point(7, 8)))
        >>> p1.focus
        Point2D(0, 0)

        r   r%   r   r   r   r   r   
  s    zParabola.focusc                    sD  t ddd\}}|  }t trZ | v r0 gS ttdd t|  g||gD S nt trt|	| j
d f| j
d fgdkr gS g S nt ttfrt|t jd  jd  g||g}tt fdd|D S t ttfr"ttd	d t|  g||gD S t tr8td
ntddS )a  The intersection of the parabola and another geometrical entity `o`.

        Parameters
        ==========

        o : GeometryEntity, LinearEntity

        Returns
        =======

        intersection : list of GeometryEntity objects

        Examples
        ========

        >>> from sympy import Parabola, Point, Ellipse, Line, Segment
        >>> p1 = Point(0,0)
        >>> l1 = Line(Point(1, -2), Point(-1,-2))
        >>> parabola1 = Parabola(p1, l1)
        >>> parabola1.intersection(Ellipse(Point(0, 0), 2, 5))
        [Point2D(-2, 0), Point2D(2, 0)]
        >>> parabola1.intersection(Line(Point(-7, 3), Point(12, 3)))
        [Point2D(-4, 3), Point2D(4, 3)]
        >>> parabola1.intersection(Segment((-12, -65), (14, -68)))
        []

        zx yTr+   c                 S   s   g | ]}t |qS r   )r   .0ir   r   r   
<listcomp>F      z)Parabola.intersection.<locals>.<listcomp>r   r$   c                    s   g | ]}| v rt |qS r   r	   r=   or   r   r@   N  rA   c                 S   s   g | ]}t |qS r   rB   r=   r   r   r   r@   P  rA   z5Entity must be two dimensional, not three dimensionalzWrong type of argument were putN)r   r3   
isinstancer   listr   r   r	   r   subs_argsr   r   r   pointsr   r   	TypeError)r    rD   r)   r*   Zparabola_eqresultr   rC   r   intersection$  s$    
*
*((
zParabola.intersectionc                 C   s   | j j}|tju r4| j jd }t| jjd | }nJ|dkr^| j jd }t| jjd | }n | j | j}t| jj	|j	 }|| j
 S )a	  P is a parameter of parabola.

        Returns
        =======

        p : number or symbolic expression

        Notes
        =====

        The absolute value of p is the focal length. The sign on p tells
        which way the parabola faces. Vertical parabolas that open up
        and horizontal that open right, give a positive value for p.
        Vertical parabolas that open down and horizontal that open left,
        give a negative value for p.


        See Also
        ========

        http://www.sparknotes.com/math/precalc/conicsections/section2.rhtml

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))
        >>> p1.p_parameter
        -4

        r   r   r$   )r   r.   r   r/   r2   r   r   r&   
projectionr)   r<   )r    r4   r)   pr*   r:   r   r   r   r0   V  s    !
zParabola.p_parameterc                 C   sp   | j }| jj}|tju r6t|jd | j |jd }n6|dkr\t|jd |jd | j }n| j	| d }|S )ap  The vertex of the parabola.

        Returns
        =======

        vertex : Point

        See Also
        ========

        sympy.geometry.point.Point

        Examples
        ========

        >>> from sympy import Parabola, Point, Line
        >>> p1 = Parabola(Point(0, 0), Line(Point(5, 8), Point(7, 8)))
        >>> p1.vertex
        Point2D(0, 4)

        r   r$   )
r   r   r.   r   r/   r   r&   r0   r#   rL   )r    r   r4   r1   r   r   r   r1     s    
zParabola.vertex)NN)r)   r*   )__name__
__module____qualname____doc__r   propertyr!   r#   r   r(   r3   r<   r   rL   r0   r1   r   r   r   r   r      s(   ,




"
,
"
2
,r   N)rR   
sympy.corer   sympy.core.sortingr   sympy.core.symbolr   r   Zsympy.geometry.entityr   r   sympy.geometry.pointr   r	   sympy.geometry.liner
   r   r   r   r   sympy.geometry.ellipser   sympy.functionsr   sympy.simplifyr   sympy.solvers.solversr   r   r   r   r   r   <module>   s   