__getitem__ = coordinate
+ def values(self):
+ yield from self._coordinates.values()
+
def __bool__(self):
return any(self._coordinates.values())
"""
def isorigin(self):
+ """
+ Return True if a Point is the origin.
+ """
return not bool(self)
+ def __hash__(self):
+ return super().__hash__()
+
def __add__(self, other):
+ """
+ Adds a Point to a Vector and returns the result as a Point.
+ """
if not isinstance(other, Vector):
return NotImplemented
coordinates = self._map2(other, operator.add)
return Point(coordinates)
def __sub__(self, other):
+ """
+ Returns the difference between two Points as a Vector.
+ """
coordinates = []
if isinstance(other, Point):
coordinates = self._map2(other, operator.sub)
return NotImplemented
def __eq__(self, other):
+ """
+ Compares two Points for equality.
+ """
return isinstance(other, Point) and \
self._coordinates == other._coordinates
def aspolyhedron(self):
+ """
+ Return a Point as a polyhedron.
+ """
from .polyhedra import Polyhedron
equalities = []
for symbol, coordinate in self.coordinates():
initial = Point(initial)
if terminal is None:
coordinates = initial._coordinates
- elif not isinstance(terminal, Point):
- terminal = Point(terminal)
+ else:
+ if not isinstance(terminal, Point):
+ terminal = Point(terminal)
coordinates = terminal._map2(initial, operator.sub)
return super().__new__(cls, coordinates)
def isnull(self):
+ """
+ Returns true if a Vector is null.
+ """
return not bool(self)
+ def __hash__(self):
+ return super().__hash__()
+
def __add__(self, other):
+ """
+ Adds either a Point or Vector to a Vector.
+ """
if isinstance(other, (Point, Vector)):
coordinates = self._map2(other, operator.add)
return other.__class__(coordinates)
def angle(self, other):
"""
- Retrieve the angle required to rotate the vector into the vector passed
- in argument. The result is an angle in radians, ranging between -pi and
- pi.
+ Retrieve the angle required to rotate the vector into the vector passed in argument. The result is an angle in radians, ranging between -pi and pi.
"""
if not isinstance(other, Vector):
raise TypeError('argument must be a Vector instance')
return result
def __eq__(self, other):
+ """
+ Compares two Vectors for equality.
+ """
return isinstance(other, Vector) and \
self._coordinates == other._coordinates
return hash(tuple(self.coordinates()))
def __mul__(self, other):
+ """
+ Multiplies a Vector by a scalar value.
+ """
if not isinstance(other, numbers.Real):
return NotImplemented
coordinates = self._map(lambda coordinate: other * coordinate)
__rmul__ = __mul__
def __neg__(self):
+ """
+ Returns the negated form of a Vector.
+ """
coordinates = self._map(operator.neg)
return Vector(coordinates)
def norm(self):
+ """
+ Normalizes a Vector.
+ """
return math.sqrt(self.norm2())
def norm2(self):
return self / self.norm()
def __sub__(self, other):
+ """
+ Subtract a Point or Vector from a Vector.
+ """
if isinstance(other, (Point, Vector)):
coordinates = self._map2(other, operator.sub)
return other.__class__(coordinates)