pygplates.Vector3D

class pygplates.Vector3D

Bases: Boost.Python.instance

Represents a vector in 3D cartesian coordinates. Vectors are equality (==, !=) comparable (but not hashable - cannot be used as a key in a dict).

The following operations can be used:

Operation Result
-vector Creates a new Vector3D that points in the opposite direction to vector
scalar * vector Creates a new Vector3D from vector with each component of (x,y,z) multiplied by scalar
vector * scalar Creates a new Vector3D from vector with each component of (x,y,z) multiplied by scalar
vector1 + vector2 Creates a new Vector3D that is the sum of vector1 and vector2
vector1 - vector2 Creates a new Vector3D that is vector2 subtracted from vector1

For example, to interpolate between two vectors:

vector1 = pygplates.Vector3D(...)
vector2 = pygplates.Vector3D(...)
vector_interp = t * vector1 + (1-t) * vector2

Convenience class static data are available for the zero vector (all zero components) and the x, y and z axes (unit vectors in the respective directions):

  • pygplates.Vector3D.zero
  • pygplates.Vector3D.x_axis
  • pygplates.Vector3D.y_axis
  • pygplates.Vector3D.z_axis

For example, to create a vector from a triplet of axis basis weights (triplet of scalars):

vector = (
    x_weight * pygplates.Vector3D.x_axis +
    y_weight * pygplates.Vector3D.y_axis +
    z_weight * pygplates.Vector3D.z_axis)
__init__(...)

A Vector3D object can be constructed in more than one way…

__init__(x, y, z)

Construct a Vector3D instance from 3D cartesian coordinates consisting of the floating-point numbers x, y and z.

param x:the x component of the 3D vector
type x:float
param y:the y component of the 3D vector
type y:float
param z:the z component of the 3D vector
type z:float
vector = pygplates.Vector3D(x, y, z)
__init__(vector)

Create a Vector3D instance from an (x,y,z) sequence (or Vector3D).

param point:(x,y,z) vector
type point:sequence, such as list or tuple, of (float,float,float), or Vector3D

The following example shows a few different ways to use this method:

vector = pygplates.Vector3D((x,y,z))
vector = pygplates.Vector3D([x,y,z])
vector = pygplates.Vector3D(numpy.array([x,y,z]))
vector = pygplates.Vector3D(pygplates.Vector3D(x,y,z))

Methods

__init__(…) A Vector3D object can be constructed in more than one way…
angle_between(vector1, vector2) [staticmethod] Returns the angle between two vectors (in radians).
create_normalised(…) [staticmethod] Returns a new vector that is a normalised (unit length) version of another.
create_normalized(…) [staticmethod] See create_normalised().
cross(vector1, vector2) [staticmethod] Returns the cross product of two vectors.
dot(vector1, vector2) [staticmethod] Returns the dot product of two vectors.
get_magnitude() Returns the magnitude, or length, of the vector.
get_x() Returns the x coordinate.
get_y() Returns the y coordinate.
get_z() Returns the z coordinate.
is_zero_magnitude() Returns True if the magnitude of this vector is zero.
to_normalised() Returns a new vector that is a normalised (unit length) version of this vector.
to_normalized() See to_normalised().
to_xyz() Returns the cartesian coordinates as the tuple (x,y,z).

Attributes

x_axis
y_axis
z_axis
zero
static angle_between(vector1, vector2)

[staticmethod] Returns the angle between two vectors (in radians).

Parameters:
  • vector1 (Vector3D, or sequence (such as list or tuple) of (float,float,float)) – the first vector
  • vector2 (Vector3D, or sequence (such as list or tuple) of (float,float,float)) – the second vector
Return type:

float

Raises:

UnableToNormaliseZeroVectorError if either vector1 or vector2 is (0,0,0) (ie, has zero magnitude)

Note that the angle between a vector (vec) and its opposite (-vec) is math.pi (and not zero) even though both vectors are parallel. This is because they point in opposite directions.

The following example shows a few different ways to use this function:

vec1 = pygplates.Vector3D(1.1, 2.2, 3.3)
vec2 = pygplates.Vector3D(-1.1, -2.2, -3.3)
angle = pygplates.Vector3D.angle_between(vec1, vec2)

angle = pygplates.Vector3D.angle_between((1.1, 2.2, 3.3), (-1.1, -2.2, -3.3))

angle = pygplates.Vector3D.angle_between(vec1, (-1.1, -2.2, -3.3))

angle = pygplates.Vector3D.angle_between((1.1, 2.2, 3.3), vec2)

This function is the equivalent of:

if not vector1.is_zero_magnitude() and not vector2.is_zero_magnitude():
    angle_between = math.acos(
        pygplates.Vector3D.dot(vector1.to_normalised(), vector2.to_normalised()))
else:
    raise pygplates.UnableToNormaliseZeroVectorError
static create_normalised(...)

[staticmethod] Returns a new vector that is a normalised (unit length) version of another.

This function can be called in more than one way…

create_normalised(xyz)

Returns a new vector that is a normalised (unit length) version of vector.

