UNPKG

1.46 kBJavaScriptView Raw
1import {atan2, cos, sin, sqrt} from "../math.js";
2
3// Note: 6-element arrays are used to denote the 3x3 affine transform matrix:
4// [a, b, c,
5// d, e, f,
6// 0, 0, 1] - this redundant row is left out.
7
8// Transform matrix for [a0, a1] -> [b0, b1].
9export default function(a, b) {
10 var u = subtract(a[1], a[0]),
11 v = subtract(b[1], b[0]),
12 phi = angle(u, v),
13 s = length(u) / length(v);
14
15 return multiply([
16 1, 0, a[0][0],
17 0, 1, a[0][1]
18 ], multiply([
19 s, 0, 0,
20 0, s, 0
21 ], multiply([
22 cos(phi), sin(phi), 0,
23 -sin(phi), cos(phi), 0
24 ], [
25 1, 0, -b[0][0],
26 0, 1, -b[0][1]
27 ])));
28}
29
30// Inverts a transform matrix.
31export function inverse(m) {
32 var k = 1 / (m[0] * m[4] - m[1] * m[3]);
33 return [
34 k * m[4], -k * m[1], k * (m[1] * m[5] - m[2] * m[4]),
35 -k * m[3], k * m[0], k * (m[2] * m[3] - m[0] * m[5])
36 ];
37}
38
39// Multiplies two 3x2 matrices.
40export function multiply(a, b) {
41 return [
42 a[0] * b[0] + a[1] * b[3],
43 a[0] * b[1] + a[1] * b[4],
44 a[0] * b[2] + a[1] * b[5] + a[2],
45 a[3] * b[0] + a[4] * b[3],
46 a[3] * b[1] + a[4] * b[4],
47 a[3] * b[2] + a[4] * b[5] + a[5]
48 ];
49}
50
51// Subtracts 2D vectors.
52function subtract(a, b) {
53 return [a[0] - b[0], a[1] - b[1]];
54}
55
56// Magnitude of a 2D vector.
57function length(v) {
58 return sqrt(v[0] * v[0] + v[1] * v[1]);
59}
60
61// Angle between two 2D vectors.
62function angle(a, b) {
63 return atan2(a[0] * b[1] - a[1] * b[0], a[0] * b[0] + a[1] * b[1]);
64}