Beispiel #1
0
        /**
         * この関数は、マーカパターンからデータを読み取ります。
         * @param i_reader
         * ラスタリーダ
         * @param i_raster_size
         * ラスタのサイズ
         * @param o_bitbuffer
         * データビットの出力先
         * @return
         * 成功するとtrue
         * @throws NyARException
         */
        public bool readDataBits(INyARGsPixelDriver i_reader, NyARIntSize i_raster_size, MarkerPattDecoder o_bitbuffer)
        {
            int raster_width  = i_raster_size.w;
            int raster_height = i_raster_size.h;

            double[] index_x = this.__readDataBits_index_bit_x;
            double[] index_y = this.__readDataBits_index_bit_y;

            //読み出し位置を取得
            detectDataBitsIndex(index_x, index_y);
            int resolution = 3;

            double[] cpara       = this._cparam;
            int[]    ref_x       = this._ref_x;
            int[]    ref_y       = this._ref_y;
            int[]    pixcel_temp = this._pixcel_temp;

            double cpara_0 = cpara[0];
            double cpara_1 = cpara[1];
            double cpara_3 = cpara[3];
            double cpara_6 = cpara[6];

            int p = 0;

            for (int i = 0; i < resolution; i++)
            {
                //1列分のピクセルのインデックス値を計算する。
                double cy0     = 1 + index_y[i * 2 + 0];
                double cy1     = 1 + index_y[i * 2 + 1];
                double cpy0_12 = cpara_1 * cy0 + cpara[2];
                double cpy0_45 = cpara[4] * cy0 + cpara[5];
                double cpy0_7  = cpara[7] * cy0 + 1.0;
                double cpy1_12 = cpara_1 * cy1 + cpara[2];
                double cpy1_45 = cpara[4] * cy1 + cpara[5];
                double cpy1_7  = cpara[7] * cy1 + 1.0;

                int pt = 0;
                for (int i2 = 0; i2 < resolution; i2++)
                {
                    int    xx, yy;
                    double d;
                    double cx0 = 1 + index_x[i2 * 2 + 0];
                    double cx1 = 1 + index_x[i2 * 2 + 1];

                    double cp6_0  = cpara_6 * cx0;
                    double cpx0_0 = cpara_0 * cx0;
                    double cpx3_0 = cpara_3 * cx0;

                    double cp6_1  = cpara_6 * cx1;
                    double cpx0_1 = cpara_0 * cx1;
                    double cpx3_1 = cpara_3 * cx1;

                    d         = cp6_0 + cpy0_7;
                    ref_x[pt] = xx = (int)((cpx0_0 + cpy0_12) / d);
                    ref_y[pt] = yy = (int)((cpx3_0 + cpy0_45) / d);
                    if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height)
                    {
                        ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
                        ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
                    }
                    pt++;

                    d         = cp6_0 + cpy1_7;
                    ref_x[pt] = xx = (int)((cpx0_0 + cpy1_12) / d);
                    ref_y[pt] = yy = (int)((cpx3_0 + cpy1_45) / d);
                    if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height)
                    {
                        ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
                        ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
                    }
                    pt++;

                    d         = cp6_1 + cpy0_7;
                    ref_x[pt] = xx = (int)((cpx0_1 + cpy0_12) / d);
                    ref_y[pt] = yy = (int)((cpx3_1 + cpy0_45) / d);
                    if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height)
                    {
                        ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
                        ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
                    }
                    pt++;

                    d         = cp6_1 + cpy1_7;
                    ref_x[pt] = xx = (int)((cpx0_1 + cpy1_12) / d);
                    ref_y[pt] = yy = (int)((cpx3_1 + cpy1_45) / d);
                    if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height)
                    {
                        ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
                        ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
                    }
                    pt++;
                }

                //1行分のピクセルを取得(場合によっては専用アクセサを書いた方がいい)
                i_reader.getPixelSet(ref_x, ref_y, resolution * 4, pixcel_temp, 0);

                //グレースケールにしながら、line→mapへの転写
                for (int i2 = 0; i2 < resolution; i2++)
                {
                    int index = i2 * 4;
                    o_bitbuffer.setBit(p, (pixcel_temp[index + 0] + pixcel_temp[index + 1] + pixcel_temp[index + 2] + pixcel_temp[index + 3]) / 4);
                    p++;
                }
            }
            return(true);
        }
        /**
         * この関数は、マーカパターンからデータを読み取ります。
         * @param i_reader
         * ラスタリーダ
         * @param i_raster_size
         * ラスタのサイズ
         * @param o_bitbuffer
         * データビットの出力先
         * @return
         * 成功するとtrue
         * @throws NyARException
         */
        public bool readDataBits(INyARGsPixelDriver i_reader, NyARIntSize i_raster_size, MarkerPattDecoder o_bitbuffer)
        {
            int raster_width = i_raster_size.w;
              int raster_height = i_raster_size.h;

              double[] index_x = this.__readDataBits_index_bit_x;
              double[] index_y = this.__readDataBits_index_bit_y;

              //読み出し位置を取得
              detectDataBitsIndex(index_x, index_y);
              int resolution = 3;

              double[] cpara = this._cparam;
              int[] ref_x = this._ref_x;
              int[] ref_y = this._ref_y;
              int[] pixcel_temp = this._pixcel_temp;

              double cpara_0 = cpara[0];
              double cpara_1 = cpara[1];
              double cpara_3 = cpara[3];
              double cpara_6 = cpara[6];

              int p = 0;
              for (int i = 0; i < resolution; i++) {
            //1列分のピクセルのインデックス値を計算する。
            double cy0 = 1 + index_y[i * 2 + 0];
            double cy1 = 1 + index_y[i * 2 + 1];
            double cpy0_12 = cpara_1 * cy0 + cpara[2];
            double cpy0_45 = cpara[4] * cy0 + cpara[5];
            double cpy0_7 = cpara[7] * cy0 + 1.0;
            double cpy1_12 = cpara_1 * cy1 + cpara[2];
            double cpy1_45 = cpara[4] * cy1 + cpara[5];
            double cpy1_7 = cpara[7] * cy1 + 1.0;

            int pt = 0;
            for (int i2 = 0; i2 < resolution; i2++) {
              int xx, yy;
              double d;
              double cx0 = 1 + index_x[i2 * 2 + 0];
              double cx1 = 1 + index_x[i2 * 2 + 1];

              double cp6_0 = cpara_6 * cx0;
              double cpx0_0 = cpara_0 * cx0;
              double cpx3_0 = cpara_3 * cx0;

              double cp6_1 = cpara_6 * cx1;
              double cpx0_1 = cpara_0 * cx1;
              double cpx3_1 = cpara_3 * cx1;

              d = cp6_0 + cpy0_7;
              ref_x[pt] = xx = (int)((cpx0_0 + cpy0_12) / d);
              ref_y[pt] = yy = (int)((cpx3_0 + cpy0_45) / d);
              if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height) {
            ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
            ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
              }
              pt++;

              d = cp6_0 + cpy1_7;
              ref_x[pt] = xx = (int)((cpx0_0 + cpy1_12) / d);
              ref_y[pt] = yy = (int)((cpx3_0 + cpy1_45) / d);
              if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height) {
            ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
            ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
              }
              pt++;

              d = cp6_1 + cpy0_7;
              ref_x[pt] = xx = (int)((cpx0_1 + cpy0_12) / d);
              ref_y[pt] = yy = (int)((cpx3_1 + cpy0_45) / d);
              if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height) {
            ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
            ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
              }
              pt++;

              d = cp6_1 + cpy1_7;
              ref_x[pt] = xx = (int)((cpx0_1 + cpy1_12) / d);
              ref_y[pt] = yy = (int)((cpx3_1 + cpy1_45) / d);
              if (xx < 0 || xx >= raster_width || yy < 0 || yy >= raster_height) {
            ref_x[pt] = xx < 0 ? 0 : (xx >= raster_width ? raster_width - 1 : xx);
            ref_y[pt] = yy < 0 ? 0 : (yy >= raster_height ? raster_height - 1 : yy);
              }
              pt++;
            }

            //1行分のピクセルを取得(場合によっては専用アクセサを書いた方がいい)
            i_reader.getPixelSet(ref_x, ref_y, resolution * 4, pixcel_temp, 0);

            //グレースケールにしながら、line→mapへの転写
            for (int i2 = 0; i2 < resolution; i2++) {
              int index = i2 * 4;
              o_bitbuffer.setBit(p, (pixcel_temp[index + 0] + pixcel_temp[index + 1] + pixcel_temp[index + 2] + pixcel_temp[index + 3]) / 4);
              p++;
            }
              }
              return true;
        }