Removed some redundant classes from bluepixle.js and moved matrix class to bluemath.js

This commit is contained in:
bluesaxman 2022-02-08 12:37:06 -07:00
parent d29d4e9366
commit 1611f58512
2 changed files with 83 additions and 198 deletions

View File

@ -157,3 +157,85 @@ function normalizeArray(array) {
var sum = array.reduce((a,b) => a+b); var sum = array.reduce((a,b) => a+b);
return array.map(v => v/sum); return array.map(v => v/sum);
} }
class matrix {
constructor (data) {
var me = this;
this.data = [];
this.rows = 0;
this.cols = 0;
if (!Array.isArray(data)) {
me.data.push([typeof data == "number" ? data : 0]);
me.cols = me.data.length;
me.rows = me.data[0].length;
} else {
me.cols = data.length;
me.rows = data[0].length;
for (var i = 0; i < me.cols; i++) {
var thisCol = [];
for (var j = 0; j < me.rows; j++) {
thisCol.push(data[i][j]);
}
me.data.push(thisCol);
}
}
this.getRow = function (row) {
return me.data.map(function (col) { return col[row]; });
}
this.addRow = function (rowData) {
if (!Array.isArray(rowData)) { return console.error("Not provided an array: "+rowData); }
me.data.forEach(function (col,i) { if (!(rowData[i])) { rowData[i] = 0; } col.push(rowData[i]); });
}
this.getCol = function (col) {
return Array.from(me.data[col]);
}
this.addCol = function (colData) {
if (!Array.isArray(colData)) { return console.error("Not provided an array: "+colData); }
colData = me.data[0].map(function (a,x) { if (colData[x]) { return colData[x]; } else { return 0;} });
me.data.push(colData);
}
this.transpose = function () {
var resultCols = me.rows;
var newData = [];
for (var c = 0; c < resultCols; c++) {
newData.push(me.getRow(c));
}
return new matrix(newData);
}
this.multMat = function (matB) {
if (!(matB instanceof matrix)) { return console.error("Must provide matrix for this method"); }
if (me.cols != matB.rows) { return console.error("The number of columns in the first matrix should be equal to the number of rows in the second\n"+JSON.stringify(me.data)+" x "+JSON.stringify(matB.data)) }
var resultRows = me.rows;
var resultCols = matB.cols;
var newData = [];
for (var c = 0; c < resultCols; c++) {
var bcol = matB.getCol(c);
var thisCol = [];
for (var r = 0; r < resultRows; r++) {
thisCol.push(me.getRow(r).map(function (a,i) { var res = a * bcol[i]; return isNaN(res) ? 0 : res; }).reduce(function (a,b) { return a + b; }) );
}
newData.push(thisCol);
}
return new matrix(newData);
}
this.multNum = function (num) {
if (typeof num != "number") { return console.error("Must provide a number, provided "+(typeof num)); }
return new matrix(me.data.map(function (a) { return a.map(function (b) { var res = b * num; return isNaN(res) ? 0 : res; }); }));
}
this.addMat = function (matB) {
if (!(matB instanceof matrix)) { return console.error("Must provide matrix for this method"); }
if (me.cols != matB.cols) {return console.error("Matrices must be of the same width"); }
if (me.rows != matB.rows) {return console.error("Matrices must be of the same height"); }
return new matrix(me.data.map(function (col,x) { return col.map(function (a,y) { var res = a + matB.data[x][y]; return isNaN(res) ? 0 : res; }); }));
}
}
}

View File

