Fractals/Computer graphic techniques/2D/transformation

Plane transformations


  • transformations
  • projections
    • Cartographic Map projection[1] ( in case of 3D to 2D graphic)[2]
  • mappings



Mapping in 2D raster graphic is a complex function   that maps from complex plane to complex plane:


It is implemented as point transformations.

It is usually denoted as



  •   is a point of complex plane ( input)
  •   is a point of image complex plane ( output = result)

Example code


For instance, Mercator:[3]

function Spherical_mercator(x, y) {
  return [x, Math.log(Math.tan(Math.PI / 4 + y / 2))];

function transverseMercatorRaw(lambda, phi) {
  return [log(tan((halfPi + phi) / 2)), -lambda];

transverseMercatorRaw.invert = function(x, y) {
  return [-y, 2 * atan(exp(x)) - halfPi];

If one work with discrete geometry ( polygons and polylines) then the projecting is much harder to imlement. One have to balance accuracy and performance.[4]

// projection from p to c 
complex double map_parameter(const ParameterTypeT ParameterType, const complex double parameter){

	complex double p; 
	// plane transformation 
		case c_identity :{p = parameter;  break;}
		case c_inverted :{p = 1.0/parameter; break;}
		case c_parabola :{p = 0.25+ 1.0/parameter; break;}
		case c_Myrberg_type :{p = cf - 1.0/parameter; break;}
		case c_inverted_2_type :{p = -2.0 + 1.0/parameter; break;}
		case c_exp :{p = cf + cexp(parameter) ; break;} // here one can change cf to get different image 
		case lambda_identity :{ p = parameter;  break;}
		case lambda_inverted_type :{p = 1.0/parameter; break;}
		case lambda_inverted_1_type :{p =1.0+ 1.0/parameter; break;}
		default: {p = parameter;}



Maps clasifications

  • object-based mappings ( Image objects are sets of connected pixels having the same integer value )
  • pixel based mappings

Transformations ( maps) in 2-D graphics

  • basic types
  • Composite Transformation [5]



Use of matrices:

  • without matrices ( using functions)
  • with matrices



  • "Matrix multiplication is not commutative. The order of the transformations is vital– Rotation followed by translation isvery different from translation followed by rotation"[6]




Affine transformations


To represent affine transformations with matrices, we can use homogeneous coordinates. This means representing a 2-vector (x, y) as a 3-vector (x, y, 1), and similarly for higher dimensions.

2D affine transformation matrix

Transformation name Affine matrix Example
Identity (transform to original image)    
where θ = π/6 =30°

The affine transforms are applicable to the registration process where two or more images are aligned (registered). An example of image registration is the generation of panoramic images that are the product of multiple images stitched together.

scale or resize


Scaling of object about origin by by a scale factor





  • Uniform (maintains the object’s proportions as it scales): sx = sy
  • non-uniform: sx != sy

Resizing objects while maintaining a fixed centre point = Scaling object about their own center

  • width' = width * sx
  • height' = height * sy
  • compute coordinate of corners from the center



Complex transtlation is a map[7]




Using this system, translation can be expressed with matrix multiplication. The functional form






For rotation by an angle θ counterclockwise (positive direction) about the origin the functional form is


Written in matrix form, this becomes:[8]


Similarly, for a rotation clockwise (negative direction) about the origin, the functional form is


the matrix form is:


These formulae assume that the x axis points right and the y axis points up.

the counter-clockwise rotation matrix in normalised coordinate:


C code without matrix


C program to rotate an object by a given angle about a given point
gcc r.c -Wall -Wextra -lm

#include <stdio.h>
#include <math.h> 
#include <complex.h> 		// complex numbers :

//The sin() function returns the value in the range of [-1, 1]

First subtract the pivot point (cx,cy), then rotate it (counter clock-wise), then add the point again.

 complex double rotate_point(const complex double center, const double angle_in_radians, const complex double point )
	// translate point to center
	complex double translated_point = creal(point) - creal(center)  + (cimag(point) - cimag(center))*I;

	// rotate point counter clock-wise by a given angle about a given pivot point ( center)
	double s = sin(angle_in_radians);
	double c = cos(angle_in_radians);
	complex double new_point = creal(translated_point) * c - cimag(translated_point) * s + (creal(translated_point) * s + cimag(translated_point) * c)*I;

	// translate point back
	new_point = creal(new_point) + creal(center) +(cimag(new_point) + cimag(center))*I;
	return new_point;

#define kMax 6

// center, angle_rad, point 
double examples[kMax][5] = {
		{50,-50, -0.7853982, 100,100 },
		{50,-50, -0.7853982, 100,200 },
		{50,-50, -0.7853982, 200,200 },
		{0,0, 1.570796, 100,100}, 
		{0,0, 1.570796, 150,200}, 
		{0,0, 1.570796, 200,200} 


int main(void){

	int k;
	complex double center ;
	double angle_r ; 
	complex double point ;
	complex double rotated_point;
	for (k=0; k<kMax; ++k){
		center = examples[k][0] + examples[k][1] * I ;
		angle_r = examples[k][2]; 
		point = examples[k][3] + examples[k][4] * I ;
		rotated_point = rotate_point(center, angle_r, point );
		fprintf(stdout, "point %f%+f*I rotated about %f%+f*I  by %f radians is %f%+f*I \n", creal(point), cimag(point), creal(center), cimag(center), angle_r, creal(rotated_point), cimag(rotated_point));

	return 0;


point 100.000000+100.000000*I rotated about 50.000000-50.000000*I  by -0.785398 radians is 191.421359+20.710673*I 
point 100.000000+200.000000*I rotated about 50.000000-50.000000*I  by -0.785398 radians is 262.132040+91.421348*I 
point 200.000000+200.000000*I rotated about 50.000000-50.000000*I  by -0.785398 radians is 332.842715+20.710668*I 
point 100.000000+100.000000*I rotated about 0.000000+0.000000*I  by 1.570796 radians is -99.999967+100.000033*I 
point 150.000000+200.000000*I rotated about 0.000000+0.000000*I  by 1.570796 radians is -199.999951+150.000065*I 
point 200.000000+200.000000*I rotated about 0.000000+0.000000*I  by 1.570796 radians is -199.999935+200.000065*I 

Other Interesting maps



Conformal map

  • "Conformal maps preserve angles and take infinitesimal circles to infinitesimal circles. Non-conformal maps take infinitesimal circles to infinitesimal ellipses (or worse)." Claude Heiland-Allen
  • "A complex function   is conformal at infinity if the function   is conformal at 0. This equivalent to the usual definition of conformal in terms of leaving angles unchanged in size and sense (clockwise/anticlockwise) if you think of   as being conformal at infinity if it leaves angles unchanged at the "North Pole" of the Riemann sphere."[22]

Conformal maps

Dictionary of Conformal Mapping by John H. Mathews, Russell W. Howell ( 2008)

Cartographic Map projection


cylindrical projection

The geometry for the normal (equatorial) tangent projections of the sphere to the cylinder.

Cylindrical projection ( or cylindric p. ) maps from sphere ( without poles) to cylinder [23][24]

Joukowsky transformation (map)


Description :

domain coloring or complex phase plots


Visualisation of complex functions

modular forms


Riemann mappings



  1. Map projection in wikipedia
  2. observable: plot-projections
  3. Transverse_Mercator_projection in wikipedia
  4. : Geographic projections, spherical shapes and spherical trigonometry in JavaScript
  5. geeksforgeeks : composite-transformation-in-2-d-graphics
  6. 2D transformations and homogeneous coordinates by Dr Nicolas Holzschuch University of Cape Town
  7. Terr, David. "Complex Translation." From MathWorld--A Wolfram Web Resource, created by Eric W. Weisstein.
  8. Template:Bare URL PDF
  9. nature of geographic information
  10. wolfram : ComplexFunctionsAppliedToASquare
  11. docs: swirl
  12. Log-Polar Mapping by Alexandre Bernardino
  13. Weisstein, Eric W. "Parabolic Cylindrical Coordinates." From MathWorld--A Wolfram Web Resource
  14. Weisstein, Eric W. "Parabolic Coordinates." From MathWorld--A Wolfram Web Resource.
  15. Numerical approximation of conformal mappings by Bjørnar Steinnes Luteberget
  16. processing : transform2d
  17. Squares that Look Round: Transforming Spherical Images by Saul Schleimer Henry Segerman
  18. fractalforums inflection-mappings
  19. theinnerframe : playing-with-circular-images
  20. theinnerframe :squaring-the-circle
  21. fractalforums: fractal-on-sphere
  22. math.stackexchange question: conformal-mappings-of-riemann-sphere
  23. Spherical Projections (Stereographic and Cylindrical) Written by Paul Bourke
  24. Weisstein, Eric W. "Cylindrical Projection." From MathWorld--A Wolfram Web Resource.
  25. johndcook : joukowsky-transformation