Procházet zdrojové kódy

Simplify findNormalVector()

customisations
alemart před 6 měsíci
rodič
revize
d69fe8a65c
1 změnil soubory, kde provedl 7 přidání a 77 odebrání
  1. 7
    77
      src/geometry/pnp.ts

+ 7
- 77
src/geometry/pnp.ts Zobrazit soubor

@@ -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
 

Načítá se…
Zrušit
Uložit