Goulib.geom module

Inheritance diagram of Goulib.geom

2D geometry

class Goulib.geom.Geometry(*args)[source]

Bases: object

The following classes are available for dealing with simple 2D geometry. The interface to each shape is similar; in particular, the connect and distance methods are defined identically for each.

For example, to find the closest point on a line to a circle:

>>> circ = Circle(Point2(3., 2.), 2.)
>>> line = Line2(Point2(0., 0.), Point2(-1., 1.))
>>> line.connect(circ).p1
Point2(0.50, -0.50)

To find the corresponding closest point on the circle to the line:

>>> line.connect(circ).p2
Point2(1.59, 0.59)

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

__init__(*args)[source]

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

point(u)[source]
Returns:Point2 or Point3 at parameter u
tangent(u)[source]
Returns:Vector2 or Vector3 tangent at parameter u
intersect(other)[source]
connect(other)[source]
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)[source]
__contains__(pt)[source]
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__eq__

Return self==value.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__

Return hash(self).

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__repr__

Return repr(self).

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

Goulib.geom.argPair(x, y=None)[source]

Process a pair of values passed in various ways.

class Goulib.geom.Vector2(*args)[source]

Bases: object

Mutable 2D vector:

Construct a vector in the obvious way:

>>> Vector2(1.5, 2.0)
Vector2(1.50, 2.00)

>>> Vector3(1.0, 2.0, 3.0)
Vector3(1.00, 2.00, 3.00)

Element access

Components may be accessed as attributes (examples that follow use Vector3, but all results are similar for Vector2, using only the x and y components):

>>> v = Vector3(1, 2, 3)
>>> v.x
1
>>> v.y
2
>>> v.z
3

Vectors support the list interface via slicing:

>>> v = Vector3(1, 2, 3)
>>> len(v)
3
>>> v[0]
1
>>> v[:]
(1, 2, 3)

You can also “swizzle” the components (a la GLSL or Cg):

>>> v = Vector3(1, 2, 3)
>>> v.xyz
(1, 2, 3)
>>> v.zx
(3, 1)
>>> v.zzzz
(3, 3, 3, 3)

Operators

Addition and subtraction are supported via operator overloading (note that in-place operators perform faster than those that create a new object):

>>> v1 = Vector3(1, 2, 3)
>>> v2 = Vector3(4, 5, 6)
>>> v1 + v2
Vector3(5.00, 7.00, 9.00)
>>> v1 -= v2
>>> v1
Vector3(-3.00, -3.00, -3.00)

Multiplication and division can be performed with a scalar only:

>>> Vector3(1, 2, 3) * 2
Vector3(2.00, 4.00, 6.00)
>>> v1 = Vector3(1., 2., 3.)
>>> v1 /= 2
>>> v1
Vector3(0.50, 1.00, 1.50)

The magnitude of a vector can be found with abs:

>>> v = Vector3(1., 2., 3.)
>>> abs(v)
3.7416573867739413

A vector can be normalized in-place (note that the in-place method also returns self, so you can chain it with further operators):

>>> v = Vector3(1., 2., 3.)
>>> v.normalize()
Vector3(0.27, 0.53, 0.80)
>>> v
Vector3(0.27, 0.53, 0.80)

The following methods do not alter the original vector or their arguments:

magnitude()

Returns the magnitude of the vector; equivalent to abs(v). Example:

>>> v = Vector3(1., 2., 3.)
>>> v.magnitude()
3.7416573867739413
magnitude_squared()

Returns the sum of the squares of each component. Useful for comparing the length of two vectors without the expensive square root operation. Example:

>>> v = Vector3(1., 2., 3.)
>>> v.magnitude_squared()
14.0
normalized()

Return a unit length vector in the same direction. Note that this method differs from normalize in that it does not modify the vector in-place. Example:

>>> v = Vector3(1., 2., 3.)
>>> v.normalized()
Vector3(0.27, 0.53, 0.80)
>>> v
Vector3(1.00, 2.00, 3.00)
dot(other)

Return the scalar “dot” product of two vectors. Example:

>>> v1 = Vector3(1., 2., 3.)
>>> v2 = Vector3(4., 5., 6.)
>>> v1.dot(v2)
32.0
cross() and cross(other)

Return the cross product of a vector (for Vector2), or the cross product of two vectors (for Vector3). The return type is a vector. Example:

>>> v1 = Vector3(1., 2., 3.)
>>> v2 = Vector3(4., 5., 6.)
>>> v1.cross(v2)
Vector3(-3.00, 6.00, -3.00)

In two dimensions there can be no argument to cross:

>>> v1 = Vector2(1., 2.)
>>> v1.cross()
Vector2(2.00, -1.00)
reflect(normal)

Return the vector reflected about the given normal. In two dimensions, normal is the normal to a line, in three dimensions it is the normal to a plane. The normal must have unit length. Example:

