# -*- coding: utf-8 -*-
"""
Définition de petits éléments géométriques tels que les points
et les segments, implemente également des opérations standard
telles le produit scalaire entre deux vecteurs, ...
:githublink:`%|py|8`
"""
import math
import copy
import numpy
[docs]class Point:
"""
Définit un point de l'image ou un vecteur,
deux coordonnées *x* et *y* qui sont réelles.
:githublink:`%|py|17`
"""
__slots__ = "x", "y"
[docs] def __init__(self, x, y):
"""
constructeur
:githublink:`%|py|21`
"""
self.x = x
self.y = y
[docs] def __str__(self):
"""
permet d'afficher un point avec l'instruction print
:githublink:`%|py|26`
"""
return '({0},{1})'.format(self.x, self.y)
[docs] def __repr__(self):
"""
usuel
:githublink:`%|py|30`
"""
return 'Point({0}, {1})'.format(self.x, self.y)
[docs] def normalise(self):
"""
normalise le vecteur, sa norme devient 1
:githublink:`%|py|34`
"""
v = self.x * self.x + self.y * self.y
v = math.sqrt(v)
if v > 0: # evite les erreurs si sa norme est nulle
self.x /= v
self.y /= v
[docs] def scalairek(self, k: float):
"""
Mulitplication par un scalaire.
:param k: float
:githublink:`%|py|46`
"""
self.x *= k
self.y *= k
[docs] def norme(self) -> float:
"""
Retourne la norme.
:return: float (norm)
:githublink:`%|py|55`
"""
return math.sqrt(self.x * self.x + self.y * self.y)
[docs] def as_array(self):
"""
Convertit en array.
:githublink:`%|py|61`
"""
return numpy.array([self.x, self.y])
[docs] def scalaire(self, k: 'Point') -> float:
"""
Calcule le produit scalaire.
:param k: :class:`Point <mlstatpy.image.detection_segment.geometrie.Point>`
:return: float
:githublink:`%|py|70`
"""
return self.x * k.x + self.y * k.y
[docs] def __iadd__(self, ad):
"""
ajoute un vecteur à celui-ci
:githublink:`%|py|74`
"""
self.x += ad.x
self.y += ad.y
return self
[docs] def __add__(self, ad):
"""
ajoute un vecteur a celui-ci
:githublink:`%|py|80`
"""
return Point(self.x + ad.x, self.y + ad.y)
[docs] def arrondi(self) -> 'Point':
"""
retourne les coordonnées arrondies à l'entier le plus proche
:githublink:`%|py|86`
"""
return Point(int(self.x + 0.5), int(self.y + 0.5))
[docs] def __sub__(self, p):
"""
soustraction de deux de vecteurs
:githublink:`%|py|90`
"""
return Point(self.x - p.x, self.y - p.y)
[docs] def angle(self):
"""
retourne l'angle du vecteur
:githublink:`%|py|94`
"""
return math.atan2(self.y, self.x)
[docs] def __eq__(self, a) -> bool:
"""
retourne True si les deux points ``self`` et ``a`` sont egaux,
False sinon
:githublink:`%|py|99`
"""
return self.x == a.x and self.y == a.y
[docs]class Segment:
"""
Définit un segment, soit deux :class:`Point <mlstatpy.image.detection_segment.geometrie.Point>`.
:githublink:`%|py|106`
"""
# voir le commentaire associees a la ligne contenant __slots__
# dans la classe Point
__slots__ = "a", "b"
[docs] def __init__(self, a, b):
"""
constructeur, pour éviter des erreurs d'etourderie,
on crée des copies des extrémités a et b,
comme ce sont des classes, une simple affectation ne suffit pas
:githublink:`%|py|117`
"""
self.a, self.b = copy.copy(a), copy.copy(b)
[docs] def __str__(self) -> str:
"""
permet d'afficher le segment avec l'instruction print
:githublink:`%|py|121`
"""
return "[{0},{1}]".format(self.a, self.b)
[docs] def directeur(self) -> Point:
"""
retourne le vecteur directeur du segment,
ce vecteur est norme
:githublink:`%|py|126`
"""
p = Point(self.b.x - self.a.x, self.b.y - self.a.y)
p.normalise()
return p
[docs] def normal(self) -> float:
"""
retourne le vecteur normal du segment,
ce vecteur est norme
:githublink:`%|py|133`
"""
p = Point(self.a.y - self.b.y, self.b.x - self.a.x)
p.normalise()
return p
[docs] def first(self):
"""
Retourne la première extrémité.
:githublink:`%|py|139`
"""
return self.a
[docs] def last(self):
"""
Retourne la seconde extrémité.
:githublink:`%|py|143`
"""
return self.b