triangle method

void triangle(
  1. int a,
  2. int b,
  3. int c
)

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]);
  }
}