>>> v = Vector3(1., 2., 3.)
>>> v.reflect(Vector3(0, 1, 0))
Vector3(1.00, -2.00, 3.00)
>>> v = Vector2(1., 2.)
>>> v.reflect(Vector2(1, 0))
Vector2(-1.00, 2.00)
rotate_around(axes, theta)

For 3D vectors, return the vector rotated around axis by the angle theta.

>>> v = Vector3(1., 2., 3.)
>>> axes = Vector3(1.,1.,0)
>>> v.rotate_around(axes,math.pi/4)
Vector3(2.65, 0.35, 2.62)

Constructor. :param *args: x,y values

__init__(*args)[source]

Constructor. :param *args: x,y values

xy
Returns:tuple (x,y)
__repr__()[source]

Return repr(self).

__hash__()[source]

Return hash(self).

__eq__(other)[source]

Tests for equality include comparing against other sequences:

>>> v2 = Vector2(1, 2)
>>> v2 == Vector2(3, 4)

False >>> v2 != Vector2(1, 2) False >>> v2 == (1, 2) True

>>> v3 = Vector3(1, 2, 3)
>>> v3 == Vector3(3, 4, 5)
False
>>> v3 != Vector3(1, 2, 3)
False
>>> v3 == (1, 2, 3)
True
__len__()[source]
__iter__()[source]
__add__(other)[source]
__radd__(other)
__iadd__(other)[source]
__sub__(other)[source]
__rsub__(other)[source]

Point2 - Vector 2 substraction :param other: Point2 or (x,y) tuple :return: Vector2

__mul__(other)[source]
__rmul__(other)
__imul__(other)[source]
__div__(other)[source]
__rdiv__(other)[source]
__floordiv__(other)[source]
__rfloordiv__(other)[source]
__truediv__(other)[source]
__rtruediv__(other)[source]
__neg__()[source]
__pos__()[source]
__abs__()[source]
mag()
length
mag2()[source]
normalize()[source]
normalized()[source]
dot(other)[source]
cross()[source]
reflect(normal)[source]
angle(other=None, unit=False)[source]

angle between two vectors. :param unit: bool True if vectors are unit vectors. False increases computations :return: float angle in radians to the other vector, or self direction if other=None

project(other)[source]

Return the projection (the component) of the vector on other.

__class__

alias of builtins.type

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

class Goulib.geom.Point2(*args)[source]

Bases: Goulib.geom.Vector2, Goulib.geom.Geometry, Goulib.drawing.Entity

A point on a 2D plane. Construct in the obvious way:

>>> p = Point2(1.0, 2.0)
>>> p

Point2(1.00, 2.00)

Point2 subclasses Vector2, so all of Vector2 operators and methods apply. In particular, subtracting two points gives a vector:

>>> Point2(2.0, 3.0) - Point2(1.0, 0.0)

Vector2(1.00, 3.00)

connect(other)
Returns a Segment2 which is the minimum length line segment that can connect the two shapes. other may be a Point2, Line2, Ray2, Segment2 or Circle.

Constructor. :param *args: x,y values

distance(other)[source]

absolute minimum distance to other object :param other: Point2, Line2 or Circle :return: float positive distance between self and other

__contains__(pt)[source]
Returns:True if self and pt are the same point, False otherwise

needed for coherency

intersect(other)[source]

Point2/object intersection :return: Point2 copy of self if on other object, None if not

connect(other)[source]
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
__abs__()
__abstractmethods__ = frozenset()
__add__(other)
__class__

alias of abc.ABCMeta

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__div__(other)
__eq__(other)

Tests for equality include comparing against other sequences:

>>> v2 = Vector2(1, 2)
>>> v2 == Vector2(3, 4)

False >>> v2 != Vector2(1, 2) False >>> v2 == (1, 2) True

>>> v3 = Vector3(1, 2, 3)
>>> v3 == Vector3(3, 4, 5)
False
>>> v3 != Vector3(1, 2, 3)
False
>>> v3 == (1, 2, 3)
True
__floordiv__(other)
__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__()

Return hash(self).

__iadd__(other)
__imul__(other)
__init__(*args)

Constructor. :param *args: x,y values

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__iter__()
__le__

Return self<=value.

__len__()
__lt__

Return self<value.

__mul__(other)
__ne__

Return self!=value.

__neg__()
__new__()

Create and return a new object. See help(type) for accurate signature.

__pos__()
__radd__(other)
__rdiv__(other)
__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__repr__()

Return repr(self).

__rfloordiv__(other)
__rmul__(other)
__rsub__(other)

Point2 - Vector 2 substraction :param other: Point2 or (x,y) tuple :return: Vector2

__rtruediv__(other)
__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

__sub__(other)
__truediv__(other)
angle(other=None, unit=False)

angle between two vectors. :param unit: bool True if vectors are unit vectors. False increases computations :return: float angle in radians to the other vector, or self direction if other=None

bbox()
Returns:BBox bounding box of Entity
center
color = 'black'
cross()
dot(other)
draw(fig=None, **kwargs)

