OSDN Git Service

[NyARToolKit for java]update document
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / core / types / NyARIntRect.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-2009 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  * このクラスは、基点x,yと、幅、高さで矩形を定義します。\r
35  */\r
36 public class NyARIntRect\r
37 {\r
38         /** 矩形の左上の点(X)*/\r
39         public int x;\r
40         /** 矩形の左上の点(Y)*/\r
41         public int y;\r
42         /** 矩形の幅(X)*/\r
43         public int w;\r
44         /** 矩形の高さ(Y)*/\r
45         public int h;\r
46         /**\r
47          * この関数は、頂点集合を包括する矩形を計算して、インスタンスにセットします。\r
48          * @param i_vertex\r
49          * 頂点集合を格納した配列\r
50          * @param i_num_of_vertex\r
51          * 計算対象とする要素の数\r
52          */\r
53         public final void setAreaRect(NyARDoublePoint2d[] i_vertex,int i_num_of_vertex)\r
54         {\r
55                 //エリアを求める。\r
56                 int xmax,xmin,ymax,ymin;\r
57                 xmin=xmax=(int)i_vertex[i_num_of_vertex-1].x;\r
58                 ymin=ymax=(int)i_vertex[i_num_of_vertex-1].y;\r
59                 for(int i=i_num_of_vertex-2;i>=0;i--){\r
60                         if(i_vertex[i].x<xmin){\r
61                                 xmin=(int)i_vertex[i].x;\r
62                         }else if(i_vertex[i].x>xmax){\r
63                                 xmax=(int)i_vertex[i].x;\r
64                         }\r
65                         if(i_vertex[i].y<ymin){\r
66                                 ymin=(int)i_vertex[i].y;\r
67                         }else if(i_vertex[i].y>ymax){\r
68                                 ymax=(int)i_vertex[i].y;\r
69                         }\r
70                 }\r
71                 this.h=ymax-ymin+1;\r
72                 this.x=xmin;\r
73                 this.w=xmax-xmin+1;\r
74                 this.y=ymin;\r
75         }\r
76         /**\r
77          * この関数は、頂点集合を包括する矩形を計算して、インスタンスにセットします。\r
78          * @param i_vertex\r
79          * 頂点集合を格納した配列\r
80          * @param i_num_of_vertex\r
81          * 計算対象とする要素の数\r
82          */\r
83         public final void setAreaRect(NyARIntPoint2d[] i_vertex,int i_num_of_vertex)\r
84         {\r
85                 //エリアを求める。\r
86                 int xmax,xmin,ymax,ymin;\r
87                 xmin=xmax=(int)i_vertex[i_num_of_vertex-1].x;\r
88                 ymin=ymax=(int)i_vertex[i_num_of_vertex-1].y;\r
89                 for(int i=i_num_of_vertex-2;i>=0;i--){\r
90                         if(i_vertex[i].x<xmin){\r
91                                 xmin=(int)i_vertex[i].x;\r
92                         }else if(i_vertex[i].x>xmax){\r
93                                 xmax=(int)i_vertex[i].x;\r
94                         }\r
95                         if(i_vertex[i].y<ymin){\r
96                                 ymin=(int)i_vertex[i].y;\r
97                         }else if(i_vertex[i].y>ymax){\r
98                                 ymax=(int)i_vertex[i].y;\r
99                         }\r
100                 }\r
101                 this.h=ymax-ymin+1;\r
102                 this.x=xmin;\r
103                 this.w=xmax-xmin+1;\r
104                 this.y=ymin;\r
105         }\r
106 \r
107         /**\r
108          * この関数は、矩形を領域内にクリップします。\r
109          * @param i_left\r
110          * クリップする左辺\r
111          * @param i_top\r
112          * クリップする上辺\r
113          * @param i_right\r
114          * クリップする右辺\r
115          * @param i_bottom\r
116          * クリップする下辺\r
117          */\r
118         public final void clip(int i_left,int i_top,int i_right,int i_bottom)\r
119         {\r
120                 int x=this.x;\r
121                 int y=this.y;\r
122                 int r=x+this.w-1;\r
123                 int b=y+this.h-1;\r
124                 if(x<i_left){\r
125                         x=i_left;\r
126                 }else if(x>i_right){\r
127                         x=i_right;      \r
128                 }\r
129                 if(y<i_top){\r
130                         y=i_top;\r
131                 }else if(y>i_bottom){\r
132                         y=i_bottom;                     \r
133                 }\r
134                 int l;\r
135                 l=(r>i_right)?i_right-x:r-x;\r
136                 if(l<0){\r
137                         this.w=0;\r
138                 }else{\r
139                         this.w=l+1;\r
140                 }\r
141                 l=(b>i_bottom)?i_bottom-y:b-y;\r
142                 if(l<0){\r
143                         this.h=0;\r
144                 }else{\r
145                         this.h=l+1;\r
146                 }\r
147                 this.x=x;\r
148                 this.y=y;\r
149                 return;\r
150         }\r
151 \r
152         /**\r
153          * この関数は、点が矩形の範囲内にあるか判定します。\r
154          * @param i_x\r
155          * 調査する座標(X)\r
156          * @param i_y\r
157          * 調査する座標(Y)\r
158          * @return\r
159          * 点が矩形の中にあれば、trueを返します。\r
160          */\r
161         public final boolean isInnerPoint(int i_x,int i_y)\r
162         {\r
163                 int x=i_x-this.x;\r
164                 int y=i_y-this.y;\r
165                 \r
166                 return (0<=x && x<this.w && 0<=y && y<this.h);\r
167         }\r
168         /**\r
169          * この関数は、点が矩形の範囲内にあるか判定します。\r
170          * @param i_pos\r
171          * 調査する座標\r
172          * @return\r
173          * 点が矩形の中にあれば、trueを返します。\r
174          */\r
175         public final boolean isInnerPoint(NyARDoublePoint2d i_pos)\r
176         {\r
177                 int x=(int)i_pos.x-this.x;\r
178                 int y=(int)i_pos.y-this.y;\r
179                 return (0<=x && x<this.w && 0<=y && y<this.h);\r
180         }\r
181         /**\r
182          * この関数は、点が矩形の範囲内にあるか判定します。\r
183          * @param i_pos\r
184          * 調査する座標\r
185          * @return\r
186          * 点が矩形の中にあれば、trueを返します。\r
187          */\r
188         public final boolean isInnerPoint(NyARIntPoint2d i_pos)\r
189         {\r
190                 int x=i_pos.x-this.x;\r
191                 int y=i_pos.y-this.y;\r
192                 return (0<=x && x<this.w && 0<=y && y<this.h);\r
193         }\r
194         /**\r
195          * この関数は、引数の矩形が、この矩形内にあるか判定します。\r
196          * @param i_rect\r
197          * 内側にあるか調べる矩形\r
198          * @return\r
199          * 矩形が内側にあれば、trueを返します。\r
200          */\r
201         public final boolean isInnerRect(NyARIntRect i_rect)\r
202         {\r
203                 assert(i_rect.w>=0 && i_rect.h>=0);\r
204                 int lx=i_rect.x-this.x;\r
205                 int ly=i_rect.y-this.y;\r
206                 int lw=lx+i_rect.w;\r
207                 int lh=ly+i_rect.h;\r
208                 return (0<=lx && lx<this.w && 0<=ly && ly<this.h && lw<=this.w && lh<=this.h);\r
209         }\r
210         /**\r
211          * この関数は、引数で定義される矩形が、この矩形内にあるか判定します。\r
212          * @param i_x\r
213          * 内側にあるか調べる矩形の左上座標(X)\r
214          * @param i_y\r
215          * 内側にあるか調べる矩形の左上座標(Y)\r
216          * @param i_w\r
217          * 内側にあるか調べる矩形の幅\r
218          * @param i_h\r
219          * 内側にあるか調べる矩形の高さ\r
220          * @return\r
221          * 矩形が内側にあれば、trueを返します。\r
222          */\r
223         public final boolean isInnerRect(int i_x,int i_y,int i_w,int i_h)\r
224         {\r
225                 assert(i_w>=0 && i_h>=0);\r
226                 int lx=i_x-this.x;\r
227                 int ly=i_y-this.y;\r
228                 int lw=lx+i_w;\r
229                 int lh=ly+i_h;\r
230                 return (0<=lx && lx<this.w && 0<=ly && ly<this.h && lw<=this.w && lh<=this.h);\r
231         }\r
232         /**\r
233          * この関数は、2つの矩形の対角点同士の距離の二乗値を計算します。\r
234          * @param i_rect2\r
235          * 比較する矩形\r
236          * @return\r
237          * 左上、右下の点同士の距離の二乗値\r
238          */\r
239         public final int sqDiagonalPointDiff(NyARIntRect i_rect2)\r
240         {\r
241                 int w1,w2;\r
242                 int ret;\r
243                 w1=this.x-i_rect2.x;\r
244                 w2=this.y-i_rect2.y;\r
245                 ret=w1*w1+w2*w2;\r
246                 w1+=this.w-i_rect2.w;\r
247                 w2+=this.h-i_rect2.h;\r
248                 ret+=w1*w1+w2*w2;\r
249                 return ret;\r
250         }\r
251         /**\r
252          * この関数は、矩形の対角距離の二乗距離を返します。\r
253          * @return\r
254          * 矩形の対角距離の二乗値。\r
255          */\r
256         public final int getDiagonalSqDist()\r
257         {\r
258                 int lh=this.h;\r
259                 int lw=this.w;\r
260                 return lh*lh+lw*lw;\r
261         }\r
262 \r
263         /**\r
264          * この関数は、オブジェクトの値をインスタンスにセットします。\r
265          * @param i_source\r
266          * セットする値を格納したオブジェクト。\r
267          */\r
268         public final void setValue(NyARIntRect i_source)\r
269         {\r
270                 this.x=i_source.x;\r
271                 this.y=i_source.y;\r
272                 this.h=i_source.h;\r
273                 this.w=i_source.w;\r
274         }\r
275 \r
276 }\r