Hello one and all.

I've been tampering with rotation matrixes and the lot, and even though i can manage the more simpler rotation around the three axes. my attempts at trying it around an arbitrary fixed point (xyz) deson't work aswell as i would have hoped.

It seems to work 80% of the time :) however, this seems only to be a result of the right combination of (xyz) vector for rotation and the angle chosen to rotate by. If its wrong i get a number which is > then 1 or < -1 and when used in conjunction with arcsin gives a -1.#IND output.

my method was originall based around euler angles and quaternions found in http://en.wikipedia.org/wiki/Convers...d_Euler_angles

essentailly computing q0-q3 and then using these to compute the euler angles

It's only a partial piece of the code however, and i can't seem to figure out why it works on some occassions and then not on others. To me it seems that the equations set out in the wiki correspond to what i have coded but i still occasionally get errors from this part:Code:`for (i = 0; i < PopSize; i++)`

{

angle = rand()%361+0.001;

// convert to radian???

angle = angle * (PI / 180);

cout << "Angle: " << angle << endl;

// convert to euler angles

q0 = cos(angle/2);

cout << "q0: " << q0 << endl;

q1 = sin(angle/2) * (cos(Pop[i][5][0])); // rotate around 5th atom

cout << "q1: " << q1 << endl;

q2 = sin(angle/2) * (cos(Pop[i][5][1]));

cout << "q2: " << q2 << endl;

q3 = sin(angle/2) * (cos(Pop[i][5][2]));

cout << "q3: " << q3 << endl;

cout << (q0*q2) << " - " << (q3*q1) << endl;

eX = atan(2*((q0*q1) + (q2*q3)) / (1 - (2*( (q1 * q1) + (q2 * q2) ) ) ) );

eY = asin(2*((q0*q2) - (q3*q1)));

eZ = atan(2*((q0*q3) + (q1*q2)) / (1 - (2*( (q2 * q2) + (q3 * q3) ) ) ) );

cout << "Euler X: " << eX << endl; cout << "Euler Y: " << eY << endl; cout << "Euler Z: " << eZ << endl;

cout << endl;

cout << "X " << Pop[i][5][0] << " Y " << Pop[i][5][1] << " Z " << Pop[i][5][2] << endl;

// cin.get();

for (j = 0; j < ShtResidue; j++)

{

// cout << "Checking Distance Before Rotation..." << endl;

Xsqd = (Pop[i][j-1][0] - Pop[i][j][0]) * (Pop[i][j-1][0] - Pop[i][j][0]);

Ysqd = (Pop[i][j-1][1] - Pop[i][j][1]) * (Pop[i][j-1][1] - Pop[i][j][1]);

Zsqd = (Pop[i][j-1][2] - Pop[i][j][2]) * (Pop[i][j-1][2] - Pop[i][j][2]);

Sum = Xsqd + Ysqd + Zsqd;

Sum = sqrt (Sum);

// cout << "X Squared: " << Xsqd << endl; cout << "Y Squared: " << Ysqd << endl; cout << "Z Squared: " << Zsqd << endl;

// cout << "Distance: " << Sum << endl;

// cin.get();

// cout << endl;

nX[0] = Pop[i][j][0]; // store for later use in z axis rotaion

nY[0] = Pop[i][j][1];

nZ[0] = Pop[i][j][2];

// rotate around Z axis

// cout << "Rotate Z axis" << endl;

Pop[i][j][0] = (nX[0] * (cos(eX))) - (nY[0] * (sin(eX)));

Pop[i][j][1] = (nX[0] * (sin(eX))) + (nY[0] * (cos(eX)));

Pop[i][j][2] = nZ[0];

// cout << "Atom: " << j << endl; cout << "X' = " << Pop[i][j][0] << endl; cout << "Y' = " << Pop[i][j][1] << endl; cout << "Z' = " << Pop[i][j][2] << endl;

// cin.get();

oldnX[0] = Pop[i][j][0]; // store for later use in y axis rotaion

oldnY[0] = Pop[i][j][1];

oldnZ[0] = Pop[i][j][2];

eY = asin(2*((q0*q2) - (q3*q1)));

i.e. computing euler angle Y

where if asin * anything greater then 1.0 or less then -1.0 it throws up the NaN -1.#IND

Also i had originally thought i could use normal angles, but it seems that cmath uses radians instead so to be honest i don't know what effect that is having, as you can see i changed it to convert from angles to radians, but still keep getting the odd -1.#IND

Can i use this method to calculate rotation around a vector (xyz) or i'am i out of luck.

Any help is appreciated

Regards Wolfe