microboard-temp 0.12.3 → 0.12.5
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/dist/cjs/browser.js +56 -47
- package/dist/cjs/index.js +56 -47
- package/dist/cjs/node.js +56 -47
- package/dist/esm/browser.js +56 -47
- package/dist/esm/index.js +56 -47
- package/dist/esm/node.js +56 -47
- package/dist/types/Gravity/GravityEngine.d.ts +1 -1
- package/package.json +1 -1
package/dist/cjs/browser.js
CHANGED
|
@@ -54310,7 +54310,7 @@ class GravityEngine {
|
|
|
54310
54310
|
G = 80;
|
|
54311
54311
|
G_CENTER = 120;
|
|
54312
54312
|
DAMPING = 0.92;
|
|
54313
|
-
REPULSION =
|
|
54313
|
+
REPULSION = 800;
|
|
54314
54314
|
TICK_MS = 33;
|
|
54315
54315
|
SYNC_MS = 300;
|
|
54316
54316
|
MAX_DISTANCE = 3000;
|
|
@@ -54345,52 +54345,68 @@ class GravityEngine {
|
|
|
54345
54345
|
const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
|
|
54346
54346
|
if (items.length < 1)
|
|
54347
54347
|
return;
|
|
54348
|
-
|
|
54349
|
-
|
|
54350
|
-
for (const item of items) {
|
|
54348
|
+
const snap = items.map((item, idx) => {
|
|
54349
|
+
const pos = item.transformation.getTranslation();
|
|
54351
54350
|
const mbr = item.getMbr();
|
|
54352
|
-
|
|
54353
|
-
|
|
54351
|
+
const w = Math.max(mbr.getWidth(), 1);
|
|
54352
|
+
const h2 = Math.max(mbr.getHeight(), 1);
|
|
54353
|
+
return {
|
|
54354
|
+
idx,
|
|
54355
|
+
id: item.getId(),
|
|
54356
|
+
left: pos.x,
|
|
54357
|
+
top: pos.y,
|
|
54358
|
+
right: pos.x + w,
|
|
54359
|
+
bottom: pos.y + h2,
|
|
54360
|
+
cx: pos.x + w * 0.5,
|
|
54361
|
+
cy: pos.y + h2 * 0.5,
|
|
54362
|
+
w,
|
|
54363
|
+
h: h2,
|
|
54364
|
+
mass: w * h2
|
|
54365
|
+
};
|
|
54366
|
+
});
|
|
54367
|
+
let sumX = 0, sumY = 0;
|
|
54368
|
+
for (const s2 of snap) {
|
|
54369
|
+
sumX += s2.cx;
|
|
54370
|
+
sumY += s2.cy;
|
|
54354
54371
|
}
|
|
54355
|
-
const centerX = sumX /
|
|
54356
|
-
const centerY = sumY /
|
|
54357
|
-
for (
|
|
54358
|
-
const
|
|
54359
|
-
if (!this.velocities.has(id)) {
|
|
54360
|
-
this.velocities.set(id, { vx: 0, vy: 0 });
|
|
54372
|
+
const centerX = sumX / snap.length;
|
|
54373
|
+
const centerY = sumY / snap.length;
|
|
54374
|
+
for (let i = 0;i < snap.length; i++) {
|
|
54375
|
+
const s1 = snap[i];
|
|
54376
|
+
if (!this.velocities.has(s1.id)) {
|
|
54377
|
+
this.velocities.set(s1.id, { vx: 0, vy: 0 });
|
|
54361
54378
|
}
|
|
54362
|
-
const vel = this.velocities.get(id);
|
|
54363
|
-
const mbr1 = item.getMbr();
|
|
54364
|
-
const w1 = mbr1.getWidth();
|
|
54365
|
-
const h1 = mbr1.getHeight();
|
|
54379
|
+
const vel = this.velocities.get(s1.id);
|
|
54366
54380
|
let ax = 0;
|
|
54367
54381
|
let ay = 0;
|
|
54368
|
-
const
|
|
54369
|
-
const
|
|
54370
|
-
const dcx = centerX - cx1;
|
|
54371
|
-
const dcy = centerY - cy1;
|
|
54382
|
+
const dcx = centerX - s1.cx;
|
|
54383
|
+
const dcy = centerY - s1.cy;
|
|
54372
54384
|
const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
|
|
54373
54385
|
ax += this.G_CENTER * dcx / distCenter;
|
|
54374
54386
|
ay += this.G_CENTER * dcy / distCenter;
|
|
54375
|
-
|
|
54376
|
-
|
|
54377
|
-
|
|
54378
|
-
const
|
|
54379
|
-
const
|
|
54380
|
-
const
|
|
54381
|
-
const
|
|
54382
|
-
|
|
54383
|
-
|
|
54384
|
-
const
|
|
54385
|
-
|
|
54386
|
-
|
|
54387
|
-
|
|
54388
|
-
|
|
54389
|
-
|
|
54390
|
-
|
|
54391
|
-
|
|
54387
|
+
for (let j = 0;j < snap.length; j++) {
|
|
54388
|
+
if (i === j)
|
|
54389
|
+
continue;
|
|
54390
|
+
const s2 = snap[j];
|
|
54391
|
+
const dx = s2.cx - s1.cx;
|
|
54392
|
+
const dy = s2.cy - s1.cy;
|
|
54393
|
+
const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
|
|
54394
|
+
if (dist > this.MAX_DISTANCE)
|
|
54395
|
+
continue;
|
|
54396
|
+
const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
|
|
54397
|
+
if (overlapping) {
|
|
54398
|
+
const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
|
|
54399
|
+
const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
|
|
54400
|
+
if (overlapX < overlapY) {
|
|
54401
|
+
const sign = s1.cx < s2.cx ? -1 : 1;
|
|
54402
|
+
ax += sign * this.REPULSION * overlapX;
|
|
54403
|
+
} else {
|
|
54404
|
+
const sign = s1.cy < s2.cy ? -1 : 1;
|
|
54405
|
+
ay += sign * this.REPULSION * overlapY;
|
|
54406
|
+
}
|
|
54392
54407
|
} else {
|
|
54393
|
-
const
|
|
54408
|
+
const distSq = dx * dx + dy * dy;
|
|
54409
|
+
const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
|
|
54394
54410
|
ax += gravAcc * dx / dist;
|
|
54395
54411
|
ay += gravAcc * dy / dist;
|
|
54396
54412
|
}
|
|
@@ -54400,7 +54416,7 @@ class GravityEngine {
|
|
|
54400
54416
|
const moveX = vel.vx * dt;
|
|
54401
54417
|
const moveY = vel.vy * dt;
|
|
54402
54418
|
if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
|
|
54403
|
-
|
|
54419
|
+
items[i].transformation.applyMatrixSilent({
|
|
54404
54420
|
translateX: moveX,
|
|
54405
54421
|
translateY: moveY,
|
|
54406
54422
|
scaleX: 1,
|
|
@@ -54431,14 +54447,7 @@ class GravityEngine {
|
|
|
54431
54447
|
method: "applyMatrix",
|
|
54432
54448
|
items: movedItems.map(({ id, dx, dy }) => ({
|
|
54433
54449
|
id,
|
|
54434
|
-
matrix: {
|
|
54435
|
-
translateX: dx,
|
|
54436
|
-
translateY: dy,
|
|
54437
|
-
scaleX: 1,
|
|
54438
|
-
scaleY: 1,
|
|
54439
|
-
shearX: 0,
|
|
54440
|
-
shearY: 0
|
|
54441
|
-
}
|
|
54450
|
+
matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
|
|
54442
54451
|
}))
|
|
54443
54452
|
};
|
|
54444
54453
|
this.board.events.emit(operation);
|
package/dist/cjs/index.js
CHANGED
|
@@ -54310,7 +54310,7 @@ class GravityEngine {
|
|
|
54310
54310
|
G = 80;
|
|
54311
54311
|
G_CENTER = 120;
|
|
54312
54312
|
DAMPING = 0.92;
|
|
54313
|
-
REPULSION =
|
|
54313
|
+
REPULSION = 800;
|
|
54314
54314
|
TICK_MS = 33;
|
|
54315
54315
|
SYNC_MS = 300;
|
|
54316
54316
|
MAX_DISTANCE = 3000;
|
|
@@ -54345,52 +54345,68 @@ class GravityEngine {
|
|
|
54345
54345
|
const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
|
|
54346
54346
|
if (items.length < 1)
|
|
54347
54347
|
return;
|
|
54348
|
-
|
|
54349
|
-
|
|
54350
|
-
for (const item of items) {
|
|
54348
|
+
const snap = items.map((item, idx) => {
|
|
54349
|
+
const pos = item.transformation.getTranslation();
|
|
54351
54350
|
const mbr = item.getMbr();
|
|
54352
|
-
|
|
54353
|
-
|
|
54351
|
+
const w = Math.max(mbr.getWidth(), 1);
|
|
54352
|
+
const h2 = Math.max(mbr.getHeight(), 1);
|
|
54353
|
+
return {
|
|
54354
|
+
idx,
|
|
54355
|
+
id: item.getId(),
|
|
54356
|
+
left: pos.x,
|
|
54357
|
+
top: pos.y,
|
|
54358
|
+
right: pos.x + w,
|
|
54359
|
+
bottom: pos.y + h2,
|
|
54360
|
+
cx: pos.x + w * 0.5,
|
|
54361
|
+
cy: pos.y + h2 * 0.5,
|
|
54362
|
+
w,
|
|
54363
|
+
h: h2,
|
|
54364
|
+
mass: w * h2
|
|
54365
|
+
};
|
|
54366
|
+
});
|
|
54367
|
+
let sumX = 0, sumY = 0;
|
|
54368
|
+
for (const s2 of snap) {
|
|
54369
|
+
sumX += s2.cx;
|
|
54370
|
+
sumY += s2.cy;
|
|
54354
54371
|
}
|
|
54355
|
-
const centerX = sumX /
|
|
54356
|
-
const centerY = sumY /
|
|
54357
|
-
for (
|
|
54358
|
-
const
|
|
54359
|
-
if (!this.velocities.has(id)) {
|
|
54360
|
-
this.velocities.set(id, { vx: 0, vy: 0 });
|
|
54372
|
+
const centerX = sumX / snap.length;
|
|
54373
|
+
const centerY = sumY / snap.length;
|
|
54374
|
+
for (let i = 0;i < snap.length; i++) {
|
|
54375
|
+
const s1 = snap[i];
|
|
54376
|
+
if (!this.velocities.has(s1.id)) {
|
|
54377
|
+
this.velocities.set(s1.id, { vx: 0, vy: 0 });
|
|
54361
54378
|
}
|
|
54362
|
-
const vel = this.velocities.get(id);
|
|
54363
|
-
const mbr1 = item.getMbr();
|
|
54364
|
-
const w1 = mbr1.getWidth();
|
|
54365
|
-
const h1 = mbr1.getHeight();
|
|
54379
|
+
const vel = this.velocities.get(s1.id);
|
|
54366
54380
|
let ax = 0;
|
|
54367
54381
|
let ay = 0;
|
|
54368
|
-
const
|
|
54369
|
-
const
|
|
54370
|
-
const dcx = centerX - cx1;
|
|
54371
|
-
const dcy = centerY - cy1;
|
|
54382
|
+
const dcx = centerX - s1.cx;
|
|
54383
|
+
const dcy = centerY - s1.cy;
|
|
54372
54384
|
const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
|
|
54373
54385
|
ax += this.G_CENTER * dcx / distCenter;
|
|
54374
54386
|
ay += this.G_CENTER * dcy / distCenter;
|
|
54375
|
-
|
|
54376
|
-
|
|
54377
|
-
|
|
54378
|
-
const
|
|
54379
|
-
const
|
|
54380
|
-
const
|
|
54381
|
-
const
|
|
54382
|
-
|
|
54383
|
-
|
|
54384
|
-
const
|
|
54385
|
-
|
|
54386
|
-
|
|
54387
|
-
|
|
54388
|
-
|
|
54389
|
-
|
|
54390
|
-
|
|
54391
|
-
|
|
54387
|
+
for (let j = 0;j < snap.length; j++) {
|
|
54388
|
+
if (i === j)
|
|
54389
|
+
continue;
|
|
54390
|
+
const s2 = snap[j];
|
|
54391
|
+
const dx = s2.cx - s1.cx;
|
|
54392
|
+
const dy = s2.cy - s1.cy;
|
|
54393
|
+
const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
|
|
54394
|
+
if (dist > this.MAX_DISTANCE)
|
|
54395
|
+
continue;
|
|
54396
|
+
const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
|
|
54397
|
+
if (overlapping) {
|
|
54398
|
+
const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
|
|
54399
|
+
const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
|
|
54400
|
+
if (overlapX < overlapY) {
|
|
54401
|
+
const sign = s1.cx < s2.cx ? -1 : 1;
|
|
54402
|
+
ax += sign * this.REPULSION * overlapX;
|
|
54403
|
+
} else {
|
|
54404
|
+
const sign = s1.cy < s2.cy ? -1 : 1;
|
|
54405
|
+
ay += sign * this.REPULSION * overlapY;
|
|
54406
|
+
}
|
|
54392
54407
|
} else {
|
|
54393
|
-
const
|
|
54408
|
+
const distSq = dx * dx + dy * dy;
|
|
54409
|
+
const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
|
|
54394
54410
|
ax += gravAcc * dx / dist;
|
|
54395
54411
|
ay += gravAcc * dy / dist;
|
|
54396
54412
|
}
|
|
@@ -54400,7 +54416,7 @@ class GravityEngine {
|
|
|
54400
54416
|
const moveX = vel.vx * dt;
|
|
54401
54417
|
const moveY = vel.vy * dt;
|
|
54402
54418
|
if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
|
|
54403
|
-
|
|
54419
|
+
items[i].transformation.applyMatrixSilent({
|
|
54404
54420
|
translateX: moveX,
|
|
54405
54421
|
translateY: moveY,
|
|
54406
54422
|
scaleX: 1,
|
|
@@ -54431,14 +54447,7 @@ class GravityEngine {
|
|
|
54431
54447
|
method: "applyMatrix",
|
|
54432
54448
|
items: movedItems.map(({ id, dx, dy }) => ({
|
|
54433
54449
|
id,
|
|
54434
|
-
matrix: {
|
|
54435
|
-
translateX: dx,
|
|
54436
|
-
translateY: dy,
|
|
54437
|
-
scaleX: 1,
|
|
54438
|
-
scaleY: 1,
|
|
54439
|
-
shearX: 0,
|
|
54440
|
-
shearY: 0
|
|
54441
|
-
}
|
|
54450
|
+
matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
|
|
54442
54451
|
}))
|
|
54443
54452
|
};
|
|
54444
54453
|
this.board.events.emit(operation);
|
package/dist/cjs/node.js
CHANGED
|
@@ -56783,7 +56783,7 @@ class GravityEngine {
|
|
|
56783
56783
|
G = 80;
|
|
56784
56784
|
G_CENTER = 120;
|
|
56785
56785
|
DAMPING = 0.92;
|
|
56786
|
-
REPULSION =
|
|
56786
|
+
REPULSION = 800;
|
|
56787
56787
|
TICK_MS = 33;
|
|
56788
56788
|
SYNC_MS = 300;
|
|
56789
56789
|
MAX_DISTANCE = 3000;
|
|
@@ -56818,52 +56818,68 @@ class GravityEngine {
|
|
|
56818
56818
|
const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
|
|
56819
56819
|
if (items.length < 1)
|
|
56820
56820
|
return;
|
|
56821
|
-
|
|
56822
|
-
|
|
56823
|
-
for (const item of items) {
|
|
56821
|
+
const snap = items.map((item, idx) => {
|
|
56822
|
+
const pos = item.transformation.getTranslation();
|
|
56824
56823
|
const mbr = item.getMbr();
|
|
56825
|
-
|
|
56826
|
-
|
|
56824
|
+
const w = Math.max(mbr.getWidth(), 1);
|
|
56825
|
+
const h2 = Math.max(mbr.getHeight(), 1);
|
|
56826
|
+
return {
|
|
56827
|
+
idx,
|
|
56828
|
+
id: item.getId(),
|
|
56829
|
+
left: pos.x,
|
|
56830
|
+
top: pos.y,
|
|
56831
|
+
right: pos.x + w,
|
|
56832
|
+
bottom: pos.y + h2,
|
|
56833
|
+
cx: pos.x + w * 0.5,
|
|
56834
|
+
cy: pos.y + h2 * 0.5,
|
|
56835
|
+
w,
|
|
56836
|
+
h: h2,
|
|
56837
|
+
mass: w * h2
|
|
56838
|
+
};
|
|
56839
|
+
});
|
|
56840
|
+
let sumX = 0, sumY = 0;
|
|
56841
|
+
for (const s2 of snap) {
|
|
56842
|
+
sumX += s2.cx;
|
|
56843
|
+
sumY += s2.cy;
|
|
56827
56844
|
}
|
|
56828
|
-
const centerX = sumX /
|
|
56829
|
-
const centerY = sumY /
|
|
56830
|
-
for (
|
|
56831
|
-
const
|
|
56832
|
-
if (!this.velocities.has(id)) {
|
|
56833
|
-
this.velocities.set(id, { vx: 0, vy: 0 });
|
|
56845
|
+
const centerX = sumX / snap.length;
|
|
56846
|
+
const centerY = sumY / snap.length;
|
|
56847
|
+
for (let i = 0;i < snap.length; i++) {
|
|
56848
|
+
const s1 = snap[i];
|
|
56849
|
+
if (!this.velocities.has(s1.id)) {
|
|
56850
|
+
this.velocities.set(s1.id, { vx: 0, vy: 0 });
|
|
56834
56851
|
}
|
|
56835
|
-
const vel = this.velocities.get(id);
|
|
56836
|
-
const mbr1 = item.getMbr();
|
|
56837
|
-
const w1 = mbr1.getWidth();
|
|
56838
|
-
const h1 = mbr1.getHeight();
|
|
56852
|
+
const vel = this.velocities.get(s1.id);
|
|
56839
56853
|
let ax = 0;
|
|
56840
56854
|
let ay = 0;
|
|
56841
|
-
const
|
|
56842
|
-
const
|
|
56843
|
-
const dcx = centerX - cx1;
|
|
56844
|
-
const dcy = centerY - cy1;
|
|
56855
|
+
const dcx = centerX - s1.cx;
|
|
56856
|
+
const dcy = centerY - s1.cy;
|
|
56845
56857
|
const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
|
|
56846
56858
|
ax += this.G_CENTER * dcx / distCenter;
|
|
56847
56859
|
ay += this.G_CENTER * dcy / distCenter;
|
|
56848
|
-
|
|
56849
|
-
|
|
56850
|
-
|
|
56851
|
-
const
|
|
56852
|
-
const
|
|
56853
|
-
const
|
|
56854
|
-
const
|
|
56855
|
-
|
|
56856
|
-
|
|
56857
|
-
const
|
|
56858
|
-
|
|
56859
|
-
|
|
56860
|
-
|
|
56861
|
-
|
|
56862
|
-
|
|
56863
|
-
|
|
56864
|
-
|
|
56860
|
+
for (let j = 0;j < snap.length; j++) {
|
|
56861
|
+
if (i === j)
|
|
56862
|
+
continue;
|
|
56863
|
+
const s2 = snap[j];
|
|
56864
|
+
const dx = s2.cx - s1.cx;
|
|
56865
|
+
const dy = s2.cy - s1.cy;
|
|
56866
|
+
const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
|
|
56867
|
+
if (dist > this.MAX_DISTANCE)
|
|
56868
|
+
continue;
|
|
56869
|
+
const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
|
|
56870
|
+
if (overlapping) {
|
|
56871
|
+
const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
|
|
56872
|
+
const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
|
|
56873
|
+
if (overlapX < overlapY) {
|
|
56874
|
+
const sign = s1.cx < s2.cx ? -1 : 1;
|
|
56875
|
+
ax += sign * this.REPULSION * overlapX;
|
|
56876
|
+
} else {
|
|
56877
|
+
const sign = s1.cy < s2.cy ? -1 : 1;
|
|
56878
|
+
ay += sign * this.REPULSION * overlapY;
|
|
56879
|
+
}
|
|
56865
56880
|
} else {
|
|
56866
|
-
const
|
|
56881
|
+
const distSq = dx * dx + dy * dy;
|
|
56882
|
+
const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
|
|
56867
56883
|
ax += gravAcc * dx / dist;
|
|
56868
56884
|
ay += gravAcc * dy / dist;
|
|
56869
56885
|
}
|
|
@@ -56873,7 +56889,7 @@ class GravityEngine {
|
|
|
56873
56889
|
const moveX = vel.vx * dt;
|
|
56874
56890
|
const moveY = vel.vy * dt;
|
|
56875
56891
|
if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
|
|
56876
|
-
|
|
56892
|
+
items[i].transformation.applyMatrixSilent({
|
|
56877
56893
|
translateX: moveX,
|
|
56878
56894
|
translateY: moveY,
|
|
56879
56895
|
scaleX: 1,
|
|
@@ -56904,14 +56920,7 @@ class GravityEngine {
|
|
|
56904
56920
|
method: "applyMatrix",
|
|
56905
56921
|
items: movedItems.map(({ id, dx, dy }) => ({
|
|
56906
56922
|
id,
|
|
56907
|
-
matrix: {
|
|
56908
|
-
translateX: dx,
|
|
56909
|
-
translateY: dy,
|
|
56910
|
-
scaleX: 1,
|
|
56911
|
-
scaleY: 1,
|
|
56912
|
-
shearX: 0,
|
|
56913
|
-
shearY: 0
|
|
56914
|
-
}
|
|
56923
|
+
matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
|
|
56915
56924
|
}))
|
|
56916
56925
|
};
|
|
56917
56926
|
this.board.events.emit(operation);
|
package/dist/esm/browser.js
CHANGED
|
@@ -54139,7 +54139,7 @@ class GravityEngine {
|
|
|
54139
54139
|
G = 80;
|
|
54140
54140
|
G_CENTER = 120;
|
|
54141
54141
|
DAMPING = 0.92;
|
|
54142
|
-
REPULSION =
|
|
54142
|
+
REPULSION = 800;
|
|
54143
54143
|
TICK_MS = 33;
|
|
54144
54144
|
SYNC_MS = 300;
|
|
54145
54145
|
MAX_DISTANCE = 3000;
|
|
@@ -54174,52 +54174,68 @@ class GravityEngine {
|
|
|
54174
54174
|
const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
|
|
54175
54175
|
if (items.length < 1)
|
|
54176
54176
|
return;
|
|
54177
|
-
|
|
54178
|
-
|
|
54179
|
-
for (const item of items) {
|
|
54177
|
+
const snap = items.map((item, idx) => {
|
|
54178
|
+
const pos = item.transformation.getTranslation();
|
|
54180
54179
|
const mbr = item.getMbr();
|
|
54181
|
-
|
|
54182
|
-
|
|
54180
|
+
const w = Math.max(mbr.getWidth(), 1);
|
|
54181
|
+
const h2 = Math.max(mbr.getHeight(), 1);
|
|
54182
|
+
return {
|
|
54183
|
+
idx,
|
|
54184
|
+
id: item.getId(),
|
|
54185
|
+
left: pos.x,
|
|
54186
|
+
top: pos.y,
|
|
54187
|
+
right: pos.x + w,
|
|
54188
|
+
bottom: pos.y + h2,
|
|
54189
|
+
cx: pos.x + w * 0.5,
|
|
54190
|
+
cy: pos.y + h2 * 0.5,
|
|
54191
|
+
w,
|
|
54192
|
+
h: h2,
|
|
54193
|
+
mass: w * h2
|
|
54194
|
+
};
|
|
54195
|
+
});
|
|
54196
|
+
let sumX = 0, sumY = 0;
|
|
54197
|
+
for (const s2 of snap) {
|
|
54198
|
+
sumX += s2.cx;
|
|
54199
|
+
sumY += s2.cy;
|
|
54183
54200
|
}
|
|
54184
|
-
const centerX = sumX /
|
|
54185
|
-
const centerY = sumY /
|
|
54186
|
-
for (
|
|
54187
|
-
const
|
|
54188
|
-
if (!this.velocities.has(id)) {
|
|
54189
|
-
this.velocities.set(id, { vx: 0, vy: 0 });
|
|
54201
|
+
const centerX = sumX / snap.length;
|
|
54202
|
+
const centerY = sumY / snap.length;
|
|
54203
|
+
for (let i = 0;i < snap.length; i++) {
|
|
54204
|
+
const s1 = snap[i];
|
|
54205
|
+
if (!this.velocities.has(s1.id)) {
|
|
54206
|
+
this.velocities.set(s1.id, { vx: 0, vy: 0 });
|
|
54190
54207
|
}
|
|
54191
|
-
const vel = this.velocities.get(id);
|
|
54192
|
-
const mbr1 = item.getMbr();
|
|
54193
|
-
const w1 = mbr1.getWidth();
|
|
54194
|
-
const h1 = mbr1.getHeight();
|
|
54208
|
+
const vel = this.velocities.get(s1.id);
|
|
54195
54209
|
let ax = 0;
|
|
54196
54210
|
let ay = 0;
|
|
54197
|
-
const
|
|
54198
|
-
const
|
|
54199
|
-
const dcx = centerX - cx1;
|
|
54200
|
-
const dcy = centerY - cy1;
|
|
54211
|
+
const dcx = centerX - s1.cx;
|
|
54212
|
+
const dcy = centerY - s1.cy;
|
|
54201
54213
|
const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
|
|
54202
54214
|
ax += this.G_CENTER * dcx / distCenter;
|
|
54203
54215
|
ay += this.G_CENTER * dcy / distCenter;
|
|
54204
|
-
|
|
54205
|
-
|
|
54206
|
-
|
|
54207
|
-
const
|
|
54208
|
-
const
|
|
54209
|
-
const
|
|
54210
|
-
const
|
|
54211
|
-
|
|
54212
|
-
|
|
54213
|
-
const
|
|
54214
|
-
|
|
54215
|
-
|
|
54216
|
-
|
|
54217
|
-
|
|
54218
|
-
|
|
54219
|
-
|
|
54220
|
-
|
|
54216
|
+
for (let j = 0;j < snap.length; j++) {
|
|
54217
|
+
if (i === j)
|
|
54218
|
+
continue;
|
|
54219
|
+
const s2 = snap[j];
|
|
54220
|
+
const dx = s2.cx - s1.cx;
|
|
54221
|
+
const dy = s2.cy - s1.cy;
|
|
54222
|
+
const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
|
|
54223
|
+
if (dist > this.MAX_DISTANCE)
|
|
54224
|
+
continue;
|
|
54225
|
+
const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
|
|
54226
|
+
if (overlapping) {
|
|
54227
|
+
const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
|
|
54228
|
+
const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
|
|
54229
|
+
if (overlapX < overlapY) {
|
|
54230
|
+
const sign = s1.cx < s2.cx ? -1 : 1;
|
|
54231
|
+
ax += sign * this.REPULSION * overlapX;
|
|
54232
|
+
} else {
|
|
54233
|
+
const sign = s1.cy < s2.cy ? -1 : 1;
|
|
54234
|
+
ay += sign * this.REPULSION * overlapY;
|
|
54235
|
+
}
|
|
54221
54236
|
} else {
|
|
54222
|
-
const
|
|
54237
|
+
const distSq = dx * dx + dy * dy;
|
|
54238
|
+
const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
|
|
54223
54239
|
ax += gravAcc * dx / dist;
|
|
54224
54240
|
ay += gravAcc * dy / dist;
|
|
54225
54241
|
}
|
|
@@ -54229,7 +54245,7 @@ class GravityEngine {
|
|
|
54229
54245
|
const moveX = vel.vx * dt;
|
|
54230
54246
|
const moveY = vel.vy * dt;
|
|
54231
54247
|
if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
|
|
54232
|
-
|
|
54248
|
+
items[i].transformation.applyMatrixSilent({
|
|
54233
54249
|
translateX: moveX,
|
|
54234
54250
|
translateY: moveY,
|
|
54235
54251
|
scaleX: 1,
|
|
@@ -54260,14 +54276,7 @@ class GravityEngine {
|
|
|
54260
54276
|
method: "applyMatrix",
|
|
54261
54277
|
items: movedItems.map(({ id, dx, dy }) => ({
|
|
54262
54278
|
id,
|
|
54263
|
-
matrix: {
|
|
54264
|
-
translateX: dx,
|
|
54265
|
-
translateY: dy,
|
|
54266
|
-
scaleX: 1,
|
|
54267
|
-
scaleY: 1,
|
|
54268
|
-
shearX: 0,
|
|
54269
|
-
shearY: 0
|
|
54270
|
-
}
|
|
54279
|
+
matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
|
|
54271
54280
|
}))
|
|
54272
54281
|
};
|
|
54273
54282
|
this.board.events.emit(operation);
|
package/dist/esm/index.js
CHANGED
|
@@ -54132,7 +54132,7 @@ class GravityEngine {
|
|
|
54132
54132
|
G = 80;
|
|
54133
54133
|
G_CENTER = 120;
|
|
54134
54134
|
DAMPING = 0.92;
|
|
54135
|
-
REPULSION =
|
|
54135
|
+
REPULSION = 800;
|
|
54136
54136
|
TICK_MS = 33;
|
|
54137
54137
|
SYNC_MS = 300;
|
|
54138
54138
|
MAX_DISTANCE = 3000;
|
|
@@ -54167,52 +54167,68 @@ class GravityEngine {
|
|
|
54167
54167
|
const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
|
|
54168
54168
|
if (items.length < 1)
|
|
54169
54169
|
return;
|
|
54170
|
-
|
|
54171
|
-
|
|
54172
|
-
for (const item of items) {
|
|
54170
|
+
const snap = items.map((item, idx) => {
|
|
54171
|
+
const pos = item.transformation.getTranslation();
|
|
54173
54172
|
const mbr = item.getMbr();
|
|
54174
|
-
|
|
54175
|
-
|
|
54173
|
+
const w = Math.max(mbr.getWidth(), 1);
|
|
54174
|
+
const h2 = Math.max(mbr.getHeight(), 1);
|
|
54175
|
+
return {
|
|
54176
|
+
idx,
|
|
54177
|
+
id: item.getId(),
|
|
54178
|
+
left: pos.x,
|
|
54179
|
+
top: pos.y,
|
|
54180
|
+
right: pos.x + w,
|
|
54181
|
+
bottom: pos.y + h2,
|
|
54182
|
+
cx: pos.x + w * 0.5,
|
|
54183
|
+
cy: pos.y + h2 * 0.5,
|
|
54184
|
+
w,
|
|
54185
|
+
h: h2,
|
|
54186
|
+
mass: w * h2
|
|
54187
|
+
};
|
|
54188
|
+
});
|
|
54189
|
+
let sumX = 0, sumY = 0;
|
|
54190
|
+
for (const s2 of snap) {
|
|
54191
|
+
sumX += s2.cx;
|
|
54192
|
+
sumY += s2.cy;
|
|
54176
54193
|
}
|
|
54177
|
-
const centerX = sumX /
|
|
54178
|
-
const centerY = sumY /
|
|
54179
|
-
for (
|
|
54180
|
-
const
|
|
54181
|
-
if (!this.velocities.has(id)) {
|
|
54182
|
-
this.velocities.set(id, { vx: 0, vy: 0 });
|
|
54194
|
+
const centerX = sumX / snap.length;
|
|
54195
|
+
const centerY = sumY / snap.length;
|
|
54196
|
+
for (let i = 0;i < snap.length; i++) {
|
|
54197
|
+
const s1 = snap[i];
|
|
54198
|
+
if (!this.velocities.has(s1.id)) {
|
|
54199
|
+
this.velocities.set(s1.id, { vx: 0, vy: 0 });
|
|
54183
54200
|
}
|
|
54184
|
-
const vel = this.velocities.get(id);
|
|
54185
|
-
const mbr1 = item.getMbr();
|
|
54186
|
-
const w1 = mbr1.getWidth();
|
|
54187
|
-
const h1 = mbr1.getHeight();
|
|
54201
|
+
const vel = this.velocities.get(s1.id);
|
|
54188
54202
|
let ax = 0;
|
|
54189
54203
|
let ay = 0;
|
|
54190
|
-
const
|
|
54191
|
-
const
|
|
54192
|
-
const dcx = centerX - cx1;
|
|
54193
|
-
const dcy = centerY - cy1;
|
|
54204
|
+
const dcx = centerX - s1.cx;
|
|
54205
|
+
const dcy = centerY - s1.cy;
|
|
54194
54206
|
const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
|
|
54195
54207
|
ax += this.G_CENTER * dcx / distCenter;
|
|
54196
54208
|
ay += this.G_CENTER * dcy / distCenter;
|
|
54197
|
-
|
|
54198
|
-
|
|
54199
|
-
|
|
54200
|
-
const
|
|
54201
|
-
const
|
|
54202
|
-
const
|
|
54203
|
-
const
|
|
54204
|
-
|
|
54205
|
-
|
|
54206
|
-
const
|
|
54207
|
-
|
|
54208
|
-
|
|
54209
|
-
|
|
54210
|
-
|
|
54211
|
-
|
|
54212
|
-
|
|
54213
|
-
|
|
54209
|
+
for (let j = 0;j < snap.length; j++) {
|
|
54210
|
+
if (i === j)
|
|
54211
|
+
continue;
|
|
54212
|
+
const s2 = snap[j];
|
|
54213
|
+
const dx = s2.cx - s1.cx;
|
|
54214
|
+
const dy = s2.cy - s1.cy;
|
|
54215
|
+
const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
|
|
54216
|
+
if (dist > this.MAX_DISTANCE)
|
|
54217
|
+
continue;
|
|
54218
|
+
const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
|
|
54219
|
+
if (overlapping) {
|
|
54220
|
+
const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
|
|
54221
|
+
const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
|
|
54222
|
+
if (overlapX < overlapY) {
|
|
54223
|
+
const sign = s1.cx < s2.cx ? -1 : 1;
|
|
54224
|
+
ax += sign * this.REPULSION * overlapX;
|
|
54225
|
+
} else {
|
|
54226
|
+
const sign = s1.cy < s2.cy ? -1 : 1;
|
|
54227
|
+
ay += sign * this.REPULSION * overlapY;
|
|
54228
|
+
}
|
|
54214
54229
|
} else {
|
|
54215
|
-
const
|
|
54230
|
+
const distSq = dx * dx + dy * dy;
|
|
54231
|
+
const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
|
|
54216
54232
|
ax += gravAcc * dx / dist;
|
|
54217
54233
|
ay += gravAcc * dy / dist;
|
|
54218
54234
|
}
|
|
@@ -54222,7 +54238,7 @@ class GravityEngine {
|
|
|
54222
54238
|
const moveX = vel.vx * dt;
|
|
54223
54239
|
const moveY = vel.vy * dt;
|
|
54224
54240
|
if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
|
|
54225
|
-
|
|
54241
|
+
items[i].transformation.applyMatrixSilent({
|
|
54226
54242
|
translateX: moveX,
|
|
54227
54243
|
translateY: moveY,
|
|
54228
54244
|
scaleX: 1,
|
|
@@ -54253,14 +54269,7 @@ class GravityEngine {
|
|
|
54253
54269
|
method: "applyMatrix",
|
|
54254
54270
|
items: movedItems.map(({ id, dx, dy }) => ({
|
|
54255
54271
|
id,
|
|
54256
|
-
matrix: {
|
|
54257
|
-
translateX: dx,
|
|
54258
|
-
translateY: dy,
|
|
54259
|
-
scaleX: 1,
|
|
54260
|
-
scaleY: 1,
|
|
54261
|
-
shearX: 0,
|
|
54262
|
-
shearY: 0
|
|
54263
|
-
}
|
|
54272
|
+
matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
|
|
54264
54273
|
}))
|
|
54265
54274
|
};
|
|
54266
54275
|
this.board.events.emit(operation);
|
package/dist/esm/node.js
CHANGED
|
@@ -56600,7 +56600,7 @@ class GravityEngine {
|
|
|
56600
56600
|
G = 80;
|
|
56601
56601
|
G_CENTER = 120;
|
|
56602
56602
|
DAMPING = 0.92;
|
|
56603
|
-
REPULSION =
|
|
56603
|
+
REPULSION = 800;
|
|
56604
56604
|
TICK_MS = 33;
|
|
56605
56605
|
SYNC_MS = 300;
|
|
56606
56606
|
MAX_DISTANCE = 3000;
|
|
@@ -56635,52 +56635,68 @@ class GravityEngine {
|
|
|
56635
56635
|
const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
|
|
56636
56636
|
if (items.length < 1)
|
|
56637
56637
|
return;
|
|
56638
|
-
|
|
56639
|
-
|
|
56640
|
-
for (const item of items) {
|
|
56638
|
+
const snap = items.map((item, idx) => {
|
|
56639
|
+
const pos = item.transformation.getTranslation();
|
|
56641
56640
|
const mbr = item.getMbr();
|
|
56642
|
-
|
|
56643
|
-
|
|
56641
|
+
const w = Math.max(mbr.getWidth(), 1);
|
|
56642
|
+
const h2 = Math.max(mbr.getHeight(), 1);
|
|
56643
|
+
return {
|
|
56644
|
+
idx,
|
|
56645
|
+
id: item.getId(),
|
|
56646
|
+
left: pos.x,
|
|
56647
|
+
top: pos.y,
|
|
56648
|
+
right: pos.x + w,
|
|
56649
|
+
bottom: pos.y + h2,
|
|
56650
|
+
cx: pos.x + w * 0.5,
|
|
56651
|
+
cy: pos.y + h2 * 0.5,
|
|
56652
|
+
w,
|
|
56653
|
+
h: h2,
|
|
56654
|
+
mass: w * h2
|
|
56655
|
+
};
|
|
56656
|
+
});
|
|
56657
|
+
let sumX = 0, sumY = 0;
|
|
56658
|
+
for (const s2 of snap) {
|
|
56659
|
+
sumX += s2.cx;
|
|
56660
|
+
sumY += s2.cy;
|
|
56644
56661
|
}
|
|
56645
|
-
const centerX = sumX /
|
|
56646
|
-
const centerY = sumY /
|
|
56647
|
-
for (
|
|
56648
|
-
const
|
|
56649
|
-
if (!this.velocities.has(id)) {
|
|
56650
|
-
this.velocities.set(id, { vx: 0, vy: 0 });
|
|
56662
|
+
const centerX = sumX / snap.length;
|
|
56663
|
+
const centerY = sumY / snap.length;
|
|
56664
|
+
for (let i = 0;i < snap.length; i++) {
|
|
56665
|
+
const s1 = snap[i];
|
|
56666
|
+
if (!this.velocities.has(s1.id)) {
|
|
56667
|
+
this.velocities.set(s1.id, { vx: 0, vy: 0 });
|
|
56651
56668
|
}
|
|
56652
|
-
const vel = this.velocities.get(id);
|
|
56653
|
-
const mbr1 = item.getMbr();
|
|
56654
|
-
const w1 = mbr1.getWidth();
|
|
56655
|
-
const h1 = mbr1.getHeight();
|
|
56669
|
+
const vel = this.velocities.get(s1.id);
|
|
56656
56670
|
let ax = 0;
|
|
56657
56671
|
let ay = 0;
|
|
56658
|
-
const
|
|
56659
|
-
const
|
|
56660
|
-
const dcx = centerX - cx1;
|
|
56661
|
-
const dcy = centerY - cy1;
|
|
56672
|
+
const dcx = centerX - s1.cx;
|
|
56673
|
+
const dcy = centerY - s1.cy;
|
|
56662
56674
|
const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
|
|
56663
56675
|
ax += this.G_CENTER * dcx / distCenter;
|
|
56664
56676
|
ay += this.G_CENTER * dcy / distCenter;
|
|
56665
|
-
|
|
56666
|
-
|
|
56667
|
-
|
|
56668
|
-
const
|
|
56669
|
-
const
|
|
56670
|
-
const
|
|
56671
|
-
const
|
|
56672
|
-
|
|
56673
|
-
|
|
56674
|
-
const
|
|
56675
|
-
|
|
56676
|
-
|
|
56677
|
-
|
|
56678
|
-
|
|
56679
|
-
|
|
56680
|
-
|
|
56681
|
-
|
|
56677
|
+
for (let j = 0;j < snap.length; j++) {
|
|
56678
|
+
if (i === j)
|
|
56679
|
+
continue;
|
|
56680
|
+
const s2 = snap[j];
|
|
56681
|
+
const dx = s2.cx - s1.cx;
|
|
56682
|
+
const dy = s2.cy - s1.cy;
|
|
56683
|
+
const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
|
|
56684
|
+
if (dist > this.MAX_DISTANCE)
|
|
56685
|
+
continue;
|
|
56686
|
+
const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
|
|
56687
|
+
if (overlapping) {
|
|
56688
|
+
const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
|
|
56689
|
+
const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
|
|
56690
|
+
if (overlapX < overlapY) {
|
|
56691
|
+
const sign = s1.cx < s2.cx ? -1 : 1;
|
|
56692
|
+
ax += sign * this.REPULSION * overlapX;
|
|
56693
|
+
} else {
|
|
56694
|
+
const sign = s1.cy < s2.cy ? -1 : 1;
|
|
56695
|
+
ay += sign * this.REPULSION * overlapY;
|
|
56696
|
+
}
|
|
56682
56697
|
} else {
|
|
56683
|
-
const
|
|
56698
|
+
const distSq = dx * dx + dy * dy;
|
|
56699
|
+
const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
|
|
56684
56700
|
ax += gravAcc * dx / dist;
|
|
56685
56701
|
ay += gravAcc * dy / dist;
|
|
56686
56702
|
}
|
|
@@ -56690,7 +56706,7 @@ class GravityEngine {
|
|
|
56690
56706
|
const moveX = vel.vx * dt;
|
|
56691
56707
|
const moveY = vel.vy * dt;
|
|
56692
56708
|
if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
|
|
56693
|
-
|
|
56709
|
+
items[i].transformation.applyMatrixSilent({
|
|
56694
56710
|
translateX: moveX,
|
|
56695
56711
|
translateY: moveY,
|
|
56696
56712
|
scaleX: 1,
|
|
@@ -56721,14 +56737,7 @@ class GravityEngine {
|
|
|
56721
56737
|
method: "applyMatrix",
|
|
56722
56738
|
items: movedItems.map(({ id, dx, dy }) => ({
|
|
56723
56739
|
id,
|
|
56724
|
-
matrix: {
|
|
56725
|
-
translateX: dx,
|
|
56726
|
-
translateY: dy,
|
|
56727
|
-
scaleX: 1,
|
|
56728
|
-
scaleY: 1,
|
|
56729
|
-
shearX: 0,
|
|
56730
|
-
shearY: 0
|
|
56731
|
-
}
|
|
56740
|
+
matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
|
|
56732
56741
|
}))
|
|
56733
56742
|
};
|
|
56734
56743
|
this.board.events.emit(operation);
|