1 | import {atan2, cos, sin, sqrt} from "../math.js";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | export 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 |
|
31 | export 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 |
|
40 | export 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 |
|
52 | function subtract(a, b) {
|
53 | return [a[0] - b[0], a[1] - b[1]];
|
54 | }
|
55 |
|
56 |
|
57 | function length(v) {
|
58 | return sqrt(v[0] * v[0] + v[1] * v[1]);
|
59 | }
|
60 |
|
61 |
|
62 | function angle(a, b) {
|
63 | return atan2(a[0] * b[1] - a[1] * b[0], a[0] * b[0] + a[1] * b[1]);
|
64 | }
|