--- /dev/null
+/* \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