
    wg)                         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y)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y)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        |      }|j                  |      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       \/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/geometry/parabola.pyr   zParabola.__new__A   sY    %Q'E!QKEO	e$IJJ%%c5)FvFF    c                      y)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    & r!   c                 L    | j                   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 yy|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 uur!   c                    t        |d      }t        |d      }| j                  j                  }|t        j                  u rJd| j
                  z  || j                  j                  z
  z  }|| j                  j                  z
  dz  }||z
  S |dk(  rJd| j
                  z  || j                  j                  z
  z  }|| j                  j                  z
  dz  }||z
  S | j                  \  }}| j                  j                  dd \  }}	||z
  dz  ||z
  dz  z   }| j                  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vertexxyr   coefficientsequation)
r%   r:   r;   mt1t2abcds
             r    r=   zParabola.equation   s?   6 AD!AD!NN  

?d&&'1t{{}}+<=Bdkkmm#a'B Bw !Vd&&'1t{{}}+<=Bdkkmm#a'B Bw	 ::DAq>>..r2DAqa%!q1uqj(B((A.11a4!Q$;?BBwr!   c                 Z    | j                   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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      \  }}| j                         }t        |t              rS|| v r|gS t	        t        t        ||j                         g||gd      d   D cg c]  }t        |       c}            S t        |t              rBt        |j                  ||j                  d   f||j                  d   fg            dk(  r|gS g S t        |t        t        f      rwt        |t        |j                  d   |j                  d         j                         g||gd      d   }t	        t        |D cg c]  }||v st        |       c}            S t        |t        t         f      rLt	        t        t        ||j                         g||gd      d   D cg c]  }t        |       c}            S t        |t"              rt%        d      t%        d      c c}w c c}w c c}w )	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 yTr3   )setr+   r   z5Entity must be two dimensional, not three dimensionalzWrong type of argument were put)r   r=   
isinstancer   listr   r   r	   r
   r   subs_argsr   r   r   pointsr   r   	TypeError)r%   or:   r;   parabola_eqiresults          r    intersectionzParabola.intersection$  s   8 u4(1mmoa"Dys
Gu !**,/!QT8CCD8F %G!U1X %G H I I7#((1aggaj/Aqwwqz?)KLMQRRs
	Iu-.Kqxx{AHHQK099;=AD""#%F V FqAv FGHHFG,-Uajjl+aV6??@6B !C !C D E E>*STT=>>%%G !G!Cs   'G+	G0G0(G5c                    | j                   j                  }|t        j                  u r?| j                   j                  d   }t        | j                  j                  d   |z         }n|dk(  r?| j                   j                  d   }t        | j                  j                  d   |z         }nQ| j                   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
        ========

        https://www.sparknotes.com/math/precalc/conicsections/section2/

        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   r6   r   r7   r<   r   r   r-   
projectionr:   rG   )r%   r>   r:   pr;   rD   s         r    r8   zParabola.p_parameterZ  s    B NN  

?++A.ATZZ__Q'!+,A!V++A.ATZZ__Q'!+,A))$**5ATZZ\\ACC'(A4$$$$r!   c                    | j                   }| j                  j                  }|t        j                  u r5t        |j                  d   | j                  z
  |j                  d         }|S |dk(  r5t        |j                  d   |j                  d   | j                  z
        }|S | j                  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   r6   r   r7   r	   r-   r8   r)   rU   )r%   r   r>   r9   s       r    r9   zParabola.vertex  s    . 

NN  

?5::a=4+;+;;UZZ]KF
 	 !V5::a=%**Q-$:J:J*JKF  **77=a@Fr!   )NN)r:   r;   )__name__
__module____qualname____doc__r   propertyr&   r)   r   r1   r=   rG   r   rU   r8   r9   r#   r!   r    r   r      s    *XG  ( = =2  2    D*X    D  24?l *% *%X  r!   r   N)r]   
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>ri      s;     & . = / N N *   # 'R{ Rr!   