draw entities :param fig: matplotlib figure where to draw. figure(g) is called if missing :return: fig,patch

end
static figure(box, **kwargs)
Parameters:
  • boxdrawing.BBox bounds and clipping box
  • kwargs – parameters passed to ~matplotlib.pyplot.figure
Returns:

matplotlib axis suitable for drawing

static from_dxf(e, mat3)
Parameters:
  • e – dxf.entity
  • mat3 – Matrix3 transform
Returns:

Entity of correct subtype

static from_pdf(path, trans, color)
Parameters:path – pdf path
Returns:Entity of correct subtype
static from_svg(path, color)
Parameters:path – svg path
Returns:Entity of correct subtype
html(**kwargs)
isclosed()
ishorizontal(tol=0.01)
isline()
isvertical(tol=0.01)
length
mag()
mag2()
normalize()
normalized()
patches(**kwargs)
Returns:list of (a single) Patch corresponding to entity
Note:this is the only method that needs to be overridden in descendants for draw, render and IPython _repr_xxx_ to work
plot(**kwargs)

renders on IPython Notebook (alias to make usage more straightforward)

png(**kwargs)
point(u)
Returns:Point2 or Point3 at parameter u
project(other)

Return the projection (the component) of the vector on other.

reflect(normal)
render(fmt, **kwargs)

render graph to bitmap stream :return: matplotlib figure as a byte stream in specified format

save(filename, **kwargs)
setattr(**kwargs)

set (graphic) attributes to entity :param kwargs: dict of attributes copied to entity

start
svg(**kwargs)
tangent(u)
Returns:Vector2 or Vector3 tangent at parameter u
to_dxf(**attr)
Parameters:attr – dict of attributes passed to the dxf entity, overriding those defined in self
Returns:dxf entity
xy
Returns:tuple (x,y)
Goulib.geom.Polar(mag, angle)[source]
class Goulib.geom.Line2(*args)[source]

Bases: Goulib.geom.Geometry

A Line2 is a line on a 2D plane extending to infinity in both directions; a Ray2 has a finite end-point and extends to infinity in a single direction; a Segment2 joins two points.

All three classes support the same constructors, operators and methods, but may behave differently when calculating intersections etc.

You may construct a line, ray or line segment using any of:

  • another line, ray or line segment
  • two points
  • a point and a vector
  • a point, a vector and a length

For example:

>>> Line2(Point2(1.0, 1.0), Point2(2.0, 3.0))
Line2(<1.00, 1.00> + u<1.00, 2.00>)
>>> Line2(Point2(1.0, 1.0), Vector2(1.0, 2.0))
Line2(<1.00, 1.00> + u<1.00, 2.00>)
>>> Ray2(Point2(1.0, 1.0), Vector2(1.0, 2.0), 1.0)
Ray2(<1.00, 1.00> + u<0.45, 0.89>)

Internally, lines, rays and line segments store a Point2 p and a Vector2 v. You can also access (but not set) the two endpoints p1 and p2. These may or may not be meaningful for all types of lines.

The following methods are supported by all three classes:

intersect(other)

If other is a Line2, Ray2 or Segment2, returns a Point2 of intersection, or None if the lines are parallel.

If other is a Circle, returns a Segment2 or Point2 giving the part of the line that intersects the circle, or None if there is no intersection.

connect(other)
Returns a Segment2 which is the minimum length line segment that can connect the two shapes. For two parallel lines, this line segment may be in an arbitrary position. other may be a Point2, Line2, Ray2, Segment2 or Circle.
distance(other)
Returns the absolute minimum distance to other. Internally this simply returns the length of the result of connect.

Segment2 also has a length property which is read-only.

__init__(*args)[source]

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

__eq__(other)[source]

lines are “equal” only if base points and vector are strictly equal. to compare if lines are “same”, use line1.distance(line2)==0

__repr__()[source]

Return repr(self).

point(u)[source]
Returns:Point2 at parameter u
tangent(u)[source]
Returns:Vector2 tangent at parameter u. Warning : tangent is generally not a unit vector
intersect(other)[source]
connect(other)[source]
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__contains__(pt)
__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

distance(other)
class Goulib.geom.Ray2(*args)[source]

Bases: Goulib.geom.Line2

__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__contains__(pt)
__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__eq__(other)

lines are “equal” only if base points and vector are strictly equal. to compare if lines are “same”, use line1.distance(line2)==0

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init__(*args)

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__repr__()

Return repr(self).

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

connect(other)
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)
intersect(other)
point(u)
Returns:Point2 at parameter u
tangent(u)
Returns:Vector2 tangent at parameter u. Warning : tangent is generally not a unit vector
class Goulib.geom.Segment2(*args)[source]

Bases: Goulib.geom.Line2, Goulib.drawing.Entity

p1
p2
__repr__()[source]

Return repr(self).

__abs__()[source]
mag2()[source]
length
swap()[source]
midpoint()[source]
bisect()[source]
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__contains__(pt)
__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__eq__(other)

