]> gerrit.simantics Code Review - simantics/3d.git/commitdiff
Eliminate rounding errors in property tabs. 88/3688/2
authorReino Ruusu <reino.ruusu@semantum.fi>
Thu, 5 Dec 2019 14:21:33 +0000 (16:21 +0200)
committerReino Ruusu <reino.ruusu@semantum.fi>
Thu, 5 Dec 2019 14:22:45 +0000 (16:22 +0200)
gitlab #64

Change-Id: I8bb9978c99a612d841c41645c0a89ab381557b79

org.simantics.g3d/src/org/simantics/g3d/math/MathTools.java
org.simantics.g3d/src/org/simantics/g3d/property/DoubleArrayPropertyManipulator.java
org.simantics.g3d/src/org/simantics/g3d/property/DoubleArrayPropertyManipulator2.java
org.simantics.g3d/src/org/simantics/g3d/property/DoublePropertyManipulator.java
org.simantics.g3d/src/org/simantics/g3d/property/QuatPropertyManipulator.java
org.simantics.g3d/src/org/simantics/g3d/property/VectorPropertyManipulator.java

index aa8b0551fdc845ac8db698724f6ad38d7d612b76..b9941c8b94a774605ed91fd55752150fe3aab88d 100644 (file)
@@ -1010,4 +1010,25 @@ public class MathTools {
                mat.m23 = -(f+n)/(f-n);
                return mat;
        }
+
+       /**
+        * Round the number to a given number of decimals, if the rounded result contains at least three
+        * zero trailing decimal places within the rounded result.
+        */
+       public static double round(double value, int nsig) {
+               if (Math.abs(value) < NEAR_ZERO)
+                       return 0.0;
+               
+               int decimals = (int) Math.round(Math.log10(value));
+               int shift = nsig - decimals;
+               double multiplier = Math.pow(10.0, shift);
+               long roundedValue = Math.round(value * multiplier);
+               if (roundedValue % 1000 == 0) {
+                       // Rounding results in at least three zeroes at the end
+                       return roundedValue / multiplier;
+               } else {
+                       // Number was not close to a shorter decimal representation, return it as is
+                       return value;
+               }
+       }
 }
index a9971605af500f1433678bc20701f4b232c76734..e0148147b83bf608f878106ba031455f964f4aa6 100644 (file)
@@ -13,6 +13,8 @@ package org.simantics.g3d.property;
 
 import java.util.Arrays;
 
+import org.simantics.g3d.math.MathTools;
+
 public class DoubleArrayPropertyManipulator implements PropertyManipulator {
        
        ValueProvider provider;
@@ -52,7 +54,7 @@ public class DoubleArrayPropertyManipulator implements PropertyManipulator {
                try {
                    double[] val = getValue();
                        if (val == null) return null;
-                   return Arrays.toString(val);
+                   return Double.toString(MathTools.round(val[i], 10));
                } catch (Exception e) {
                        return null;
                }
index 6b7a2e115dbe833632888cc85024a4a2edd22ee0..9275bfead2e9dbdfc63bf1dc196472eeb1fbaf1f 100644 (file)
@@ -11,6 +11,8 @@
  *******************************************************************************/
 package org.simantics.g3d.property;
 
+import org.simantics.g3d.math.MathTools;
+
 public class DoubleArrayPropertyManipulator2 implements PropertyManipulator {
        
        ValueProvider provider;
@@ -57,7 +59,7 @@ public class DoubleArrayPropertyManipulator2 implements PropertyManipulator {
                        return "New";
             if (val.length < i)
                 return null;
-            return Double.toString(val[i]);
+            return Double.toString(MathTools.round(val[i], 10));
                } catch (Exception e) {
                        return null;
                }
index 4f7c670fc71ab186e722c31ff72adc0bab35ca71..46f892f3c849b3c0171981c56965f0f6d7dcf523 100644 (file)
@@ -11,6 +11,8 @@
  *******************************************************************************/
 package org.simantics.g3d.property;
 
+import org.simantics.g3d.math.MathTools;
+
 public class DoublePropertyManipulator implements PropertyManipulator {
        
        ValueProvider provider;
@@ -43,6 +45,8 @@ public class DoublePropertyManipulator implements PropertyManipulator {
                try {
                        Object value = provider.getValue(input);
                        if (value == null) return null;
+                       if (value instanceof Double)
+                               return Double.toString(MathTools.round((Double)value, 10));
                        return value.toString();
                } catch (Exception e) {
                        return null;
@@ -70,7 +74,8 @@ public class DoublePropertyManipulator implements PropertyManipulator {
                editMode = b;
                if (editMode) {
                        try {
-                               editValue = provider.getValue(input).toString();
+                               Object value = provider.getValue(input);
+                               editValue = value.toString();
                        } catch (Exception e) {
                                
                        }
index 2104fbcaf6f55651ca8ec066f86fec944467f80c..8c3359925f43915e12d357849d773d44c7fe469d 100644 (file)
@@ -158,7 +158,7 @@ public class QuatPropertyManipulator implements PropertyManipulator {
                        default:\r
                                break;\r
                        }\r
-                       return Double.toString(d);\r
+                       return Double.toString(MathTools.round(d, 10));\r
                } catch (Exception e) {\r
                        return null;\r
                }\r
index e0a8021925ff87635da054ced8170e9c71926a13..47587fbca2ffa44e2fd2963ce8d222695efac09a 100644 (file)
@@ -13,6 +13,8 @@ package org.simantics.g3d.property;
 
 import javax.vecmath.Vector3d;
 
+import org.simantics.g3d.math.MathTools;
+
 public class VectorPropertyManipulator implements PropertyManipulator {
        
        ValueProvider provider;
@@ -49,11 +51,11 @@ public class VectorPropertyManipulator implements PropertyManipulator {
                        if (v == null)
                                return null;
                        if (i == 0)
-                               return Double.toString(v.x);
+                               return Double.toString(MathTools.round(v.x, 10));
                        if (i == 1)
-                               return Double.toString(v.y);
+                               return Double.toString(MathTools.round(v.y, 10));
                        if (i == 2)
-                               return Double.toString(v.z);
+                               return Double.toString(MathTools.round(v.z, 10));
                        return null;
                } catch (Exception e) {
                        return null;