Module py3d.droites

Module droites, contient la classe Droite et des fonctions annexes

Attributes

axe_x : Droite
Droite de l'axe X
axe_y : Droite
Droite de l'axe Y
axe_z : Droite
Droite de l'axe Z
Expand source code
"""Module droites, contient la classe Droite et des fonctions annexes

Attributes:
    axe_x (Droite): Droite de l'axe X
    axe_y (Droite): Droite de l'axe Y
    axe_z (Droite): Droite de l'axe Z
"""
import points
import vecteurs
from fractions import Fraction

def parallelles(d, *args):
        """Renvoie True si les droites données sont parallèles, False sinon
        
        Args:
            d (Droite): Droite de référence
            *args: Autres droites
        
        Returns:
            bool: Droites toutes parallèles ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas tous des droites
        """
        if isinstance(d, Droite):

                for d2 in args:
                        if isinstance(d2, Droite):
                                if not(vecteurs.collineaires(d.vecteur, d2.vecteur)):
                                        return False
                        else:
                                typeA = u.__class__.__name__
                                typeB = v.__class__.__name__
                                raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
                                
                return True

        else:
                typeA = u.__class__.__name__
                v = args[0]
                typeB = v.__class__.__name__
                raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")

def secantes(d, *args):
        """Renvoie True si les droites données sont sécantes, False sinon
        
        Args:
            d (Droite): Droite de référence
            *args: Autres droites
        
        Returns:
            bool: Droites toutes sécantes ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas tous des droites
        """
        if isinstance(d, Droite):
                
                for d2 in args:
                        if isinstance(d2, Droite):
                                produit = d.vecteur.produit_vectoriel(d2.vecteur)
                                vect_deplacement = vecteurs.Vecteur(d.point, d2.point)
                                if produit.scalaire(vect_deplacement) != 0:
                                        return False
                        else:
                                typeA = d.__class__.__name__
                                typeB = d2.__class__.__name__
                                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")

                return True

        else:
                typeA = d.__class__.__name__
                d2 = args[0]
                typeB = d2.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")


def secante_plan(droite, plan):
        """Renvoie True si la droite donnée est sécante avec le plan, False sinon
        
        Args:
            droite (Droite): Droite
            plan (Plan): Plan
        
        Returns:
            bool: Droite et plan sécants ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas une droite et un plan
        """
        import plans
        if isinstance(droite, Droite):
                
                if isinstance(plan, plans.Plan):
                        if droite.vecteur.scalaire(plan.vecteur_n) == 0:
                                return False
                else:
                        typeA = d.__class__.__name__
                        typeB = plan.__class__.__name__
                        raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")
                
                return True

        else:
                typeA = droite.__class__.__name__
                typeB = plan.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")


def orthogonales(droite1, droite2):
        """Renvoie True si les droites données sont orthogonales, False sinon
        
        Args:
            droite1 (Droite): Droite 1
            droite2 (Droite): Droite 2
        
        Returns:
            bool: Droites orthogonales ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas tous des droites
        """
        if isinstance(droite1, Droite):
                if isinstance(droite2, Droite):
                        if secantes(droite1, droite2):
                                if vecteurs.orthogonaux(droite1.vecteur, droite2.vecteur):
                                        return True
                        return False

                else:
                        typeA = droite1.__class__.__name__
                        typeB = droite2.__class__.__name__
                        raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")

        else:
                typeA = droite1.__class__.__name__
                typeB = droite2.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")


