#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();