OSDN Git Service

[backup]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core / squaredetect / NyARVertexCounter.java
index b82940f..8aa1833 100644 (file)
@@ -46,13 +46,13 @@ final public class NyARVertexCounter
 \r
        private int[] y_coord;\r
 \r
-       public boolean getVertex(int[] i_x_coord, int[] i_y_coord, int st, int ed, double i_thresh)\r
+       public boolean getVertex(int[] i_x_coord, int[] i_y_coord,int i_coord_len,int st, int ed, double i_thresh)\r
        {\r
                this.number_of_vertex = 0;\r
                this.thresh = i_thresh;\r
                this.x_coord = i_x_coord;\r
                this.y_coord = i_y_coord;\r
-               return get_vertex(st, ed);\r
+               return get_vertex(st, ed,i_coord_len);\r
        }\r
 \r
        /**\r
@@ -65,7 +65,7 @@ final public class NyARVertexCounter
         * @param thresh\r
         * @return\r
         */\r
-       private boolean get_vertex(int st, int ed)\r
+       private boolean get_vertex(int st, int ed,int i_coord_len)\r
        {\r
                //メモ:座標値は65536を超えなければint32で扱って大丈夫なので変更。\r
                //dmaxは4乗なのでやるとしてもint64じゃないとマズイ\r
@@ -76,15 +76,36 @@ final public class NyARVertexCounter
                final int b = lx_coord[st] - lx_coord[ed];\r
                final int c = lx_coord[ed] * ly_coord[st] - ly_coord[ed] * lx_coord[st];\r
                double dmax = 0;\r
-               for (int i = st + 1; i < ed; i++) {\r
-                       final double d = a * lx_coord[i] + b * ly_coord[i] + c;\r
-                       if (d * d > dmax) {\r
-                               dmax = d * d;\r
-                               v1 = i;\r
+               if(st<ed){\r
+                       //stとedが1区間\r
+                       for (int i = st + 1; i < ed; i++) {\r
+                               final double d = a * lx_coord[i] + b * ly_coord[i] + c;\r
+                               if (d * d > dmax) {\r
+                                       dmax = d * d;\r
+                                       v1 = i;\r
+                               }\r
+                       }\r
+               }else{\r
+                       //stとedが2区間\r
+                       for (int i = st + 1; i < i_coord_len; i++) {\r
+                               final double d = a * lx_coord[i] + b * ly_coord[i] + c;\r
+                               if (d * d > dmax) {\r
+                                       dmax = d * d;\r
+                                       v1 = i;\r
+                               }\r
+                       }\r
+                       for (int i = 0; i < ed; i++) {\r
+                               final double d = a * lx_coord[i] + b * ly_coord[i] + c;\r
+                               if (d * d > dmax) {\r
+                                       dmax = d * d;\r
+                                       v1 = i;\r
+                               }\r
                        }\r
                }\r
+\r
+               \r
                if (dmax / (double)(a * a + b * b) > thresh) {\r
-                       if (!get_vertex(st, v1)) {\r
+                       if (!get_vertex(st, v1,i_coord_len)) {\r
                                return false;\r
                        }\r
                        if (number_of_vertex > 5) {\r
@@ -93,7 +114,7 @@ final public class NyARVertexCounter
                        vertex[number_of_vertex] = v1;// vertex[(*vnum)] = v1;\r
                        number_of_vertex++;// (*vnum)++;\r
 \r
-                       if (!get_vertex(v1, ed)) {\r
+                       if (!get_vertex(v1, ed,i_coord_len)) {\r
                                return false;\r
                        }\r
                }\r