efront 3.20.4 → 3.20.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coms/basic/Matrix.js +424 -0
- package/coms/zimoli/confirm.less +1 -1
- package/coms/zimoli/data.js +4 -3
- package/coms/zimoli/matrix.js +1 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
- package/coms/basic/matrix.js +0 -306
package/coms/basic/matrix.js
DELETED
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
// 空间变换算法
|
|
2
|
-
// function [dots]=xrs(dots,wyh)
|
|
3
|
-
// % 转动,缩放,平移,依次进行
|
|
4
|
-
// % wyh.mid为变换中心
|
|
5
|
-
// % wyh.ppt为转动轴的方向
|
|
6
|
-
// % wyh.alph为转动角度
|
|
7
|
-
// % wyh.scrl为缩放系数,反射可设轴向系数为-1
|
|
8
|
-
// % wyh.drag为平移向量
|
|
9
|
-
// wyh.alph=pi*wyh.alph/180;
|
|
10
|
-
// if size(dots,2)==3
|
|
11
|
-
// if numel(wyh.ppt) == 2
|
|
12
|
-
// theta = pi*wyh.ppt(1)/180;
|
|
13
|
-
// phi = pi*wyh.ppt(2)/180;
|
|
14
|
-
// rot_u = [cos(phi)*cos(theta); cos(phi)*sin(theta); sin(phi)];
|
|
15
|
-
// elseif numel(wyh.ppt) == 3
|
|
16
|
-
// rot_u = wyh.ppt(:)/norm(wyh.ppt);
|
|
17
|
-
// end
|
|
18
|
-
// x_u = rot_u(1);
|
|
19
|
-
// y_u = rot_u(2);
|
|
20
|
-
// z_u = rot_u(3);
|
|
21
|
-
// cosa = cos(wyh.alph);
|
|
22
|
-
// sina = sin(wyh.alph);
|
|
23
|
-
// vera = 1 - cosa;
|
|
24
|
-
// rot = [cosa+x_u^2*vera x_u*y_u*vera-z_u*sina x_u*z_u*vera+y_u*sina; ...
|
|
25
|
-
// x_u*y_u*vera+z_u*sina cosa+y_u^2*vera y_u*z_u*vera-x_u*sina; ...
|
|
26
|
-
// x_u*z_u*vera-y_u*sina y_u*z_u*vera+x_u*sina cosa+z_u^2*vera]';
|
|
27
|
-
// else
|
|
28
|
-
// rot=[cos(wyh.alph),-sin(wyh.alph);sin(wyh.alph),cos(wyh.alph)];
|
|
29
|
-
// end
|
|
30
|
-
// for cx=1:size(dots,1)
|
|
31
|
-
// dots(cx,:)=(dots(cx,:)-wyh.mid).*wyh.scrl*rot+wyh.mid+wyh.drag;
|
|
32
|
-
// end
|
|
33
|
-
// end
|
|
34
|
-
"use strict";
|
|
35
|
-
var notMatchLength = new Error("矩阵长度不一致");
|
|
36
|
-
|
|
37
|
-
function transform(B, dots) {
|
|
38
|
-
var dimention = Math.sqrt(B.length - 1) | 0;
|
|
39
|
-
if (dots.length % dimention !== 0) throw notMatchLength;
|
|
40
|
-
if (dots === B) B = B.slice(0);
|
|
41
|
-
var ds = dots.slice(0);
|
|
42
|
-
var dim2 = B.length % dimention !== 0 ? dimention + 1 : dimention;
|
|
43
|
-
for (var cx = 0, dx = dots.length; cx < dx; cx += dimention) {
|
|
44
|
-
for (var cy = 0, dy = dimention; cy < dy; cy++) {
|
|
45
|
-
var sum = 0;
|
|
46
|
-
var start = dim2 * cy;
|
|
47
|
-
for (var ct = 0, dt = dimention; ct < dt; ct++) {
|
|
48
|
-
sum += ds[cx + ct] * B[start + ct];
|
|
49
|
-
}
|
|
50
|
-
sum += B[start + dimention];
|
|
51
|
-
dots[cx + cy] = sum;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return dots;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
function translate(A, delta) {
|
|
58
|
-
var [dim2, dim] = size(A);
|
|
59
|
-
var inc = 0;
|
|
60
|
-
for (var cx = dim, dx = dim * dim2; cx < dx; cx += dim2) {
|
|
61
|
-
A[cx] = (A[cx] || 0) + delta[inc++];
|
|
62
|
-
}
|
|
63
|
-
return A;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function 负(a) {
|
|
67
|
-
return -a;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function multiply(A, B) {
|
|
71
|
-
if (A.length !== B.length) throw notMatchLength;
|
|
72
|
-
var dim = Math.sqrt(A.length) | 0;
|
|
73
|
-
if (dim * dim !== A.length) throw notMatchLength;
|
|
74
|
-
var X = A.slice(0);
|
|
75
|
-
for (var cx = 0, dx = A.length; cx < dx; cx += dim) {
|
|
76
|
-
for (var cy = 0, dy = dim; cy < dy; cy++) {
|
|
77
|
-
var sum = 0;
|
|
78
|
-
for (var ct = 0, dt = dim; ct < dt; ct++) {
|
|
79
|
-
sum += B[cx + ct] * X[ct * dim + cy];
|
|
80
|
-
}
|
|
81
|
-
A[cx + cy] = sum;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return A;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function inner(vec1, vec2) {
|
|
88
|
-
if (vec1.length !== vec2.length) throw notMatchLength;
|
|
89
|
-
var sum = 0;
|
|
90
|
-
for (var cx = 0, dx = vec1.length; cx < dx; cx++) {
|
|
91
|
-
sum += vec1[cx] * vec2[cx];
|
|
92
|
-
}
|
|
93
|
-
return sum;
|
|
94
|
-
}
|
|
95
|
-
function cross(vec1, vec2) {
|
|
96
|
-
if (vec1.length !== vec2.length) throw notMatchLength;
|
|
97
|
-
var c = new Array(vec1.length);
|
|
98
|
-
for (var cx = 0, dx = vec1.length; cx < dx; cx++) {
|
|
99
|
-
var s = 0, f = 1;
|
|
100
|
-
for (var cy = 1, dy = dx; cy < dy; cy++) {
|
|
101
|
-
var c1 = cx + cy;
|
|
102
|
-
var c2 = c1 + f;
|
|
103
|
-
if (c1 >= dx) c1 -= dx;
|
|
104
|
-
if (c2 >= dx) c2 -= dx;
|
|
105
|
-
f = 0 - f;
|
|
106
|
-
s += vec1[c1] * vec2[c2];
|
|
107
|
-
}
|
|
108
|
-
c[cx] = s;
|
|
109
|
-
}
|
|
110
|
-
return c;
|
|
111
|
-
}
|
|
112
|
-
function times(vector, factor) {
|
|
113
|
-
for (var cx = 0, dx = vector.length; cx < dx; cx++) {
|
|
114
|
-
vector[cx] *= factor;
|
|
115
|
-
}
|
|
116
|
-
return vector;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function olinde(v, vector) {
|
|
120
|
-
// 罗德里格旋转公式
|
|
121
|
-
// https://baike.baidu.com/item/%E7%BD%97%E5%BE%B7%E9%87%8C%E6%A0%BC%E6%97%8B%E8%BD%AC%E5%85%AC%E5%BC%8F/18878562
|
|
122
|
-
// https://www.cnblogs.com/flyinggod/p/8144100.html 旋转矩阵、欧拉角、四元数理论及其转换关系
|
|
123
|
-
var theta = norm(vector);
|
|
124
|
-
var k = times(vector.slice(0), 1 / theta);
|
|
125
|
-
var cosa = Math.cos(theta);
|
|
126
|
-
var sina = Math.sin(theta);
|
|
127
|
-
var inna = inner(k, v);
|
|
128
|
-
var aa = inna * (1 - cosa);
|
|
129
|
-
var kv = cross(k, v);
|
|
130
|
-
for (var cx = 0, dx = k.length; cx < dx; cx++) {
|
|
131
|
-
v[cx] = v[cx] * cosa + aa * k[cx] + sina * kv[cx];
|
|
132
|
-
}
|
|
133
|
-
return v;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function matrix2d(theta) {
|
|
137
|
-
var cosa = Math.cos(theta);
|
|
138
|
-
var sina = Math.sin(theta);
|
|
139
|
-
return new Matrix(
|
|
140
|
-
cosa, -sina, 0,
|
|
141
|
-
sina, cosa, 0,
|
|
142
|
-
0, 0, 1
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function matrix3d(factor) {
|
|
147
|
-
var theta = norm(factor);
|
|
148
|
-
var vec = times(factor, 1 / theta);
|
|
149
|
-
var cosa = Math.cos(theta);
|
|
150
|
-
var sina = Math.sin(theta);
|
|
151
|
-
var vera = 1 - cosa;
|
|
152
|
-
var [x_u, y_u, z_u] = factor ? [0, 0, 1] : vec;
|
|
153
|
-
|
|
154
|
-
return new Matrix(
|
|
155
|
-
cosa + x_u * x_u * vera, x_u * y_u * vera + z_u * sina, x_u * z_u * vera - y_u * sina, 0,
|
|
156
|
-
x_u * y_u * vera - z_u * sina, cosa + y_u * y_u * vera, y_u * z_u * vera + x_u * sina, 0,
|
|
157
|
-
x_u * z_u * vera + y_u * sina, y_u * z_u * vera - x_u * sina, cosa + z_u * z_u * vera, 0,
|
|
158
|
-
0, 0, 0, 1
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
var norm = function (vector) {
|
|
162
|
-
var sum = 0;
|
|
163
|
-
for (var cx = 0, dx = vector.length; cx < dx; cx++) {
|
|
164
|
-
sum += vector[cx] * vector[cx];
|
|
165
|
-
}
|
|
166
|
-
return Math.sqrt(sum);
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
var 逆 = function (A) {
|
|
170
|
-
var dim = Math.sqrt(A.length) | 0;
|
|
171
|
-
if (dim * dim !== A.length) throw notMatchLength;
|
|
172
|
-
var E = new Array(A.length).fill(0);
|
|
173
|
-
for (var cx = 0, dx = dim; cx < dx; cx++)E[cx * dim + cx] = 1;
|
|
174
|
-
var X = A.splice(0, A.length);
|
|
175
|
-
A.push.apply(A, E);
|
|
176
|
-
for (var cx = 0, dx = dim; cx < dx; cx++) {
|
|
177
|
-
var start = cx * dim + cx;
|
|
178
|
-
var max_ct, v = 0;
|
|
179
|
-
for (var ct = start, dt = cx * dim + dim; ct < dt; ct++) {
|
|
180
|
-
var v0 = Math.abs(X[ct]);
|
|
181
|
-
if (v0 > v) {
|
|
182
|
-
max_ct = ct;
|
|
183
|
-
v = v0;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
ct = max_ct;
|
|
187
|
-
if (ct !== start) {
|
|
188
|
-
var delta = ct - start;
|
|
189
|
-
var ratio = (1 - X[start]) / X[ct];
|
|
190
|
-
for (var cy = cx, dy = X.length; cy < dy; cy += dim) {
|
|
191
|
-
X[cy] += X[cy + delta] * ratio;
|
|
192
|
-
A[cy] += A[cy + delta] * ratio;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
if (X[start] !== 1) {
|
|
196
|
-
var ratio = 1 / X[start];
|
|
197
|
-
for (var cy = cx, dy = X.length; cy < dy; cy += dim) {
|
|
198
|
-
X[cy] *= ratio;
|
|
199
|
-
A[cy] *= ratio;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
for (var ct = start + 1, dt = start + dim - cx; ct < dt; ct++) {
|
|
203
|
-
if (X[ct] === 0) continue;
|
|
204
|
-
var ratio = -X[ct];
|
|
205
|
-
var delta = start - ct;
|
|
206
|
-
for (var cy = cx + ct - start, dy = X.length; cy < dy; cy += dim) {
|
|
207
|
-
X[cy] += X[cy + delta] * ratio;
|
|
208
|
-
A[cy] += A[cy + delta] * ratio;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
for (var cx = dim - 1; cx >= 0; cx--) {
|
|
213
|
-
var start = cx * dim + cx;
|
|
214
|
-
for (var ct = start - 1, dt = start - cx; ct >= dt; ct--) {
|
|
215
|
-
if (X[ct] === 0) continue;
|
|
216
|
-
var ratio = -X[ct];
|
|
217
|
-
var delta = start - ct;
|
|
218
|
-
for (var cy = cx + ct - start, dy = X.length; cy < dy; cy += dim) {
|
|
219
|
-
X[cy] += X[cy + delta] * ratio;
|
|
220
|
-
A[cy] += A[cy + delta] * ratio;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return A;
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
function size(A) {
|
|
228
|
-
var dim = Math.sqrt(A.length - 1) | 0;
|
|
229
|
-
var dim2 = dim;
|
|
230
|
-
if (A.length % dim !== 0) {
|
|
231
|
-
dim2++;
|
|
232
|
-
}
|
|
233
|
-
if ((dim + 1) * dim2 !== A.length) throw notMatchLength;
|
|
234
|
-
return [dim2, dim];
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
class Matrix extends Array {
|
|
238
|
-
static create2d(theta = 0) {
|
|
239
|
-
return matrix2d(theta);
|
|
240
|
-
}
|
|
241
|
-
static create3d(factor = [0, 0, 0]) {
|
|
242
|
-
return matrix3d(factor);
|
|
243
|
-
}
|
|
244
|
-
size() {
|
|
245
|
-
return size(this);
|
|
246
|
-
}
|
|
247
|
-
dirty() {
|
|
248
|
-
this._invert = null;
|
|
249
|
-
}
|
|
250
|
-
_invert = null;
|
|
251
|
-
get invert() {
|
|
252
|
-
if (this._invert) return this._invert;
|
|
253
|
-
return this._invert = this.slice().inverse();
|
|
254
|
-
}
|
|
255
|
-
transpose() {
|
|
256
|
-
var [size] = this.size();
|
|
257
|
-
for (var cx = 0, dx = size; cx < dx; cx++) {
|
|
258
|
-
for (var cy = cx + 1, dy = dx; cy < dy; cy++) {
|
|
259
|
-
var i = cx * size + cy;
|
|
260
|
-
var j = cy * size + cx;
|
|
261
|
-
var tmp = this[i];
|
|
262
|
-
this[i] = this[j];
|
|
263
|
-
this[j] = tmp;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return this;
|
|
267
|
-
}
|
|
268
|
-
inverse() {
|
|
269
|
-
this.dirty();
|
|
270
|
-
return 逆(this);
|
|
271
|
-
}
|
|
272
|
-
rotate(factor, center) {
|
|
273
|
-
this.dirty();
|
|
274
|
-
if (center) this.translate(center.map(负));
|
|
275
|
-
if (factor.length) {
|
|
276
|
-
this.multiply(matrix3d(factor));
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
this.multiply(matrix2d(factor));
|
|
280
|
-
}
|
|
281
|
-
if (center) this.translate(center);
|
|
282
|
-
return this;
|
|
283
|
-
}
|
|
284
|
-
translate(vector) {
|
|
285
|
-
this.dirty();
|
|
286
|
-
return translate(this, vector);
|
|
287
|
-
}
|
|
288
|
-
scale(ratio) {
|
|
289
|
-
this.dirty();
|
|
290
|
-
times(this, ratio);
|
|
291
|
-
this[this.length - 1] = 1;
|
|
292
|
-
return this;
|
|
293
|
-
}
|
|
294
|
-
multiply(a) {
|
|
295
|
-
this.dirty();
|
|
296
|
-
return multiply(this, a);
|
|
297
|
-
}
|
|
298
|
-
transform(dots) {
|
|
299
|
-
if (dots instanceof Array) return transform(this, dots);
|
|
300
|
-
if (arguments.length > 1) {
|
|
301
|
-
var a = Array.prototype.slice.apply(arguments, 0);
|
|
302
|
-
return transform(this, a);
|
|
303
|
-
}
|
|
304
|
-
return dots;
|
|
305
|
-
}
|
|
306
|
-
}
|