triangle method
Adds a triangle facing the way its vertices' normals point. One with no area is left out.
Implementation
void triangle(int a, int b, int c) {
final ux = _p[b * 3] - _p[a * 3],
uy = _p[b * 3 + 1] - _p[a * 3 + 1],
uz = _p[b * 3 + 2] - _p[a * 3 + 2];
final vx = _p[c * 3] - _p[a * 3],
vy = _p[c * 3 + 1] - _p[a * 3 + 1],
vz = _p[c * 3 + 2] - _p[a * 3 + 2];
final fx = uy * vz - uz * vy,
fy = uz * vx - ux * vz,
fz = ux * vy - uy * vx;
final area = fx * fx + fy * fy + fz * fz;
final scale = (ux * ux + uy * uy + uz * uz) * (vx * vx + vy * vy + vz * vz);
if (area <= 1e-14 * scale || area == 0) return;
final nx = _n[a * 3] + _n[b * 3] + _n[c * 3];
final ny = _n[a * 3 + 1] + _n[b * 3 + 1] + _n[c * 3 + 1];
final nz = _n[a * 3 + 2] + _n[b * 3 + 2] + _n[c * 3 + 2];
if (fx * nx + fy * ny + fz * nz >= 0) {
_i.addAll([a, b, c]);
} else {
_i.addAll([a, c, b]);
}
}