public override bool encode(NyIdMarkerPattern i_data, INyIdMarkerData o_dest)
        {
            //対象か調べるん
            if (i_data.ctrl_domain != 0)
            {
                return(false);
            }
            //受け入れられるMaskは0のみ
            if (i_data.ctrl_mask != 0)
            {
                return(false);
            }
            //受け入れられるModelは5未満
            if (i_data.model >= 5)
            {
                return(false);
            }
            //エンコードしてみる
            if (!base.encode(i_data, this._tmp))
            {
                return(false);
            }
            //SerialIDの再構成
            ulong s = 0;

            //最大4バイト繋げて1個のint値に変換
            for (int i = 0; i < this._tmp.length; i++)
            {
                s = (s << 8) | (uint)this._tmp.packet[i];
            }
            ((NyIdMarkerData_RawBitId)o_dest).marker_id = (long)s;
            return(true);
        }
 public override bool encode(NyIdMarkerPattern i_data, INyIdMarkerData o_dest)
 {
     //対象か調べるん
     if (i_data.ctrl_domain != 0)
     {
         return false;
     }
     //受け入れられるMaskは0のみ
     if (i_data.ctrl_mask != 0)
     {
         return false;
     }
     //受け入れられるModelは5未満
     if (i_data.model >= 5)
     {
         return false;
     }
     //エンコードしてみる
     if (!base.encode(i_data, this._tmp))
     {
         return false;
     }
     //SerialIDの再構成
     ulong s = 0;
     //最大4バイト繋げて1個のint値に変換
     for (int i = 0; i < this._tmp.length; i++)
     {
         s = (s << 8) | (uint)this._tmp.packet[i];
     }
     ((NyIdMarkerData_RawBitId)o_dest).marker_id = (long)s;
     return true;
 }
Example #3
0
        /**
         * この関数は、マーカパターンデータを{@link NyIdMarkerData_RawBit}型のデータに変換します。
         * o_destには、{@link NyIdMarkerData_RawBit}型のオブジェクトを指定してください。
         */
        public virtual bool Encode(NyIdMarkerPattern i_data, INyIdMarkerData o_dest)
        {
            NyIdMarkerData_RawBit dest = (NyIdMarkerData_RawBit)o_dest;

            if (i_data.ctrl_domain != _DOMAIN_ID)
            {
                return(false);
            }

            //パケット数計算
            int resolution_len = (i_data.model + i_data.model - 1); //データドットの数
            int packet_length  = (resolution_len * resolution_len) / 8 + 1;
            int sum            = 0;

            for (int i = 0; i < packet_length; i++)
            {
                dest.packet[i] = i_data.data[i];
                sum           += i_data.data[i];
            }

            //チェックドット値計算
            sum = sum % _mod_data[i_data.model - 2];

            //チェックドット比較
            if (i_data.check != sum)
            {
                return(false);
            }

            dest.length = packet_length;
            return(true);
        }
	/**
	 * この関数は、マーカパターンデータを{@link NyIdMarkerData_RawBit}型のデータに変換します。
	 * o_destには、{@link NyIdMarkerData_RawBit}型のオブジェクトを指定してください。
	 */
	public virtual bool encode(NyIdMarkerPattern i_data,INyIdMarkerData o_dest)
	{
		NyIdMarkerData_RawBit dest=(NyIdMarkerData_RawBit)o_dest;
		if(i_data.ctrl_domain!=_DOMAIN_ID){
			return false;
		}
		//パケット数計算
		int resolution_len=(i_data.model+i_data.model-1);      //データドットの数
		int packet_length=(resolution_len*resolution_len)/8+1;
		int sum=0;
		for(int i=0;i<packet_length;i++){
			dest.packet[i]=i_data.data[i];
			sum+=i_data.data[i];
		}
		//チェックドット値計算
		sum=sum%_mod_data[i_data.model-2];
		//チェックドット比較
		if(i_data.check!=sum){
			return false;
		}
		dest.length=packet_length;
		return true;
	}
            /**
             * 矩形が見付かるたびに呼び出されます。
             * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。
             */
            public void onSquareDetect(NyARSquareContourDetector i_sender, int[] i_coordx, int[] i_coordy, int i_coor_num, int[] i_vertex_index)
            {
                //既に発見済なら終了
                if (this.marker_data != null)
                {
                    return;
                }
                //輪郭座標から頂点リストに変換
                NyARIntPoint2d[] vertex = this.__tmp_vertex;
                vertex[0].x = i_coordx[i_vertex_index[0]];
                vertex[0].y = i_coordy[i_vertex_index[0]];
                vertex[1].x = i_coordx[i_vertex_index[1]];
                vertex[1].y = i_coordy[i_vertex_index[1]];
                vertex[2].x = i_coordx[i_vertex_index[2]];
                vertex[2].y = i_coordy[i_vertex_index[2]];
                vertex[3].x = i_coordx[i_vertex_index[3]];
                vertex[3].y = i_coordy[i_vertex_index[3]];

                NyIdMarkerParam   param     = this._marker_param;
                NyIdMarkerPattern patt_data = this._marker_data;

                // 評価基準になるパターンをイメージから切り出す
                if (!this._id_pickup.pickFromRaster(this._ref_raster, vertex, patt_data, param))
                {
                    return;
                }
                //エンコード
                if (!this._encoder.encode(patt_data, this._data_temp))
                {
                    return;
                }

                //継続認識要求されている?
                if (this._prev_data == null)
                {
                    //継続認識要求なし
                    this._current_data.copyFrom(this._data_temp);
                }
                else
                {
                    //継続認識要求あり
                    if (!this._prev_data.isEqual((this._data_temp)))
                    {
                        return;//認識請求のあったIDと違う。
                    }
                }
                //新しく認識、または継続認識中に更新があったときだけ、Square情報を更新する。
                //ココから先はこの条件でしか実行されない。
                NyARSquare sq = this.square;

                //directionを考慮して、squareを更新する。
                for (int i = 0; i < 4; i++)
                {
                    int idx = (i + 4 - param.direction) % 4;
                    this._coordline.coord2Line(i_vertex_index[idx], i_vertex_index[(idx + 1) % 4], i_coordx, i_coordy, i_coor_num, sq.line[i]);
                }
                for (int i = 0; i < 4; i++)
                {
                    //直線同士の交点計算
                    if (!NyARLinear.crossPos(sq.line[i], sq.line[(i + 3) % 4], sq.sqvertex[i]))
                    {
                        throw new NyARException();//ここのエラー復帰するならダブルバッファにすればOK
                    }
                }
                this.threshold   = param.threshold;
                this.marker_data = this._current_data;//みつかった。
            }