I'd like to show u the following 2 functions that may be valuable in theCalc 
class:
   /**Returns a rotated Structure object (the rotation is around the origo)    
*    * @param ostructure Structure -- the stucture to be rotated    * @param 
from Atom            -- the reference Atom's originalcoordinates    * @param to 
Atom              -- the reference Atom's desiredcoordinates    * @return 
Structure           -- null if there was an error    */
   public static Structure rotate3D(Structure ostructure,Atom from, Atom 
to)throws StructureException {       Structure nstructure = new StructureImpl();
       //calculate the angle of rotation       final double angle = 
radangle(from,to);       if (angle == 0 || angle == Math.PI) {           throw 
new StructureException ("The rotation angle is 0 or 180degrees!");       }
       //calculate te unit normal vector of the (origo, from, to) pane       
//which will serve as an arbitary axis for the rotation       Atom axisvector = 
vectorProduct(from,to);       axisvector = unitVector(axisvector);
       //calculate the trigonometric values       final double c = 
Math.cos(angle);       final double s = Math.sin(angle);       final double t = 
1-Math.cos(angle);
       final double x = axisvector.getX();       final double y = 
axisvector.getY();       final double z = axisvector.getZ();
       //and now the matrix       double[][] rotationmatrix = new double[3][3]; 
      rotationmatrix[0][0] = t*x*x+c  ;rotationmatrix[0][1] 
=t*x*y+s*z;rotationmatrix[0][2] = t*x*z-s*y;       rotationmatrix[1][0] = 
t*x*y-s*z;rotationmatrix[1][1] =t*y*y+c;rotationmatrix[1][2] = t*y*z+s*x;       
rotationmatrix[2][0] = t*x*y+s*y;rotationmatrix[2][1] 
=t*y*z-s*x;rotationmatrix[2][2] = t*z*z+c;
       //and now the rotation       nstructure = (Structure) 
ostructure.clone();       try {           rotate(nstructure, rotationmatrix);   
    }       catch (StructureException e) {           System.out.println(e);     
      nstructure = null;       }
       return nstructure;   }
   /**Calculates the a,origo,b angle in radians    *    * @param a Atom    * 
@param b Atom    * @return double    */

   public static double radangle(Atom a, Atom b) {
       final double skalar = skalarProduct(a,b);       final double radangle = 
Math.acos( skalar/( amount(a) * amount(b) ));
       return radangle;   }
_______________________________________________
Biojava-l mailing list  -  Biojava-l@biojava.org
http://biojava.org/mailman/listinfo/biojava-l

Reply via email to