Guest User

Untitled

a guest
May 20th, 2015
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.70 KB | None | 0 0
  1. import com.jme3.math.FastMath;
  2. import com.jme3.math.Quaternion;
  3. import com.jme3.math.Vector3f;
  4. import java.math.BigDecimal;
  5.  
  6. public class PrecisionTest {
  7.     public static void mult15(Quaternion q, Vector3f v, Vector3f s) {
  8.         //15 mult, 15 add
  9.         float x = q.getX();
  10.         float y = q.getY();
  11.         float z = q.getZ();
  12.         float w = q.getW();
  13.        
  14.         float vx = y*v.z-z*v.y;
  15.         float vy = z*v.x-x*v.z;
  16.         float vz = x*v.y-y*v.x;
  17.         vx += vx; vy += vy; vz += vz;
  18.         s.x = v.x + w*vx + y*vz-z*vy;
  19.         s.y = v.y + w*vy + z*vx-x*vz;
  20.         s.z = v.z + w*vz + x*vy-y*vx;
  21.     }
  22.     public static void main(String[] args) {
  23.         silent = true; //set to false to see outout
  24.         int iterations = 100; // number of iterations
  25.        
  26.         Quaternion q = new Quaternion();
  27.         q.fromAngleNormalAxis(0.4547f, new Vector3f(0.5454f,0.21f,0.12f).normalizeLocal());
  28.         QuaternionHD qHD = new QuaternionHD(q.getX(),q.getY(),
  29.                 q.getZ(), q.getW());
  30.        
  31.         out("Quaternion \t" + q);
  32.         out("QuaternionHD \t" + qHD);
  33.      
  34.         Vector3f resHD15 = new Vector3f();
  35.         Vector3f resHD60 = new Vector3f();
  36.         Vector3f res15 = new Vector3f();
  37.         Vector3f res60 = new Vector3f();
  38.         Vector3f v = new Vector3f(128.55f,5145.48f,1351.54f);
  39.        
  40.        
  41.         int score15 = 0, score60 = 0, draw = 0;
  42.         for(int i = 0; i < iterations; i++) {
  43.            out("v " + v);
  44.            //compute HighPrecision result using both methods
  45.            qHD.mult15(v, resHD15);
  46.            qHD.mult60(v, resHD60);
  47.            
  48.            out("HD15 " + resHD15);
  49.            out("HD60 " + resHD60);
  50.            
  51.             q.mult(v, res60);
  52.             mult15(q, v, res15);        
  53.            
  54.             out("mult15 " + res15);
  55.             out("mult60 " + res60);            
  56.          
  57.            if(resHD15.x != resHD60.x || resHD15.y != resHD60.y || resHD15.z != resHD60.z) {
  58.               out("*HD Difference*");
  59.                //resD15 != resD60
  60.                //now the question is which one is more correct, resD15 or resD60
  61.                //eg. use mathematical program to check which one produces better results
  62.            }
  63.            
  64.            out("Comparing---------------");
  65.             out("diff15 " + resHD15.subtract(res15));
  66.             out("diff60 " + resHD15.subtract(res60));
  67.            
  68.             float e15 = error(resHD15.subtract(res15));
  69.             float e60 = error(resHD15.subtract(res60));
  70.             if(e15 < e60) score15++;
  71.             else if(e60 < e15)
  72.                 score60++;
  73.             else draw++;
  74.  
  75.             v.set(FastMath.nextRandomFloat()*10000f,
  76.                     FastMath.nextRandomFloat()*10000f,
  77.                     FastMath.nextRandomFloat()*10000f);
  78.             q.fromAngleNormalAxis(FastMath.PI*FastMath.nextRandomFloat(),
  79.                     new Vector3f(2*FastMath.nextRandomFloat()-1f,
  80.                     2*FastMath.nextRandomFloat()-1f,
  81.                     2*FastMath.nextRandomFloat()-1f).normalizeLocal());
  82.             qHD = new QuaternionHD(q.getX(),q.getY(),
  83.                 q.getZ(), q.getW());
  84.             out("-----------------------");
  85.         }
  86.        
  87.         System.out.println("Results: (15,60,Draws): " + score15+","+score60+","+draw);
  88.         if(score15 > score60)
  89.             System.out.println("mult15 is more precise");
  90.         else if(score60 > score15)
  91.             System.out.println("mult60 is more precise");
  92.         else System.out.println("Draw");
  93.     }
  94.     static boolean silent = false;
  95.     public static void out(String msg) {
  96.         if(silent) return;
  97.         System.out.println(msg);
  98.     }
  99.     private static float error(Vector3f v) {
  100.         return FastMath.abs(v.x)+FastMath.abs(v.y)+FastMath.abs(v.z);
  101.     }
  102.     public static class QuaternionHD  {
  103.         public BigDecimal x,y,z,w;
  104.         public QuaternionHD(float x, float y, float z, float w) {
  105.             this.x = new BigDecimal(x+"");
  106.             this.y = new BigDecimal(y+"");
  107.             this.z = new BigDecimal(z+"");
  108.             this.w = new BigDecimal(w+"");
  109.         }
  110.          public void mult15(Vector3f v, Vector3f store) {
  111.             //15 mult, 15 add
  112.             BigDecimal ix = new BigDecimal(v.x+"");
  113.             BigDecimal iy = new BigDecimal(v.y+"");
  114.             BigDecimal iz = new BigDecimal(v.z+"");
  115.            
  116.             BigDecimal vx = y.multiply(iz).subtract(z.multiply(iy));
  117.             BigDecimal vy = z.multiply(ix).subtract(x.multiply(iz));
  118.             BigDecimal vz = x.multiply(iy).subtract(y.multiply(ix));
  119.            
  120.             vx = vx.add(vx); vy = vy.add(vy); vz = vz.add(vz);
  121.            
  122.             BigDecimal sx = ix.add(w.multiply(vx)).add(y.multiply(vz)).subtract(z.multiply(vy));
  123.             BigDecimal sy = iy.add(w.multiply(vy)).add(z.multiply(vx)).subtract(x.multiply(vz));
  124.             BigDecimal sz = iz.add(w.multiply(vz)).add(x.multiply(vy)).subtract(y.multiply(vx));
  125.             out("precision: "+sx.precision()+", " + sy.precision()+ ", " + sz.precision());
  126.             out("Result15: "+sx.toPlainString()+", "+sy.toPlainString()+", "+sz.toPlainString());
  127.             store.set(sx.floatValue(), sy.floatValue(), sz.floatValue());
  128.          }
  129.          public void mult60(Vector3f v, Vector3f store) {
  130.             BigDecimal vx = new BigDecimal(v.x+"");
  131.             BigDecimal vy = new BigDecimal(v.y+"");
  132.             BigDecimal vz = new BigDecimal(v.z+"");
  133.             BigDecimal n2 = new BigDecimal("2");
  134.                        
  135.             BigDecimal sx =  w.multiply( w) .multiply( vx)
  136.                     .add(n2 .multiply( y) .multiply( w) .multiply( vz))
  137.                     .subtract(n2 .multiply( z) .multiply( w) .multiply( vy))
  138.                     .add( x .multiply( x).multiply( vx))
  139.                     .add( n2 .multiply( y) .multiply( x ).multiply( vy))
  140.                     .add( n2 .multiply( z) .multiply( x) .multiply( vz))
  141.                     .subtract( z .multiply( z) .multiply( vx))
  142.                     .subtract(y.multiply( y) .multiply( vx));
  143.             BigDecimal sy = n2 .multiply( x) .multiply( y) .multiply( vx)
  144.                     .add( y .multiply( y) .multiply( vy))
  145.                     .add( n2 .multiply( z) .multiply( y) .multiply( vz))
  146.                     .add( n2 .multiply( w).multiply( z) .multiply( vx))
  147.                     .subtract( z .multiply( z) .multiply( vy))
  148.                     .add( w .multiply( w) .multiply( vy))
  149.                     .subtract( n2 .multiply( x) .multiply( w) .multiply( vz))
  150.                     .subtract( x .multiply( x) .multiply( vy));
  151.             BigDecimal sz = n2 .multiply( x) .multiply( z) .multiply( vx)
  152.                     .add( n2 .multiply( y) .multiply( z) .multiply( vy))
  153.                     .add( z .multiply( z) .multiply( vz))
  154.                     .subtract( n2 .multiply( w).multiply( y) .multiply( vx))
  155.                     .subtract( y .multiply( y) .multiply( vz))
  156.                     .add(n2 .multiply( w) .multiply( x) .multiply( vy))
  157.                     .subtract( x .multiply( x) .multiply( vz))
  158.                     .add( w.multiply( w) .multiply( vz));
  159.              out("precision: "+sx.precision()+", " + sy.precision()+ ", " + sz.precision());
  160.              out("Result60: "+sx.toPlainString()+", "+sy.toPlainString()+", "+sz.toPlainString());
  161.             store.set(sx.floatValue(), sy.floatValue(), sz.floatValue());
  162.          }
  163.         @Override
  164.         public String toString() {
  165.             String s = "[";
  166.             s += x.toPlainString()+", ";
  167.             s += y.toPlainString()+", ";
  168.             s += z.toPlainString()+", ";
  169.             s += w.toPlainString()+"]";
  170.             return s;
  171.         }
  172.        
  173.     }
  174. }
Advertisement
Add Comment
Please, Sign In to add comment