lines are “equal” only if base points and vector are strictly equal. to compare if lines are “same”, use line1.distance(line2)==0

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init__(*args)

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

bbox()
Returns:BBox bounding box of Entity
center
color = 'black'
connect(other)
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)
draw(fig=None, **kwargs)

draw entities :param fig: matplotlib figure where to draw. figure(g) is called if missing :return: fig,patch

end
static figure(box, **kwargs)
Parameters:
  • boxdrawing.BBox bounds and clipping box
  • kwargs – parameters passed to ~matplotlib.pyplot.figure
Returns:

matplotlib axis suitable for drawing

static from_dxf(e, mat3)
Parameters:
  • e – dxf.entity
  • mat3 – Matrix3 transform
Returns:

Entity of correct subtype

static from_pdf(path, trans, color)
Parameters:path – pdf path
Returns:Entity of correct subtype
static from_svg(path, color)
Parameters:path – svg path
Returns:Entity of correct subtype
html(**kwargs)
intersect(other)
isclosed()
ishorizontal(tol=0.01)
isline()
isvertical(tol=0.01)
patches(**kwargs)
Returns:list of (a single) Patch corresponding to entity
Note:this is the only method that needs to be overridden in descendants for draw, render and IPython _repr_xxx_ to work
plot(**kwargs)

renders on IPython Notebook (alias to make usage more straightforward)

png(**kwargs)
point(u)
Returns:Point2 at parameter u
render(fmt, **kwargs)

render graph to bitmap stream :return: matplotlib figure as a byte stream in specified format

save(filename, **kwargs)
setattr(**kwargs)

set (graphic) attributes to entity :param kwargs: dict of attributes copied to entity

start
svg(**kwargs)
tangent(u)
Returns:Vector2 tangent at parameter u. Warning : tangent is generally not a unit vector
to_dxf(**attr)
Parameters:attr – dict of attributes passed to the dxf entity, overriding those defined in self
Returns:dxf entity
class Goulib.geom.Surface(*args)[source]

Bases: Goulib.geom.Geometry

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

length
area
center
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__contains__(pt)
__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__eq__

Return self==value.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__

Return hash(self).

__init__(*args)

this constructor is called by descendant classes at copy it is replaced to copy some graphics attributes in module drawings

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__repr__

Return repr(self).

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

connect(other)
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)
intersect(other)
point(u)
Returns:Point2 or Point3 at parameter u
tangent(u)
Returns:Vector2 or Vector3 tangent at parameter u
class Goulib.geom.Polygon(args)[source]

Bases: Goulib.geom.Surface, Goulib.drawing.Entity

Parameters:args – can be
  • Polygon
  • iterator of points
__init__(args)[source]
Parameters:args – can be
  • Polygon
  • iterator of points
__repr__()[source]

Return repr(self).

xy
Returns:tuple (x,y)
__iter__()[source]
__abs__()[source]
Returns:float perimeter
area
center

centroid

Returns:Point2 centroid of the Polygon
__contains__(pt)[source]
intersect(other)[source]
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__eq__

Return self==value.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__

Return hash(self).

__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

bbox()
Returns:BBox bounding box of Entity
color = 'black'
connect(other)
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)
draw(fig=None, **kwargs)

draw entities :param fig: matplotlib figure where to draw. figure(g) is called if missing :return: fig,patch

end
static figure(box, **kwargs)
Parameters:
  • boxdrawing.BBox bounds and clipping box
  • kwargs – parameters passed to ~matplotlib.pyplot.figure
Returns:

matplotlib axis suitable for drawing

static from_dxf(e, mat3)
Parameters:
  • e – dxf.entity
  • mat3 – Matrix3 transform
Returns:

Entity of correct subtype

static from_pdf(path, trans, color)
Parameters:path – pdf path
Returns:Entity of correct subtype
static from_svg(path, color)
Parameters:path – svg path
Returns:Entity of correct subtype
html(**kwargs)
isclosed()
ishorizontal(tol=0.01)
isline()
isvertical(tol=0.01)
length
patches(**kwargs)
Returns:list of (a single) Patch corresponding to entity
Note:this is the only method that needs to be overridden in descendants for draw, render and IPython _repr_xxx_ to work
plot(**kwargs)

renders on IPython Notebook (alias to make usage more straightforward)

png(**kwargs)
point(u)
Returns:Point2 or Point3 at parameter u
render(fmt, **kwargs)

render graph to bitmap stream :return: matplotlib figure as a byte stream in specified format

save(filename, **kwargs)
setattr(**kwargs)

set (graphic) attributes to entity :param kwargs: dict of attributes copied to entity

start
svg(**kwargs)
tangent(u)
Returns:Vector2 or Vector3 tangent at parameter u
to_dxf(**attr)
Parameters:attr – dict of attributes passed to the dxf entity, overriding those defined in self
Returns:dxf entity
class Goulib.geom.Circle(*args)[source]