class Droite:

        """Classe représentant une droite de l'espace
        
        Attributes:
            point (points.Point): Un point appartenant à la droite
            vecteur (vecteurs.Vecteur): Vecteur directeur de la droite
        """
        
        def __init__(self, *args):
                """Initialisation de la droite

                        - Deux points

                        - Un point + un vecteur
                
                Args:
                    *args: Arguments de définition de la droite
                
                Raises:
                    TypeError: Les types passés sont incorrects
                    ValueError: Les deux points son identiques ou le vecteur directeur est nul
                """
                self.point = None
                self.vecteur = None

                if len(args) == 2:
                        a, b = args

                        if isinstance(a, points.Point) and isinstance(b, points.Point):
                                if not points.est_meme_point(a, b):
                                        u = vecteurs.Vecteur(a, b)
                                        self.vecteur = u
                                        self.point = a
                                else:
                                        raise ValueError("Les deux points ne doivent pas être identiques")
                
                        elif isinstance(a, points.Point) and isinstance(b, vecteurs.Vecteur):
                                if not b.est_nul():
                                        self.point = a
                                        self.vecteur = b
                                else:
                                        raise ValueError("Le vecteur directeur ne doit pas être nul")
                                
                        else:
                                raise TypeError(f"Une droite est créée à partir de deux points, ou d'un point et d'un vecteur")
                
                else:
                        raise TypeError(f"Une droite est créée à partir de deux points, ou d'un point et d'un vecteur")

        def est_sur_droite(self, point):
                """Renvoie True si le point est sur la droite, False sinon
                
                Args:
                    point (points.Point): Point quelconque
                
                Returns:
                    bool: Point sur la droite ?
                
                Raises:
                    TypeError: Si l'objet donné n'est pas un point
                """
                if isinstance(point, point.Point):
                        pointA = self.point
                        pointB = points.Point(pointA.x + self.vecteur.x, pointA.y + self.vecteur.y, pointA.z + self.vecteur.z)
                        return bool(points.alignes(pointA, pointB, point))

                type_ = point.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'appartenance entre droite et [{type_}]")

        def parametrique(self):
                """Renvoie l'équation paramétrique de la droite, et les coefficients dans un tuple
                
                Returns:
                    tuple:

                    - Equation paramétrique (str)

                    - Tuple avec les coefficients xp, yp, zp, xu, yu, zu pour


        \\begin{equation}
                x= xp + x\\overrightarrow{u}
        \\end{equation}

        \\begin{equation}
                y= y + y\\overrightarrow{u}
        \\end{equation}

        \\begin{equation}
                z= zp + z\\overrightarrow{u}
        \\end{equation}
                """
                xp = Fraction(str(self.point.x))
                yp = Fraction(str(self.point.y))
                zp = Fraction(str(self.point.z))

                xu = Fraction(str(self.vecteur.x))
                yu = Fraction(str(self.vecteur.y))
                zu = Fraction(str(self.vecteur.z))

                signe_xu = "+ " if xu >= 0 else ""
                signe_yu = "+ " if yu >= 0 else ""
                signe_zu = "+ " if zu >= 0 else ""
                
                str_parametrique = f"x = {xp} {signe_xu}{xu}t\ny = {yp} {signe_yu}{yu}t\nz = {zp} {signe_zu}{zu}t"
                return (str_parametrique, (xp, yp, zp, xu, yu, zu))

        def __contains__(self, point):
                return self.est_sur_droite(point)

        def __str__(self):
                return self.paramétrique[0]

        def __repr__(self):
                return self.paramétrique[0]

axe_x = Droite(points.origine, points.Point(1, 0, 0))
axe_y = Droite(points.origine, points.Point(0, 1, 0))
axe_z = Droite(points.origine, points.Point(0, 0, 1))

__all__ = ("Droite", "axe_x", "axe_y", "axe_z", "parallelles", "secantes", "orthogonales")

Functions

def orthogonales(droite1, droite2)

Renvoie True si les droites données sont orthogonales, False sinon

Args

droite1 : Droite
Droite 1
droite2 : Droite
Droite 2

Returns

bool
Droites orthogonales ?

Raises

TypeError
Si les objets donnés ne sont pas tous des droites
Expand source code
def orthogonales(droite1, droite2):
        """Renvoie True si les droites données sont orthogonales, False sinon
        
        Args:
            droite1 (Droite): Droite 1
            droite2 (Droite): Droite 2
        
        Returns:
            bool: Droites orthogonales ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas tous des droites
        """
        if isinstance(droite1, Droite):
                if isinstance(droite2, Droite):
                        if secantes(droite1, droite2):
                                if vecteurs.orthogonaux(droite1.vecteur, droite2.vecteur):
                                        return True
                        return False

                else:
                        typeA = droite1.__class__.__name__
                        typeB = droite2.__class__.__name__
                        raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")

        else:
                typeA = droite1.__class__.__name__
                typeB = droite2.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")
def parallelles(d, *args)

Renvoie True si les droites données sont parallèles, False sinon

Args

d : Droite
Droite de référence
*args
Autres droites

Returns

bool
Droites toutes parallèles ?

Raises

