// [a b c alpha beta gamma m00 m01 m02 m03 m10 m11.... m20...]
// this is for PDB and CIF reader
float[] scaleMatrix = new float[16];
for (int i = 0; i < 16; i++)
scaleMatrix[i] = parameters[6 + i];
matrixCartesianToFractional = new Matrix4f(scaleMatrix);
matrixFractionalToCartesian = new Matrix4f();
matrixFractionalToCartesian.invert(matrixCartesianToFractional);
} else if (parameters.length > 14 && !Float.isNaN(parameters[14])) {
// parameters with a 3 vectors
// [a b c alpha beta gamma ax ay az bx by bz cx cy cz...]
Matrix4f m = matrixFractionalToCartesian = new Matrix4f();
m.setColumn(0, parameters[6], parameters[7], parameters[8], 0);
m.setColumn(1, parameters[9], parameters[10], parameters[11], 0);
m.setColumn(2, parameters[12], parameters[13], parameters[14], 0);
m.setColumn(3, 0, 0, 0, 1);
matrixCartesianToFractional = new Matrix4f();
matrixCartesianToFractional.invert(matrixFractionalToCartesian);
} else {
Matrix4f m = matrixFractionalToCartesian = new Matrix4f();
// 1. align the a axis with x axis
m.setColumn(0, a, 0, 0, 0);
// 2. place the b is in xy plane making a angle gamma with a
m.setColumn(1, (float) (b * cosGamma), (float) (b * sinGamma), 0, 0);
// 3. now the c axis,
// http://server.ccl.net/cca/documents/molecular-modeling/node4.html
m.setColumn(2, (float) (c * cosBeta), (float) (c
* (cosAlpha - cosBeta * cosGamma) / sinGamma), (float) (volume / (a
* b * sinGamma)), 0);
m.setColumn(3, 0, 0, 0, 1);
matrixCartesianToFractional = new Matrix4f();
matrixCartesianToFractional.invert(matrixFractionalToCartesian);
}
matrixCtoFAbsolute = matrixCartesianToFractional;
matrixFtoCAbsolute = matrixFractionalToCartesian;
}