Bases: Goulib.geom.Surface, Goulib.drawing.Entity

Circles are constructed with a center Point2 and a radius:

>>> c = Circle(Point2(1.0, 1.0), 0.5)
>>> c

Circle(<1.00, 1.00>, radius=0.50)

Internally there are two attributes: c, giving the center point and r, giving the radius.

The following methods are supported:

connect(other)
Returns a Segment2 which is the minimum length line segment that can connect the two shapes. other may be a Point2, Line2, Ray2, Segment2 or Circle.
distance(other)
Returns the absolute minimum distance to other. Internally this simply returns the length of the result of connect.
Parameters:args – can be
  • Circle
  • center, point on circle
  • center, radius
__init__(*args)[source]
Parameters:args – can be
  • Circle
  • center, point on circle
  • center, radius
__eq__(other)[source]

Return self==value.

__repr__()[source]

Return repr(self).

__abs__()[source]
Returns:float perimeter
center
area
point(u)[source]
Returns:Point2 at angle u radians
tangent(u)[source]
Returns:Vector2 tangent at angle u. Warning : tangent has magnitude r != 1
__contains__(pt)[source]
Returns:True if pt is ON or IN the circle
intersect(other)[source]
Parameters:other – Line2, Ray2 or Segment2**, Ray2 or Segment2, returns

a Segment2 giving the part of the line that intersects the circle, or None if there is no intersection.

connect(other)[source]
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
swap()[source]
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

bbox()
Returns:BBox bounding box of Entity
color = 'black'
distance(other)
draw(fig=None, **kwargs)

draw entities :param fig: matplotlib figure where to draw. figure(g) is called if missing :return: fig,patch

end
static figure(box, **kwargs)
Parameters:
  • boxdrawing.BBox bounds and clipping box
  • kwargs – parameters passed to ~matplotlib.pyplot.figure
Returns:

matplotlib axis suitable for drawing

static from_dxf(e, mat3)
Parameters:
  • e – dxf.entity
  • mat3 – Matrix3 transform
Returns:

Entity of correct subtype

static from_pdf(path, trans, color)
Parameters:path – pdf path
Returns:Entity of correct subtype
static from_svg(path, color)
Parameters:path – svg path
Returns:Entity of correct subtype
html(**kwargs)
isclosed()
ishorizontal(tol=0.01)
isline()
isvertical(tol=0.01)
length
patches(**kwargs)
Returns:list of (a single) Patch corresponding to entity
Note:this is the only method that needs to be overridden in descendants for draw, render and IPython _repr_xxx_ to work
plot(**kwargs)

renders on IPython Notebook (alias to make usage more straightforward)

png(**kwargs)
render(fmt, **kwargs)

render graph to bitmap stream :return: matplotlib figure as a byte stream in specified format

save(filename, **kwargs)
setattr(**kwargs)

set (graphic) attributes to entity :param kwargs: dict of attributes copied to entity

start
svg(**kwargs)
to_dxf(**attr)
Parameters:attr – dict of attributes passed to the dxf entity, overriding those defined in self
Returns:dxf entity
Goulib.geom.circle_from_3_points(a, b, c)[source]

constructs Circle passing through 3 distinct points :param a,b,c: Point2 :return: the unique Circle through the three points a, b, c

Goulib.geom.arc_from_3_points(a, b, c)[source]

constructs Arc2 starting in a, going through b and ending in c :param a,b,c: Point2 :return: the unique Arc2 starting in a, going through b and ending in c

class Goulib.geom.Arc2(center, p1=0, p2=6.283185307179586, r=None, dir=1)[source]

Bases: Goulib.geom.Circle

Parameters:
  • center – Point2 or (x,y) tuple
  • p1 – starting Point2 or angle in radians
  • p2 – ending Point2 or angle in radians
  • r – float radius, needed only if p1 or p2 is an angle
  • dir – arc direction. +1 is trig positive (CCW) and -1 is Clockwise
__init__(center, p1=0, p2=6.283185307179586, r=None, dir=1)[source]
Parameters:
  • center – Point2 or (x,y) tuple
  • p1 – starting Point2 or angle in radians
  • p2 – ending Point2 or angle in radians
  • r – float radius, needed only if p1 or p2 is an angle
  • dir – arc direction. +1 is trig positive (CCW) and -1 is Clockwise
angle(b=None)[source]
Returns:float signed arc angle
__abs__()[source]
Returns:float arc length
point(u)[source]
Returns:Point2 at parameter u
tangent(u)[source]
Returns:Vector2 tangent at parameter u
__eq__(other)[source]

Return self==value.

__repr__()[source]

Return repr(self).

swap()[source]
__contains__(pt)[source]
Returns:True if pt is ON the Arc
intersect(other)[source]
Parameters:other – Line2, Ray2 or Segment2**, Ray2 or Segment2, returns

a Segment2 giving the part of the line that intersects the circle, or None if there is no intersection.

