From e50b2facb441d96febf17a6210370489bbcb9dbf Mon Sep 17 00:00:00 2001 From: Danielle Bolan Date: Wed, 30 Jul 2014 15:31:27 +0200 Subject: [PATCH 1/1] Need to merge --- doc/domain.rst | 21 ++++++-------- doc/examples.rst | 65 +++++++++++++++++++++++++++++++++++++------- doc/images/cube.jpg | Bin 0 -> 36839 bytes doc/polyhedra.rst | 2 +- 4 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 doc/images/cube.jpg diff --git a/doc/domain.rst b/doc/domain.rst index 91b96f8..7098c32 100644 --- a/doc/domain.rst +++ b/doc/domain.rst @@ -3,12 +3,8 @@ Domains Module .. py:class :: Domain - .. py:method:: polyhedra(self) - - Return . - -Domain Properties ------------------ + The properties of a domain can be are found using the following + .. py:method:: symbols Returns a tuple of the symbols that exsist in a domain. @@ -29,8 +25,8 @@ Domain Properties Returns ``True`` if a domain depends on the given dimensions. -Unary Properties ----------------- + The unary properties of a domain can be inspected using the following methods. + .. py:method:: isempty(self) Return ``True`` is a domain is empty. @@ -41,14 +37,13 @@ Unary Properties .. py:method:: isbounded(self) - Return ``True`` if a domain is bounded + Return ``True`` if a domain is bounded. .. py:method:: disjoint(self) - Returns a domain as disjoint. + It is not guarenteed that a domain is disjoint. If it is necessary, this method will return a domain as disjoint. -Binary Properties ------------------ + The following methods compare two domains to find the binary properties. .. py:method:: isdisjoint(self, other) @@ -144,7 +139,7 @@ Binary Properties .. py:method:: points(self) - Return a list of the points contained in a domain. + Return a list of the points contained in a domain as :class:`Points` objects. .. py:method:: vertices(self) diff --git a/doc/examples.rst b/doc/examples.rst index 793ecbe..f3fbfb3 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -1,22 +1,67 @@ Pypol Examples ============== -Creating a Square +Creating a Polyhedron ----------------- - To create any polyhedron, first define the symbols used. Then use the polyhedron functions to define the constraints for the polyhedron. This example creates a square:: + To create any polyhedron, first define the symbols used. Then use the polyhedron functions to define the constraints for the polyhedron. This example creates a square. + >>> from pypol import * >>> x, y = symbols('x y') >>> # define the constraints of the polyhedron - >>> square = Le(0, x) & Le(x, 2) & Le(0, y) & Le(y, 2) - >>> print(square) - >>> And(Ge(x, 0), Ge(-x + 2, 0), Ge(y, 0), Ge(-y + 2, 0)) + >>> square1 = Le(0, x) & Le(x, 2) & Le(0, y) & Le(y, 2) + >>> print(square1) + And(Ge(x, 0), Ge(-x + 2, 0), Ge(y, 0), Ge(-y + 2, 0)) - Several unary operations can be performed on a polyhedron. For example: :: +Urnary Operations +----------------- - >>> ¬square - + >>> square1.isempty() + False + >>> square1.isbounded() + True + +Binary Operations +----------------- + + >>> square2 = Le(2, x) & Le(x, 4) & Le(2, y) & Le(y, 4) + >>> square1 + square2 + Or(And(Ge(x, 0), Ge(-x + 2, 0), Ge(y, 0), Ge(-y + 2, 0)), And(Ge(x - 2, 0), Ge(-x + 4, 0), Ge(y - 2, 0), Ge(-y + 4, 0))) + >>> # check if square1 and square2 are disjoint + >>> square1.disjoint(square2) + False Plot Examples ------------- - - + + Linpy uses matplotlib plotting library to plot 2D and 3D polygons. The user has the option to pass subplots to the :meth:`plot` method. This can be a useful tool to compare polygons. Also, key word arguments can be passed such as color and the degree of transparency of a polygon. + + >>> import matplotlib.pyplot as plt + >>> from matplotlib import pylab + >>> from mpl_toolkits.mplot3d import Axes3D + >>> from pypol import * + >>> # define the symbols + >>> x, y, z = symbols('x y z') + >>> fig = plt.figure() + >>> cham_plot = fig.add_subplot(2, 2, 3, projection='3d') + >>> cham_plot.set_title('Chamfered cube') + >>> cham = Le(0, x) & Le(x, 3) & Le(0, y) & Le(y, 3) & Le(0, z) & Le(z, 3) & Le(z - 2, x) & Le(x, z + 2) & Le(1 - z, x) & Le(x, 5 - z) & Le(z - 2, y) & Le(y, z + 2) & Le(1 - z, y) & Le(y, 5 - z) & Le(y - 2, x) & Le(x, y + 2) & Le(1 - y, x) & Le(x, 5 - y) + >>> cham.plot(cham_plot, facecolors=(1, 0, 0, 0.75)) + >>> pylab.show() + + .. figure:: images/cube.jpg + :align: center + + The user can also inspect a polygon's vertices and the integer points included in the polygon. + + >>> diamond = Ge(y, x - 1) & Le(y, x + 1) & Ge(y, -x - 1) & Le(y, -x + 1) + >>> diamond.vertices() + [Point({x: Fraction(0, 1), y: Fraction(1, 1)}), Point({x: Fraction(-1, 1), y: Fraction(0, 1)}), Point({x: Fraction(1, 1), y: Fraction(0, 1)}), Point({x: Fraction(0, 1), y: Fraction(-1, 1)})] + >>> diamond.points() + [Point({x: -1, y: 0}), Point({x: 0, y: -1}), Point({x: 0, y: 0}), Point({x: 0, y: 1}), Point({x: 1, y: 0})] + + + + + + + diff --git a/doc/images/cube.jpg b/doc/images/cube.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d10cdaa2e0e42d245252f873dae7a39bf6eefe1e GIT binary patch literal 36839 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