Need to merge
[linpy.git] / pypol / geometry.py
index ce055a4..1db5710 100644 (file)
@@ -71,6 +71,9 @@ class Coordinates:
 
     __getitem__ = coordinate
 
 
     __getitem__ = coordinate
 
+    def values(self):
+        yield from self._coordinates.values()
+
     def __bool__(self):
         return any(self._coordinates.values())
 
     def __bool__(self):
         return any(self._coordinates.values())
 
@@ -104,15 +107,27 @@ class Point(Coordinates, GeometricObject):
     """
 
     def isorigin(self):
     """
 
     def isorigin(self):
+        """
+        Return True if a Point is the origin.
+        """
         return not bool(self)
 
         return not bool(self)
 
+    def __hash__(self):
+        return super().__hash__()
+
     def __add__(self, other):
     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):
         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)
         coordinates = []
         if isinstance(other, Point):
             coordinates = self._map2(other, operator.sub)
@@ -124,10 +139,16 @@ class Point(Coordinates, GeometricObject):
             return NotImplemented
 
     def __eq__(self, other):
             return NotImplemented
 
     def __eq__(self, other):
+        """
+        Compares two Points for equality.
+        """
         return isinstance(other, Point) and \
             self._coordinates == other._coordinates
 
     def aspolyhedron(self):
         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():
         from .polyhedra import Polyhedron
         equalities = []
         for symbol, coordinate in self.coordinates():
@@ -145,15 +166,25 @@ class Vector(Coordinates):
             initial = Point(initial)
         if terminal is None:
             coordinates = initial._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):
             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)
 
         return not bool(self)
 
+    def __hash__(self):
+        return super().__hash__()
+
     def __add__(self, other):
     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)
         if isinstance(other, (Point, Vector)):
             coordinates = self._map2(other, operator.add)
             return other.__class__(coordinates)
@@ -209,6 +240,9 @@ class Vector(Coordinates):
         return result
 
     def __eq__(self, other):
         return result
 
     def __eq__(self, other):
+        """
+        Compares two Vectors for equality.
+        """
         return isinstance(other, Vector) and \
             self._coordinates == other._coordinates
 
         return isinstance(other, Vector) and \
             self._coordinates == other._coordinates
 
@@ -216,6 +250,9 @@ class Vector(Coordinates):
         return hash(tuple(self.coordinates()))
 
     def __mul__(self, other):
         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)
         if not isinstance(other, numbers.Real):
             return NotImplemented
         coordinates = self._map(lambda coordinate: other * coordinate)
@@ -224,10 +261,16 @@ class Vector(Coordinates):
     __rmul__ = __mul__
 
     def __neg__(self):
     __rmul__ = __mul__
 
     def __neg__(self):
+        """
+        Returns the negated form of a Vector.
+        """
         coordinates = self._map(operator.neg)
         return Vector(coordinates)
 
     def norm(self):
         coordinates = self._map(operator.neg)
         return Vector(coordinates)
 
     def norm(self):
+        """
+        Normalizes a Vector.
+        """
         return math.sqrt(self.norm2())
 
     def norm2(self):
         return math.sqrt(self.norm2())
 
     def norm2(self):
@@ -240,6 +283,9 @@ class Vector(Coordinates):
         return self / self.norm()
 
     def __sub__(self, other):
         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)
         if isinstance(other, (Point, Vector)):
             coordinates = self._map2(other, operator.sub)
             return other.__class__(coordinates)