OSDN Git Service

[Backup]NyARToolkit for Java
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Thu, 8 Oct 2009 02:01:30 +0000 (02:01 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Thu, 8 Oct 2009 02:01:30 +0000 (02:01 +0000)
今日は台風ですが、偏微分Fittingのエラー値計算修正しました。

src/jp/nyatla/nyartoolkit/core/transmat/optimize/NyARPartialDifferentiationOptimize.java

index 8558d4d..b8522b1 100644 (file)
@@ -183,13 +183,12 @@ public class NyARPartialDifferentiationOptimize
                        O += f * f + c * c;\r
 \r
                }\r
-               L *= 2;\r
-               J = (J + J) / L;\r
-               K = (K + K) / L;\r
-               N /= L;\r
-               M /= L;\r
-               O /= L;\r
-               return getMinimumErrorAngleFromParam(J, K, M, N, O, i_hint_angle);\r
+               L *=2;\r
+               J *=2;\r
+               K *=2;\r
+\r
+               return getMinimumErrorAngleFromParam(L,J, K, M, N, O, i_hint_angle);\r
+\r
 \r
        }\r
 \r
@@ -244,12 +243,10 @@ public class NyARPartialDifferentiationOptimize
 \r
                }\r
                L *= 2;\r
-               J = (J + J) / L;\r
-               K = (K + K) / L;\r
-               N /= L;\r
-               M /= L;\r
-               O /= L;\r
-               return getMinimumErrorAngleFromParam(J, K, M, N, O, i_hint_angle);\r
+               J *= 2;\r
+               K *= 2;\r
+               return getMinimumErrorAngleFromParam(L,J, K, M, N, O, i_hint_angle);\r
+\r
        }\r
 \r
        private double optimizeParamZ(TSinCosValue i_angle_x, TSinCosValue i_angle_y, NyARDoublePoint3d i_trans, NyARDoublePoint3d[] i_vertex3d, NyARDoublePoint2d[] i_vertex2d, int i_number_of_vertex, double i_hint_angle) throws NyARException\r
@@ -302,13 +299,11 @@ public class NyARPartialDifferentiationOptimize
                        O += f * f + c * c;\r
 \r
                }\r
-               L *= 2;\r
-               J = (J + J) / L;\r
-               K = (K + K) / L;\r
-               N /= L;\r
-               M /= L;\r
-               O /= L;\r
-               return getMinimumErrorAngleFromParam(J, K, M, N, O, i_hint_angle);\r
+               L *=2;\r
+               J *=2;\r
+               K *=2;\r
+               \r
+               return getMinimumErrorAngleFromParam(L,J, K, M, N, O, i_hint_angle);\r
        }\r
        private TSinCosValue[] __angles_in=TSinCosValue.createArray(3);\r
        private NyARDoublePoint3d __ang=new NyARDoublePoint3d();\r
@@ -329,13 +324,13 @@ public class NyARPartialDifferentiationOptimize
        /**\r
         * エラーレートが最小になる点を得る。\r
         */\r
-       private double getMinimumErrorAngleFromParam(double iJ, double iK, double iM, double iN, double iO, double i_hint_angle) throws NyARException\r
+       private double getMinimumErrorAngleFromParam(double iL,double iJ, double iK, double iM, double iN, double iO, double i_hint_angle) throws NyARException\r
        {\r
                double[] sin_table = this.__sin_table;\r
 \r
-               double M = iN - iM;\r
-               double J = iJ;\r
-               double K = -iK;\r
+               double M = (iN - iM)/iL;\r
+               double J = iJ/iL;\r
+               double K = -iK/iL;\r
 \r
                // パラメータからsinテーブルを作成\r
                // (- 4*M^2-4)*x^4 + (4*K- 4*J*M)*x^3 + (4*M^2 -(K^2- 4)- J^2)*x^2 +(4*J*M- 2*K)*x + J^2-1 = 0\r
@@ -361,7 +356,7 @@ public class NyARPartialDifferentiationOptimize
                        cos_rt = (a1 < a2) ? cos_rt : -cos_rt;\r
                        double ang = Math.atan2(sin_rt, cos_rt);\r
                        // エラー値を計算\r
-                       double err = iN * sin_rt * sin_rt + (cos_rt + iJ) * sin_rt + iM * cos_rt * cos_rt + iK * cos_rt + iO;\r
+                       double err = iN * sin_rt * sin_rt + (iL*cos_rt + iJ) * sin_rt + iM * cos_rt * cos_rt + iK * cos_rt + iO;\r
                        // 最小の2個を獲得する。\r
                        if (min_err_0 > err) {\r
                                min_err_1 = min_err_0;\r