OSDN Git Service

[Backup]NyARToolkit for Java
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Tue, 25 Aug 2009 04:03:38 +0000 (04:03 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Tue, 25 Aug 2009 04:03:38 +0000 (04:03 +0000)
新型ピックアップクラスなど

src/jp/nyatla/nyartoolkit/core/pickup/NyARColorPatt_Perspective_O2.java [new file with mode: 0644]

diff --git a/src/jp/nyatla/nyartoolkit/core/pickup/NyARColorPatt_Perspective_O2.java b/src/jp/nyatla/nyartoolkit/core/pickup/NyARColorPatt_Perspective_O2.java
new file mode 100644 (file)
index 0000000..6dd7410
--- /dev/null
@@ -0,0 +1,689 @@
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.pickup;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+\r
+interface IpickFromRaster_Impl\r
+{\r
+       public void pickFromRaster(double[] i_cpara,INyARRgbRaster image, NyARSquare i_square,int[] o_patt)throws NyARException;\r
+}\r
+\r
+/**\r
+ * 汎用ピックアップ関数\r
+ *\r
+ */\r
+class pickFromRaster_N implements IpickFromRaster_Impl\r
+{\r
+       protected int _resolution;\r
+       protected NyARIntSize _size_ref;\r
+       protected NyARIntPoint2d _lt_ref;\r
+       public pickFromRaster_N(NyARIntPoint2d i_lt,int i_resolution,NyARIntSize i_source_size)\r
+       {\r
+               this._lt_ref=i_lt;\r
+               this._resolution=i_resolution;\r
+               this._size_ref=i_source_size;\r
+               \r
+               this._rgb_temp=new int[i_resolution*i_resolution*3];\r
+               this._rgb_px=new int[i_resolution*i_resolution];\r
+               this._rgb_py=new int[i_resolution*i_resolution];\r
+               \r
+               this._cp1cy_cp2=new double[i_resolution];\r
+               this._cp4cy_cp5=new double[i_resolution];\r
+               this._cp7cy_1=new double[i_resolution];\r
+               return;\r
+       }\r
+       private int[] _rgb_temp;\r
+       private int[] _rgb_px;\r
+       private int[] _rgb_py;\r
+       private double[] _cp1cy_cp2;\r
+       private double[] _cp4cy_cp5;\r
+       private double[] _cp7cy_1;\r
+       \r
+       public void pickFromRaster(double[] i_cpara,INyARRgbRaster image, NyARSquare i_square,int[] o_patt)throws NyARException\r
+       {\r
+               int i2x,i2y;//プライム変数\r
+               int x,y;\r
+               int w;\r
+               int r,g,b;\r
+\r
+               final int resolution=this._resolution;\r
+               final int res_pix=resolution*resolution;\r
+               final int img_x = image.getWidth();\r
+               final int img_y = image.getHeight();\r
+\r
+               final int[] rgb_tmp = this._rgb_temp;\r
+               final int[] rgb_px=this._rgb_px;\r
+               final int[] rgb_py=this._rgb_py;        \r
+\r
+               final double[] cp1cy_cp2=this._cp1cy_cp2;\r
+               final double[] cp4cy_cp5=this._cp4cy_cp5;\r
+               final double[] cp7cy_1=this._cp7cy_1;           \r
+\r
+               final double cp0=i_cpara[0];\r
+               final double cp3=i_cpara[3];\r
+               final double cp6=i_cpara[6];\r
+               final double cp1=i_cpara[1];\r
+               final double cp2=i_cpara[2];\r
+               final double cp4=i_cpara[4];\r
+               final double cp5=i_cpara[5];\r
+               final double cp7=i_cpara[7];\r
+               \r
+       \r
+               final int pick_y=this._lt_ref.y;\r
+               final int pick_x=this._lt_ref.x;\r
+               //ピクセルリーダーを取得\r
+               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               int p=0;\r
+\r
+               \r
+               for(int iy=0;iy<this._size_ref.h*resolution;iy+=resolution){\r
+                       w=pick_y+iy;\r
+                       cp1cy_cp2[0]=cp1*w+cp2;\r
+                       cp4cy_cp5[0]=cp4*w+cp5;\r
+                       cp7cy_1[0]=cp7*w+1.0;                   \r
+                       for(i2y=1;i2y<resolution;i2y++){\r
+                               cp1cy_cp2[i2y]=cp1cy_cp2[i2y-1]+cp1;\r
+                               cp4cy_cp5[i2y]=cp4cy_cp5[i2y-1]+cp4;\r
+                               cp7cy_1[i2y]=cp7cy_1[i2y-1]+cp7;\r
+                       }\r
+                       //解像度分の点を取る。\r
+\r
+                       for(int ix=0;ix<this._size_ref.w*resolution;ix+=resolution){\r
+                               int n=0;\r
+                               w=pick_x+ix;\r
+                               for(i2y=resolution-1;i2y>=0;i2y--){\r
+                                       double cp0cx=cp0*w+cp1cy_cp2[i2y];\r
+                                       double cp6cx=cp6*w+cp7cy_1[i2y];\r
+                                       double cp3cx=cp3*w+cp4cy_cp5[i2y];\r
+                                       \r
+                                       final double m=1/(cp6cx);\r
+                                       final double d=-cp6/(cp6cx*(cp6cx+cp6));\r
+                                       \r
+                                       double m2=cp0cx*m;\r
+                                       double m3=cp3cx*m;\r
+                                       double d2=cp0cx*d+cp0*(m+d);\r
+                                       double d3=cp3cx*d+cp3*(m+d);\r
+                                       for(i2x=resolution-1;i2x>=0;i2x--){\r
+                                               //1ピクセルを作成\r
+                                               x=rgb_px[n]=(int)(m2);\r
+                                               y=rgb_py[n]=(int)(m3);\r
+                                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                                       if(x<0){rgb_px[n]=0;}else if(x>=img_x){rgb_px[n]=img_x-1;}\r
+                                                       if(y<0){rgb_py[n]=0;}else if(y>=img_y){rgb_py[n]=img_y-1;}                      \r
+                                               }\r
+                                               n++;\r
+                                               m2+=d2;\r
+                                               m3+=d3;\r
+                                       }\r
+                               }\r
+                               reader.getPixelSet(rgb_px, rgb_py,res_pix, rgb_tmp);\r
+                               r=g=b=0;\r
+                               for(int i=res_pix*3-1;i>0;){\r
+                                       b+=rgb_tmp[i--];\r
+                                       g+=rgb_tmp[i--];\r
+                                       r+=rgb_tmp[i--];\r
+                               }\r
+                               r/=res_pix;\r
+                               g/=res_pix;\r
+                               b/=res_pix;\r
+                               o_patt[p]=((r&0xff)<<16)|((g&0xff)<<8)|((b&0xff));\r
+                               p++;\r
+                       }\r
+               }\r
+               return;\r
+       }\r
+}\r
+/**\r
+ * チェックデジット:4127936236942444153655776299710081208144715171590159116971715177917901890204024192573274828522936312731813388371037714083\r
+ *\r
+ */\r
+class pickFromRaster_1 implements IpickFromRaster_Impl\r
+{\r
+       protected NyARIntSize _size_ref;\r
+       protected NyARIntPoint2d _lt_ref;\r
+       public pickFromRaster_1(NyARIntPoint2d i_lt,NyARIntSize i_source_size)\r
+       {\r
+               this._lt_ref=i_lt;\r
+               this._size_ref=i_source_size;\r
+               \r
+               this._rgb_temp=new int[i_source_size.w*3];\r
+               this._rgb_px=new int[i_source_size.w];\r
+               this._rgb_py=new int[i_source_size.w];\r
+               \r
+               return;\r
+       }\r
+       private int[] _rgb_temp;\r
+       private int[] _rgb_px;\r
+       private int[] _rgb_py;\r
+\r
+       \r
+       public void pickFromRaster(double[] i_cpara,INyARRgbRaster image, NyARSquare i_square,int[] o_patt)throws NyARException\r
+       {\r
+               double d0,m0;\r
+               int x,y;\r
+               \r
+               final int img_x = image.getWidth();\r
+               final int img_y = image.getHeight();\r
+               final int patt_w=this._size_ref.w;\r
+\r
+               final int[] rgb_tmp = this._rgb_temp;\r
+               final int[] rgb_px=this._rgb_px;\r
+               final int[] rgb_py=this._rgb_py;        \r
+\r
+               \r
+\r
+               final double cp0=i_cpara[0];\r
+               final double cp3=i_cpara[3];\r
+               final double cp6=i_cpara[6];\r
+               final double cp1=i_cpara[1];\r
+               final double cp4=i_cpara[4];\r
+               final double cp7=i_cpara[7];\r
+               \r
+       \r
+               final int pick_y=this._lt_ref.y;\r
+               final int pick_x=this._lt_ref.x;\r
+               //ピクセルリーダーを取得\r
+               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               int p=0;\r
+\r
+               \r
+               double cp0cx0,cp3cx0;\r
+               double cp1cy_cp20=cp1*pick_y+i_cpara[2]+cp0*pick_x;\r
+               double cp4cy_cp50=cp4*pick_y+i_cpara[5]+cp3*pick_x;\r
+               double cp7cy_10=cp7*pick_y+1.0+cp6*pick_x;\r
+               \r
+\r
+               for(int iy=this._size_ref.h-1;iy>=0;iy--){\r
+                       m0=1/(cp7cy_10);\r
+                       d0=-cp6/(cp7cy_10*(cp7cy_10+cp6));                      \r
+\r
+                       cp0cx0=cp1cy_cp20;\r
+                       cp3cx0=cp4cy_cp50;\r
+                       \r
+                       //ピックアップシーケンス\r
+                       \r
+                       //0番目のピクセル(検査対象)をピックアップ\r
+\r
+\r
+                       for(int ix=patt_w-1;ix>=0;ix--){\r
+                               //1ピクセルを作成\r
+                               x=rgb_px[ix]=(int)(cp0cx0*m0);\r
+                               y=rgb_py[ix]=(int)(cp3cx0*m0);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[ix]=0;}else if(x>=img_x){rgb_px[ix]=img_x-1;}\r
+                                       if(y<0){rgb_py[ix]=0;}else if(y>=img_y){rgb_py[ix]=img_y-1;}                    \r
+                               }\r
+                               cp0cx0+=cp0;\r
+                               cp3cx0+=cp3;\r
+                               m0+=d0;\r
+                       }\r
+                       \r
+                       cp1cy_cp20+=cp1;\r
+                       cp4cy_cp50+=cp4;\r
+                       cp7cy_10+=cp7;\r
+                       \r
+                       reader.getPixelSet(rgb_px, rgb_py,patt_w, rgb_tmp);\r
+                       for(int ix=patt_w-1;ix>=0;ix--){\r
+                               final int idx=ix*3;\r
+                               o_patt[p]=(rgb_tmp[idx]<<16)|(rgb_tmp[idx+1]<<8)|((rgb_tmp[idx+2]&0xff));\r
+                               p++;\r
+                       }\r
+               }\r
+\r
+               return;\r
+       }\r
+}\r
+\r
+/**\r
+ * 2x2\r
+ * チェックデジット:207585881161241401501892422483163713744114324414474655086016467027227327958629279571017\r
+ *\r
+ */\r
+class pickFromRaster_2x implements IpickFromRaster_Impl\r
+{\r
+       protected NyARIntSize _size_ref;\r
+       protected NyARIntPoint2d _lt_ref;\r
+       public pickFromRaster_2x(NyARIntPoint2d i_lt,NyARIntSize i_source_size)\r
+       {\r
+               this._lt_ref=i_lt;\r
+               this._size_ref=i_source_size;\r
+               \r
+               this._rgb_temp=new int[i_source_size.w*4*3];\r
+               this._rgb_px=new int[i_source_size.w*4];\r
+               this._rgb_py=new int[i_source_size.w*4];\r
+               \r
+\r
+               return;\r
+       }\r
+       private int[] _rgb_temp;\r
+       private int[] _rgb_px;\r
+       private int[] _rgb_py;\r
+\r
+\r
+       public void pickFromRaster(double[] i_cpara,INyARRgbRaster image, NyARSquare i_square,int[] o_patt)throws NyARException\r
+       {\r
+               double d0,m0,d1,m1;\r
+               int x,y;\r
+               \r
+               final int img_x = image.getWidth();\r
+               final int img_y = image.getHeight();\r
+               final int patt_w=this._size_ref.w;\r
+\r
+               final int[] rgb_tmp = this._rgb_temp;\r
+               final int[] rgb_px=this._rgb_px;\r
+               final int[] rgb_py=this._rgb_py;        \r
+\r
+               \r
+\r
+               final double cp0=i_cpara[0];\r
+               final double cp3=i_cpara[3];\r
+               final double cp6=i_cpara[6];\r
+               final double cp1=i_cpara[1];\r
+               final double cp4=i_cpara[4];\r
+               final double cp7=i_cpara[7];\r
+               \r
+       \r
+               final int pick_y=this._lt_ref.y;\r
+               final int pick_x=this._lt_ref.x;\r
+               //ピクセルリーダーを取得\r
+               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               int p=0;\r
+\r
+               \r
+               double cp0cx0,cp3cx0;\r
+               double cp1cy_cp20=cp1*pick_y+i_cpara[2]+cp0*pick_x;\r
+               double cp4cy_cp50=cp4*pick_y+i_cpara[5]+cp3*pick_x;\r
+               double cp7cy_10=cp7*pick_y+1.0+cp6*pick_x;\r
+\r
+\r
+               double cp0cx1,cp3cx1;\r
+               double cp1cy_cp21=cp1cy_cp20+cp1;\r
+               double cp4cy_cp51=cp4cy_cp50+cp4;\r
+               double cp7cy_11=cp7cy_10+cp7;\r
+               \r
+               double cw0=cp1+cp1;\r
+               double cw7=cp7+cp7;\r
+               double cw4=cp4+cp4;\r
+               \r
+               for(int iy=this._size_ref.h-1;iy>=0;iy--){                      \r
+                       cp0cx0=cp1cy_cp20;\r
+                       cp3cx0=cp4cy_cp50;\r
+                       cp0cx1=cp1cy_cp21;\r
+                       cp3cx1=cp4cy_cp51;\r
+\r
+                       m0=1/(cp7cy_10);\r
+                       d0=-cp6/(cp7cy_10*(cp7cy_10+cp6));                      \r
+                       m1=1/(cp7cy_11);\r
+                       d1=-cp6/(cp7cy_11*(cp7cy_11+cp6));                      \r
+                       \r
+                       int n=patt_w*2*2-1;\r
+                       \r
+                       for(int ix=patt_w*2-1;ix>=0;ix--){\r
+                               //[n,0]\r
+                               x=rgb_px[n]=(int)(cp0cx0*m0);\r
+                               y=rgb_py[n]=(int)(cp3cx0*m0);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[n]=0;}else if(x>=img_x){rgb_px[n]=img_x-1;}\r
+                                       if(y<0){rgb_py[n]=0;}else if(y>=img_y){rgb_py[n]=img_y-1;}                      \r
+                               }\r
+                               cp0cx0+=cp0;\r
+                               cp3cx0+=cp3;\r
+                               m0+=d0;\r
+                               n--;\r
+                               //[n,1]\r
+                               x=rgb_px[n]=(int)(cp0cx1*m1);\r
+                               y=rgb_py[n]=(int)(cp3cx1*m1);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[n]=0;}else if(x>=img_x){rgb_px[n]=img_x-1;}\r
+                                       if(y<0){rgb_py[n]=0;}else if(y>=img_y){rgb_py[n]=img_y-1;}                      \r
+                               }\r
+                               cp0cx1+=cp0;\r
+                               cp3cx1+=cp3;\r
+                               m1+=d1;\r
+                               n--;                    \r
+                       }\r
+                       cp7cy_10+=cw7;\r
+                       cp7cy_11+=cw7;\r
+\r
+                       cp1cy_cp20+=cw0;\r
+                       cp4cy_cp50+=cw4;\r
+                       cp1cy_cp21+=cw0;\r
+                       cp4cy_cp51+=cw4;\r
+\r
+\r
+\r
+                       reader.getPixelSet(rgb_px, rgb_py,patt_w*4, rgb_tmp);\r
+                       for(int ix=patt_w-1;ix>=0;ix--){\r
+                               final int idx=ix*12;//3*2*2\r
+                               final int r=(rgb_tmp[idx+0]+rgb_tmp[idx+3]+rgb_tmp[idx+6]+rgb_tmp[idx+ 9])/4;\r
+                               final int g=(rgb_tmp[idx+1]+rgb_tmp[idx+4]+rgb_tmp[idx+7]+rgb_tmp[idx+10])/4;\r
+                               final int b=(rgb_tmp[idx+2]+rgb_tmp[idx+5]+rgb_tmp[idx+8]+rgb_tmp[idx+11])/4;\r
+                               o_patt[p]=(r<<16)|(g<<8)|((b&0xff));\r
+                               p++;\r
+                       }\r
+               }\r
+\r
+               return;\r
+       }\r
+}\r
+\r
+/**\r
+ * 4x4\r
+ *\r
+ */\r
+class pickFromRaster_4x implements IpickFromRaster_Impl\r
+{\r
+       protected NyARIntSize _size_ref;\r
+       protected NyARIntPoint2d _lt_ref;\r
+       public pickFromRaster_4x(NyARIntPoint2d i_lt,NyARIntSize i_source_size)\r
+       {\r
+               this._lt_ref=i_lt;\r
+               this._size_ref=i_source_size;\r
+               \r
+               this._rgb_temp=new int[4*4*3];\r
+               this._rgb_px=new int[4*4];\r
+               this._rgb_py=new int[4*4];\r
+               return;\r
+       }\r
+       private int[] _rgb_temp;\r
+       private int[] _rgb_px;\r
+       private int[] _rgb_py;\r
+       \r
+       public void pickFromRaster(double[] i_cpara,INyARRgbRaster image, NyARSquare i_square,int[] o_patt)throws NyARException\r
+       {\r
+               int x,y;\r
+               double d,m;\r
+               double cp6cx,cp0cx,cp3cx;\r
+               final int[] rgb_px=this._rgb_px;\r
+               final int[] rgb_py=this._rgb_py;\r
+\r
+               int r,g,b;              \r
+               //遠近法のパラメータを計算\r
+               \r
+               final int img_x = image.getWidth();\r
+               final int img_y = image.getHeight();\r
+               final int[] rgb_tmp = this._rgb_temp;\r
+               final double cp0=i_cpara[0];\r
+               final double cp3=i_cpara[3];\r
+               final double cp6=i_cpara[6];\r
+               final double cp1=i_cpara[1];\r
+               final double cp2=i_cpara[2];\r
+               final double cp4=i_cpara[4];\r
+               final double cp5=i_cpara[5];\r
+               final double cp7=i_cpara[7];\r
+       \r
+\r
+               final int pick_lt_x=this._lt_ref.x;\r
+               //ピクセルリーダーを取得\r
+               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               \r
+\r
+               int p=0;\r
+               int py=this._lt_ref.y;\r
+               for(int iy=this._size_ref.h-1;iy>=0;iy--,py+=4){\r
+                       final double cp1cy_cp2_0=cp1*py+cp2;\r
+                       final double cp4cy_cp5_0=cp4*py+cp5;\r
+                       final double cp7cy_1_0  =cp7*py+1.0;\r
+                       \r
+                       final double cp1cy_cp2_1=cp1cy_cp2_0+cp1;\r
+                       final double cp1cy_cp2_2=cp1cy_cp2_1+cp1;\r
+                       final double cp1cy_cp2_3=cp1cy_cp2_2+cp1;\r
+\r
+                       final double cp4cy_cp5_1=cp4cy_cp5_0+cp4;\r
+                       final double cp4cy_cp5_2=cp4cy_cp5_1+cp4;\r
+                       final double cp4cy_cp5_3=cp4cy_cp5_2+cp4;\r
+                       \r
+                       int px=pick_lt_x;\r
+                       //解像度分の点を取る。\r
+                       for(int ix=this._size_ref.w-1;ix>=0;ix--,px+=4){\r
+\r
+                               cp6cx=cp6*px;\r
+                               cp0cx=cp0*px;                           \r
+                               cp3cx=cp3*px;\r
+                               \r
+                               cp6cx+=cp7cy_1_0;\r
+                               m=1/cp6cx;\r
+                               d=-cp7/((cp6cx+cp7)*cp6cx);                     \r
+\r
+                               //1ピクセルを作成[0,0]\r
+                               x=rgb_px[0]=(int)((cp0cx+cp1cy_cp2_0)*m);\r
+                               y=rgb_py[0]=(int)((cp3cx+cp4cy_cp5_0)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[0]=0;}else if(x>=img_x){rgb_px[0]=img_x-1;}\r
+                                       if(y<0){rgb_py[0]=0;}else if(y>=img_y){rgb_py[0]=img_y-1;}                      \r
+                               }\r
+\r
+                               //1ピクセルを作成[0,1]\r
+                               m+=d;                           \r
+                               x=rgb_px[4]=(int)((cp0cx+cp1cy_cp2_1)*m);\r
+                               y=rgb_py[4]=(int)((cp3cx+cp4cy_cp5_1)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[4]=0;}else if(x>=img_x){rgb_px[4]=img_x-1;}\r
+                                       if(y<0){rgb_py[4]=0;}else if(y>=img_y){rgb_py[4]=img_y-1;}                      \r
+                               }                               \r
+                               //1ピクセルを作成[0,2]\r
+                               m+=d;\r
+                               x=rgb_px[8]=(int)((cp0cx+cp1cy_cp2_2)*m);\r
+                               y=rgb_py[8]=(int)((cp3cx+cp4cy_cp5_2)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[8]=0;}else if(x>=img_x){rgb_px[8]=img_x-1;}\r
+                                       if(y<0){rgb_py[8]=0;}else if(y>=img_y){rgb_py[8]=img_y-1;}                      \r
+                               }\r
+                               \r
+                               //1ピクセルを作成[0,3]\r
+                               m+=d;\r
+                               x=rgb_px[12]=(int)((cp0cx+cp1cy_cp2_3)*m);\r
+                               y=rgb_py[12]=(int)((cp3cx+cp4cy_cp5_3)*m);                              \r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[12]=0;}else if(x>=img_x){rgb_px[12]=img_x-1;}\r
+                                       if(y<0){rgb_py[12]=0;}else if(y>=img_y){rgb_py[12]=img_y-1;}                    \r
+                               }\r
+                               \r
+                               cp6cx+=cp6;\r
+                               cp0cx+=cp0;\r
+                               cp3cx+=cp3;\r
+                               \r
+                               m=1/cp6cx;\r
+                               d=-cp7/((cp6cx+cp7)*cp6cx);                             \r
+                               \r
+                               //1ピクセルを作成[1,0]\r
+                               x=rgb_px[1]=(int)((cp0cx+cp1cy_cp2_0)*m);\r
+                               y=rgb_py[1]=(int)((cp3cx+cp4cy_cp5_0)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[1]=0;}else if(x>=img_x){rgb_px[1]=img_x-1;}\r
+                                       if(y<0){rgb_py[1]=0;}else if(y>=img_y){rgb_py[1]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[1,1]\r
+                               m+=d;\r
+                               x=rgb_px[5]=(int)((cp0cx+cp1cy_cp2_1)*m);\r
+                               y=rgb_py[5]=(int)((cp3cx+cp4cy_cp5_1)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[5]=0;}else if(x>=img_x){rgb_px[5]=img_x-1;}\r
+                                       if(y<0){rgb_py[5]=0;}else if(y>=img_y){rgb_py[5]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[1,2]\r
+                               m+=d;\r
+                               x=rgb_px[9]=(int)((cp0cx+cp1cy_cp2_2)*m);\r
+                               y=rgb_py[9]=(int)((cp3cx+cp4cy_cp5_2)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[9]=0;}else if(x>=img_x){rgb_px[9]=img_x-1;}\r
+                                       if(y<0){rgb_py[9]=0;}else if(y>=img_y){rgb_py[9]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[1,3]\r
+                               m+=d;\r
+                               x=rgb_px[13]=(int)((cp0cx+cp1cy_cp2_3)*m);\r
+                               y=rgb_py[13]=(int)((cp3cx+cp4cy_cp5_3)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[13]=0;}else if(x>=img_x){rgb_px[13]=img_x-1;}\r
+                                       if(y<0){rgb_py[13]=0;}else if(y>=img_y){rgb_py[13]=img_y-1;}\r
+                               }\r
+               \r
+                               cp6cx+=cp6;\r
+                               cp0cx+=cp0;\r
+                               cp3cx+=cp3;\r
+\r
+                               m=1/cp6cx;\r
+                               d=-cp7/((cp6cx+cp7)*cp6cx);\r
+                               \r
+                               //1ピクセルを作成[2,0]\r
+                               x=rgb_px[2]=(int)((cp0cx+cp1cy_cp2_0)*m);\r
+                               y=rgb_py[2]=(int)((cp3cx+cp4cy_cp5_0)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[2]=0;}else if(x>=img_x){rgb_px[2]=img_x-1;}\r
+                                       if(y<0){rgb_py[2]=0;}else if(y>=img_y){rgb_py[2]=img_y-1;}\r
+                               }                               \r
+                               //1ピクセルを作成[2,1]\r
+                               m+=d;\r
+                               x=rgb_px[6]=(int)((cp0cx+cp1cy_cp2_1)*m);\r
+                               y=rgb_py[6]=(int)((cp3cx+cp4cy_cp5_1)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[6]=0;}else if(x>=img_x){rgb_px[6]=img_x-1;}\r
+                                       if(y<0){rgb_py[6]=0;}else if(y>=img_y){rgb_py[6]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[2,2]\r
+                               m+=d;\r
+                               x=rgb_px[10]=(int)((cp0cx+cp1cy_cp2_2)*m);\r
+                               y=rgb_py[10]=(int)((cp3cx+cp4cy_cp5_2)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[10]=0;}else if(x>=img_x){rgb_px[10]=img_x-1;}\r
+                                       if(y<0){rgb_py[10]=0;}else if(y>=img_y){rgb_py[10]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[2,3](ここ計算ずれします。)\r
+                               m+=d;\r
+                               x=rgb_px[14]=(int)((cp0cx+cp1cy_cp2_3)*m);\r
+                               y=rgb_py[14]=(int)((cp3cx+cp4cy_cp5_3)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[14]=0;}else if(x>=img_x){rgb_px[14]=img_x-1;}\r
+                                       if(y<0){rgb_py[14]=0;}else if(y>=img_y){rgb_py[14]=img_y-1;}\r
+                               }\r
+                               cp6cx+=cp6;\r
+                               cp0cx+=cp0;\r
+                               cp3cx+=cp3;\r
+\r
+                               m=1/cp6cx;\r
+                               d=-cp7/((cp6cx+cp7)*cp6cx);\r
+                                                               \r
+                               //1ピクセルを作成[3,0]\r
+                               x=rgb_px[3]=(int)((cp0cx+cp1cy_cp2_0)*m);\r
+                               y=rgb_py[3]=(int)((cp3cx+cp4cy_cp5_0)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[3]=0;}else if(x>=img_x){rgb_px[3]=img_x-1;}\r
+                                       if(y<0){rgb_py[3]=0;}else if(y>=img_y){rgb_py[3]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[3,1]\r
+                               m+=d;\r
+                               x=rgb_px[7]=(int)((cp0cx+cp1cy_cp2_1)*m);\r
+                               y=rgb_py[7]=(int)((cp3cx+cp4cy_cp5_1)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[7]=0;}else if(x>=img_x){rgb_px[7]=img_x-1;}\r
+                                       if(y<0){rgb_py[7]=0;}else if(y>=img_y){rgb_py[7]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[3,2]\r
+                               m+=d;\r
+                               x=rgb_px[11]=(int)((cp0cx+cp1cy_cp2_2)*m);\r
+                               y=rgb_py[11]=(int)((cp3cx+cp4cy_cp5_2)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[11]=0;}else if(x>=img_x){rgb_px[11]=img_x-1;}\r
+                                       if(y<0){rgb_py[11]=0;}else if(y>=img_y){rgb_py[11]=img_y-1;}\r
+                               }\r
+                               //1ピクセルを作成[3,3]\r
+                               m+=d;\r
+                               x=rgb_px[15]=(int)((cp0cx+cp1cy_cp2_3)*m);\r
+                               y=rgb_py[15]=(int)((cp3cx+cp4cy_cp5_3)*m);\r
+                               if(x<0||x>=img_x||y<0||y>=img_y){\r
+                                       if(x<0){rgb_px[15]=0;}else if(x>=img_x){rgb_px[15]=img_x-1;}\r
+                                       if(y<0){rgb_py[15]=0;}else if(y>=img_y){rgb_py[15]=img_y-1;}\r
+                               }\r
+\r
+                               reader.getPixelSet(rgb_px, rgb_py,4*4, rgb_tmp);\r
+\r
+                               r=(rgb_tmp[ 0]+rgb_tmp[ 3]+rgb_tmp[ 6]+rgb_tmp[ 9]+rgb_tmp[12]+rgb_tmp[15]+rgb_tmp[18]+rgb_tmp[21]+rgb_tmp[24]+rgb_tmp[27]+rgb_tmp[30]+rgb_tmp[33]+rgb_tmp[36]+rgb_tmp[39]+rgb_tmp[42]+rgb_tmp[45])/16;\r
+                               g=(rgb_tmp[ 1]+rgb_tmp[ 4]+rgb_tmp[ 7]+rgb_tmp[10]+rgb_tmp[13]+rgb_tmp[16]+rgb_tmp[19]+rgb_tmp[22]+rgb_tmp[25]+rgb_tmp[28]+rgb_tmp[31]+rgb_tmp[34]+rgb_tmp[37]+rgb_tmp[40]+rgb_tmp[43]+rgb_tmp[46])/16;\r
+                               b=(rgb_tmp[ 2]+rgb_tmp[ 5]+rgb_tmp[ 8]+rgb_tmp[11]+rgb_tmp[14]+rgb_tmp[17]+rgb_tmp[20]+rgb_tmp[23]+rgb_tmp[26]+rgb_tmp[29]+rgb_tmp[32]+rgb_tmp[35]+rgb_tmp[38]+rgb_tmp[41]+rgb_tmp[44]+rgb_tmp[47])/16;\r
+                               o_patt[p]=((r&0xff)<<16)|((g&0xff)<<8)|((b&0xff));\r
+                               p++;\r
+                       \r
+                       }\r
+               }\r
+               return;\r
+       }\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+/**\r
+ * 遠近法を使ったパースペクティブ補正をかけて、ラスタ上の四角形から\r
+ * 任意解像度の矩形パターンを作成します。\r
+ *\r
+ */\r
+public class NyARColorPatt_Perspective_O2 extends NyARColorPatt_Perspective\r
+{\r
+       private IpickFromRaster_Impl _pickup;\r
+       public NyARColorPatt_Perspective_O2(int i_width, int i_height,int i_resolution,int i_edge_percentage)\r
+       {\r
+               super(i_width,i_height,i_resolution,i_edge_percentage);\r
+               switch(i_resolution){\r
+               case 1:\r
+                       this._pickup=new pickFromRaster_1(this._pickup_lt,this._size);\r
+                       break;\r
+               case 2:\r
+                       this._pickup=new pickFromRaster_2x(this._pickup_lt,this._size);\r
+                       break;\r
+               case 4:\r
+                       this._pickup=new pickFromRaster_4x(this._pickup_lt,this._size);\r
+                       break;\r
+               default:\r
+                       this._pickup=new pickFromRaster_N(this._pickup_lt,i_resolution,this._size);\r
+               }               \r
+               return;\r
+       }\r
+\r
+       public boolean pickFromRaster(INyARRgbRaster image, NyARSquare i_square)throws NyARException\r
+       {\r
+               //遠近法のパラメータを計算\r
+               final double[] cpara = this.__pickFromRaster_cpara;\r
+               if (!this._perspective_gen.getParam(i_square.imvertex, cpara)) {\r
+                       return false;\r
+               }               \r
+               this._pickup.pickFromRaster(cpara, image, i_square, this._patdata);\r
+               return true;\r
+       }\r
+\r
+}\r
+\r
\ No newline at end of file