TypeError
Si les objets donnés ne sont pas tous des droites
Expand source code
def parallelles(d, *args):
        """Renvoie True si les droites données sont parallèles, False sinon
        
        Args:
            d (Droite): Droite de référence
            *args: Autres droites
        
        Returns:
            bool: Droites toutes parallèles ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas tous des droites
        """
        if isinstance(d, Droite):

                for d2 in args:
                        if isinstance(d2, Droite):
                                if not(vecteurs.collineaires(d.vecteur, d2.vecteur)):
                                        return False
                        else:
                                typeA = u.__class__.__name__
                                typeB = v.__class__.__name__
                                raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
                                
                return True

        else:
                typeA = u.__class__.__name__
                v = args[0]
                typeB = v.__class__.__name__
                raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
def secantes(d, *args)

Renvoie True si les droites données sont sécantes, False sinon

Args

d : Droite
Droite de référence
*args
Autres droites

Returns

bool
Droites toutes sécantes ?

Raises

TypeError
Si les objets donnés ne sont pas tous des droites
Expand source code
def secantes(d, *args):
        """Renvoie True si les droites données sont sécantes, False sinon
        
        Args:
            d (Droite): Droite de référence
            *args: Autres droites
        
        Returns:
            bool: Droites toutes sécantes ?
        
        Raises:
            TypeError: Si les objets donnés ne sont pas tous des droites
        """
        if isinstance(d, Droite):
                
                for d2 in args:
                        if isinstance(d2, Droite):
                                produit = d.vecteur.produit_vectoriel(d2.vecteur)
                                vect_deplacement = vecteurs.Vecteur(d.point, d2.point)
                                if produit.scalaire(vect_deplacement) != 0:
                                        return False
                        else:
                                typeA = d.__class__.__name__
                                typeB = d2.__class__.__name__
                                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")

                return True

        else:
                typeA = d.__class__.__name__
                d2 = args[0]
                typeB = d2.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'intersection entre [{typeA}] et [{typeB}]")

Classes

class Droite (*args)

Classe représentant une droite de l'espace

Attributes

point : points.Point
Un point appartenant à la droite
vecteur : vecteurs.Vecteur
Vecteur directeur de la droite

Initialisation de la droite

    - Deux points

    - Un point + un vecteur

Args

*args
Arguments de définition de la droite

Raises

TypeError
Les types passés sont incorrects
ValueError
Les deux points son identiques ou le vecteur directeur est nul
Expand source code
class Droite:

        """Classe représentant une droite de l'espace
        
        Attributes:
            point (points.Point): Un point appartenant à la droite
            vecteur (vecteurs.Vecteur): Vecteur directeur de la droite
        """
        
        def __init__(self, *args):
                """Initialisation de la droite

                        - Deux points

                        - Un point + un vecteur
                
                Args:
                    *args: Arguments de définition de la droite
                
                Raises:
                    TypeError: Les types passés sont incorrects
                    ValueError: Les deux points son identiques ou le vecteur directeur est nul
                """
                self.point = None
                self.vecteur = None

                if len(args) == 2:
                        a, b = args

                        if isinstance(a, points.Point) and isinstance(b, points.Point):
                                if not points.est_meme_point(a, b):
                                        u = vecteurs.Vecteur(a, b)
                                        self.vecteur = u
                                        self.point = a
                                else:
                                        raise ValueError("Les deux points ne doivent pas être identiques")
                
                        elif isinstance(a, points.Point) and isinstance(b, vecteurs.Vecteur):
                                if not b.est_nul():
                                        self.point = a
                                        self.vecteur = b
                                else:
                                        raise ValueError("Le vecteur directeur ne doit pas être nul")
                                
                        else:
                                raise TypeError(f"Une droite est créée à partir de deux points, ou d'un point et d'un vecteur")
                
                else:
                        raise TypeError(f"Une droite est créée à partir de deux points, ou d'un point et d'un vecteur")

        def est_sur_droite(self, point):
                """Renvoie True si le point est sur la droite, False sinon
                
                Args:
                    point (points.Point): Point quelconque
                
                Returns:
                    bool: Point sur la droite ?
                
                Raises:
                    TypeError: Si l'objet donné n'est pas un point
                """
                if isinstance(point, point.Point):
                        pointA = self.point
                        pointB = points.Point(pointA.x + self.vecteur.x, pointA.y + self.vecteur.y, pointA.z + self.vecteur.z)
                        return bool(points.alignes(pointA, pointB, point))

                type_ = point.__class__.__name__
                raise TypeError(f"Impossible de déterminer l'appartenance entre droite et [{type_}]")

        def parametrique(self):
                """Renvoie l'équation paramétrique de la droite, et les coefficients dans un tuple
                
                Returns:
                    tuple:

                    - Equation paramétrique (str)

                    - Tuple avec les coefficients xp, yp, zp, xu, yu, zu pour


        \\begin{equation}
                x= xp + x\\overrightarrow{u}
        \\end{equation}

        \\begin{equation}
                y= y + y\\overrightarrow{u}
        \\end{equation}

        \\begin{equation}
                z= zp + z\\overrightarrow{u}
        \\end{equation}
                """
                xp = Fraction(str(self.point.x))
                yp = Fraction(str(self.point.y))
                zp = Fraction(str(self.point.z))

                xu = Fraction(str(self.vecteur.x))
                yu = Fraction(str(self.vecteur.y))
                zu = Fraction(str(self.vecteur.z))

                signe_xu = "+ " if xu >= 0 else ""
                signe_yu = "+ " if yu >= 0 else ""
                signe_zu = "+ " if zu >= 0 else ""
                
                str_parametrique = f"x = {xp} {signe_xu}{xu}t\ny = {yp} {signe_yu}{yu}t\nz = {zp} {signe_zu}{zu}t"
                return (str_parametrique, (xp, yp, zp, xu, yu, zu))

        def __contains__(self, point):
                return self.est_sur_droite(point)

        def __str__(self):
                return self.paramétrique[0]

        def __repr__(self):
                return self.paramétrique[0]

