
    Edj)                         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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                       e Zd ZdZddZed             Zed             Zed             Zed             Z	dd
Z
ed             Zed             Zd Zed             Ze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                     |rt          |d          }nt          dd          }t          |          }|                    |          rt          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kwargss       7lib/python3.11/site-packages/sympy/geometry/parabola.pyr   zParabola.__new__A   sy     	 %Q'''EE!QKKEOO	e$$ 	KIJJJ%c5)FFvFFF    c                     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    selfs    r    ambient_dimensionzParabola.ambient_dimensionO   s	    & qr!   c                 @    | 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$   s    r    axis_of_symmetryzParabola.axis_of_symmetryd   s    0 ~00<<<r!   c                     | 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$   s    r    r   zParabola.directrix~       0 y|r!   c                     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$   s    r    eccentricityzParabola.eccentricity   s    B ur!   xyc                    t          |d          }t          |d          }| j        j        }|t          j        u r-d| j        z  || j        j        z
  z  }|| j        j        z
  dz  }n|dk    r-d| j        z  || j        j        z
  z  }|| j        j        z
  dz  }n\| j	        \  }}| j        j
        dd         \  }}	||z
  dz  ||z
  dz  z   }| j                            ||          dz  |dz  |	dz  z   z  }||z
  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vertexr2   r3   r   coefficientsequation)
r%   r2   r3   mt1t2abcds
             r    r=   zParabola.equation   s    6 AD!!!AD!!!N 
? 
	@d&'1t{}+<=Bdkm#a'BB!V 	@d&'1t{}+<=Bdkm#a'BB:DAq>.rr2DAqa%!q1uqj(B((A..11a4!Q$;?BBwr!   c                 N    | j                             | j                  }|dz  }|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%   rF   focal_lengths      r    rG   zParabola.focal_length   s*    < >**4:66zr!   c                     | 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$   s    r    r   zParabola.focus
  r.   r!   c           
      &   t          dd          \  }}|                                 }t          t                    rQ| v rgS t	          t          d t          |                                g||g          D                                 S t          t                    rGt          |	                    |j
        d         f|j
        d         fg                    dk    rgS g S t          t          t          f          rrt          |t          j        d         j        d                                                   g||g          }t	          t          fd|D                                 S t          t          t          f          rJt	          t          d t          |                                g||g          D                                 S t          t                     rt#          d	          t#          d
          )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 yTr5   c                 ,    g | ]}t          |          S r#   )r	   .0is     r    
<listcomp>z)Parabola.intersection.<locals>.<listcomp>F  s    $b$b$b!U1XX$b$b$br!   r   r+   c                 6    g | ]}|v t          |          S r#   r
   )rL   rM   os     r    rN   z)Parabola.intersection.<locals>.<listcomp>N  s(     F F FqAv F F F Fr!   c                 ,    g | ]}t          |          S r#   rP   rK   s     r    rN   z)Parabola.intersection.<locals>.<listcomp>P  s     ` ` ` ` ` `r!   z5Entity must be two dimensional, not three dimensionalzWrong type of argument were put)r   r=   
isinstancer   listr   r   r
   r   subs_argsr   r   r   pointsr   r   	TypeError)r%   rQ   r2   r3   parabola_eqresults    `    r    intersectionzParabola.intersection$  s   8 u4(((1mmooa"" 	?Dy es
G$b$buk1::<<=X[\^_Z`7a7a$b$b$bccddd7## 	?((1agaj/Aqwqz?)KLLMMQRR s
	Iu-.. 	?KQXa[)I)I)R)R)T)TUXY[\W]^^F F F F FV F F FGGHHHFG,-- 	? ` `UK;VYZ\]X^5_5_ ` ` `aabbb>** 	?STTT=>>>r!   c                    | j         j        }|t          j        u r5| j         j        d         }t          | j        j        d         |z             }n{|dk    r5| j         j        d         }t          | j        j        d         |z             }n@| j                             | j                  }t          | j        j	        |j	        z
            }|| j
        z  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   r8   r   r9   r<   r   r   r-   
projectionr2   rG   )r%   r>   r2   pr3   rD   s         r    r:   zParabola.p_parameterV  s    B N 
? 	)+A.ATZ_Q'!+,,AA!V 	)+A.ATZ_Q'!+,,AA))$*55ATZ\AC'((A4$$$r!   c                 P   | j         }| j        j        }|t          j        u r/t          |j        d         | j        z
  |j        d                   }nU|dk    r/t          |j        d         |j        d         | j        z
            }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   r8   r   r9   r	   r-   r:   r)   r[   )r%   r   r>   r;   s       r    r;   zParabola.vertex  s    . 
N 
? 	A5:a=4+;;UZ]KKFF!V 	A5:a=%*Q-$:J*JKKFF*77==a@Fr!   )NN)r2   r3   )__name__
__module____qualname____doc__r   propertyr&   r)   r   r1   r=   rG   r   r[   r:   r;   r#   r!   r    r   r      s7       * *XG G G G   X( = = X=2   X2     X D* * * *X     X D   X20? 0? 0?d *% *% X*%X   X  r!   r   N)rc   
sympy.corer   sympy.core.sortingr   sympy.core.symbolr   r   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    <module>ro      s-          & & & & & & . . . . . . . . = = = = = = = = / / / / / / / / N N N N N N N N N N N N N N * * * * * *             # # # # # # ' ' ' ' ' 'N N N N N{ N N N N Nr!   