-
Notifications
You must be signed in to change notification settings - Fork 617
Algebra with Matrices, Rectangles and Points
For the Matrix
, Rect
, IRect
and Point
classes algebraic operations are possible to some extent. Following we will describe what they are and how they can be used.
Matrix
objects m
, m1
, m2
can be added, subtracted, negated, inverted or multiplied. The result of these operations always is a new matrix. In addition the "absolute value" of a matrix can be calculated - its Euclidean norm - which is a non-negative floating point number.
-
m1 + m2
is defined as the matrix[m1.a + m2.a, m1.b + m2.b, ..., m1.f + m2.f]
. -
m1 - m2
analogous to addition. -
m1 * m2
is defined bym1.concat(m2)
, ifm2
is a matrix. If it is a number, component-wise multiplication takes place. -
-m
is defined by[-m.a, -m.b, ..., -m.f]
. -
+m
is just a copy ofm
. -
~m
is defined byinvert(m)
. This means thatm * ~m = ~m * m = fitz.Identity
. Because we are dealing with floats here, this equality often is only almost true because of rounding effects etc. Ifm
is not invertible (degenerate), then~m = [0, 0, 0, 0, 0, 0]
. -
abs(m)
is defined bymath.sqrt(m.a**2 + m.b**2 + ... + m.f**2)
. -
bool(m)
isFalse
ifm = fitz.Matrix(0, 0, 0, 0, 0, 0)
, elseTrue
. - Comparisons are based on components, not object identities:
m1 == m2
isTrue
if all components are equal. Note however, that floating point values are compared here: therefore a false inequality may result from e.g. rounding effects.
Following are some examples to illustrate the above.
- check if a matrix is invertible:
if not bool(~m): print("m is not invertible")
- check whether two matrices are (almost) equal:
if abs(m1 - m2) < epsilon: print("m1 (almost) equals m2")
- do a complex matrix calculation:
m = m1*(m2 + ~m3)*m4
Rect
and IRect
objects can be added and subtracted to / from other rectangles or numbers, they can be negated and multiplied with matrices. In addition, inclusion |
and intersection &
of rectangles with other objects are supported as binary operations. The result of these operations always is a new rectangle with the same type (Rect
or IRect
) as the left operand.
-
r1 + r2
andr1 - r2
are defined component-wise as with matrices. Any of the two operands can be aRect
or anIRect
. In addition,r2
can also be a number. -
-r
is defined component-wise (Rect
orIRect
). -
+r
is a copy ofr
. -
r * m
is a new rectangle resulting fromr
transformed with matrixm
. Works forRect
andIRect
. Ifm
is a number, it is multiplied with the coordinates. -
r1 | r2
(inclusion) is the smallest rectangle containing both,r1
(Rect
orIRect
) andr2
(Rect
,IRect
orPoint
). -
r1 & r2
(intersection) is the largest rectangle that is contained in both,r1
(Rect
orIRect
) andr2
(Rect
orIRect
). -
bool(r)
isFalse
if all components ofr
are zero, elseTrue
.
Example ("rectangle hull"):
If plist = [p0, p1, ..., pn]
is a list of Point
objects then r
computed by
r = fitz.Rect(p0, p0)
for p in plist:
r = r | p
is the smallest rectangle containing all points in the list. Note: if you want an IRect
perform a r.round()
afterwards.
Example ("finite rectangle"):
MuPDF defines rectangles as infinite, if the bottom right corner is not south-eastern to the top left one. This may be awkward sometimes. So, here is a recipe to create a finite rectangle covering the same area:
r = fitz.Rect(...) # potentiallyinfinite rectangle
s = fitz.Rect(r.top_left, r.top_left) # rect containing just a point
s = s | r.bottom_right # s now is a finite rectangle
Point
objects can be added, subtracted and negated just like rectangles, yielding new point objects.
-
p1 + p2
,p1 - p2
,-p
,+p
are defined component-wise like the rectangle operations.p2
can also be a number. -
abs(p)
is the Eucldean normmath.sqrt(p.x**2 + p.y**2)
as with matrices. -
p * m
is a new point resulting fromp
transformed with matrixm
. Again,m
may be a number, which then multiplies the coordinates.
HOWTO Button annots with JavaScript
HOWTO work with PDF embedded files
HOWTO extract text from inside rectangles
HOWTO extract text in natural reading order
HOWTO create or extract graphics
HOWTO create your own PDF Drawing
Rectangle inclusion & intersection
Metadata & bookmark maintenance