Advertisement
Guest User

Untitled

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