__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

area
bbox()
Returns:BBox bounding box of Entity
center
color = 'black'
connect(other)
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)
draw(fig=None, **kwargs)

draw entities :param fig: matplotlib figure where to draw. figure(g) is called if missing :return: fig,patch

end
static figure(box, **kwargs)
Parameters:
  • boxdrawing.BBox bounds and clipping box
  • kwargs – parameters passed to ~matplotlib.pyplot.figure
Returns:

matplotlib axis suitable for drawing

static from_dxf(e, mat3)
Parameters:
  • e – dxf.entity
  • mat3 – Matrix3 transform
Returns:

Entity of correct subtype

static from_pdf(path, trans, color)
Parameters:path – pdf path
Returns:Entity of correct subtype
static from_svg(path, color)
Parameters:path – svg path
Returns:Entity of correct subtype
html(**kwargs)
isclosed()
ishorizontal(tol=0.01)
isline()
isvertical(tol=0.01)
length
patches(**kwargs)
Returns:list of (a single) Patch corresponding to entity
Note:this is the only method that needs to be overridden in descendants for draw, render and IPython _repr_xxx_ to work
plot(**kwargs)

renders on IPython Notebook (alias to make usage more straightforward)

png(**kwargs)
render(fmt, **kwargs)

render graph to bitmap stream :return: matplotlib figure as a byte stream in specified format

save(filename, **kwargs)
setattr(**kwargs)

set (graphic) attributes to entity :param kwargs: dict of attributes copied to entity

start
svg(**kwargs)
to_dxf(**attr)
Parameters:attr – dict of attributes passed to the dxf entity, overriding those defined in self
Returns:dxf entity
class Goulib.geom.Ellipse(*args)[source]

Bases: Goulib.geom.Circle

Parameters:args – can be
  • Ellipse
  • center, corner point
  • center, r1,r2,angle
__init__(*args)[source]
Parameters:args – can be
  • Ellipse
  • center, corner point
  • center, r1,r2,angle
__repr__()[source]

Return repr(self).

__eq__(other)[source]

Return self==value.

__abs__()
Returns:float perimeter
__abstractmethods__ = frozenset()
__class__

alias of abc.ABCMeta

__contains__(pt)
Returns:True if pt is ON or IN the circle
__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__str__

Return str(self).

area
bbox()
Returns:BBox bounding box of Entity
center
color = 'black'
connect(other)
Returns:Geometry shortest (Segment2 or Segment3) that connects self to other
distance(other)
draw(fig=None, **kwargs)

draw entities :param fig: matplotlib figure where to draw. figure(g) is called if missing :return: fig,patch

end
static figure(box, **kwargs)
Parameters:
  • boxdrawing.BBox bounds and clipping box
  • kwargs – parameters passed to ~matplotlib.pyplot.figure
Returns:

matplotlib axis suitable for drawing

static from_dxf(e, mat3)
Parameters:
  • e – dxf.entity
  • mat3 – Matrix3 transform
Returns:

Entity of correct subtype

static from_pdf(path, trans, color)
Parameters:path – pdf path
Returns:Entity of correct subtype
static from_svg(path, color)
Parameters:path – svg path
Returns:Entity of correct subtype
html(**kwargs)
intersect(other)
Parameters:other – Line2, Ray2 or Segment2**, Ray2 or Segment2, returns

a Segment2 giving the part of the line that intersects the circle, or None if there is no intersection.

isclosed()
ishorizontal(tol=0.01)
isline()
isvertical(tol=0.01)
length
patches(**kwargs)
Returns:list of (a single) Patch corresponding to entity
Note:this is the only method that needs to be overridden in descendants for draw, render and IPython _repr_xxx_ to work
plot(**kwargs)

renders on IPython Notebook (alias to make usage more straightforward)

png(**kwargs)
point(u)
Returns:Point2 at angle u radians
render(fmt, **kwargs)

render graph to bitmap stream :return: matplotlib figure as a byte stream in specified format

save(filename, **kwargs)
setattr(**kwargs)

set (graphic) attributes to entity :param kwargs: dict of attributes copied to entity

start
svg(**kwargs)
swap()
tangent(u)
Returns:Vector2 tangent at angle u. Warning : tangent has magnitude r != 1
to_dxf(**attr)
Parameters:attr – dict of attributes passed to the dxf entity, overriding those defined in self
Returns:dxf entity
class Goulib.geom.Matrix3(*args)[source]

Bases: object

Two matrix classes are supplied, Matrix3, a 3x3 matrix for working with 2D affine transformations, and Matrix4, a 4x4 matrix for working with 3D affine transformations.

The default constructor intializes the matrix to the identity:

>>> Matrix3()
Matrix3([    1.00     0.00     0.00
             0.00     1.00     0.00
             0.00     0.00     1.00])
>>> Matrix4()
Matrix4([    1.00     0.00     0.00     0.00
             0.00     1.00     0.00     0.00
             0.00     0.00     1.00     0.00
             0.00     0.00     0.00     1.00])