Methods

def est_sur_droite(self, point)

Renvoie True si le point est sur la droite, False sinon

Args

point : points.Point
Point quelconque

Returns

bool
Point sur la droite ?

Raises

TypeError
Si l'objet donné n'est pas un point
Expand source code
def est_sur_droite(self, point):
        """Renvoie True si le point est sur la droite, False sinon
        
        Args:
            point (points.Point): Point quelconque
        
        Returns:
            bool: Point sur la droite ?
        
        Raises:
            TypeError: Si l'objet donné n'est pas un point
        """
        if isinstance(point, point.Point):
                pointA = self.point
                pointB = points.Point(pointA.x + self.vecteur.x, pointA.y + self.vecteur.y, pointA.z + self.vecteur.z)
                return bool(points.alignes(pointA, pointB, point))

        type_ = point.__class__.__name__
        raise TypeError(f"Impossible de déterminer l'appartenance entre droite et [{type_}]")
def parametrique(self)

Renvoie l'équation paramétrique de la droite, et les coefficients dans un tuple

    Returns:
        tuple:

        - Equation paramétrique (str)

        - Tuple avec les coefficients xp, yp, zp, xu, yu, zu pour

\begin{equation} x= xp + x\overrightarrow{u} \end{equation}

\begin{equation} y= y + y\overrightarrow{u} \end{equation}

\begin{equation} z= zp + z\overrightarrow{u} \end{equation}

Expand source code
def parametrique(self):
        """Renvoie l'équation paramétrique de la droite, et les coefficients dans un tuple
        
        Returns:
            tuple:

            - Equation paramétrique (str)

            - Tuple avec les coefficients xp, yp, zp, xu, yu, zu pour


\\begin{equation}
        x= xp + x\\overrightarrow{u}
\\end{equation}

\\begin{equation}
        y= y + y\\overrightarrow{u}
\\end{equation}

\\begin{equation}
        z= zp + z\\overrightarrow{u}
\\end{equation}
        """
        xp = Fraction(str(self.point.x))
        yp = Fraction(str(self.point.y))
        zp = Fraction(str(self.point.z))

        xu = Fraction(str(self.vecteur.x))
        yu = Fraction(str(self.vecteur.y))
        zu = Fraction(str(self.vecteur.z))

        signe_xu = "+ " if xu >= 0 else ""
        signe_yu = "+ " if yu >= 0 else ""
        signe_zu = "+ " if zu >= 0 else ""
        
        str_parametrique = f"x = {xp} {signe_xu}{xu}t\ny = {yp} {signe_yu}{yu}t\nz = {zp} {signe_zu}{zu}t"
        return (str_parametrique, (xp, yp, zp, xu, yu, zu))