@ -1,13 +1,6 @@
// bluepixle.js // bluepixle.js
// This library is to help make using canvas tags easier // This library is to help make using canvas tags easier
// requires bluemath.js
function deg2rad (deg) {
return ((Math.PI*2)/360)*deg;
}
function rad2deg (rad) {
return (1/deg2rad(1))*rad;
}
function drift(object) { function drift(object) {
if (object instanceof container) { if (object instanceof container) {
@ -20,19 +13,6 @@ function drift(object) {
} }
} }
function getAngle(ax,ay,bx,by) {
var deltaX = bx - ax;
var deltaY = by - ay;
return rad2deg(Math.atan2(deltaY,deltaX));
}
function reflect(inAngle,surfaceAngle) {
var normal = surfaceAngle+90;
var theta1 = normal - inAngle;
var theta2 = normal + theta1;
return theta2;
}
function bounce(object, surface, impactTime) { function bounce(object, surface, impactTime) {
object.direction = reflect(object.direction,surface.direction-90); object.direction = reflect(object.direction,surface.direction-90);
object.speed = object.speed; object.speed = object.speed;
@ -180,183 +160,6 @@ function drawPixel (ctx, x, y, r, g, b, a) {
ctx.putImageData(new ImageData(new Uint8ClampedArray([r,g,b,a]),1,1),x,y); ctx.putImageData(new ImageData(new Uint8ClampedArray([r,g,b,a]),1,1),x,y);
} }
class matrix {
constructor(m,n,matrixArray) {
if (matrixArray.length != m*n) {
return new RangeError("the size of the array does not match the size of the matrix!");
} else {
this.array = [];
for (var row = 0; row < m; row++) {
this.array[row] = [];
for (var col = 0; col < n; col++) {
this.array[row][col] = matrixArray[n*row+col];
}
}
this.m = m;
this.n = n;
}
}
log() {
var string = "";
for (var row = 0; row < this.m; row++) {
string += "[";
for( var col = 0; col < this.n; col++) {
string += this.array[row][col];
string += ",";
}
string += "]";
console.log(string);
string = "";
}
}
add(matrixb) {
if (
matrixb.m == this.m &&
matrixb.n == this.n
) {
matrixb.array.forEach( function(row,rowIndex) {
row.forEach( function(col,colIndex) {
this.array[rowIndex][colIndex] += col;
});
});
} else {
throw new RangeError("cannot add matricies of different dimentions.");
}
}
scalarMult(scalar) {
var data = this.array;
data.forEach( function(row,rI) {
row.forEach( function(col,cI) {
data[rI][cI] *= scalar;
});
});
}
transpose() {
var tArray = [];
for (var row = 0; row < this.n; row++) { tArray[row] = []; }
for (var row = 0; row < this.m; row++) {
for (var col = 0; col < this.n; col++) {
tArray[col][row] = this.array[row][col];
}
}
var rawArray = [];
tArray.forEach(function (row,rI) {
row.forEach( function(col,cI) {
rawArray.push(tArray[rI][cI]);
});
});
return new matrix(this.n,this.m,rawArray);
}
multiply(matrixb) {
if (matrixb.m == this.n) {
var m = this.m;
var n = this.n;
var p = matrixb.n;
var A = this;
var B = matrixb;
var newMatrix = [];
for (var i = 0; i < m; i++) {
newMatrix[i] = [];
for (var j = 0; j < p; j++) {
var sum = 0;
for (var k = 0; k < n; k++) {
sum += A.array[i][k] * B.array[k][j];
}
newMatrix[i][j] = sum;
}
}
var rawArray = [];
newMatrix.forEach(function (row,rI) {
row.forEach( function (col,cI) {
rawArray.push(newMatrix[rI][cI]);
});
});
return new matrix(m,p,rawArray);
} else {
return undefined;
}
}
}
class point {
constructor(x,y) {
this.x = "number" == typeof x ? x : 0;
this.y = "number" == typeof y ? y : 0;
}
getCoords() {
return [this.x,this.y];
}
setCoords(x,y) {
this.x = "number" == typeof x ? x : 0;
this.y = "number" == typeof y ? y : 0;
}
setX(x) {
this.x = "number" == typeof x ? x : 0;
}
setY(y) {
this.y = "number" == typeof y ? y : 0;
}
}
class vector {
constructor(direction,magnitude) {
this.direction = "number" == typeof direction ?
0 <= direction ?
360 >= direction ? direction : 360 : 0 : 0;
this.magnitude = "number" == typeof magnitude ? magnitude : 0;
}
getXYcomponents() {
var theta = deg2rad(this.direction);
var deltaX = Math.cos(theta)*this.magnitude;
var deltaY = Math.sin(theta)*this.magnitude;
return {"dx":deltaX,"dy":deltaY};
}
adjustMag(value) {
this.magnitude += "number" == typeof value ? value : 0;
}
setMag(value) {
this.magnitude = "number" == typeof value ? value : this.magnitude;
}
adjustDir(value) {
value = 0 <= value ? 360 >= value ? value: 360 : 0;
this.direction += value;
}
setDir(value) {
this.direction = 0 <= value ? 360 >= value ? value: 360 : 0;
}
executeVector(x,y) {
var components = this.getXYcomponents();
return new point(x+components.dx,y+components.dy);
}
crossProduct(vectorB) {
if (vectorB instanceof vector) {
var V1 = this.executeVector(0,0);
var V2 = vectorB.executeVector(0,0);
return (Math.sin(V1.x) * Math.cos(V2.y))
- (Math.cos(V1.y) * Math.sin(V2.x));
} else {
throw new TypeError("object is not a vector");
}
}
}
class lineSeg { class lineSeg {
constructor(x1,y1,x2,y2) { constructor(x1,y1,x2,y2) {
this.pointA = new point(x1,y1); this.pointA = new point(x1,y1);