Element access

Internally each matrix is stored as a set of attributes named a to p. The layout for Matrix3 is:

# a b c
# e f g
# i j k

and for Matrix4:

# a b c d
# e f g h
# i j k l
# m n o p

If you wish to set or retrieve a number of elements at once, you can do so with a slice:

>>> m = Matrix4()
>>> m[:]
[1.0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 1.0]
>>> m[12:15] = (5, 5, 5)
>>> m
Matrix4([    1.00     0.00     0.00     5.00
             0.00     1.00     0.00     5.00
             0.00     0.00     1.00     5.00
             0.00     0.00     0.00     1.00])

Note that slices operate in column-major order, which makes them suitable for working directly with OpenGL’s glLoadMatrix and glGetFloatv functions.

Class constructors

There are class constructors for the most common types of transform.

new_identity

Equivalent to the default constructor. Example:

>>> m = Matrix4.new_identity()
>>> m
Matrix4([    1.00     0.00     0.00     0.00
             0.00     1.00     0.00     0.00
             0.00     0.00     1.00     0.00
             0.00     0.00     0.00     1.00])
new_scale(x, y) and new_scale(x, y, z)

The former is defined on Matrix3, the latter on Matrix4. Equivalent to the OpenGL call glScalef. Example:

>>> m = Matrix4.new_scale(2.0, 3.0, 4.0)
>>> m
Matrix4([    2.00     0.00     0.00     0.00
             0.00     3.00     0.00     0.00
             0.00     0.00     4.00     0.00
             0.00     0.00     0.00     1.00])
new_translate(x, y) and new_translate(x, y, z)

The former is defined on Matrix3, the latter on Matrix4. Equivalent to the OpenGL call glTranslatef. Example:

>>> m = Matrix4.new_translate(3.0, 4.0, 5.0)
>>> m
Matrix4([    1.00     0.00     0.00     3.00
             0.00     1.00     0.00     4.00
             0.00     0.00     1.00     5.00
             0.00     0.00     0.00     1.00])
new_rotate(angle)

Create a Matrix3 for a rotation around the origin. angle is specified in radians, anti-clockwise. This is not implemented in Matrix4 (see below for equivalent methods). Example:

>>> import math
>>> m = Matrix3.new_rotate(math.pi / 2)
>>> m
Matrix3([    0.00    -1.00     0.00
             1.00     0.00     0.00
             0.00     0.00     1.00])

The following constructors are defined for Matrix4 only.

new_rotatex(angle), new_rotatey(angle), new_rotatez(angle)

Create a Matrix4 for a rotation around the X, Y or Z axis, respectively. angle is specified in radians. Example:

>>> m = Matrix4.new_rotatex(math.pi / 2)
>>> m
Matrix4([    1.00     0.00     0.00     0.00
             0.00     0.00    -1.00     0.00
             0.00     1.00     0.00     0.00
             0.00     0.00     0.00     1.00])
new_rotate_axis(angle, axis)

Create a Matrix4 for a rotation around the given axis. angle is specified in radians, and axis must be an instance of Vector3. It is not necessary to normalize the axis. Example:

>>> m = Matrix4.new_rotate_axis(math.pi / 2, Vector3(1.0, 0.0, 0.0))
>>> m
Matrix4([    1.00     0.00     0.00     0.00
             0.00     0.00    -1.00     0.00
             0.00     1.00     0.00     0.00
             0.00     0.00     0.00     1.00])
new_rotate_euler(heading, attitude, bank)

Create a Matrix4 for the given Euler rotation. heading is a rotation around the Y axis, attitude around the X axis and bank around the Z axis. All rotations are performed simultaneously, so this method avoids “gimbal lock” and is the usual method for implemented 3D rotations in a game. Example:

>>> m = Matrix4.new_rotate_euler(math.pi / 2, math.pi / 2, 0.0)
>>> m
Matrix4([    0.00    -0.00     1.00     0.00
             1.00     0.00    -0.00     0.00
            -0.00     1.00     0.00     0.00
             0.00     0.00     0.00     1.00])
new_perspective(fov_y, aspect, near, far)

Create a Matrix4 for projection onto the 2D viewing plane. This method is equivalent to the OpenGL call gluPerspective. fov_y is the view angle in the Y direction, in radians. aspect is the aspect ration width / height of the viewing plane. near and far are the distance to the near and far clipping planes. They must be positive and non-zero. Example:

>>> m = Matrix4.new_perspective(math.pi / 2, 1024.0 / 768, 1.0, 100.0)
>>> m
Matrix4([    0.75     0.00     0.00     0.00
             0.00     1.00     0.00     0.00
             0.00     0.00    -1.02    -2.02
             0.00     0.00    -1.00     0.00])

Operators

Matrices of the same dimension may be multiplied to give a new matrix. For example, to create a transform which translates and scales:

