MCPcopy Create free account
hub / github.com/bernaferrari/FigmaToCode / decomposeRelativeTransform

Function decomposeRelativeTransform

packages/backend/src/common/color.ts:84–133  ·  view source on GitHub ↗
(
  t1: [number, number, number],
  t2: [number, number, number],
)

Source from the content-addressed store, hash-verified

82
83// from https://math.stackexchange.com/a/2888105
84export const decomposeRelativeTransform = (
85 t1: [number, number, number],
86 t2: [number, number, number],
87): {
88 translation: [number, number];
89 rotation: number;
90 scale: [number, number];
91 skew: [number, number];
92} => {
93 const a: number = t1[0];
94 const b: number = t1[1];
95 const c: number = t1[2];
96 const d: number = t2[0];
97 const e: number = t2[1];
98 const f: number = t2[2];
99
100 const delta = a * d - b * c;
101
102 const result: {
103 translation: [number, number];
104 rotation: number;
105 scale: [number, number];
106 skew: [number, number];
107 } = {
108 translation: [e, f],
109 rotation: 0,
110 scale: [0, 0],
111 skew: [0, 0],
112 };
113
114 // Apply the QR-like decomposition.
115 if (a !== 0 || b !== 0) {
116 const r = Math.sqrt(a * a + b * b);
117 result.rotation = b > 0 ? Math.acos(a / r) : -Math.acos(a / r);
118 result.scale = [r, delta / r];
119 result.skew = [Math.atan((a * c + b * d) / (r * r)), 0];
120 }
121 // these are not currently being used.
122 // else if (c != 0 || d != 0) {
123 // const s = Math.sqrt(c * c + d * d);
124 // result.rotation =
125 // Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s));
126 // result.scale = [delta / s, s];
127 // result.skew = [0, Math.atan((a * c + b * d) / (s * s))];
128 // } else {
129 // // a = b = c = d = 0
130 // }
131
132 return result;
133};
134
135// ---- Common color check helpers ----
136

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected