Module py3d.plans
Module plans, contient la classe Plan et des fonctions annexes
Attributes
plan_xy
:Plan
- Plan d'équation z = 0 (horizontal)
plan_xz
:Plan
- Plan d'équation y = 0 (vertical)
plan_yz
:Plan
- Plan d'équation x = 0 (vertical)
Expand source code
"""Module plans, contient la classe Plan et des fonctions annexes
Attributes:
plan_xy (Plan): Plan d'équation z = 0 (horizontal)
plan_xz (Plan): Plan d'équation y = 0 (vertical)
plan_yz (Plan): Plan d'équation x = 0 (vertical)
"""
import droites
import vecteurs
import calculs
def parallelles(planA, *args):
"""Renvoie True si les plans donnés sont parallèles, False sinon
Args:
planA (Plan): Plan de référence
*args: Autres plans
Returns:
bool: Plans tous parallelles ?
Raises:
TypeError: Si les objets donnés ne sont pas tous des plans
"""
if isinstance(planA, Plan):
for planX in args:
if isinstance(planX, Plan):
if not(planX.vecteur_normal() == planA.vecteur_normal()):
return False
else:
typeA = planA.__class__.__name__
typeB = planX.__class__.__name__
raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
return True
else:
typeA = planA.__class__.__name__
planX = args[0]
typeB = planX.__class__.__name__
raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
def secants(planA, *args):
"""Renvoie True si les plans donnés sont sécants, False sinon
Args:
planA (Plan): Plan de référence
*args: Autres plans
Returns:
bool: Plans tous sécants ?
Raises:
TypeError: Si les objets donnés ne sont pas tous des plans
"""
return not parallelles(planA, *args)
def plans_orthogonaux(planA, *args):
"""Renvoie True si les plans donnés sont sécants, False sinon
Args:
planA (Plan): Plan de référence
*args: Autres plans
Returns:
bool: Plans tous sécants ?
Raises:
TypeError: Si les objets donnés ne sont pas tous des plans
"""
if isinstance(planA, Plan):
for planX in args:
if isinstance(planX, Plan):
if secants(planA, planX):
if not(planX.vecteur_normal().scalaire(planA.vecteur_normal())) != 0:
return False
else:
return False
else:
typeA = planA.__class__.__name__
typeB = planX.__class__.__name__
raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
return True
else:
typeA = planA.__class__.__name__
planX = args[0]
typeB = planX.__class__.__name__
raise TypeError(f"Impossible de déterminer le parallélisme entre [{typeA}] et [{typeB}]")
class Plan:
"""Classe représentant un plan de l'espace
Attributes:
point (points.Point): Point d'origine du plan
vecteur_n (vecteurs.Vecteur): Vecteur normal au plan
"""
def __init__(self, *args):
"""Initialisation du plan :
- Un point + un vecteur normal
- Deux droites
- Un point + deux vecteurs non colinéaires
- Trois points
Args:
*args: Arguments de définition du plan
Raises:
TypeError: Les types passés sont incorrects
ValueError: Le vecteur normal est nul, les deux vecteurs sont colinéaires ou les trois points sont alignés
"""
import points
if len(args) == 2:
a, b = args
#Point + Vecteur Normal
if isinstance(a, points.Point) and isinstance(b, vecteurs.Vecteur):
if not b.est_nul():
self.point = a
self.vecteur_n = b
else:
raise ValueError("Le vecteur normal d'un plan ne peut pas être nul")
#Deux droites
elif isinstance(a, droites.Droite) and isinstance(b, droites.Droite):
self.point = calculs.intersection(a, b)
self.vecteur_n = a.vecteur.produit_vectoriel(b.vecteur)
else:
typeA = a.__class__.__name__
typeB = b.__class__.__name__
raise TypeError(f"Impossible de créer un plan à partir de [{typeA}] et [{typeB}]")
elif len(args) == 3:
a, b ,c = args
#Point + Deux vecteurs
if isinstance(a, points.Point) and (b, vecteurs.Vecteur) and isinstance(c, vecteurs.Vecteur):
if not(b.est_nul() or c.est_nul()):
if not vecteurs.collineaires(b, c):
self.vecteur_n = b.produit_vectoriel(c)
self.point = a
else:
raise ValueError("Deux vecteurs collinéaires ne peuvent pas engendrer un plan")
else:
raise ValueError("Impossible de générer un plan à partir d'un vecteur nul")
#Trois points
elif all(isinstance(x, points.Point) for x in args):
ab = vecteurs.Vecteur(a, b)
ac = vecteurs.Vecteur(b, c)
if not(ab.est_nul() or ac.est_nul()):
if not vecteurs.collineaires(ab, ac):
self.vecteur_n = ab.produit_vectoriel(ac)
self.point = a
else:
raise ValueError("Trois points alignés ne peuvent pas engendrer un plan")
else:
raise ValueError("Impossible de générer un plan : les points ne sont pas distincts")
else:
typeA = a.__class__.__name__
typeB = b.__class__.__name__
typeC = c.__class__.__name__
raise TypeError(f"Impossible de créer un plan à partir de [{typeA}], [{typeB}] et [{typeC}]")
elif len(args) == 4:
pass
a, b, c, d = args
#Equation cartesienne
if all(isinstance(x, int) or isinstance(x, float) for x in args):
if not(a == 0 and b == 0 and c == 0):
self.vecteur_n = vecteurs.Vecteur(a, b, c)
if c != 0:
self.point = points.Point(0, 0, -d/c)
elif b != 0:
self.point = points.Point(0, -d/b, 0)
elif a != 0:
self.point = points.Point(-d/a, 0, 0)
else:
raise ValueError("Impossible de générer un plan à partir d'un vecteur nul")
else:
raise TypeError("Les paramètres de l'équation cartésienne doivent être des chiffres")
def cartesienne(self):
"""Renvoie l'équation cartésienne du plan, et les coefficients dans un tuple
Returns:
tuple:
- Equation cartésienne (str)
- Tuple avec les coefficients a b c d pour `ax + by + cz + d = 0`
"""
a = self.vecteur_n.x
b = self.vecteur_n.y
c = self.vecteur_n.z
signe_b = "+ " if b >= 0 else ""
signe_c = "+ " if c >= 0 else ""
total_p = a * self.point.x + b * self.point.y + c * self.point.z
d = -total_p
signe_d = "+ " if d >= 0 else ""
str_equation = f"{a}x {signe_b}{b}y {signe_c}{c}z {signe_d}{d} = 0"
return (str_equation, (a, b, c, d))
def vecteur_normal(self):
"""Renvoie le vecteur normal au plan
Returns:
vecteurs.Vecteur: Vecteur normal
"""
return self.vecteur_n
def __contains__(self, point):
if isinstance(point, points.Point):
projete = point.projete_orthogonal(self)
return points.est_meme_point(point, projete)
def __str__(self):
return self.cartesienne()[0]
def __repr__(self):
return self.cartesienne()[0]
plan_xy = Plan(0, 0, 1, 0)
plan_yz = Plan(1, 0, 0, 0)
plan_xz = Plan(0, 1, 0, 0)
__all__ = ("Plan", "plan_xy", "plan_yz", "plan_xz")
Classes
class Plan (*args)
-
Classe représentant un plan de l'espace
Attributes
point
:points.Point
- Point d'origine du plan
vecteur_n
:vecteurs.Vecteur
- Vecteur normal au plan
Initialisation du plan :
- Un point + un vecteur normal - Deux droites - Un point + deux vecteurs non colinéaires - Trois points
Args
*args
- Arguments de définition du plan
Raises
TypeError
- Les types passés sont incorrects
ValueError
- Le vecteur normal est nul, les deux vecteurs sont colinéaires ou les trois points sont alignés
Expand source code
class Plan: """Classe représentant un plan de l'espace Attributes: point (points.Point): Point d'origine du plan vecteur_n (vecteurs.Vecteur): Vecteur normal au plan """ def __init__(self, *args): """Initialisation du plan : - Un point + un vecteur normal - Deux droites - Un point + deux vecteurs non colinéaires - Trois points Args: *args: Arguments de définition du plan Raises: TypeError: Les types passés sont incorrects ValueError: Le vecteur normal est nul, les deux vecteurs sont colinéaires ou les trois points sont alignés """ import points if len(args) == 2: a, b = args #Point + Vecteur Normal if isinstance(a, points.Point) and isinstance(b, vecteurs.Vecteur): if not b.est_nul(): self.point = a self.vecteur_n = b else: raise ValueError("Le vecteur normal d'un plan ne peut pas être nul") #Deux droites elif isinstance(a, droites.Droite) and isinstance(b, droites.Droite): self.point = calculs.intersection(a, b) self.vecteur_n = a.vecteur.produit_vectoriel(b.vecteur) else: typeA = a.__class__.__name__ typeB = b.__class__.__name__ raise TypeError(f"Impossible de créer un plan à partir de [{typeA}] et [{typeB}]") elif len(args) == 3: a, b ,c = args #Point + Deux vecteurs if isinstance(a, points.Point) and (b, vecteurs.Vecteur) and isinstance(c, vecteurs.Vecteur): if not(b.est_nul() or c.est_nul()): if not vecteurs.collineaires(b, c): self.vecteur_n = b.produit_vectoriel(c) self.point = a else: raise ValueError("Deux vecteurs collinéaires ne peuvent pas engendrer un plan") else: raise ValueError("Impossible de générer un plan à partir d'un vecteur nul") #Trois points elif all(isinstance(x, points.Point) for x in args): ab = vecteurs.Vecteur(a, b) ac = vecteurs.Vecteur(b, c) if not(ab.est_nul() or ac.est_nul()): if not vecteurs.collineaires(ab, ac): self.vecteur_n = ab.produit_vectoriel(ac) self.point = a else: raise ValueError("Trois points alignés ne peuvent pas engendrer un plan") else: raise ValueError("Impossible de générer un plan : les points ne sont pas distincts") else: typeA = a.__class__.__name__ typeB = b.__class__.__name__ typeC = c.__class__.__name__ raise TypeError(f"Impossible de créer un plan à partir de [{typeA}], [{typeB}] et [{typeC}]") elif len(args) == 4: pass a, b, c, d = args #Equation cartesienne if all(isinstance(x, int) or isinstance(x, float) for x in args): if not(a == 0 and b == 0 and c == 0): self.vecteur_n = vecteurs.Vecteur(a, b, c) if c != 0: self.point = points.Point(0, 0, -d/c) elif b != 0: self.point = points.Point(0, -d/b, 0) elif a != 0: self.point = points.Point(-d/a, 0, 0) else: raise ValueError("Impossible de générer un plan à partir d'un vecteur nul") else: raise TypeError("Les paramètres de l'équation cartésienne doivent être des chiffres") def cartesienne(self): """Renvoie l'équation cartésienne du plan, et les coefficients dans un tuple Returns: tuple: - Equation cartésienne (str) - Tuple avec les coefficients a b c d pour `ax + by + cz + d = 0` """ a = self.vecteur_n.x b = self.vecteur_n.y c = self.vecteur_n.z signe_b = "+ " if b >= 0 else "" signe_c = "+ " if c >= 0 else "" total_p = a * self.point.x + b * self.point.y + c * self.point.z d = -total_p signe_d = "+ " if d >= 0 else "" str_equation = f"{a}x {signe_b}{b}y {signe_c}{c}z {signe_d}{d} = 0" return (str_equation, (a, b, c, d)) def vecteur_normal(self): """Renvoie le vecteur normal au plan Returns: vecteurs.Vecteur: Vecteur normal """ return self.vecteur_n def __contains__(self, point): if isinstance(point, points.Point): projete = point.projete_orthogonal(self) return points.est_meme_point(point, projete) def __str__(self): return self.cartesienne()[0] def __repr__(self): return self.cartesienne()[0]
Methods
def cartesienne(self)
-
Renvoie l'équation cartésienne du plan, et les coefficients dans un tuple
Returns
tuple:
-
Equation cartésienne (str)
-
Tuple avec les coefficients a b c d pour
ax + by + cz + d = 0
Expand source code
def cartesienne(self): """Renvoie l'équation cartésienne du plan, et les coefficients dans un tuple Returns: tuple: - Equation cartésienne (str) - Tuple avec les coefficients a b c d pour `ax + by + cz + d = 0` """ a = self.vecteur_n.x b = self.vecteur_n.y c = self.vecteur_n.z signe_b = "+ " if b >= 0 else "" signe_c = "+ " if c >= 0 else "" total_p = a * self.point.x + b * self.point.y + c * self.point.z d = -total_p signe_d = "+ " if d >= 0 else "" str_equation = f"{a}x {signe_b}{b}y {signe_c}{c}z {signe_d}{d} = 0" return (str_equation, (a, b, c, d))
-
def vecteur_normal(self)
-
Renvoie le vecteur normal au plan
Returns
vecteurs.Vecteur
- Vecteur normal
Expand source code
def vecteur_normal(self): """Renvoie le vecteur normal au plan Returns: vecteurs.Vecteur: Vecteur normal """ return self.vecteur_n