OSDN Git Service

[NyARToolKit for java]update document
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / core / types / NyARIntCoordinates.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java edition ARToolKit class library.\r
11  * Copyright (C)2008-2010 Ryo Iizuka\r
12  *\r
13  * This program is free software: you can redistribute it and/or modify\r
14  * it under the terms of the GNU General Public License as published by\r
15  * the Free Software Foundation, either version 3 of the License, or\r
16  * (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  *\r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
25  * \r
26  * For further information please contact.\r
27  *      http://nyatla.jp/nyatoolkit/\r
28  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
29  * \r
30  */\r
31 package jp.nyatla.nyartoolkit.core.types;\r
32 \r
33 /**\r
34  * このクラスは、整数型の2次元輪郭線を格納します。\r
35  * 輪郭線は、2次元座標{@link NyARIntPoint2d}の集合です。\r
36  */\r
37 public class NyARIntCoordinates\r
38 {\r
39         /** 点を格納する配列です。*/\r
40         public NyARIntPoint2d[] items;\r
41         /** 有効な要素の長さです。*/\r
42         public int length;\r
43         /**\r
44          * コンストラクタです。\r
45          * 最大長さを指定して、有効要素数0のインスタンスを作ります。\r
46          * @param i_length\r
47          * 輪郭の最大長\r
48          */\r
49         public NyARIntCoordinates(int i_length)\r
50         {\r
51                 this.items=NyARIntPoint2d.createArray(i_length);\r
52                 this.length=0;\r
53         }\r
54         /**\r
55          * この関数は2点を結ぶ直線を計算して、輪郭線を保存します。\r
56          * 輪郭線は、Bresenhamのアルゴリズムで計算します。\r
57          * 2点間の距離が、格納可能な最大長さ以下になるように注意してください。\r
58          * @param i_x0\r
59          * 点1のX座標\r
60          * @param i_y0\r
61          * 点1のY座標\r
62          * @param i_x1\r
63          * 点2のX座標\r
64          * @param i_y1\r
65          * 点2のY座標\r
66          * @return\r
67          * 成功するとtrueを返します。\r
68          */\r
69         public boolean setLineCoordinates(int i_x0, int i_y0, int i_x1, int i_y1)\r
70         {\r
71                 NyARIntPoint2d[] ptr=this.items;\r
72                 // 線分を定義\r
73                 int dx = (i_x1 > i_x0) ? i_x1 - i_x0 : i_x0 - i_x1;\r
74                 int dy = (i_y1 > i_y0) ? i_y1 - i_y0 : i_y0 - i_y1;\r
75                 int sx = (i_x1 > i_x0) ? 1 : -1;\r
76                 int sy = (i_y1 > i_y0) ? 1 : -1;\r
77 \r
78                 // Bresenham\r
79                 int idx = 0;\r
80                 if (dx >= dy) {\r
81                         // 傾きが1以下の場合\r
82                         if (dx >= ptr.length) {\r
83                                 return false;\r
84                         }\r
85                         int E = -dx;\r
86                         for (int i = 0; i <= dx; i++) {\r
87                                 ptr[idx].x = i_x0;\r
88                                 ptr[idx].y = i_y0;\r
89                                 idx++;\r
90                                 i_x0 += sx;\r
91                                 E += 2 * dy;\r
92                                 if (E >= 0) {\r
93                                         i_y0 += sy;\r
94                                         E -= 2 * dx;\r
95                                 }\r
96                         }\r
97                 } else {\r
98                         // 傾きが1より大きい場合\r
99                         if (dy >= this.items.length) {\r
100                                 return false;\r
101                         }\r
102                         int E = -dy;\r
103                         for (int i = 0; i <= dy; i++) {\r
104                                 ptr[idx].x = i_x0;\r
105                                 ptr[idx].y = i_y0;\r
106                                 idx++;\r
107                                 i_y0 += sy;\r
108                                 E += 2 * dx;\r
109                                 if (E >= 0) {\r
110                                         i_x0 += sx;\r
111                                         E -= 2 * dy;\r
112                                 }\r
113                         }\r
114                 }\r
115                 this.length=idx;\r
116                 return true;\r
117         }       \r
118 }\r