class Rotation 
 {
  private double m[][];
  public Rotation(double x, double y, double z, double a, double b, double c, double r)
   {
    m = new double [3][3];
    double sinr = Math.sin(r);
    double cosr = Math.cos(r);
    double i = 1.0 - cosr;
    m[0][0]=a*a*i + cosr;
    m[1][0]=a*b*i - c*sinr;
    m[2][0]=a*c*i + b*sinr;
    m[0][1]=a*b*i + c*sinr;
    m[1][1]=b*b*i + cosr;
    m[2][1]=b*c*i - a*sinr;
    m[0][2]=a*c*i - b*sinr;
    m[1][2]=b*c*i + a*sinr;
    m[2][2]=c*c*i + cosr;
   }
  public void transform(XYZ k)
   {
    if (k == null) return;
    k.x = k.x * m[0][0] + k.y * m[0][1] + k.z * m[0][2];
    k.y = k.x * m[1][0] + k.y * m[1][1] + k.z * m[1][2];
    k.z = k.x * m[2][0] + k.y * m[2][1] + k.z * m[2][2];
   }
  public void rot(XYZ k)
   {
    if (k == null) return;
    k.x = k.x * m[0][0] + k.y * m[0][1] + k.z * m[0][2];
    k.y = k.x * m[1][0] + k.y * m[1][1] + k.z * m[1][2];
    k.z = k.x * m[2][0] + k.y * m[2][1] + k.z * m[2][2];
   }
  public void rot(XYZ[] a) 
   {
    int l=a.length;
    for(int i=0;i<l;i++)
     {
      a[i].x = a[i].x * m[0][0] + a[i].y * m[0][1] + a[i].z * m[0][2];
      a[i].y = a[i].x * m[1][0] + a[i].y * m[1][1] + a[i].z * m[1][2];
      a[i].z = a[i].x * m[2][0] + a[i].y * m[2][1] + a[i].z * m[2][2];
     }
   }
 }
