Transforms in Pycairo - rotate


Martin McBride, 2019-09-27
Tags transform rotation user space device space
Categories pycairo

This article is part of a series on Pycairo.

We have previously seen how to use translate and scale in Pycairo, to draw items in different positions on the page. In this article we will see how to use rotation to draw items at different angles.

Default user space

Here is our initial square in default user space, with no transform applied.

ctx.rectangle(300, 100, 100, 100)
ctx.set_source_rgb(0, 0, 1)
ctx.fill()

This defines the rectangle in user space. Pycairo then draws the square in device space. Because of the default mapping, the square is drawn at exactly the same size and place in device space:

Angles - radians

Like many graphics libraries, Pycairo measures angles in radians rather than degrees. You can convert from degrees to radians by multiplying by pi/180.

So, for example, 20 degrees is equal to 20*pi/180 radians (ie about 0.35 radians).

Rotating

The rotate function rotates user space. Here is an example:

ctx.rotate(20*math.pi/180)   # 20 degrees
ctx.rectangle(300, 100, 100, 100)
ctx.set_source_rgb(0, 0, 1)
ctx.fill()

This rotates user space by a 20 degrees. The whole of the user space is rotated. The centre of rotation is the point (0, 0).

Here is how the square is drawn using the rotated user space:

The shape drawn is still a square, 100 pixel wide, but it is no longer aligned with the device space axes because it has been rotated.

See also

If you found this article useful you might be interested in my ebook Computer Graphics in Python.


Tag cloud

2d arrays abstract data type alignment and array arrays bezier curve built-in function close closure colour comparison operator comprehension context conversion data types device space dictionary duck typing efficiency encryption enumerate filter font font style for loop function function plot functools generator gif gradient html image processing imagesurface immutable object index input installing iter iterator itertools lambda function len linspace list list comprehension logical operator lru_cache mandelbrot map mutability named parameter numeric python numpy object open operator optional parameter or path positional parameter print pure function radial gradient range recursion reduce rotation scaling sequence slice slicing sound spirograph str stream string subpath symmetric encryption template text text metrics transform translation transparency tuple unpacking user space vectorisation webserver website while loop zip

Copyright (c) Axlesoft Ltd 2020