Ошибка построителя функции в Dart (с three.dart): сбой при исключении: у нулевого объекта нет метода ‘crossInto’

#math #web #plot #3d #dart

#математика #веб #построить #3D #dart

Вопрос:

Вычисления выполняются в следующем коде:

 var MIN = -10.0,
    MAX = 10.0,
    RANGE = MAX - MIN;

getColor(max, min, val) {
  var MIN_L = 40,
      MAX_L = 100;
  var color = new Color();
  var h = 0 / 240;
  var s = 80 / 240;
  var l = (((MAX_L - MIN_L) / (max - min)) * val) / 240;
  color.setHSL(h, s, l);
  return color;
}
initGraph() {
  var x = MIN,
      y = MIN,
      z = 0.0;
  initData() {
    var data = [];
    for (var i = MIN; i < MAX; i  ) {
      var row = [];
      for (var j = MIN; j < MAX; j  ) {
        double z = 2*( x * x   y * y);
        print('$z');
        row.add({
          x: x,
          y: y,
          z: z
        });
        y  ;
      }
      data.add(row);
      x  ;
    }
    return data;
  }

  var data = initData();
  var geometry = new Geometry();
  var colors = [];

  var RANGE = data.length,
      height = data[0].length;
  data.forEach((col) {
    col.forEach((val) {
      geometry.vertices.add(new Vector3(x.toDouble(), y.toDouble(), z.toDouble()));
      colors.add(getColor(2.5, 0, z.toDouble()));
    });
  });

  offset(x, y) {
    return x * RANGE   y;
  }

  for (var x = 0; x < RANGE - 1; x  ) {
    for (var y = 0; y < height - 1; y  ) {
      Vector3 vec0;
      Vector3 vec1;
      Vector3 n_vec;
      // one of two triangle polygons in one rectangle
      vec0 = (geometry.vertices[offset(x, y)] - geometry.vertices[offset(x   1, y)]);
      vec1 = (geometry.vertices[offset(x, y)] - geometry.vertices[offset(x, y   1)]);
      n_vec.crossInto(vec0, vec1).normalize();
      geometry.faces.add(new Face3(offset(x, y), offset(x   1, y), offset(x, y   1), n_vec, [colors[offset(x, y)], colors[offset(x   1, y)], colors[offset(x, y   1)]]));
      geometry.faces.add(new Face3(offset(x, y), offset(x, y   1), offset(x   1, y), n_vec.negate(), [colors[offset(x, y)], colors[offset(x, y   1)], colors[offset(x   1, y)]]));
      // the other one
      vec0 = (geometry.vertices[offset(x   1, y)] - geometry.vertices[offset(x   1, y   1)]);
      vec1 = (geometry.vertices[offset(x, y   1)] - geometry.vertices[offset(x   1, y   1)]);
      n_vec.crossInto(vec0, vec1).normalize();
      geometry.faces.add(new Face3(offset(x   1, y), offset(x   1, y   1), offset(x, y   1), n_vec, [colors[offset(x   1, y)], colors[offset(x   1, y   1)], colors[offset(x, y   1)]]));
      geometry.faces.add(new Face3(offset(x   1, y), offset(x, y   1), offset(x   1, y   1), n_vec.negate(), [colors[offset(x   1, y)], colors[offset(x, y   1)], colors[offset(x   1, y   1)]]));
    }
  }
  var material = new MeshLambertMaterial(vertexColors: VertexColors);
  var mesh = new Mesh(geometry, material);
  scene.add(mesh);
}
  

Похоже, ошибка связана с появлением этой строки:

   n_vec.crossInto(vec0, vec1).normalize();
  

Что здесь за нулевой объект и как мне это решить? Может ли переменная ‘z’ вызывать проблему? Сначала он показал null и вызвал аналогичную ошибку (что ‘*’ не может быть применен), и я объявил его как double, и это было решено. У меня также есть подозрение в приведенных ниже строках:

  data.forEach((col) {
    col.forEach((val) {
      geometry.vertices.add(new Vector3(x.toDouble(), y.toDouble(), z.toDouble()));
  

Ответ №1:

n_vec никогда не инициализируется экземпляром Vector3 . crossInto требуется для вызова экземпляра, либо вы сначала создаете экземпляр:

 Vector3 n_vec = new Vector3.zero();
...
n_vec.crossInto(vec0, vec1).normalize();
  

Или вы используете cross метод, но он создает новый экземпляр Vector3 (возможно, вы захотите избежать новых экземпляров, чем я бы переместил переменные из цикла):

 n_vec = vec0.cross(vec1).normalize();