package com.verictas.pos.simulator.mathUtils; import javax.vecmath.GMatrix; import javax.vecmath.Vector3d; public class Vector3dMatrix extends GMatrix { /** * Creates a new matrix with some helper functions for use with Vector3f. The created matrix will be empty. * @param n The number of rows. * @param m The number of columns. */ public Vector3dMatrix(int n, int m) { // Change the size to suit Vector3d super(n, m * 3); this.setZero(); } /** * Set the size of the matrix in the amount of vectors (e.g. a 1 x 3 vector matrix gets converted to a 1 x 9 storage matrix). * @param n The amount of rows * @param m The amount of columns expressed in vectors (1 vector = 3 values). */ public void setSizeInVectors(int n, int m) { this.setSize(n, m * 3); } /** * Provides a function for putting the matrix into String form for visualisation. * @return String */ public String toString() { StringBuffer buffer = new StringBuffer(this.getNumRow() * this.getNumCol() * 8); for(int n = 0; n < this.getNumRow(); ++n) { for(int m = 0; m < this.getNumCol(); ++m) { if ((m + 1) == 1 || m % 3 == 0) { // If m is 1 or a multiple of 4, begin the bracket. buffer.append("(").append(this.getElement(n, m)).append(", "); } else if ((m + 1) % 3 == 0) { // If m is a multiple of 3, close the bracket buffer.append(this.getElement(n, m)).append(")\t\t"); } else { buffer.append(this.getElement(n, m)).append(", "); } } buffer.append("\n"); } return buffer.toString(); } /** * Provides a translator from the vector positions (e.g. the second vector starts at position 1) to the matrix positions (the second vector starts at position 3). * @param n The vector positions row * @param m The vector positions column * @return void */ private int[] translatePosition(int n, int m) { return new int[]{n, m * 3}; } /** * Provides a way to set a vector into a certain position in the matrix * @param settable The vector you want to put in the matrix * @param n The row to insert into * @param m The column to insert into */ public void setPosition(Vector3d settable, int n, int m) { int[] position = translatePosition(n, m); n = position[0]; m = position[1]; this.setElement(n, m, settable.x); this.setElement(n, m + 1, settable.y); this.setElement(n, m + 2, settable.z); } /** * Provides a way to get a vector from a certain position in the matrix * @param n The row to get from * @param m The column to get from * @return Vector3d The vector in that position */ public Vector3d getPosition(int n, int m) { int[] position = translatePosition(n, m); n = position[0]; m = position[1]; double x = this.getElement(n, m); double y = this.getElement(n, m + 1); double z = this.getElement(n, m + 2); return new Vector3d(x, y, z); } /** * Provides a way to calculate the result vector of a certain row * @param row The row to calculate the total of * @return Vector3d */ public Vector3d getRowTotal(int row) { double[] rowTotal = new double[this.getNumCol()]; this.getRow(row, rowTotal); // Create an empty vector to store the result Vector3d resultVector = new Vector3d(0,0,0); for(int i = 0; i < this.getNumCol(); i = i + 3) { // For every third entry (including 0). double x = this.getElement(row, i); double y = this.getElement(row, i + 1); double z = this.getElement(row, i + 2); resultVector.add(new Vector3d(x, y, z)); } return resultVector; } /** * Provides a way to calculate the result vector of a certain column * @param column The column to calculate the total of * @return Vector3d */ public Vector3d getColumnTotal(int column) { double[] columnTotal = new double[this.getNumRow()]; // Translate the column number to the correct vector column int[] position = translatePosition(0, column); column = position[1]; this.getColumn(column, columnTotal); // Create an empty vector to store the result Vector3d resultVector = new Vector3d(0,0,0); for(int i = 0; i < this.getNumRow(); i++) { // For every entry (including 0). double x = this.getElement(i, column); double y = this.getElement(i, column + 1); double z = this.getElement(i, column + 2); resultVector.add(new Vector3d(x, y, z)); } return resultVector; } }