{{>disclaimer~}} # transformation-matrix Javascript isomorphic 2D affine transformations written in ES6 syntax. Manipulate transformation matrices with this totally tested library! [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard.js-brightgreen.svg)](https://standardjs.com) [![Build Status](https://travis-ci.org/chrvadala/transformation-matrix.svg?branch=master)](https://travis-ci.org/chrvadala/transformation-matrix) [![Coverage Status](https://coveralls.io/repos/github/chrvadala/transformation-matrix/badge.svg?branch=master)](https://coveralls.io/github/chrvadala/transformation-matrix?branch=master) [![npm](https://img.shields.io/npm/v/transformation-matrix.svg?maxAge=2592000?style=plastic)](https://www.npmjs.com/package/transformation-matrix) [![Downloads](https://img.shields.io/npm/dm/transformation-matrix.svg)](https://www.npmjs.com/package/transformation-matrix) [![Donate](https://img.shields.io/badge/donate-PayPal-green.svg)](https://www.paypal.me/chrvadala/25) Transformations, i.e. *linear invertible automorphisms*, are used to map a picture into another one with different size, position and orientation. Given a basis, transformations are represented by means of squared invertible matrices, called **transformation matrices**. A geometric transformation is defined as a one-to-one mapping of a point space to itself, which preservers some geometric relations of figures. - [Geometric Programming for Computer Aided Design](https://books.google.it/books?vid=ISBN9780471899426) This library allows us to: - generate transformation matrices for the following operations: **translation**, **rotation**, **scale**, **shear**, **skew** - merge multiple transformation matrices in a single matrix that is the **composition of multiple matrices** - work with strings in both directions: **parse**, **render** - **apply a transformation matrix to point(s)** ## Usage example (ES6) ```js import {scale, rotate, translate, compose, applyToPoint} from 'transformation-matrix'; let {scale, rotate, translate, compose, applyToPoint} = window.TransformationMatrix; let {scale, rotate, translate, compose, applyToPoint} = require('transformation-matrix') let matrix = compose( translate(40,40), rotate(Math.PI/2), scale(2, 4) ); applyToPoint(matrix, {x: 42, y: 42}); // { x: -128, y: 124.00000000000001 } applyToPoint(matrix, [16, 24]); // [ -56, 72 ] ``` ## Setup ```sh npm install transformation-matrix # or yarn add transformation-matrix ``` ```html ``` ## Data Model A **Transformation Matrix** is defined as an `Object` with 6 keys: `a`, `b`, `c`, `d`, `e` and `f`. ```js const matrix = { a: 1, c: 0, e: 0, b: 0, d: 1, f: 0 } ``` A **Point** can be defined in two different ways: - as `Object`, with inside two keys: `x` and `y` ```js const point = { x: 24, y: 42 } ``` - as `Array`, with two items in the form `[x, y]` ```js const point = [ 24, 42 ] ``` ## Live Demo available at [http://chrvadala.github.io/transformation-matrix/](http://chrvadala.github.io/transformation-matrix/) # Reference {{>main-index~}} ## Changelog - **0.0** - Preview version - **1.0** - First public version - **1.1** - Splits lib into different files - **1.2** - Adds shear operation - **1.3** - Adds umd support - **1.4** - Adds typescript definitions - **1.5** - Upgrades deps - **1.6** - Adds optional parameter support on `translate(tx)`, `scale(sx)`, `rotate(angle, cx, cy)` - **1.7** - Upgrades deps - **1.8** - Fixes [#12](https://github.com/chrvadala/transformation-matrix/issues/12), Adds `fromTransformAttribute`, Discontinues node 4 support - **1.9** - Adds `skew(ax, ay)`, Upgrades deps, Improves `fromTransformAttribute` - **1.10**- Updates typescript definitions [#15](https://github.com/chrvadala/transformation-matrix/pull/15) - **1.11**- Upgrades deps - **1.12**- Migrates tests on [Jest](https://jestjs.io/), Integrates [standard.js](https://standardjs.com/), Upgrades deps - **1.13**- Adds `compose` function, Upgrades deps, Exposes skew operation [#37](https://github.com/chrvadala/transformation-matrix/pull/37) - **1.14**- Adds support for points defined as `Array` in the form `[x, y]` [#38](https://github.com/chrvadala/transformation-matrix/pull/38) - **1.15**- Adds `fromTriangle` and `smoothMatrix` functions [#41](https://github.com/chrvadala/transformation-matrix/issues/41) ## Some projects using transformation-matrix - [**React Planner**](https://github.com/cvdlab/react-planner) - [**React SVG Pan Zoom**](https://github.com/chrvadala/react-svg-pan-zoom) - [**ngx-graph**](https://github.com/swimlane/ngx-graph) - [**learn-anything**](https://github.com/learn-anything/learn-anything) - [**Others...**](https://github.com/chrvadala/transformation-matrix/network/dependents) - Pull request your project! ## Contributors - [chrvadala](https://github.com/chrvadala) (author) - [forabi](https://github.com/forabi) - [nidu](https://github.com/nidu) (PEG.js descriptor) - [aubergene](https://github.com/aubergene) - [SophiaLi1](https://github.com/SophiaLi1) # API {{>all-docs~}}