Module py3d.vecteurs
Module vecteurs, contient la classe Vecteur et des fonctions annexes
Attributes
vecteur_nul
:Vecteur
-
Vecteur (0, 0, 0)
vecteur_unitaire_x
:Vecteur
- Vecteur (1, 0, 0)
vecteur_unitaire_y
:Vecteur
- Vecteur (0, 1, 0)
vecteur_unitaire_z
:Vecteur
- Vecteur (0, 0, 1)
Expand source code
"""Module vecteurs, contient la classe Vecteur et des fonctions annexes
Attributes:
vecteur_nul (Vecteur): Vecteur (0, 0, 0)
vecteur_unitaire_x (Vecteur): Vecteur (1, 0, 0)
vecteur_unitaire_y (Vecteur): Vecteur (0, 1, 0)
vecteur_unitaire_z (Vecteur): Vecteur (0, 0, 1)
"""
from math import sqrt
import points
import droites
def collineaires(u, *args):
"""Renvoie True si les vecteurs donnés sont collinéaires, False sinon
Args:
u (Vecteur): Vecteur de référence
*args: Autres vecteurs
Returns:
bool: Tous les vecteurs collinéaires ?
Raises:
TypeError: Si les objets donnés ne sont pas tous des vecteurs
"""
if isinstance(u, Vecteur):
for v in args:
if isinstance(v, Vecteur):
if abs(abs(u.scalaire(v)) - u.norme() * v.norme()) >= 1/10*10:
return False
else:
typeA = u.__class__.__name__
typeB = v.__class__.__name__
raise TypeError(f"Impossible de déterminer la colinéarité entre [{typeA}] et [{typeB}]")
return True
else:
typeA = u.__class__.__name__
typeB = v.__class__.__name__
raise TypeError(f"Impossible de déterminer la colinéarité entre [{typeA}] et [{typeB}]")
def orthogonaux(u, v):
"""Renvoie True si les vecteurs donnés sont orthogonaux, False sinon
Args:
u (Vecteur): Vecteur de référence
v (Vecteur): Autre vecteur
Returns:
bool: Tous les vecteurs orthogonaux ?
Raises:
TypeError: Si les objets donnés ne sont pas tous des vecteurs
"""
if isinstance(u, Vecteur) and isinstance(v, Vecteur):
if u.scalaire(v) == 0:
return True
return False
else:
typeA = u.__class__.__name__
typeB = v.__class__.__name__
raise TypeError(f"Impossible de déterminer l'orthogonalité entre [{typeA}] et [{typeB}]")
class Vecteur():
"""Classe représentant un vecteur de l'espace
Attributes:
x (float): Coordonnée x
y (float): Coordonnée y
z (float): Coordonnée z
"""
def __init__(self, *args):
"""Initialisation du vecteur
- Deux points
- Trois coordonnées
Args:
*args: Arguments de définition du vecteur
Raises:
TypeError: Si les types donnés sont incorrectes
ValueError: Si le nombre de paramètres ne correspond pas
"""
if len(args) == 2:
a, b = args
if isinstance(a, points.Point) and isinstance(b, points.Point):
self.x = b.x - a.x
self.y = b.y - a.y
self.z = b.z - a.z
elif all(isinstance(coord, int) or isinstance(coord, float) for coord in args):
a, b = args
self.x = a
self.y = b
self.z = 0
else:
typeA = a.__class__.__name__
typeB = b.__class__.__name__
raise TypeError(f"Impossible de créer un vecteur à partir de [{typeA}] et [{typeB}]")
elif len(args) == 3:
if all(isinstance(coord, int) or isinstance(coord, float) for coord in args):
x, y ,z = args
self.x = x
self.y = y
self.z = z
else:
raise TypeError("Les coordonnées d'un vecteur doivent être des nombres")
else:
raise ValueError("Un vecteur est créé à partir de deux points ou de coordonnées")
def scalaire(self, vecteurB):
"""Renvoie le produit scalaire entre le vecteur et vecteurB
Args:
vecteurB (Vecteur): Vecteur à comparer
Returns:
float: Résultat du produit scalaire
Raises:
TypeError: Si vecteurB n'est pas un vecteur
"""
if isinstance(vecteurB, Vecteur):
return self.x * vecteurB.x + self.y * vecteurB.y + self.z * vecteurB.z
else:
type_ = vecteurB.__class__.__name__
raise TypeError(f"Impossible de faire le produit scalaire entre [Vecteur] et [{type_}]")
def produit_vectoriel(self, vecteurB):
"""Renvoie le produit vectoriel entre le vecteur et vecteurB
Args:
vecteurB (Vecteur): Vecteur à comparer
Returns:
float: Résultat du produit vectoriel
Raises:
TypeError: Si vecteurB n'est pas un vecteur
"""
x = (self.y * vecteurB.z) - (self.z * vecteurB.y)
y = (self.z * vecteurB.x) - (self.x * vecteurB.z)
z = (self.x * vecteurB.y) - (self.y * vecteurB.x)
return Vecteur(x, y, z)
def norme(self):
"""Donne la norme du vecteur
Returns:
float: Norme du vecteur
"""
return sqrt((self.x)**2 + (self.y)**2 + (self.z)**2)
def absolue(self):
"""Donne la valeur absolue du vecteur
Returns:
float: Valeur absolue du vecteur
"""
return Vecteur(abs(self.x), abs(self.z), abs(self.z))
def normalise(self):
"""Donne la forme normalisée du vecteur
Returns:
Vecteur: Forme normalisée du vecteur
"""
return self * float(1 / self.norme())
def normal(self, *p):
"""Donne un vecteur normal à ce vecteur
Returns:
Vecteur: Vecteur normal
Raises:
NotImplementedError: Si le vecteur actuel n'a aucune coordonnée nulle
"""
if self.z == 0:
return Vecteur(self.y, -self.x, 0)
elif self.y == 0:
return Vecteur(-self.z, 0, self.x)
elif self.x == 0:
return Vecteur(0, self.z, -self.y)
else:
p = p[0]
if isinstance(p, points.Point):
a = points.origine
b = points.Point(self.x, self.y, self.z)
projete = p.projete_orthogonal(droites.Droite(a, b))
return Vecteur(projete, p)
else:
raise TypeError("Il faut un point pour calculer un vecteur normal en 3D")
def get_coordonnes(self):
"""Donne les coordonnées du vecteur dans un tuple
Returns:
tuple: Coordonnées (x, y, z)
"""
return (self.x, self.y, self.z)
def est_nul(self):
"""Renvoie True si le vecteur est nul, False sinon
Returns:
bool: Vecteur nul ?
"""
return self.x == 0 and self.y == 0 and self.z == 0
def __add__(self, vecteurB):
if isinstance(vecteurB, Vecteur):
return Vecteur(self.x + vecteurB.x, self.y + vecteurB.y, self.z + vecteurB.z)
else:
type_ = vecteurB.__class__.__name__
raise TypeError(f"Impossible d'additioner [Vecteur] et [{type_}]")
def __radd__(self, vecteurB):
if vecteurB == 0:
return self
else:
return self.__add__(vecteurB)
def __neg__(self):
return Vecteur(-self.x, -self.y, -self.z)
def __sub__(self, vecteurB):
return self.__add__(-vecteurB)
def __rsub__(self, vecteurB):
return self.__radd__(-vecteurB)
def __mul__(self, valeur):
if isinstance(valeur, int) or isinstance(valeur, float):
return Vecteur(self.x * valeur, self.y * valeur, self.z * valeur)
else:
type_ = valeur.__class__.__name__
raise TypeError(f"Impossible de multiplier [Vecteur] et [{type_}]")
def __rmul__(self, valeur):
return self.__mul__(valeur)
def __str__(self):
return f"Vecteur ({self.x}, {self.y}, {self.z})"
def __eq__(self, v):
if isinstance(v, Vecteur):
return self.x == v.x and self.y == v.y and self.z == v.z
else:
type_ = v.__class__.__name__
raise TypeError(f"Impossible de comparer [Vecteur] et [{type_}]")
vecteur_unitaire_x = Vecteur(1, 0, 0)
vecteur_unitaire_y = Vecteur(0, 1, 0)
vecteur_unitaire_z = Vecteur(0, 0, 1)
vecteur_nul = Vecteur(0, 0, 0)
__all__ = ("Vecteur", "vecteur_unitaire_x", "vecteur_unitaire_y", "vecteur_unitaire_z", "vecteur_nul", "collineaires", "orthogonaux")
Functions
def collineaires(u, *args)
-
Renvoie True si les vecteurs donnés sont collinéaires, False sinon
Args
u
:Vecteur
- Vecteur de référence
*args
- Autres vecteurs
Returns
bool
- Tous les vecteurs collinéaires ?
Raises
TypeError
- Si les objets donnés ne sont pas tous des vecteurs
Expand source code
def collineaires(u, *args): """Renvoie True si les vecteurs donnés sont collinéaires, False sinon Args: u (Vecteur): Vecteur de référence *args: Autres vecteurs Returns: bool: Tous les vecteurs collinéaires ? Raises: TypeError: Si les objets donnés ne sont pas tous des vecteurs """ if isinstance(u, Vecteur): for v in args: if isinstance(v, Vecteur): if abs(abs(u.scalaire(v)) - u.norme() * v.norme()) >= 1/10*10: return False else: typeA = u.__class__.__name__ typeB = v.__class__.__name__ raise TypeError(f"Impossible de déterminer la colinéarité entre [{typeA}] et [{typeB}]") return True else: typeA = u.__class__.__name__ typeB = v.__class__.__name__ raise TypeError(f"Impossible de déterminer la colinéarité entre [{typeA}] et [{typeB}]")
def orthogonaux(u, v)
-
Renvoie True si les vecteurs donnés sont orthogonaux, False sinon
Args
Returns
bool
- Tous les vecteurs orthogonaux ?
Raises
TypeError
- Si les objets donnés ne sont pas tous des vecteurs
Expand source code
def orthogonaux(u, v): """Renvoie True si les vecteurs donnés sont orthogonaux, False sinon Args: u (Vecteur): Vecteur de référence v (Vecteur): Autre vecteur Returns: bool: Tous les vecteurs orthogonaux ? Raises: TypeError: Si les objets donnés ne sont pas tous des vecteurs """ if isinstance(u, Vecteur) and isinstance(v, Vecteur): if u.scalaire(v) == 0: return True return False else: typeA = u.__class__.__name__ typeB = v.__class__.__name__ raise TypeError(f"Impossible de déterminer l'orthogonalité entre [{typeA}] et [{typeB}]")
Classes
class Vecteur (*args)
-
Classe représentant un vecteur de l'espace
Attributes
x
:float
- Coordonnée x
y
:float
- Coordonnée y
z
:float
- Coordonnée z
Initialisation du vecteur
- Deux points - Trois coordonnées
Args
*args
- Arguments de définition du vecteur
Raises
TypeError
- Si les types donnés sont incorrectes
ValueError
- Si le nombre de paramètres ne correspond pas
Expand source code
class Vecteur(): """Classe représentant un vecteur de l'espace Attributes: x (float): Coordonnée x y (float): Coordonnée y z (float): Coordonnée z """ def __init__(self, *args): """Initialisation du vecteur - Deux points - Trois coordonnées Args: *args: Arguments de définition du vecteur Raises: TypeError: Si les types donnés sont incorrectes ValueError: Si le nombre de paramètres ne correspond pas """ if len(args) == 2: a, b = args if isinstance(a, points.Point) and isinstance(b, points.Point): self.x = b.x - a.x self.y = b.y - a.y self.z = b.z - a.z elif all(isinstance(coord, int) or isinstance(coord, float) for coord in args): a, b = args self.x = a self.y = b self.z = 0 else: typeA = a.__class__.__name__ typeB = b.__class__.__name__ raise TypeError(f"Impossible de créer un vecteur à partir de [{typeA}] et [{typeB}]") elif len(args) == 3: if all(isinstance(coord, int) or isinstance(coord, float) for coord in args): x, y ,z = args self.x = x self.y = y self.z = z else: raise TypeError("Les coordonnées d'un vecteur doivent être des nombres") else: raise ValueError("Un vecteur est créé à partir de deux points ou de coordonnées") def scalaire(self, vecteurB): """Renvoie le produit scalaire entre le vecteur et vecteurB Args: vecteurB (Vecteur): Vecteur à comparer Returns: float: Résultat du produit scalaire Raises: TypeError: Si vecteurB n'est pas un vecteur """ if isinstance(vecteurB, Vecteur): return self.x * vecteurB.x + self.y * vecteurB.y + self.z * vecteurB.z else: type_ = vecteurB.__class__.__name__ raise TypeError(f"Impossible de faire le produit scalaire entre [Vecteur] et [{type_}]") def produit_vectoriel(self, vecteurB): """Renvoie le produit vectoriel entre le vecteur et vecteurB Args: vecteurB (Vecteur): Vecteur à comparer Returns: float: Résultat du produit vectoriel Raises: TypeError: Si vecteurB n'est pas un vecteur """ x = (self.y * vecteurB.z) - (self.z * vecteurB.y) y = (self.z * vecteurB.x) - (self.x * vecteurB.z) z = (self.x * vecteurB.y) - (self.y * vecteurB.x) return Vecteur(x, y, z) def norme(self): """Donne la norme du vecteur Returns: float: Norme du vecteur """ return sqrt((self.x)**2 + (self.y)**2 + (self.z)**2) def absolue(self): """Donne la valeur absolue du vecteur Returns: float: Valeur absolue du vecteur """ return Vecteur(abs(self.x), abs(self.z), abs(self.z)) def normalise(self): """Donne la forme normalisée du vecteur Returns: Vecteur: Forme normalisée du vecteur """ return self * float(1 / self.norme()) def normal(self, *p): """Donne un vecteur normal à ce vecteur Returns: Vecteur: Vecteur normal Raises: NotImplementedError: Si le vecteur actuel n'a aucune coordonnée nulle """ if self.z == 0: return Vecteur(self.y, -self.x, 0) elif self.y == 0: return Vecteur(-self.z, 0, self.x) elif self.x == 0: return Vecteur(0, self.z, -self.y) else: p = p[0] if isinstance(p, points.Point): a = points.origine b = points.Point(self.x, self.y, self.z) projete = p.projete_orthogonal(droites.Droite(a, b)) return Vecteur(projete, p) else: raise TypeError("Il faut un point pour calculer un vecteur normal en 3D") def get_coordonnes(self): """Donne les coordonnées du vecteur dans un tuple Returns: tuple: Coordonnées (x, y, z) """ return (self.x, self.y, self.z) def est_nul(self): """Renvoie True si le vecteur est nul, False sinon Returns: bool: Vecteur nul ? """ return self.x == 0 and self.y == 0 and self.z == 0 def __add__(self, vecteurB): if isinstance(vecteurB, Vecteur): return Vecteur(self.x + vecteurB.x, self.y + vecteurB.y, self.z + vecteurB.z) else: type_ = vecteurB.__class__.__name__ raise TypeError(f"Impossible d'additioner [Vecteur] et [{type_}]") def __radd__(self, vecteurB): if vecteurB == 0: return self else: return self.__add__(vecteurB) def __neg__(self): return Vecteur(-self.x, -self.y, -self.z) def __sub__(self, vecteurB): return self.__add__(-vecteurB) def __rsub__(self, vecteurB): return self.__radd__(-vecteurB) def __mul__(self, valeur): if isinstance(valeur, int) or isinstance(valeur, float): return Vecteur(self.x * valeur, self.y * valeur, self.z * valeur) else: type_ = valeur.__class__.__name__ raise TypeError(f"Impossible de multiplier [Vecteur] et [{type_}]") def __rmul__(self, valeur): return self.__mul__(valeur) def __str__(self): return f"Vecteur ({self.x}, {self.y}, {self.z})" def __eq__(self, v): if isinstance(v, Vecteur): return self.x == v.x and self.y == v.y and self.z == v.z else: type_ = v.__class__.__name__ raise TypeError(f"Impossible de comparer [Vecteur] et [{type_}]")
Methods
def absolue(self)
-
Donne la valeur absolue du vecteur
Returns
float
- Valeur absolue du vecteur
Expand source code
def absolue(self): """Donne la valeur absolue du vecteur Returns: float: Valeur absolue du vecteur """ return Vecteur(abs(self.x), abs(self.z), abs(self.z))
def est_nul(self)
-
Renvoie True si le vecteur est nul, False sinon
Returns
bool
- Vecteur nul ?
Expand source code
def est_nul(self): """Renvoie True si le vecteur est nul, False sinon Returns: bool: Vecteur nul ? """ return self.x == 0 and self.y == 0 and self.z == 0
def get_coordonnes(self)
-
Donne les coordonnées du vecteur dans un tuple
Returns
tuple
- Coordonnées (x, y, z)
Expand source code
def get_coordonnes(self): """Donne les coordonnées du vecteur dans un tuple Returns: tuple: Coordonnées (x, y, z) """ return (self.x, self.y, self.z)
def normal(self, *p)
-
Donne un vecteur normal à ce vecteur
Returns
Vecteur
- Vecteur normal
Raises
NotImplementedError
- Si le vecteur actuel n'a aucune coordonnée nulle
Expand source code
def normal(self, *p): """Donne un vecteur normal à ce vecteur Returns: Vecteur: Vecteur normal Raises: NotImplementedError: Si le vecteur actuel n'a aucune coordonnée nulle """ if self.z == 0: return Vecteur(self.y, -self.x, 0) elif self.y == 0: return Vecteur(-self.z, 0, self.x) elif self.x == 0: return Vecteur(0, self.z, -self.y) else: p = p[0] if isinstance(p, points.Point): a = points.origine b = points.Point(self.x, self.y, self.z) projete = p.projete_orthogonal(droites.Droite(a, b)) return Vecteur(projete, p) else: raise TypeError("Il faut un point pour calculer un vecteur normal en 3D")
def normalise(self)
-
Expand source code
def normalise(self): """Donne la forme normalisée du vecteur Returns: Vecteur: Forme normalisée du vecteur """ return self * float(1 / self.norme())
def norme(self)
-
Donne la norme du vecteur
Returns
float
- Norme du vecteur
Expand source code
def norme(self): """Donne la norme du vecteur Returns: float: Norme du vecteur """ return sqrt((self.x)**2 + (self.y)**2 + (self.z)**2)
def produit_vectoriel(self, vecteurB)
-
Renvoie le produit vectoriel entre le vecteur et vecteurB
Args
vecteurB
:Vecteur
- Vecteur à comparer
Returns
float
- Résultat du produit vectoriel
Raises
TypeError
- Si vecteurB n'est pas un vecteur
Expand source code
def produit_vectoriel(self, vecteurB): """Renvoie le produit vectoriel entre le vecteur et vecteurB Args: vecteurB (Vecteur): Vecteur à comparer Returns: float: Résultat du produit vectoriel Raises: TypeError: Si vecteurB n'est pas un vecteur """ x = (self.y * vecteurB.z) - (self.z * vecteurB.y) y = (self.z * vecteurB.x) - (self.x * vecteurB.z) z = (self.x * vecteurB.y) - (self.y * vecteurB.x) return Vecteur(x, y, z)
def scalaire(self, vecteurB)
-
Renvoie le produit scalaire entre le vecteur et vecteurB
Args
vecteurB
:Vecteur
- Vecteur à comparer
Returns
float
- Résultat du produit scalaire
Raises
TypeError
- Si vecteurB n'est pas un vecteur
Expand source code
def scalaire(self, vecteurB): """Renvoie le produit scalaire entre le vecteur et vecteurB Args: vecteurB (Vecteur): Vecteur à comparer Returns: float: Résultat du produit scalaire Raises: TypeError: Si vecteurB n'est pas un vecteur """ if isinstance(vecteurB, Vecteur): return self.x * vecteurB.x + self.y * vecteurB.y + self.z * vecteurB.z else: type_ = vecteurB.__class__.__name__ raise TypeError(f"Impossible de faire le produit scalaire entre [Vecteur] et [{type_}]")