blob: f27d4b8c7f1b667780dcb7f79812a38e73b51c8e [file] [log] [blame]
// Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details.
// All rights reserved. Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import 'package:test/test.dart';
import 'package:vector_math/vector_math.dart';
Vector2 $v2(double x, double y) => Vector2(x, y);
Vector3 $v3(double x, double y, double z) => Vector3(x, y, z);
Vector4 $v4(double x, double y, double z, double w) => Vector4(x, y, z, w);
void relativeTest(dynamic output, dynamic expectedOutput) {
final errorThreshold = 0.0005;
final num error = relativeError(output, expectedOutput).abs();
expect(error >= errorThreshold, isFalse,
reason: '$output != $expectedOutput : relativeError = $error');
}
void absoluteTest(dynamic output, dynamic expectedOutput) {
final errorThreshold = 0.0005;
final num error = absoluteError(output, expectedOutput).abs();
expect(error >= errorThreshold, isFalse,
reason: '$output != $expectedOutput : absoluteError = $error');
}
dynamic makeMatrix(int rows, int cols) {
if (rows != cols) {
return null;
}
if (cols == 2) {
return Matrix2.zero();
}
if (cols == 3) {
return Matrix3.zero();
}
if (cols == 4) {
return Matrix4.zero();
}
return null;
}
T parseMatrix<T>(String input) {
input = input.trim();
final rows = input.split('\n');
final values = <double>[];
var col_count = 0;
for (var i = 0; i < rows.length; i++) {
rows[i] = rows[i].trim();
final cols = rows[i].split(' ');
for (var j = 0; j < cols.length; j++) {
cols[j] = cols[j].trim();
}
for (var j = 0; j < cols.length; j++) {
if (cols[j].isEmpty) {
continue;
}
if (i == 0) {
col_count++;
}
values.add(double.parse(cols[j]));
}
}
final dynamic m = makeMatrix(rows.length, col_count);
for (var j = 0; j < rows.length; j++) {
for (var i = 0; i < col_count; i++) {
m[m.index(j, i)] = values[j * col_count + i];
//m[i][j] = values[j*col_count+i];
}
}
return m as T;
}
T parseVector<T extends Vector>(String v) {
v = v.trim();
final Pattern pattern =
RegExp('[\\s]+', multiLine: true, caseSensitive: false);
final rows = v.split(pattern);
final values = <double>[];
for (var i = 0; i < rows.length; i++) {
rows[i] = rows[i].trim();
if (rows[i].isEmpty) {
continue;
}
values.add(double.parse(rows[i]));
}
Vector r;
if (values.length == 2) {
r = Vector2(values[0], values[1]);
} else if (values.length == 3) {
r = Vector3(values[0], values[1], values[2]);
} else if (values.length == 4) {
r = Vector4(values[0], values[1], values[2], values[3]);
} else {
throw UnimplementedError();
}
return r as T;
}