| 1 |
/* |
|---|
| 2 |
* PROJECT: FLARToolKit |
|---|
| 3 |
* -------------------------------------------------------------------------------- |
|---|
| 4 |
* This work is based on the NyARToolKit developed by |
|---|
| 5 |
* R.Iizuka (nyatla) |
|---|
| 6 |
* http://nyatla.jp/nyatoolkit/ |
|---|
| 7 |
* |
|---|
| 8 |
* The FLARToolKit is ActionScript 3.0 version ARToolkit class library. |
|---|
| 9 |
* Copyright (C)2008 Saqoosha |
|---|
| 10 |
* |
|---|
| 11 |
* This program is free software; you can redistribute it and/or |
|---|
| 12 |
* modify it under the terms of the GNU General Public License |
|---|
| 13 |
* as published by the Free Software Foundation; either version 2 |
|---|
| 14 |
* of the License, or (at your option) any later version. |
|---|
| 15 |
* |
|---|
| 16 |
* This program is distributed in the hope that it will be useful, |
|---|
| 17 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 18 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 19 |
* GNU General Public License for more details. |
|---|
| 20 |
* |
|---|
| 21 |
* You should have received a copy of the GNU General Public License |
|---|
| 22 |
* along with this framework; if not, write to the Free Software |
|---|
| 23 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|---|
| 24 |
* |
|---|
| 25 |
* For further information please contact. |
|---|
| 26 |
* http://www.libspark.org/wiki/saqoosha/FLARToolKit |
|---|
| 27 |
* <saq(at)saqoosha.net> |
|---|
| 28 |
* |
|---|
| 29 |
*/ |
|---|
| 30 |
|
|---|
| 31 |
package org.libspark.flartoolkit.core.pickup { |
|---|
| 32 |
import org.libspark.flartoolkit.core.pickup.IFLARColorPatt; |
|---|
| 33 |
import org.libspark.flartoolkit.utils.ArrayUtil; |
|---|
| 34 |
import org.libspark.flartoolkit.FLARException; |
|---|
| 35 |
import org.libspark.flartoolkit.core.FLARMat; |
|---|
| 36 |
import org.libspark.flartoolkit.core.FLARSquare; |
|---|
| 37 |
import org.libspark.flartoolkit.core.raster.rgb.IFLARRgbRaster; |
|---|
| 38 |
import org.libspark.flartoolkit.core.rasterreader.IFLARRgbPixelReader; |
|---|
| 39 |
|
|---|
| 40 |
/** |
|---|
| 41 |
* 24ビットカラーのマーカーを保持するために使うクラスです。 このクラスは、ARToolkitのパターンと、ラスタから取得したパターンを保持します。 |
|---|
| 42 |
* 演算順序を含む最適化をしたもの |
|---|
| 43 |
* |
|---|
| 44 |
*/ |
|---|
| 45 |
public class FLARDynamicRatioColorPatt_O3 implements IFLARColorPatt { |
|---|
| 46 |
|
|---|
| 47 |
private static const AR_PATT_SAMPLE_NUM:int = 64; |
|---|
| 48 |
|
|---|
| 49 |
|
|---|
| 50 |
// #define |
|---|
| 51 |
// AR_PATT_SAMPLE_NUM 64 |
|---|
| 52 |
|
|---|
| 53 |
private var extpat:Array; |
|---|
| 54 |
// int[][][] |
|---|
| 55 |
|
|---|
| 56 |
private var _width:int; |
|---|
| 57 |
|
|---|
| 58 |
private var _height:int; |
|---|
| 59 |
|
|---|
| 60 |
private var _pickFromRasterDivideX:Number; |
|---|
| 61 |
private var _pickFromRasterDivideY:Number; |
|---|
| 62 |
|
|---|
| 63 |
private var _extPatXwBase:Number; |
|---|
| 64 |
private var _extPatXwStep:Number; |
|---|
| 65 |
private var _extPatYwBase:Number; |
|---|
| 66 |
private var _extPatYwStep:Number; |
|---|
| 67 |
|
|---|
| 68 |
/** |
|---|
| 69 |
* 枠の全く無いマーカや、長方形のマーカも扱えるIFLARColorPattの実装クラス |
|---|
| 70 |
* @param i_width マーカパターンのX方向の値の個数 |
|---|
| 71 |
* @param i_height マーカパターンのY方向の値の個数 |
|---|
| 72 |
* @param markerWidthByDec マーカ全体を10とした場合の、マーカ幅の割合(X方向)。デフォルトは5(1:2:1) |
|---|
| 73 |
* @param markerHeightByDec マーカ全体を10とした場合の、マーカ高さの割合(Y方向)。デフォルトは5(1:2:1) |
|---|
| 74 |
*/ |
|---|
| 75 |
public function FLARDynamicRatioColorPatt_O3(i_width:int, |
|---|
| 76 |
i_height:int, |
|---|
| 77 |
markerWidthByDec:Number = 5, |
|---|
| 78 |
markerHeightByDec:Number = 5) { |
|---|
| 79 |
if (markerWidthByDec < 0 || markerWidthByDec > WK_WORLD_ADD) { |
|---|
| 80 |
throw new ArgumentError("Marker width is between 0 and " + WK_WORLD_BASE + "."); |
|---|
| 81 |
} |
|---|
| 82 |
if (markerHeightByDec < 0 || markerHeightByDec > WK_WORLD_ADD) { |
|---|
| 83 |
throw new ArgumentError("Marker height is between 0 and " + WK_WORLD_BASE + "."); |
|---|
| 84 |
} |
|---|
| 85 |
|
|---|
| 86 |
var frameWidthByDec:Number = (WK_WORLD_ADD - markerWidthByDec)/2; |
|---|
| 87 |
var frameHeightByDec:Number = (WK_WORLD_ADD - markerHeightByDec)/2; |
|---|
| 88 |
|
|---|
| 89 |
//updateExtpatで利用する、マーカと枠の比率の値を決めている |
|---|
| 90 |
this._extPatXwBase = WK_WORLD_BASE + frameWidthByDec; |
|---|
| 91 |
this._extPatYwBase = WK_WORLD_BASE + frameHeightByDec; |
|---|
| 92 |
this._extPatXwStep = (WK_WORLD_ADD - frameWidthByDec * 2); |
|---|
| 93 |
this._extPatYwStep = (WK_WORLD_ADD - frameHeightByDec * 2); |
|---|
| 94 |
|
|---|
| 95 |
this._width = i_width; |
|---|
| 96 |
this._height = i_height; |
|---|
| 97 |
this._pickFromRasterDivideX = AR_PATT_SAMPLE_NUM / i_width; |
|---|
| 98 |
this._pickFromRasterDivideY = AR_PATT_SAMPLE_NUM / i_height; |
|---|
| 99 |
this.extpat = ArrayUtil.createJaggedArray(i_height, i_width, 3);//newint[i_height][i_width][3]; |
|---|
| 100 |
} |
|---|
| 101 |
|
|---|
| 102 |
/** |
|---|
| 103 |
* マーカ全体を10とした場合の、枠の太さ(X方向)を取得 |
|---|
| 104 |
*/ |
|---|
| 105 |
public function get frameWidthByDec():Number |
|---|
| 106 |
{ |
|---|
| 107 |
return this._extPatXwBase - WK_WORLD_BASE; |
|---|
| 108 |
} |
|---|
| 109 |
|
|---|
| 110 |
/** |
|---|
| 111 |
* マーカ全体を10とした場合の、枠の太さ(X方向)を変更 |
|---|
| 112 |
* @param value 新しい値 |
|---|
| 113 |
*/ |
|---|
| 114 |
public function set frameWidthByDec(value:Number):void |
|---|
| 115 |
{ |
|---|
| 116 |
this._extPatXwBase = WK_WORLD_BASE + value; |
|---|
| 117 |
this._extPatXwStep = (WK_WORLD_ADD - value * 2); |
|---|
| 118 |
} |
|---|
| 119 |
|
|---|
| 120 |
/** |
|---|
| 121 |
* マーカ全体を10とした場合の、枠の太さ(Y方向)を取得 |
|---|
| 122 |
*/ |
|---|
| 123 |
public function get frameHeightByDec():Number |
|---|
| 124 |
{ |
|---|
| 125 |
return this._extPatXwBase - WK_WORLD_BASE; |
|---|
| 126 |
} |
|---|
| 127 |
|
|---|
| 128 |
/** |
|---|
| 129 |
* マーカ全体を10とした場合の、枠の太さ(Y方向)を変更 |
|---|
| 130 |
* @param value 新しい値 |
|---|
| 131 |
*/ |
|---|
| 132 |
public function set frameHeightByDec(value:Number):void |
|---|
| 133 |
{ |
|---|
| 134 |
this._extPatXwBase = WK_WORLD_BASE + value; |
|---|
| 135 |
this._extPatYwStep = (WK_WORLD_ADD - value * 2); |
|---|
| 136 |
} |
|---|
| 137 |
|
|---|
| 138 |
|
|---|
| 139 |
public function get width():int { return _width; } |
|---|
| 140 |
|
|---|
| 141 |
public function set width(value:int):void |
|---|
| 142 |
{ |
|---|
| 143 |
this._width = value; |
|---|
| 144 |
this._pickFromRasterDivideX = AR_PATT_SAMPLE_NUM / value; |
|---|
| 145 |
this.extpat = ArrayUtil.createJaggedArray(this._height, this._width, 3); |
|---|
| 146 |
} |
|---|
| 147 |
|
|---|
| 148 |
public function get height():int { return _height; } |
|---|
| 149 |
|
|---|
| 150 |
public function set height(value:int):void |
|---|
| 151 |
{ |
|---|
| 152 |
this._height = value; |
|---|
| 153 |
this._pickFromRasterDivideY = AR_PATT_SAMPLE_NUM / value; |
|---|
| 154 |
this.extpat = ArrayUtil.createJaggedArray(this._height, this._width, 3); |
|---|
| 155 |
} |
|---|
| 156 |
|
|---|
| 157 |
// public void setSize(int i_new_width,int i_new_height) |
|---|
| 158 |
// { |
|---|
| 159 |
// int array_w=this.extpat[0].length; |
|---|
| 160 |
// int array_h=this.extpat.length; |
|---|
| 161 |
// //十分なサイズのバッファがあるか確認 |
|---|
| 162 |
// if(array_w>=i_new_width && array_h>=i_new_height){ |
|---|
| 163 |
// //OK 十分だ→サイズ調整のみ |
|---|
| 164 |
// }else{ |
|---|
| 165 |
// //足りないよ→取り直し |
|---|
| 166 |
// this.extpat=new int[i_new_height][i_new_width][3]; |
|---|
| 167 |
// } |
|---|
| 168 |
// this.width =i_new_width; |
|---|
| 169 |
// this.height=i_new_height; |
|---|
| 170 |
// return; |
|---|
| 171 |
// } |
|---|
| 172 |
/** |
|---|
| 173 |
* @return int[][][] |
|---|
| 174 |
*/ |
|---|
| 175 |
public function getPatArray():Array { |
|---|
| 176 |
return extpat; |
|---|
| 177 |
} |
|---|
| 178 |
|
|---|
| 179 |
public function getWidth():int { |
|---|
| 180 |
return width; |
|---|
| 181 |
} |
|---|
| 182 |
|
|---|
| 183 |
public function getHeight():int { |
|---|
| 184 |
return height; |
|---|
| 185 |
} |
|---|
| 186 |
|
|---|
| 187 |
private const wk_get_cpara_a:FLARMat = new FLARMat(8, 8); |
|---|
| 188 |
|
|---|
| 189 |
private const wk_get_cpara_b:FLARMat = new FLARMat(8, 1); |
|---|
| 190 |
|
|---|
| 191 |
/** |
|---|
| 192 |
* @param i_vertex FLARIntPoint[] |
|---|
| 193 |
* @throws FLARException |
|---|
| 194 |
*/ |
|---|
| 195 |
private function get_cpara(i_vertex:Array, o_para:FLARMat):Boolean { |
|---|
| 196 |
var world:Array = this.wk_pickFromRaster_world;// int[][] |
|---|
| 197 |
var a:FLARMat = wk_get_cpara_a;// 次処理で値を設定するので、初期化不要// new FLARMat( 8, 8 ); |
|---|
| 198 |
var a_array:Array = a.getArray();// double[][] |
|---|
| 199 |
var b:FLARMat = wk_get_cpara_b;// 次処理で値を設定するので、初期化不要// new FLARMat( 8, 1 ); |
|---|
| 200 |
var b_array:Array = b.getArray();// double[][] |
|---|
| 201 |
var a_pt0:Array, a_pt1:Array;// double[] |
|---|
| 202 |
var world_pti:Array;// int[] |
|---|
| 203 |
|
|---|
| 204 |
for (var i:int = 0;i < 4; i++) { |
|---|
| 205 |
a_pt0 = a_array[i * 2]; |
|---|
| 206 |
a_pt1 = a_array[i * 2 + 1]; |
|---|
| 207 |
world_pti = world[i]; |
|---|
| 208 |
|
|---|
| 209 |
a_pt0[0] = world_pti[0];// a->m[i*16+0] = world[i][0]; |
|---|
| 210 |
a_pt0[1] = world_pti[1];// a->m[i*16+1] = world[i][1]; |
|---|
| 211 |
a_pt0[2] = 1.0;// a->m[i*16+2] = 1.0; |
|---|
| 212 |
a_pt0[3] = 0.0;// a->m[i*16+3] = 0.0; |
|---|
| 213 |
a_pt0[4] = 0.0;// a->m[i*16+4] = 0.0; |
|---|
| 214 |
a_pt0[5] = 0.0;// a->m[i*16+5] = 0.0; |
|---|
| 215 |
a_pt0[6] = (-world_pti[0] * i_vertex[i].x);// a->m[i*16+6]= -world[i][0]*vertex[i][0]; |
|---|
| 216 |
a_pt0[7] = (-world_pti[1] * i_vertex[i].x);// a->m[i*16+7]=-world[i][1]*vertex[i][0]; |
|---|
| 217 |
a_pt1[0] = 0.0;// a->m[i*16+8] = 0.0; |
|---|
| 218 |
a_pt1[1] = 0.0;// a->m[i*16+9] = 0.0; |
|---|
| 219 |
a_pt1[2] = 0.0;// a->m[i*16+10] = 0.0; |
|---|
| 220 |
a_pt1[3] = world_pti[0];// a->m[i*16+11] = world[i][0]; |
|---|
| 221 |
a_pt1[4] = world_pti[1];// a->m[i*16+12] = world[i][1]; |
|---|
| 222 |
a_pt1[5] = 1.0;// a->m[i*16+13] = 1.0; |
|---|
| 223 |
a_pt1[6] = (-world_pti[0] * i_vertex[i].y);// a->m[i*16+14]=-world[i][0]*vertex[i][1]; |
|---|
| 224 |
a_pt1[7] = (-world_pti[1] * i_vertex[i].y);// a->m[i*16+15]=-world[i][1]*vertex[i][1]; |
|---|
| 225 |
b_array[i * 2 + 0][0] = i_vertex[i].x;// b->m[i*2+0] =vertex[i][0]; |
|---|
| 226 |
b_array[i * 2 + 1][0] = i_vertex[i].y;// b->m[i*2+1] =vertex[i][1]; |
|---|
| 227 |
} |
|---|
| 228 |
if (!a.matrixSelfInv()) { |
|---|
| 229 |
return false; |
|---|
| 230 |
} |
|---|
| 231 |
|
|---|
| 232 |
o_para.matrixMul(a, b); |
|---|
| 233 |
return true; |
|---|
| 234 |
} |
|---|
| 235 |
|
|---|
| 236 |
// private const double[] wk_pickFromRaster_para=new double[9];//[3][3]; |
|---|
| 237 |
private const WK_WORLD_BASE:uint = 100; |
|---|
| 238 |
private const WK_WORLD_ADD:uint = 10; |
|---|
| 239 |
private const wk_pickFromRaster_world:Array = [ |
|---|
| 240 |
[WK_WORLD_BASE, WK_WORLD_BASE], |
|---|
| 241 |
[WK_WORLD_BASE + WK_WORLD_ADD, WK_WORLD_BASE], |
|---|
| 242 |
[WK_WORLD_BASE + WK_WORLD_ADD, WK_WORLD_BASE + WK_WORLD_ADD], |
|---|
| 243 |
[WK_WORLD_BASE, WK_WORLD_BASE + WK_WORLD_ADD] |
|---|
| 244 |
]; // double world[4][2]; |
|---|
| 245 |
|
|---|
| 246 |
/** |
|---|
| 247 |
* pickFromRaster関数から使う変数です。 |
|---|
| 248 |
* @param i_ext_pat2 int[][][] |
|---|
| 249 |
*/ |
|---|
| 250 |
private static function initValue_wk_pickFromRaster_ext_pat2(i_ext_pat2:Array, i_width:int, i_height:int):void { |
|---|
| 251 |
var i:int, i2:int; |
|---|
| 252 |
var pt2:Array;// int[][] |
|---|
| 253 |
var pt1:Array;// int[] |
|---|
| 254 |
for (i = i_height - 1;i >= 0; i--) { |
|---|
| 255 |
pt2 = i_ext_pat2[i]; |
|---|
| 256 |
for (i2 = i_width - 1;i2 >= 0; i2--) { |
|---|
| 257 |
pt1 = pt2[i2]; |
|---|
| 258 |
pt1[0] = 0; |
|---|
| 259 |
pt1[1] = 0; |
|---|
| 260 |
pt1[2] = 0; |
|---|
| 261 |
} |
|---|
| 262 |
} |
|---|
| 263 |
} |
|---|
| 264 |
|
|---|
| 265 |
private const wk_pickFromRaster_cpara:FLARMat = new FLARMat(8, 1); |
|---|
| 266 |
|
|---|
| 267 |
/** |
|---|
| 268 |
* imageから、i_markerの位置にあるパターンを切り出して、保持します。 Optimize:STEP[769->750] |
|---|
| 269 |
* |
|---|
| 270 |
* @param image |
|---|
| 271 |
* @param i_marker |
|---|
| 272 |
* @throws Exception |
|---|
| 273 |
*/ |
|---|
| 274 |
public function pickFromRaster(image:IFLARRgbRaster, i_square:FLARSquare):Boolean { |
|---|
| 275 |
var cpara:FLARMat = this.wk_pickFromRaster_cpara; |
|---|
| 276 |
var local:Array = i_square.imvertex; |
|---|
| 277 |
// FLARIntPoint[] |
|---|
| 278 |
// //localの計算 |
|---|
| 279 |
// int[] local_0=wk_pickFromRaster_local[0];//double local[4][2]; |
|---|
| 280 |
// int[] local_1=wk_pickFromRaster_local[1];//double local[4][2]; |
|---|
| 281 |
// // |
|---|
| 282 |
// for(int i = 0; i < 4; i++ ) { |
|---|
| 283 |
// local_0[i] = i_square.imvertex[i][0]; |
|---|
| 284 |
// local_1[i] = i_square.imvertex[i][1]; |
|---|
| 285 |
// } |
|---|
| 286 |
// xdiv2,ydiv2の計算 |
|---|
| 287 |
var xdiv2:int, ydiv2:int; |
|---|
| 288 |
var l1:int, l2:int; |
|---|
| 289 |
var w1:int, w2:int; |
|---|
| 290 |
|
|---|
| 291 |
// x計算 |
|---|
| 292 |
w1 = local[0].x - local[1].x; |
|---|
| 293 |
w2 = local[0].y - local[1].y; |
|---|
| 294 |
l1 = (w1 * w1 + w2 * w2); |
|---|
| 295 |
w1 = local[2].x - local[3].x; |
|---|
| 296 |
w2 = local[2].y - local[3].y; |
|---|
| 297 |
l2 = (w1 * w1 + w2 * w2); |
|---|
| 298 |
if (l2 > l1) { |
|---|
| 299 |
l1 = l2; |
|---|
| 300 |
} |
|---|
| 301 |
l1 = l1 / this._pickFromRasterDivideX; |
|---|
| 302 |
xdiv2 = this.width; |
|---|
| 303 |
while (xdiv2 * xdiv2 < l1) { |
|---|
| 304 |
xdiv2 *= 2; |
|---|
| 305 |
} |
|---|
| 306 |
if (xdiv2 > AR_PATT_SAMPLE_NUM) { |
|---|
| 307 |
xdiv2 = AR_PATT_SAMPLE_NUM; |
|---|
| 308 |
} |
|---|
| 309 |
|
|---|
| 310 |
// y計算 |
|---|
| 311 |
w1 = local[1].x - local[2].x; |
|---|
| 312 |
w2 = local[1].y - local[2].y; |
|---|
| 313 |
l1 = (w1 * w1 + w2 * w2); |
|---|
| 314 |
w1 = local[3].x - local[0].x; |
|---|
| 315 |
w2 = local[3].y - local[0].y; |
|---|
| 316 |
l2 = (w1 * w1 + w2 * w2); |
|---|
| 317 |
if (l2 > l1) { |
|---|
| 318 |
l1 = l2; |
|---|
| 319 |
} |
|---|
| 320 |
ydiv2 = this.height; |
|---|
| 321 |
l1 = l1 / this._pickFromRasterDivideY; |
|---|
| 322 |
while (ydiv2 * ydiv2 < l1) { |
|---|
| 323 |
ydiv2 *= 2; |
|---|
| 324 |
} |
|---|
| 325 |
if (ydiv2 > AR_PATT_SAMPLE_NUM) { |
|---|
| 326 |
ydiv2 = AR_PATT_SAMPLE_NUM; |
|---|
| 327 |
} |
|---|
| 328 |
|
|---|
| 329 |
// cparaの計算 |
|---|
| 330 |
if (!get_cpara(local, cpara)) { |
|---|
| 331 |
return false; |
|---|
| 332 |
} |
|---|
| 333 |
updateExtpat(image, cpara, xdiv2, ydiv2); |
|---|
| 334 |
return true; |
|---|
| 335 |
} |
|---|
| 336 |
|
|---|
| 337 |
// かなり大きいワークバッファを取るな…。 |
|---|
| 338 |
private var wk_updateExtpat_para00_xw:Array; |
|---|
| 339 |
// double[] |
|---|
| 340 |
|
|---|
| 341 |
private var wk_updateExtpat_para10_xw:Array; |
|---|
| 342 |
// double[] |
|---|
| 343 |
|
|---|
| 344 |
private var wk_updateExtpat_para20_xw:Array; |
|---|
| 345 |
// double[] |
|---|
| 346 |
|
|---|
| 347 |
private var wk_updateExtpat_rgb_buf:Array; |
|---|
| 348 |
// int[] |
|---|
| 349 |
|
|---|
| 350 |
private var wk_updateExtpat_x_rgb_index:Array; |
|---|
| 351 |
// int[] |
|---|
| 352 |
|
|---|
| 353 |
private var wk_updateExtpat_y_rgb_index:Array; |
|---|
| 354 |
// int[] |
|---|
| 355 |
|
|---|
| 356 |
private var wk_updateExtpat_i_rgb_index:Array; |
|---|
| 357 |
// int[] |
|---|
| 358 |
|
|---|
| 359 |
private var wk_updateExtpat_buffer_size:int = 0; |
|---|
| 360 |
|
|---|
| 361 |
/** |
|---|
| 362 |
* ワークバッファを予約する |
|---|
| 363 |
* |
|---|
| 364 |
* @param i_xdiv2 |
|---|
| 365 |
*/ |
|---|
| 366 |
private function reservWorkBuffers(i_xdiv2:int):void { |
|---|
| 367 |
if (this.wk_updateExtpat_buffer_size < i_xdiv2) { |
|---|
| 368 |
wk_updateExtpat_para00_xw = new Array(i_xdiv2); // new double[i_xdiv2]; |
|---|
| 369 |
wk_updateExtpat_para10_xw = new Array(i_xdiv2); // new double[i_xdiv2]; |
|---|
| 370 |
wk_updateExtpat_para20_xw = new Array(i_xdiv2); // new double[i_xdiv2]; |
|---|
| 371 |
wk_updateExtpat_rgb_buf = new Array(i_xdiv2 * 3); // new int[i_xdiv2 * 3]; |
|---|
| 372 |
wk_updateExtpat_x_rgb_index = new Array(i_xdiv2); // new int[i_xdiv2]; |
|---|
| 373 |
wk_updateExtpat_y_rgb_index = new Array(i_xdiv2); // new int[i_xdiv2]; |
|---|
| 374 |
wk_updateExtpat_i_rgb_index = new Array(i_xdiv2); // new int[i_xdiv2]; |
|---|
| 375 |
this.wk_updateExtpat_buffer_size = i_xdiv2; |
|---|
| 376 |
} |
|---|
| 377 |
// 十分なら何もしない。 |
|---|
| 378 |
return; |
|---|
| 379 |
} |
|---|
| 380 |
|
|---|
| 381 |
private function updateExtpat(image:IFLARRgbRaster, i_cpara:FLARMat, i_xdiv2:int, i_ydiv2:int):void { |
|---|
| 382 |
var img_x:int = image.getWidth(); |
|---|
| 383 |
var img_y:int = image.getHeight(); |
|---|
| 384 |
const L_extpat:Array = this.extpat; // int[][][] |
|---|
| 385 |
const L_WIDTH:int = this.width; |
|---|
| 386 |
const L_HEIGHT:int = this.height; |
|---|
| 387 |
/* wk_pickFromRaster_ext_pat2ワーク変数を初期化する。 */ |
|---|
| 388 |
// int[][][] ext_pat2=wk_pickFromRaster_ext_pat2;//ARUint32 |
|---|
| 389 |
// ext_pat2[AR_PATT_SIZE_Y][AR_PATT_SIZE_X][3]; |
|---|
| 390 |
var extpat_j:Array; // int[][] |
|---|
| 391 |
var extpat_j_i:Array; // int[] |
|---|
| 392 |
// int ext_pat2_j[][],ext_pat2_j_i[]; |
|---|
| 393 |
|
|---|
| 394 |
initValue_wk_pickFromRaster_ext_pat2(L_extpat, L_WIDTH, L_HEIGHT); |
|---|
| 395 |
|
|---|
| 396 |
var cpara_array:Array = i_cpara.getArray(); |
|---|
| 397 |
// double[][] |
|---|
| 398 |
var para21_x_yw:Number, para01_x_yw:Number, para11_x_yw:Number; |
|---|
| 399 |
var para00:Number, para01:Number, para02:Number, para10:Number, para11:Number, para12:Number, para20:Number, para21:Number; |
|---|
| 400 |
para00 = cpara_array[0 * 3 + 0][0];// para[i][0] = c->m[i*3+0]; |
|---|
| 401 |
para01 = cpara_array[0 * 3 + 1][0];// para[i][1] = c->m[i*3+1]; |
|---|
| 402 |
para02 = cpara_array[0 * 3 + 2][0];// para[i][2] = c->m[i*3+2]; |
|---|
| 403 |
para10 = cpara_array[1 * 3 + 0][0];// para[i][0] = c->m[i*3+0]; |
|---|
| 404 |
para11 = cpara_array[1 * 3 + 1][0];// para[i][1] = c->m[i*3+1]; |
|---|
| 405 |
para12 = cpara_array[1 * 3 + 2][0];// para[i][2] = c->m[i*3+2]; |
|---|
| 406 |
para20 = cpara_array[2 * 3 + 0][0];// para[2][0] = c->m[2*3+0]; |
|---|
| 407 |
para21 = cpara_array[2 * 3 + 1][0];// para[2][1] = c->m[2*3+1]; |
|---|
| 408 |
|
|---|
| 409 |
var d:Number, yw:Number; |
|---|
| 410 |
var xc:int, yc:int; |
|---|
| 411 |
var i:int, j:int; |
|---|
| 412 |
// arGetCode_put_zero(ext_pat2);//put_zero( (ARUint8 *)ext_pat2, |
|---|
| 413 |
// AR_PATT_SIZE_Y*AR_PATT_SIZE_X*3*sizeof(ARUint32) ); |
|---|
| 414 |
var xdiv:int = i_xdiv2 / L_WIDTH;// xdiv = xdiv2/Config.AR_PATT_SIZE_X; |
|---|
| 415 |
var ydiv:int = i_ydiv2 / L_HEIGHT;// ydiv = ydiv2/Config.AR_PATT_SIZE_Y; |
|---|
| 416 |
|
|---|
| 417 |
// 計算バッファを予約する |
|---|
| 418 |
this.reservWorkBuffers(i_xdiv2); |
|---|
| 419 |
var para00_xw:Array = this.wk_updateExtpat_para00_xw; // double[] |
|---|
| 420 |
var para10_xw:Array = this.wk_updateExtpat_para10_xw; // double[] |
|---|
| 421 |
var para20_xw:Array = this.wk_updateExtpat_para20_xw; // double[] |
|---|
| 422 |
var x_rgb_index:Array = this.wk_updateExtpat_x_rgb_index; // int[] |
|---|
| 423 |
var y_rgb_index:Array = this.wk_updateExtpat_y_rgb_index; // int[] |
|---|
| 424 |
var i_rgb_index:Array = this.wk_updateExtpat_i_rgb_index; // int[] |
|---|
| 425 |
var rgb_buf:Array = this.wk_updateExtpat_rgb_buf; // int[] |
|---|
| 426 |
var xw:Number; |
|---|
| 427 |
|
|---|
| 428 |
for (i = 0; i < i_xdiv2; i++) { |
|---|
| 429 |
xw = this._extPatXwBase + this._extPatXwStep * (i + 0.5) / i_xdiv2; |
|---|
| 430 |
para20_xw[i] = para20 * xw; |
|---|
| 431 |
para00_xw[i] = para00 * xw; |
|---|
| 432 |
para10_xw[i] = para10 * xw; |
|---|
| 433 |
} |
|---|
| 434 |
|
|---|
| 435 |
var index_num:int; |
|---|
| 436 |
//ピクセルリーダーを取得 |
|---|
| 437 |
var reader:IFLARRgbPixelReader = image.getRgbPixelReader(); |
|---|
| 438 |
|
|---|
| 439 |
for (j = 0; j < i_ydiv2; j++) { |
|---|
| 440 |
yw = this._extPatYwBase + this._extPatYwStep * (j + 0.5) / i_ydiv2; |
|---|
| 441 |
para21_x_yw = para21 * yw + 1.0; |
|---|
| 442 |
para11_x_yw = para11 * yw + para12; |
|---|
| 443 |
para01_x_yw = para01 * yw + para02; |
|---|
| 444 |
extpat_j = L_extpat[int(j / ydiv)]; |
|---|
| 445 |
index_num = 0; |
|---|
| 446 |
// ステップ1.RGB取得用のマップを作成 |
|---|
| 447 |
for (i = 0; i < i_xdiv2; i++) { |
|---|
| 448 |
d = para20_xw[i] + para21_x_yw; |
|---|
| 449 |
if (d == 0) { |
|---|
| 450 |
throw new FLARException(); |
|---|
| 451 |
} |
|---|
| 452 |
xc = (int)((para00_xw[i] + para01_x_yw) / d); |
|---|
| 453 |
yc = (int)((para10_xw[i] + para11_x_yw) / d); |
|---|
| 454 |
// 範囲外は無視 |
|---|
| 455 |
if (xc < 0 || xc >= img_x || yc < 0 || yc >= img_y) { |
|---|
| 456 |
continue; |
|---|
| 457 |
} |
|---|
| 458 |
// ピクセル値の計算 |
|---|
| 459 |
// image.getPixel(xc,yc,rgb_buf); |
|---|
| 460 |
// ext_pat2_j_i=ext_pat2_j[i/xdiv]; |
|---|
| 461 |
// ext_pat2_j_i[0] += rgb_buf[0];//R |
|---|
| 462 |
// ext_pat2_j_i[1] += rgb_buf[1];//G |
|---|
| 463 |
// ext_pat2_j_i[2] += rgb_buf[2];//B |
|---|
| 464 |
|
|---|
| 465 |
x_rgb_index[index_num] = xc; |
|---|
| 466 |
y_rgb_index[index_num] = yc; |
|---|
| 467 |
i_rgb_index[index_num] = int(i / xdiv); |
|---|
| 468 |
index_num++; |
|---|
| 469 |
} |
|---|
| 470 |
// //ステップ2.ピクセル配列を取得 |
|---|
| 471 |
reader.getPixelSet(x_rgb_index, y_rgb_index, index_num, rgb_buf); |
|---|
| 472 |
// //ピクセル値の計算 |
|---|
| 473 |
for (i = index_num - 1; i >= 0; i--) { |
|---|
| 474 |
extpat_j_i = extpat_j[i_rgb_index[i]]; |
|---|
| 475 |
extpat_j_i[0] += rgb_buf[i * 3 + 0];// R |
|---|
| 476 |
extpat_j_i[1] += rgb_buf[i * 3 + 1];// G |
|---|
| 477 |
extpat_j_i[2] += rgb_buf[i * 3 + 2];// B |
|---|
| 478 |
} |
|---|
| 479 |
} |
|---|
| 480 |
/* <Optimize> */ |
|---|
| 481 |
var xdiv_x_ydiv:int = xdiv * ydiv; |
|---|
| 482 |
for (j = L_HEIGHT - 1; j >= 0; j--) { |
|---|
| 483 |
extpat_j = L_extpat[j]; |
|---|
| 484 |
for (i = L_WIDTH - 1; i >= 0; i--) { |
|---|
| 485 |
// PRL 2006-06-08. |
|---|
| 486 |
extpat_j_i = extpat_j[i]; |
|---|
| 487 |
extpat_j_i[0] /= (xdiv_x_ydiv);// ext_pat[j][i][0] =(byte)(ext_pat2[j][i][0] /(xdiv*ydiv)); |
|---|
| 488 |
extpat_j_i[1] /= (xdiv_x_ydiv);// ext_pat[j][i][1] =(byte)(ext_pat2[j][i][1] /(xdiv*ydiv)); |
|---|
| 489 |
extpat_j_i[2] /= (xdiv_x_ydiv);// ext_pat[j][i][2] =(byte)(ext_pat2[j][i][2] /(xdiv*ydiv)); |
|---|
| 490 |
} |
|---|
| 491 |
} |
|---|
| 492 |
return; |
|---|
| 493 |
} |
|---|
| 494 |
} |
|---|
| 495 |
} |
|---|