param xyz:the vector (x,y,z) components
type xyz:sequence (such as list or tuple) of (float,float,float), or Vector3D
rtype:Vector3D
raises:UnableToNormaliseZeroVectorError if xyz is (0,0,0) (ie, has zero magnitude)
normalised_vector = pygplates.Vector3D.create_normalised((2, 1, 0))

This function is similar to to_normalised() but is typically used when you don’t have a Vector3D object to call to_normalised() on. Such as pygplates.Vector3D.create_normalised((2, 1, 0)).

create_normalised(x, y, z)

Returns a new vector that is a normalised (unit length) version of vector (x, y, z).

param x:the x component of the 3D vector
type x:float
param y:the y component of the 3D vector
type y:float
param z:the z component of the 3D vector
type z:float
rtype:Vector3D
raises:UnableToNormaliseZeroVectorError if (x,y,z) is (0,0,0) (ie, has zero magnitude)
normalised_vector = pygplates.Vector3D.create_normalised(2, 1, 0)

This function is similar to the create_normalised function above but takes three arguments x, y and z instead of a single argument (such as a tuple or list).

static create_normalized(...)

[staticmethod] See create_normalised().

static cross(vector1, vector2)

[staticmethod] Returns the cross product of two vectors.

Parameters:
  • vector1 (Vector3D, or sequence (such as list or tuple) of (float,float,float)) – the first vector
  • vector2 (Vector3D, or sequence (such as list or tuple) of (float,float,float)) – the second vector
Return type:

Vector3D

The following example shows a few different ways to use this function:

vec1 = pygplates.Vector3D(1.1, 2.2, 3.3)
vec2 = pygplates.Vector3D(-1.1, -2.2, -3.3)
cross_product = pygplates.Vector3D.cross(vec1, vec2)

cross_product = pygplates.Vector3D.cross((1.1, 2.2, 3.3), (-1.1, -2.2, -3.3))

cross_product = pygplates.Vector3D.cross(vec1, (-1.1, -2.2, -3.3))

cross_product = pygplates.Vector3D.cross((1.1, 2.2, 3.3), vec2)

The cross product is the equivalent of:

cross_product = pygplates.Vector3D(
    vector1.get_y() * vector2.get_z() - vector1.get_z() * vector2.get_y(),
    vector1.get_z() * vector2.get_x() - vector1.get_x() * vector2.get_z(),
    vector1.get_x() * vector2.get_y() - vector1.get_y() * vector2.get_x())
static dot(vector1, vector2)

[staticmethod] Returns the dot product of two vectors.

Parameters:
  • vector1 (Vector3D, or sequence (such as list or tuple) of (float,float,float)) – the first vector
  • vector2 (Vector3D, or sequence (such as list or tuple) of (float,float,float)) – the second vector
Return type:

float

The following example shows a few different ways to use this function:

vec1 = pygplates.Vector3D(1.1, 2.2, 3.3)
vec2 = pygplates.Vector3D(-1.1, -2.2, -3.3)
dot_product = pygplates.Vector3D.dot(vec1, vec2)

dot_product = pygplates.Vector3D.dot((1.1, 2.2, 3.3), (-1.1, -2.2, -3.3))

dot_product = pygplates.Vector3D.dot(vec1, (-1.1, -2.2, -3.3))

dot_product = pygplates.Vector3D.dot((1.1, 2.2, 3.3), vec2)

The dot product is the equivalent of:

dot_product = (
    vector1.get_x() * vector2.get_x() +
    vector1.get_y() * vector2.get_y() +
    vector1.get_z() * vector2.get_z())
get_magnitude()

Returns the magnitude, or length, of the vector.

Return type:float
magnitude = vector.get_magnitude()

The magnitude is the equivalent of:

magnitude = math.sqrt(
    vector.get_x() * vector.get_x() +
    vector.get_y() * vector.get_y() +
    vector.get_z() * vector.get_z())
get_x()

Returns the x coordinate.

Return type:float
get_y()

Returns the y coordinate.

Return type:float
get_z()

Returns the z coordinate.

Return type:float
is_zero_magnitude()

Returns True if the magnitude of this vector is zero.

Return type:bool

This method will also return True for tiny, non-zero magnitudes that would cause to_normalised() to raise UnableToNormaliseZeroVectorError.

to_normalised()

Returns a new vector that is a normalised (unit length) version of this vector.

Return type:Vector3D
Raises:UnableToNormaliseZeroVectorError if this vector is (0,0,0) (ie, has zero magnitude)

If a vector is not zero magnitude then it can return a normalised version of itself:

if not vector.is_zero_magnitude():
    normalised_vector = vector.to_normalised()

NOTE: This does not normalise this vector. Instead it returns a new vector object that is the equivalent of this vector but has a magnitude of 1.0.

This function is the equivalent of:

if not vector.is_zero_magnitude():
    scale = 1.0 / vector.get_magnitude()
    normalised_vector = pygplates.Vector3D(
        scale * vector.get_x(),
        scale * vector.get_y(),
        scale * vector.get_z())
else:
    raise pygplates.UnableToNormaliseZeroVectorError
to_normalized()

See to_normalised().

to_xyz()

Returns the cartesian coordinates as the tuple (x,y,z).

Return type:the tuple (float,float,float)
x, y, z = vector.to_xyz()