- @classmethod
- def _sort_polygon_3d(cls, points):
- if len(points) <= 3:
- return points
- o = cls._polygon_inner_point(points)
- a = points[0]
- oa = Vector(o, a)
- norm_oa = oa.norm()
- for b in points[1:]:
- ob = Vector(o, b)
- u = oa.cross(ob)
- if not u.isnull():
- u = u.asunit()
- break
- else:
- raise ValueError('degenerate polygon')
- angles = {a: 0.}
- for m in points[1:]:
- om = Vector(o, m)
- normprod = norm_oa * om.norm()
- cosinus = oa.dot(om) / normprod
- sinus = u.dot(oa.cross(om)) / normprod
- angle = math.acos(cosinus)
- angle = math.copysign(angle, sinus)
- angles[m] = angle
- return sorted(points, key=angles.get)
-
- def faces(self):
- vertices = self.vertices()
- faces = []
- for constraint in self.constraints:
- face = []
- for vertex in vertices:
- if constraint.subs(vertex.coordinates()) == 0:
- face.append(vertex)
- faces.append(face)
- return faces
-
- def plot(self):
- import matplotlib.pyplot as plt
- from matplotlib.path import Path
- import matplotlib.patches as patches
-
- if len(self.symbols)> 3:
- raise TypeError
-
- elif len(self.symbols) == 2:
- verts = self.vertices()
- points = []
- codes = [Path.MOVETO]
- for vert in verts:
- pairs = ()
- for sym in sorted(vert, key=Symbol.sortkey):
- num = vert.get(sym)
- pairs = pairs + (num,)
- points.append(pairs)
- points.append((0.0, 0.0))
- num = len(points)
- while num > 2:
- codes.append(Path.LINETO)
- num = num - 1
- else:
- codes.append(Path.CLOSEPOLY)
- path = Path(points, codes)
- fig = plt.figure()
- ax = fig.add_subplot(111)
- patch = patches.PathPatch(path, facecolor='blue', lw=2)
- ax.add_patch(patch)
- ax.set_xlim(-5,5)
- ax.set_ylim(-5,5)
- plt.show()
+ __slots__ = Polyhedron.__slots__
+
+ def __new__(cls):
+ self = object().__new__(cls)
+ self._equalities = (Rational(1),)
+ self._inequalities = ()
+ self._constraints = self._equalities
+ self._symbols = ()
+ self._dimension = 0
+ return self
+
+ def widen(self, other):
+ if not isinstance(other, Polyhedron):
+ raise ValueError('argument must be a Polyhedron instance')
+ return other
+
+ def __repr__(self):
+ return 'Empty'
+
+ def _repr_latex_(self):
+ return '$$\\emptyset$$'
+
+Empty = EmptyType()
+
+
+class UniverseType(Polyhedron):