Skip to content

Commit

Permalink
Merge pull request #84 from labuzm/matmul
Browse files Browse the repository at this point in the history
add Transformation.__matmul__
  • Loading branch information
labuzm committed Jun 16, 2020
2 parents 04644e2 + b5b581a commit 0cd748f
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 26 deletions.
62 changes: 37 additions & 25 deletions src/kaa/geometry.pxi
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,43 @@ cdef class Transformation:
(<Vector>scale).c_vector
)

def __repr__(self):
return "<{}[{} {}, {} {}, {} {}]>".format(
self.__class__.__name__,
self.c_transformation.at(0, 0), self.c_transformation.at(0, 1),
self.c_transformation.at(1, 0), self.c_transformation.at(1, 1),
self.c_transformation.at(3, 0), self.c_transformation.at(3, 1),
)

def __eq__(self, Transformation other):
return self.c_transformation == other.c_transformation

def __or__(left, right):
"""
Operator for joining transformations, which in fact is
a "reversed" matrix multiplication,
useful for a more user-friendly order of transformations.
`tmn1 | tmn2 | tmn3` is equivalent to `tmn3 @ tmn2 @ tmn1`
and `vec | tmn` is equivalent to `tmn @ vec`.
"""

if not isinstance(right, Transformation):
return NotImplemented

if isinstance(left, Transformation):
return right._combine_with_transformation(left)
elif isinstance(left, Vector):
return right._combine_with_vector(left)

def __matmul__(left, right):
if not isinstance(left, Transformation):
return NotImplemented

if isinstance(right, Transformation):
return left._combine_with_transformation(right)
elif isinstance(right, Vector):
return left._combine_with_vector(right)

@staticmethod
cdef Transformation create(const CTransformation& c_transformation):
cdef Transformation transformation = Transformation.__new__(Transformation)
Expand All @@ -81,14 +118,6 @@ cdef class Transformation:
def rotate(double r):
return Transformation.create(CTransformation.rotate(r))

def __repr__(self):
return "<{}[{} {}, {} {}, {} {}]>".format(
self.__class__.__name__,
self.c_transformation.at(0, 0), self.c_transformation.at(0, 1),
self.c_transformation.at(1, 0), self.c_transformation.at(1, 1),
self.c_transformation.at(3, 0), self.c_transformation.at(3, 1),
)

@staticmethod
def rotate_degrees(double r_deg):
return Transformation.create(CTransformation.rotate(radians(r_deg)))
Expand All @@ -109,23 +138,6 @@ cdef class Transformation:
operand.c_vector | self.c_transformation
)

def __or__(left, right):
"""
Operator for joining transformations, which in fact is
a "reversed" matrix multiplication,
useful for a more user-friendly order of transformations.
`tmn1 | tmn2 | tmn3` is equivalent to `tmn3 @ tmn2 @ tmn1`
and `vec | tmn` is equivalent to `tmn @ vec`.
"""

if isinstance(right, Transformation):
if isinstance(left, Transformation):
return right._combine_with_transformation(left)
elif isinstance(left, Vector):
return right._combine_with_vector(left)
return NotImplemented


@cython.freelist(DECOMPOSED_TRANSFORMATION_FREELIST_SIZE)
cdef class DecomposedTransformation:
cdef CDecomposedTransformation c_decomposed_transformation
Expand Down
1 change: 1 addition & 0 deletions src/kaa/kaacore/geometry.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ cdef extern from "kaacore/geometry.h" nogil:

cdef cppclass CTransformation "kaacore::Transformation":
CTransformation()
bint operator==(const CTransformation&)

@staticmethod
CTransformation translate(const CDVec2&) except +raise_py_error
Expand Down

0 comments on commit 0cd748f

Please sign in to comment.