|
@@ -1330,87 +1330,16 @@ function findNormalVector(u: TinyMatrix[], v: TinyMatrix[], n: number): TinyMatr
|
1330
|
1330
|
const j = Math.floor((n-1) * 2 / 3);
|
1331
|
1331
|
const k = n-1;
|
1332
|
1332
|
|
1333
|
|
- const u0 = u[o], ui = u[i], uj = u[j], uk = u[k];
|
1334
|
|
- const v0 = v[o], vi = v[i], vj = v[j], vk = v[k];
|
1335
|
|
-
|
1336
|
|
- /*
|
1337
|
|
- DEBUG && print({
|
1338
|
|
- unprojectedPoints: {
|
1339
|
|
- u: { u0, ui, uj, uk },
|
1340
|
|
- v: { v0, vi, vj, vk },
|
1341
|
|
- phi_0i: angle(v0, vi),
|
1342
|
|
- phi_0j: angle(v0, vj),
|
1343
|
|
- phi_0k: angle(v0, vk),
|
1344
|
|
- }
|
1345
|
|
- });
|
1346
|
|
- */
|
1347
|
|
-
|
1348
|
|
- // let wa be ua - u0 for a in { i, j, k }
|
1349
|
|
- sub(wi, ui, u0);
|
1350
|
|
- sub(wj, uj, u0);
|
1351
|
|
- sub(wk, uk, u0);
|
1352
|
|
-
|
1353
|
|
- /*
|
1354
|
|
- DEBUG && print({
|
1355
|
|
- planeBasis: {
|
1356
|
|
- wi, wj, wk,
|
1357
|
|
- }
|
1358
|
|
- });
|
1359
|
|
- */
|
1360
|
|
-
|
1361
|
|
- // find (ai, aj) such that wk = ai wi + aj wj
|
1362
|
|
- const det2 = wi[0] * wj[1] - wi[1] * wj[0];
|
1363
|
|
- if(Math.abs(det2) < 1e-6) // wi and wj are colinear
|
1364
|
|
- return vec3(Number.NaN);
|
1365
|
|
-
|
1366
|
|
- const ai = (wj[1] * wk[0] - wj[0] * wk[1]) / det2;
|
1367
|
|
- const aj = (wi[0] * wk[1] - wi[1] * wk[0]) / det2;
|
1368
|
|
-
|
1369
|
|
- /*
|
1370
|
|
- DEBUG && print({
|
1371
|
|
- planePair: {
|
1372
|
|
- det2,
|
1373
|
|
- ai, aj,
|
1374
|
|
- }
|
1375
|
|
- });
|
1376
|
|
- */
|
1377
|
|
-
|
1378
|
|
- // solve Ax = b for x = [ si/s0 sj/s0 sk/s0 ]'
|
1379
|
|
- const bm = ai + aj - 1;
|
1380
|
|
-
|
1381
|
|
- _b[0] = bm * v0[0];
|
1382
|
|
- _b[1] = bm * v0[1];
|
1383
|
|
- _b[2] = bm * v0[2];
|
1384
|
|
-
|
1385
|
|
- _A[0] = ai * vi[0],
|
1386
|
|
- _A[1] = ai * vi[1],
|
1387
|
|
- _A[2] = ai * vi[2],
|
1388
|
|
- _A[3] = aj * vj[0],
|
1389
|
|
- _A[4] = aj * vj[1],
|
1390
|
|
- _A[5] = aj * vj[2],
|
1391
|
|
- _A[6] = -vk[0],
|
1392
|
|
- _A[7] = -vk[1],
|
1393
|
|
- _A[8] = -vk[2]
|
1394
|
|
-
|
1395
|
|
- /*
|
1396
|
|
- DEBUG && print({
|
1397
|
|
- findRatios: {
|
1398
|
|
- _A,
|
1399
|
|
- detA: determinant(_A),
|
1400
|
|
- _b
|
1401
|
|
- }
|
1402
|
|
- });
|
1403
|
|
- */
|
1404
|
|
-
|
1405
|
|
- inverse(_invA, _A);
|
1406
|
|
- mul(_x, _invA, _b);
|
1407
|
|
- if(Number.isNaN(_x[0]))
|
|
1333
|
+ // find the ratios si/s0, sj/s0 and sk/s0
|
|
1334
|
+ const ratios = findRatios(u, v, n, o, i, j, k);
|
|
1335
|
+ if(Number.isNaN(ratios[0]))
|
1408
|
1336
|
return vec3(Number.NaN);
|
1409
|
1337
|
|
1410
|
1338
|
// compute a normal vector
|
1411
|
|
- scale(ri, vi, _x[0]);
|
|
1339
|
+ const v0 = v[o], vi = v[i], vj = v[j];
|
|
1340
|
+ scale(ri, vi, ratios[0]);
|
1412
|
1341
|
sub(ri, ri, v0);
|
1413
|
|
- scale(rj, vj, _x[1]);
|
|
1342
|
+ scale(rj, vj, ratios[1]);
|
1414
|
1343
|
sub(rj, rj, v0);
|
1415
|
1344
|
normalize(nvec, cross(nvec, ri, rj));
|
1416
|
1345
|
|
|
@@ -1424,6 +1353,7 @@ function findNormalVector(u: TinyMatrix[], v: TinyMatrix[], n: number): TinyMatr
|
1424
|
1353
|
});
|
1425
|
1354
|
*/
|
1426
|
1355
|
|
|
1356
|
+ // done!
|
1427
|
1357
|
return nvec;
|
1428
|
1358
|
}
|
1429
|
1359
|
|