/*
* Copyright (C) 2010-2014 Mathias Unberath
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.conrad.io;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.StringTokenizer;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
/**
* Class to read a 3x3 rotation matrix and a translation vector stored in a file.
* The reader assumes a 3x4 space separated structure containing the translation vector as the 4th column.
* @author Mathias Unberath
*
*/
public class RotTransIO {
/**
* The file to be read.
*/
private String filename;
private SimpleMatrix rotation;
private SimpleVector translation;
//==========================================================================================
// METHODS
//==========================================================================================
public RotTransIO(String filename){
this.filename = filename;
try {
read();
} catch (IOException e) {
e.printStackTrace();
}
}
public SimpleMatrix getAffineMapping(){
SimpleMatrix out = new SimpleMatrix(4,4);
out.setSubMatrixValue(0, 0, rotation);
out.setSubColValue(0, 3, translation);
out.setElementValue(3, 3, 1);
return out;
}
public SimpleMatrix getRotation(){
return this.rotation;
}
public SimpleVector getTranslation(){
return this.translation;
}
public void newFile(String filename){
this.filename = filename;
try {
read();
} catch (IOException e) {
e.printStackTrace();
}
}
public RotTransIO(String filename, SimpleMatrix rot, SimpleVector trans){
this.filename = filename;
write(rot, trans);
}
/**
* Read the rotation and translation in filename.
* @throws IOException
*/
private void read() throws IOException{
SimpleMatrix rotation = new SimpleMatrix(3,3);
SimpleVector translation = new SimpleVector(3);
FileReader fr = new FileReader(filename);
BufferedReader br = new BufferedReader(fr);
String line = br.readLine(); // skip first line
StringTokenizer tok;
// read rotation matrix 3x3 and translation 3x1
for (int i = 0; i < 3; i++){
line = br.readLine();
tok = new StringTokenizer(line);
SimpleVector row = new SimpleVector(Float.parseFloat(tok.nextToken()), Float.parseFloat(tok.nextToken()), Float.parseFloat(tok.nextToken()));
rotation.setRowValue(i, row);
translation.setElementValue(i, Float.parseFloat(tok.nextToken()));
}
br.close();
fr.close();
this.rotation = rotation;
this.translation = translation;
}
private void write(SimpleMatrix rot, SimpleVector trans){
assert(filename != null && rot.getCols() == 3 && rot.getRows() == 3 && trans.getLen() == 3) : new Exception();
try {
PrintWriter writer = new PrintWriter(filename,"UTF-8");
writer.println("ROTATION | TRANSLATION");
for(int i = 0; i < rot.getRows(); i++){
String line = "";
for( int j = 0; j < rot.getCols() + 1; j++){
line += " ";
line += (j != rot.getCols()) ? rot.getElement(i, j):trans.getElement(i);
}
writer.println(line);
}
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}