Quelltext von Matrix.java |
/* |
* Matrix.java |
* |
* Created on 30. September 2004, 13:55 |
*/ |
|
/** |
* {@link NewPolygon} |
* {@link Polyeder} |
* |
* Diese Klasse stellt eine 4 * 4 main_matrix bereit, mit deren Hilfe |
* Rotationen, Skalierung und Translation von 3D-Objecten berechnet werden |
* koennen. Das Besondere hieran ist, das zunaechst alle Bewegungen ueber |
* die entsprechenden Methoden uebergeben werden und dann die main_matrix |
* alle Berechnungen in einem Vorgang uebernimmt. Die Berechnung uebergebener |
* Punkte wird durch die Methode update durchgefuehrt. |
* |
* @author Rüdiger Witte-Petersen |
*/ |
public class Matrix { |
|
/**Die Hauptmatrix*/ |
double[][] main_matrix = new double[4][4]; |
|
/** Neue Instanz der Klasse Matrix uebergibt eine Einheitsmatrix*/
|
public Matrix() { |
clear(); |
} |
|
/** initialisiert ein Matrixobjekt als Einheitsmatrix. Wird im Konstruktor |
* aufgerufen und dient beim Verwenden dieser Klasse dazu, die gespei- |
* cherten Multiplikationen einer main_matrix zu loeschen.
|
*/ |
public void clear() { |
main_matrix[0][0] = 1; |
main_matrix[0][1] = 0; |
main_matrix[0][2] = 0; |
main_matrix[0][3] = 0; |
main_matrix[1][0] = 0; |
main_matrix[1][1] = 1; |
main_matrix[1][2] = 0; |
main_matrix[1][3] = 0; |
main_matrix[2][0] = 0; |
main_matrix[2][1] = 0; |
main_matrix[2][2] = 1; |
main_matrix[2][3] = 0; |
main_matrix[3][0] = 0; |
main_matrix[3][1] = 0; |
main_matrix[3][2] = 0; |
main_matrix[3][3] = 1; |
} |
|
/** Methode uebergibt durch Matrizenmultiplikation die erhaltenen
|
* Parameter xs, ys und zs an die main_matrix. Die main_matrix kann |
* die Skalierung zusammen mit allen anderen Bewegungen in einer
|
* Berechnung durchfuehren. Eingabe 0 nicht moeglich, Eingabe 1 ergibt |
* fuer die jeweilige Richtung keine Aenderung, > 0 bis < 1 verkleinert, |
* > 1 vergroessert. |
* @param xs scale Wert x |
* @param ys scale Wert y |
* @param zs scale Wert z |
*/ |
public void scale(double xs, double ys, double zs) { |
double[][] sm = {{ xs, 0, 0, 0 }, |
{ 0, ys, 0, 0 }, |
{ 0, 0, zs, 0 }, |
{ 0, 0, 0, 1 }}; |
multiplicate(sm); |
} |
|
/** Methode uebergibt durch Matrizenmultiplikation die erhaltenen
|
* Parameter xt, yt und zt an die main_matrix. Die main_matrix
|
* kann die Translation zusammen mit allen anderen Bewegungen
|
* in einer Berechnung ausfuehren. |
* @param xt Translationswert x |
* @param yt Translationswert y |
* @param zt Translationswert z |
*/ |
public void translate(double xt, double yt, double zt) { |
double[][] tm = {{ 1, 0, 0, 0 }, |
{ 0, 1, 0, 0 }, |
{ 0, 0, 1, 0 }, |
{ xt, yt, zt, 1 }}; |
multiplicate(tm); |
} |
|
/** |
* Methode uebergibt durch Matrizenmultiplikationen die erhaltenen |
* Parameter xa, ya und za an die main_matrix. Dadurch wird die
|
* main_matrix in die Lage versetzt, die uebergebenen Rotationen
|
* incl. aller anderen Bewegungen in einer Berechnung weiterzugeben. |
* Wenn um einige Achsen keine Rotation gewuenscht wird, 0 uebergeben. |
* @param xa Rotationswert x |
* @param ya Rotationswert y |
* @param za Rotationswert z |
*/ |
public void rotate(double xa, double ya, double za) { |
//Matrix Rotation um x-Achse |
double[][] rx = {{ 1, 0, 0, 0 }, |
{ 0, Math.cos(xa), Math.sin(xa), 0 }, |
{ 0, -Math.sin(xa), Math.cos(xa), 0 }, |
{ 0, 0, 0, 1 }}; |
//Matrix Rotation um y-Achse |
double[][] ry = {{ Math.cos(ya), 0, -Math.sin(ya), 0 }, |
{ 0, 1, 0, 0 }, |
{ Math.sin(ya), 0, Math.cos(ya), 0 }, |
{ 0, 0, 0, 1 }}; |
//Matrix Rotation um z-Achse |
double[][] rz = {{ Math.cos(za), Math.sin(za), 0, 0 }, |
{ -Math.sin(za), Math.cos(za), 0, 0 }, |
{ 0, 0, 1, 0 }, |
{ 0, 0, 0, 1 }}; |
|
//Rotationsmatrizen multiplizieren |
multiplicate(rx); |
multiplicate(ry); |
multiplicate(rz); |
} |
|
/** |
* Methode ermoeglicht das Multiplizieren von zwei 4 x 4 Matrizen. |
* Die Klassenmatrize main_matrix kann mit entsprechenden Matrizen |
* der Methoden rotate, translate und scale multipliziert werden und |
* somit die entsprechenden Bewegungen gemeinsam umsetzen. |
* Achtung: Die main_matrix steht bei dieser Multiplikation vorn und |
* Matrizen mit den Bewegungsvariablen an zweiter Stelle. |
*/ |
private void multiplicate(double[][] n_m) { |
//temporaere Matrix |
double[][] temp = new double[4][4]; |
|
//Doppelschleife errechnet die neue Matrix, speichert in temp |
for(int row = 0; row < 4; row++) { |
for(int column = 0; column < 4; column++) { |
temp[row][column] = main_matrix[row][0] * n_m[0][column] + |
main_matrix[row][1] * n_m[1][column] +
|
main_matrix[row][2] * n_m[2][column] +
|
main_matrix[row][3] * n_m[3][column];
|
} |
} |
|
//Kopieren von temp in die main_matrix |
for(int row = 0; row < 4; row++) { |
for(int column = 0; column < 4; column++) { |
main_matrix[row][column] = temp[row][column]; |
} |
} |
} |
|
/** |
* |
* Methode multipliziert ein Array von uebergebenen Punkten P( mit den |
* Koordinaten x, y, z und 1) mit der main_matrix und berechnet ein Array |
* mit den neuen Punkten P'. Dieses wird dann returniert. |
* Achtung: Das uebergebene Array steht bei der Multiplikation vorn und |
* main_matrix an zweiter Stelle. Matrizenmultiplikation ist nicht |
* kommutativ. |
* @param koord uebergebene Matrix, die multipliziert werden soll
|
* @return berechnete Matrix wird zurueckgegeben |
*/ |
public double[][] update(double[][] koord) { |
double[][] temp = new double[4][koord[0].length]; |
if(main_matrix[0].length != koord.length) {
|
System.out.println("Matrizen können nicht miteinander" + |
" multipliziert werden");
|
} else { |
for(int i = 0; i < 4; i++) { |
for(int j = 0; j < koord[0].length; j++) { |
for(int k = 0; k < 4; k++) { |
temp[i][j] = temp[i][j] + |
(koord[k][j] * main_matrix[k][i]);
|
} |
} |
} |
} |
for(int i = 0; i < 4; i++) { |
for(int j = 0; j < koord[0].length; j++) { |
koord[i][j] = temp[i][j]; |
} |
} |
return koord; |
} |
|
/** |
* Ermoeglicht das Anzeigen der main_matrix zu testzwecken |
*/ |
public void print() { |
for(int i = 0; i < 4; i++) { |
for(int j = 0; j < 4; j++) { |
System.out.print(main_matrix[i][j] + " "); |
} |
System.out.println(""); |
} |
} |
} |