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 adict
).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.
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.
Returns
True
if the magnitude of this vector is zero.Returns a new vector that is a normalised (unit length) version of this vector.
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
- 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
) ismath.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
- 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 aVector3D
object to callto_normalised()
on. Such aspygplates.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
- 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
- Return type
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
- 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 causeto_normalised()
to raise UnableToNormaliseZeroVectorError.
- to_normalised()
Returns a new vector that is a normalised (unit length) version of this vector.
- Return type
- 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()