Skip to content

Commit

Permalink
added ortho
Browse files Browse the repository at this point in the history
  • Loading branch information
fibo committed Oct 26, 2012
1 parent 5e02408 commit 203c3b1
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 42 deletions.
14 changes: 12 additions & 2 deletions examples/RealVector.js
Expand Up @@ -8,10 +8,13 @@ var Rn = algebra.Real.VectorSpace;
var R3 = new Rn(3);

//Then we can ask the R3 space to give us a vector.
//The constructor arguments are the elements of the vector.
//Since we are using R3, i.e. the three dimensional euclidean space,
//the elements are real numbers.

var v1 = new R3.Vector(1, 0, 1);

//Let see the coordinates of our brand new vector v1.
//You can see the coordinates of our brand new vector v1.

console.log(v1.getCoordinates());

Expand Down Expand Up @@ -44,12 +47,19 @@ var v2 = new R3.Vector(0, 1, 0);
//It is defined a dot product in every Rn. It returns a real number: when this
//number is zero, it means that the vectors are orthogonal.

if(v1.dot(v2).eq(0)) {
if (v1.dot(v2).eq(0)) {
console.log('v1 and v2 are orthogonal');
}

//There is also a shortcut to check orthogonality, the "ortho" method, see below.

//Since we are in R3, it is also defined a cross product.
//The cross product is an (dim-1)-ary operator, so in R3 it is binary.

var v3 = v1.cross(v2);

//Now we have three vectors v1, v2, v3 that are orthogonal and spans R3: they form a basis.

if (v1.ortho(v2) && v1.ortho(v3) && v2.ortho(v3)) {
console.log('<v1, v2, v3> is a basis of R3');
}
7 changes: 6 additions & 1 deletion lib/Real/Element.js
@@ -1,5 +1,5 @@

var RealElement = function(arg) {
var RealElement = function (arg) {
var self = this;

var _num = 0;
Expand All @@ -23,6 +23,11 @@ var RealElement = function(arg) {
return (num == _num);
}

// TODO questo sarebbe da mettere in una classe padre, GroupElement
self.isZero = function () {
return self.eq(0);
}

self.neg = function () {
_num = 0 - _num;

Expand Down
53 changes: 37 additions & 16 deletions lib/Vector.js
Expand Up @@ -11,40 +11,54 @@ function Vector(arg) {
self.getElement = function (i) { return _elements[i]; }
self.getElements = function () { return _elements; }


self.r4c = function (matrix) {
// TODO moltiplicazione righe per colonne
self.eq = function (vector) {
result = true;

for (var i in self.getElements()) {
if (!_elements[i].eq(vector.getElement(i))) {
result = false;
continue;
}
}
return result;
}

self.scalar = function (scalar) {
for(var i in _elements) {
_elements[i].mul(scalar);
self.add = function (vector) {
for (var i in self.getElements()) {
_elements[i].add(vector.getElement(i));
}
return self;
}

self.add = function(vector) {
for(var i in self.getElements()) {
_elements[i].add(vector.getElement(i));
self.sub = function (vector) {
for (var i in self.getElements()) {
_elements[i].sub(vector.getElement(i));
}

return self;
}

self.sub = function(vector) {
for(var i in self.getElements()) {
_elements[i].sub(vector.getElement(i));
self.scalar = function (scalar) {
for (var i in _elements) {
_elements[i].mul(scalar);
}
return self;
}

self.dot = function(vector) {
self.dot = function (vector) {
var scalar = _elements[0].clone();
for(var i in self.getElements()) {

for (var i in self.getElements()) {
scalar.add(scalar.mul(vector.getElement(i)));
}

return scalar;
}

self.ortho = function (vector) {
return self.dot(vector).isZero();
}

if (self.getDim() == 3) {
self.cross = function (vector) {
var field = _space.getField();
Expand All @@ -64,9 +78,14 @@ function Vector(arg) {
return self;
}
}

self.r4c = function (matrix) {
// TODO moltiplicazione righe per colonne
}

}

Vector.prototype.clone = function() {
Vector.prototype.clone = function () {
var arg = {};

arg.elements = this.getElements();
Expand All @@ -75,7 +94,9 @@ Vector.prototype.clone = function() {
return new Vector(arg);
}

Vector.prototype.inspect = function() {
// TOOD ve3di se e' da togliere, vedi anche i toString
// o come fare in generale
Vector.prototype.inspect = function () {
return this.getElements();
}

Expand Down
66 changes: 43 additions & 23 deletions test/Real/Vector.js
Expand Up @@ -10,35 +10,31 @@ var Rn = algebra.Real.VectorSpace;
var R3 = new Rn(3);

describe('RealVector', function () {
describe('constructor', function () {
it('', function() {
describe('constructor:', function () {
it('works', function () {
});
});

describe('inherits', function () {
it('from Vector', function() {
describe('inheritance:', function () {
it('from Vector', function () {
//var v = new R3.Vector();
//assert.ok(v instanceof Vector);
});
});

// TODO uniforma tutti i test che controllano la funzione clone().
describe('clone()', function () {
it('...', function() {
it('...', function () {
});
});

describe('x(<Integer>', function () {
it('returns the i-esim coordinate', function() {
var vector = new R3.Vector(1, 2, 3);
assert.equal(vector.x(0), 1);
assert.equal(vector.x(1), 2);
assert.equal(vector.x(2), 3);
describe('eq(<Vector>)', function () {
it('...', function () {
});
});

describe('getElements()', function () {
it('returns the vector elements', function() {
it('returns the vector elements', function () {
var zero = new Real(0);
var vector = new R3.Vector(zero, 1, 2);
var elements = vector.getElements();
Expand All @@ -49,7 +45,7 @@ describe('RealVector', function () {
});

describe('getElement()', function () {
it('returns the vector elements', function() {
it('returns the vector elements', function () {
var zero = new Real(0);
var vector = new R3.Vector(zero, 1, 2);
var element = vector.getElement(0);
Expand All @@ -58,7 +54,7 @@ describe('RealVector', function () {
});

describe('scalar(<number|Real>)', function () {
it('implements multiplication by a scalar', function() {
it('implements multiplication by a scalar', function () {
var vector = new R3.Vector(1, 1, 1);

var two = new Real(2);
Expand All @@ -69,7 +65,7 @@ describe('RealVector', function () {
assert.equal(vector.x(2), 2);
});

it('coerces number type', function() {
it('coerces number type', function () {
var vector = new R3.Vector(1, 1, 1);

vector.scalar(2);
Expand All @@ -79,7 +75,7 @@ describe('RealVector', function () {
assert.equal(vector.x(2), 2);
});

it('can be chained', function() {
it('can be chained', function () {
var vector = new R3.Vector(1, 1, 1);

vector.scalar(2).scalar(4);
Expand All @@ -91,7 +87,7 @@ describe('RealVector', function () {
});

describe('dot(<Vector>)', function () {
it('implements dot product operator', function() {
it('implements dot product operator', function () {
var v1 = new R3.Vector(0, 0, 1);
var v2 = new R3.Vector(0, 1, 0);

Expand All @@ -103,7 +99,7 @@ describe('RealVector', function () {

describe('R3 Vector', function () {
describe('cross(<Vector>)', function () {
it('implements cross product operator', function() {
it('implements cross product operator', function () {
var v1 = new R3.Vector(0, 0, 1);
var v2 = new R3.Vector(0, 1, 0);

Expand All @@ -117,7 +113,7 @@ describe('RealVector', function () {
});

describe('add(<Vector>)', function () {
it('implements vector addition operation', function() {
it('implements vector addition operation', function () {
var vector1 = new R3.Vector(1, 2, 3);
var vector2 = new R3.Vector(1, -1, 1);

Expand All @@ -128,7 +124,7 @@ describe('RealVector', function () {
assert.equal(vector1.x(2), 4);
});

it('can be chained', function() {
it('can be chained', function () {
var vector1 = new R3.Vector(1, 1, 1);
var vector2 = new R3.Vector(2, 2, 2);
var vector3 = new R3.Vector(4, 4, 4);
Expand All @@ -142,7 +138,7 @@ describe('RealVector', function () {
});

describe('sub(<Vector>)', function () {
it('implements vector subtraction operation', function() {
it('implements vector subtraction operation', function () {
var vector1 = new R3.Vector(1, 2, 3);
var vector2 = new R3.Vector(1, -1, 1);

Expand All @@ -153,7 +149,7 @@ describe('RealVector', function () {
assert.equal(vector1.x(2), 2);
});

it('can be chained', function() {
it('can be chained', function () {
var vector1 = new R3.Vector(1, 1, 1);
var vector2 = new R3.Vector(2, 2, 2);
var vector3 = new R3.Vector(4, 4, 4);
Expand All @@ -166,13 +162,37 @@ describe('RealVector', function () {
});
});

describe('ortho(<Vector>)', function () {
it('returns true if two vectors are orthogonal', function () {
var vector1 = new R3.Vector(1, 0, 1);
var vector2 = new R3.Vector(0, 1, 0);

assert.ok(vector1.ortho(vector2));
});
});

describe('r4c(<Matrix>)', function () {
it('implements right multiplication by matrix', function () {
});
});

describe('getCoordinates()', function () {
it('returns an array of numbers', function() {
it('returns an array of numbers', function () {
var vector = new R3.Vector(1, 2, 3);

assert.deepEqual(vector.getCoordinates(), [1, 2, 3]);
});
});

describe('x(<Integer>', function () {
it('returns the i-esim coordinate', function () {
var vector = new R3.Vector(1, 2, 3);
assert.equal(vector.x(0), 1);
assert.equal(vector.x(1), 2);
assert.equal(vector.x(2), 3);
});
});

});


0 comments on commit 203c3b1

Please sign in to comment.