>>> m1 = Matrix3.new_translate(5.0, 6.0)
>>> m2 = Matrix3.new_scale(1.0, 2.0)
>>> m1 * m2
Matrix3([    1.00     0.00     5.00
             0.00     2.00     6.00
             0.00     0.00     1.00])

Note that multiplication is not commutative (the order that you apply transforms matters):

>>> m2 * m1
Matrix3([    1.00     0.00     5.00
             0.00     2.00    12.00
             0.00     0.00     1.00])

In-place multiplication is also permitted (and optimised):

>>> m1 *= m2
>>> m1
Matrix3([    1.00     0.00     5.00
             0.00     2.00     6.00
             0.00     0.00     1.00])

Multiplying a matrix by a vector returns a vector, and is used to transform a vector:

>>> m1 = Matrix3.new_rotate(math.pi / 2)
>>> m1 * Vector2(1.0, 1.0)
Vector2(-1.00, 1.00)

Note that translations have no effect on vectors. They do affect points, however:

>>> m1 = Matrix3.new_translate(5.0, 6.0)
>>> m1 * Vector2(1.0, 2.0)
Vector2(1.00, 2.00)
>>> m1 * Point2(1.0, 2.0)
Point2(6.00, 8.00)

Multiplication is currently incorrect between matrices and vectors – the projection component is ignored. Use the Matrix4.transform method instead.

Matrix4 also defines transpose (in-place), transposed (functional), determinant and inverse (functional) methods.

A Matrix3 can be multiplied with a Vector2 or any of the 2D geometry objects (Point2, Line2, Circle, etc).

A Matrix4 can be multiplied with a Vector3 or any of the 3D geometry objects (Point3, Line3, Sphere, etc).

For convenience, each of the matrix constructors are also available as in-place operators. For example, instead of writing:

>>> m1 = Matrix3.new_translate(5.0, 6.0)
>>> m2 = Matrix3.new_scale(1.0, 2.0)
>>> m1 *= m2

you can apply the scale directly to m1:

>>> m1 = Matrix3.new_translate(5.0, 6.0)
>>> m1.scale(1.0, 2.0)
Matrix3([    1.00     0.00     5.00
             0.00     2.00     6.00
             0.00     0.00     1.00])
>>> m1
Matrix3([    1.00     0.00     5.00
             0.00     2.00     6.00
             0.00     0.00     1.00])

Note that these methods operate in-place (they modify the original matrix), and they also return themselves as a result. This allows you to chain transforms together directly:

>>> Matrix3().translate(1.0, 2.0).rotate(math.pi / 2).scale(4.0, 4.0)
Matrix3([    0.00    -4.00     1.00
             4.00     0.00     2.00
             0.00     0.00     1.00])

All constructors have an equivalent in-place method. For Matrix3, they are identity, translate, scale and rotate. For Matrix4, they are identity, translate, scale, rotatex, rotatey, rotatez, rotate_axis and rotate_euler. Both Matrix3 and Matrix4 also have an in-place transpose method.

The copy method is also implemented in both matrix classes and behaves in the obvious way.

__init__(*args)[source]

Initialize self. See help(type(self)) for accurate signature.

__repr__()[source]

Return repr(self).

__iter__()[source]
__getitem__(key)[source]
__setitem__(key, value)[source]
__eq__(other)[source]

Return self==value.

__sub__(other)[source]
__imul__(other)[source]
__mul__(other)[source]
__call__(other)[source]

Call self as a function.

__class__

alias of builtins.type

__delattr__

Implement delattr(self, name).

__dir__()

Default dir() implementation.

__format__()

Default object formatter.

__ge__

Return self>=value.

__getattribute__

Return getattr(self, name).

__gt__

Return self>value.

__hash__ = None
__init_subclass__()

This method is called when a class is subclassed.

The default implementation does nothing. It may be overridden to extend subclasses.

__le__

Return self<=value.

__lt__

Return self<value.

__ne__

Return self!=value.

__new__()

Create and return a new object. See help(type) for accurate signature.

__reduce__()

Helper for pickle.

__reduce_ex__()

Helper for pickle.

__setattr__

Implement setattr(self, name, value).

__sizeof__()

Size of object in memory, in bytes.

__slotnames__ = []
__str__

Return str(self).

identity()[source]
scale(x, y=None)[source]
offset()[source]
angle(angle=0)[source]
Parameters:angle – angle in radians of a unit vector starting at origin
Returns:float bearing in radians of the transformed vector
mag(v=None)[source]

Return the net (uniform) scaling of this transform.

translate(*args)[source]
Parameters:*args

x,y values

rotate(angle)[source]
classmethod new_identity()[source]
classmethod new_scale(x, y)[source]
classmethod new_translate(x, y)[source]
classmethod new_rotate(angle)[source]
mag2()[source]
__abs__()[source]
transpose()[source]
transposed()[source]
determinant()[source]
inverse()[source]
orientation()[source]
Returns:1 if matrix is right handed, -1 if left handed