/** {@link #UnknownRectInfo}のステータス値。推定に失敗しました。入力値が間違っている?*/\r
public final static int FAILED_TARGET_MISSMATCH=4;\r
/**\r
- * i_targetの大きさを推定して、{@link UnknownRectInfo}に結果を保存します。この関数は{@link UnknownRectInfo}の状態を変化させるだけです。\r
- * @param i_target\r
- * 大きさを推定するターゲット。\r
- * @param io_result\r
- * 入出力パラメータ。前段までの推定結果と現在の推定値をマージして返します。\r
- * はじめてターゲットの推定をするときは、リセットした{@link UnknownRectInfo}を入力してください。\r
- * @return\r
- * 認識状況を返します。\r
- * @throws NyARException\r
- */\r
- \r
- /**\r
* この関数は、i_targetの矩形比率を推定します。\r
* 推定結果は、io_resultに返却します。\r
* <p>関数の使い方-\r
* @param i_is_alloc\r
* 外部参照/内部バッファのフラグ\r
* @return\r
+ * 初期化が成功すると、trueです。\r
*/\r
protected boolean initInstance(NyARIntSize i_size,int i_raster_type,boolean i_is_alloc)\r
{\r
* コンストラクタでi_is_allocをfalseにしてラスタを作成した場合、\r
* バッファにアクセスするまえに、バッファの有無をこの関数でチェックしてください。\r
* @return\r
+ * インスタンスがバッファを所有すれば、trueです。\r
*/ \r
public boolean hasBuffer()\r
{\r
/**\r
* コンストラクタです。\r
* 入力、出力ラスタの画素形式を指定して、フィルタを作成します。\r
- * @param i_threshold\r
- * 敷居値の初期値です。0<n<256の値を指定します。\r
* @param i_in_raster_type\r
* 入力ラスタの形式です。\r
* @param i_out_raster_type\r
* 入力画像と出力画像のサイズは同じである必要があります。\r
* @param i_input\r
* 入力画像\r
- * @param i_area\r
+ * @param i_rect\r
* 2値化する矩形範囲。入力画像の範囲内である必要があります。\r
* @param i_output\r
* 出力画像\r
/**\r
* コンストラクタです。\r
* 入力、出力ラスタの画素形式を指定して、フィルタを作成します。\r
- * @param i_threshold\r
- * 敷居値の初期値です。0<n<256の値を指定します。\r
* @param i_in_raster_type\r
* 入力ラスタの形式です。\r
* @param i_out_raster_type\r
* 出力ラスタの形式です。\r
* @throws NyARException\r
*/ \r
- public NyARRasterFilter_Rgb2Gs_RgbCube(int i_in_raster_type,int i_out_raster) throws NyARException\r
+ public NyARRasterFilter_Rgb2Gs_RgbCube(int i_in_raster_type,int i_out_raster_type) throws NyARException\r
{\r
- if(!initInstance(i_in_raster_type,i_out_raster))\r
+ if(!initInstance(i_in_raster_type,i_out_raster_type))\r
{\r
throw new NyARException();\r
}\r
* 出力ラスタの形式です。\r
* @throws NyARException\r
*/ \r
- public NyARRasterFilter_Rgb2Gs_YCbCr(int i_in_raster_type,int i_out_raster) throws NyARException\r
+ public NyARRasterFilter_Rgb2Gs_YCbCr(int i_in_raster_type,int i_out_raster_type) throws NyARException\r
{\r
- if(!initInstance(i_in_raster_type,i_out_raster))\r
+ if(!initInstance(i_in_raster_type,i_out_raster_type))\r
{\r
throw new NyARException();\r
}\r
* 他の形式でも動作しますが、低速な場合があります。\r
* </p>\r
* <p>高速化について - \r
- * 入力ラスタ形式が、{@link NyARBufferType#INT1D_X8R8G8B8_32},{@link NyARBufferType#BYTE1D_B8G8R8_24)\r
+ * 入力ラスタ形式が、{@link NyARBufferType#INT1D_X8R8G8B8_32},{@link NyARBufferType#BYTE1D_B8G8R8_24}\r
* ,{@link NyARBufferType#BYTE1D_R8G8B8_24}のものについては、他の形式よりも高速に動作します。\r
* また、出力ラスタ形式が、{@link NyARBufferType#INT1D_X8R8G8B8_32}の物については、単体サンプリングモードの時のみ、さらに高速に動作します。\r
* 他の形式のラスタでは、以上のものよりも低速転送で対応します。\r
import jp.nyatla.nyartoolkit.core.types.*;\r
\r
/**\r
- * NyARIntPoint2d型の可変長配列です。\r
- *\r
+ * このクラスは、{@link NyARIntPoint2d}型の可変長配列です。\r
*/\r
public class NyARIntPointStack extends NyARObjectStack<NyARIntPoint2d>\r
{\r
+ /**\r
+ * コンストラクタです。\r
+ * 配列の最大長さを指定して、インスタンスを生成します。\r
+ * @param i_length\r
+ * 配列の最大長さ\r
+ * @throws NyARException\r
+ */\r
public NyARIntPointStack(int i_length) throws NyARException\r
{\r
super.initInstance(i_length,NyARIntPoint2d.class);\r
return;\r
}\r
+ /**\r
+ * この関数は、配列要素を作成します。\r
+ */\r
protected NyARIntPoint2d createElement()\r
{\r
return new NyARIntPoint2d();\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
-\r
+/**\r
+ * このクラスは、{@link NyARIntRect}型の可変長配列です。\r
+ */\r
public class NyARIntRectStack extends NyARObjectStack<NyARIntRect>\r
{\r
+ /**\r
+ * コンストラクタです。\r
+ * 配列の最大長さを指定して、インスタンスを生成します。\r
+ * @param i_length\r
+ * 配列の最大長さ\r
+ * @throws NyARException\r
+ */ \r
public NyARIntRectStack(int i_length) throws NyARException\r
{\r
super.initInstance(i_length,NyARIntRect.class);\r
}\r
+ /**\r
+ * この関数は、配列要素を作成します。\r
+ */ \r
protected NyARIntRect createElement()\r
{\r
return new NyARIntRect();\r
\r
\r
/**\r
- * 可変長なオブジェクト配列です。\r
- * 型Tのオブジェクト配列を所有し、アクセス方法を提供します。\r
+ * このクラスは、オブジェクトを格納する可変長配列です。\r
+ * 配列に、オブジェクトの実態を所有します。\r
+ * このクラスの実体化は禁止しています。継承して使ってください。\r
+ * <p>継承クラスの実装方法 - \r
+ * 配列要素の生成シーケンスを実装するには、{@link #createElement}をオーバライドして、\r
+ * コンストラクタから{@link #initInstance}を呼び出します。\r
+ * {@link #initInstance}には2種類の関数があります。要素生成パラメータの有無で、どちらかを選択して呼び出してください。\r
+ * </p>\r
+ * @param <T>\r
+ * 配列型を指定します。\r
*/\r
public class NyARObjectStack<T> extends NyARPointerStack<T>\r
{\r
-\r
+ /**\r
+ * コンストラクタです。\r
+ * クラスの実体化を禁止するために宣言しています。\r
+ * 継承クラスから呼び出してください。\r
+ * @throws NyARException\r
+ */\r
protected NyARObjectStack() throws NyARException\r
{\r
return;\r
}\r
/**\r
- * パラメータが不要なインスタンスを作るためのinitInstance\r
- * コンストラクタから呼び出します。この関数を使うときには、 createElement()をオーバライドしてください。\r
+ * この関数は、インスタンスを初期化します。\r
+ * 継承クラスのコンストラクタから呼び出します。\r
+ * {@link #initInstance(int, Class, Object)}との違いは、オブジェクトの生成に引数を渡すかどうかです。\r
+ * 引数が必要な時は、こちらの関数を使って、{@link #createElement()}をオーバライドします。\r
* @param i_length\r
+ * 配列の最大長さ\r
* @param i_element_type\r
- * @param i_param\r
+ * 配列型を示すクラスタイプ\r
* @throws NyARException\r
*/\r
protected void initInstance(int i_length,Class<T> i_element_type) throws NyARException\r
return;\r
}\r
/**\r
- * パラメータが必要なインスタンスを作るためのinitInstance\r
- * コンストラクタから呼び出します。この関数を使うときには、 createElement(Object i_param)をオーバライドしてください。\r
+ * この関数は、インスタンスを初期化します。\r
+ * 継承クラスのコンストラクタから呼び出します。\r
+ * {@link #initInstance(int, Class)}との違いは、オブジェクトの生成に引数を渡すかどうかです。\r
+ * 引数が必要な時は、こちらの関数を使って、{@link #createElement(Object)}をオーバライドします。\r
* @param i_length\r
+ * 配列の最大長さ\r
* @param i_element_type\r
+ * 配列型を示すクラスタイプ\r
* @param i_param\r
+ * 配列要素を生成するときに渡すパラメータ\r
* @throws NyARException\r
*/\r
protected void initInstance(int i_length,Class<T> i_element_type,Object i_param) throws NyARException\r
}\r
return;\r
}\r
+ /**\r
+ * この関数は、配列要素のオブジェクトを1個作ります。\r
+ * {@link #initInstance(int, Class)}から呼び出されます。\r
+ * 継承クラスでオーバライドして、要素オブジェクトを1個生成して返す処理を実装してください。\r
+ * @return\r
+ * 新しいオブジェクトを返してください。\r
+ * @throws NyARException\r
+ */\r
protected T createElement() throws NyARException\r
{\r
throw new NyARException();\r
}\r
+ /**\r
+ * この関数は、配列要素のオブジェクトを(引数付きで)1個作ります。\r
+ * {@link #initInstance(int, Class, Object)}から呼び出されます。\r
+ * 継承クラスでオーバライドして、要素オブジェクトを1個生成して返す処理を実装してください。\r
+ * @return\r
+ * 新しいオブジェクトを返してください。\r
+ * @throws NyARException\r
+ */\r
protected T createElement(Object i_param) throws NyARException\r
{\r
throw new NyARException();\r
}\r
\r
/**\r
- * 新しい領域を予約します。\r
+ * この関数は、配列から新しい要素を1個わりあてて返します。\r
+ * 関数が成功すると、有効な配列長が+1されます。\r
* @return\r
+ * 成功すると、新しい配列要素。\r
* 失敗するとnull\r
* @throws NyARException\r
*/\r
return ret;\r
}\r
/**\r
- * このクラスは、オブジェクトをpushすることはできません。\r
- * prePush()を使用してください。\r
+ * この関数は機能しません。{@link #prePush}を使って下さい。\r
*/\r
public T push(T i_object)\r
{\r
return null;\r
}\r
/**\r
- * ã\82¹ã\82¿ã\83\83ã\82¯ã\82\92å\88\9dæ\9c\9få\8c\96します。\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81é\85\8då\88\97ã\81®æ\9c\89å\8a¹é\95·ã\82\92è¨å®\9aします。\r
* @param i_reserv_length\r
- * 使用済みにするサイズ\r
- * @return\r
+ * 設定するサイズ\r
*/\r
public final void init(int i_reserv_length) throws NyARException\r
{\r
throw new NyARException();\r
}\r
this._length=i_reserv_length;\r
- } \r
- /**\r
- * 指定した要素を削除します。\r
- * 削除した要素は前方詰めで詰められます。\r
- */\r
+ }\r
+ //override\r
public final void remove(int i_index)\r
{\r
if(i_index!=this._length-1){\r
}\r
this._length--;\r
}\r
- /**\r
- * 指定した要素を順序を無視して削除します。\r
- * 削除後のスタックの順序は保証されません。\r
- * このAPIは、最後尾の有効要素と、削除対象の要素を交換することで、削除を実現します。\r
- * @param i_index\r
- */\r
+ //override\r
public final void removeIgnoreOrder(int i_index)\r
{\r
assert(this._length>i_index && i_index>=0);\r
import jp.nyatla.nyartoolkit.NyARException;\r
\r
/**\r
- * 実体をもたない可変長配列です。\r
- * このクラスは実体化できません。継承して使います。\r
- *\r
+ * このクラスは、オブジェクトの参照値を格納する可変長配列です。\r
+ * このクラスの実体化は禁止しています。継承して使ってください。\r
* @param <T>\r
+ * 配列型を指定します。\r
*/\r
public class NyARPointerStack<T>\r
{\r
+ /** オブジェクトの参照値を格納するバッファ*/\r
protected T[] _items;\r
+ /** 配列の長さ。({@link #_items#length)とは異なることに注意してください。*/\r
protected int _length;\r
\r
/**\r
- * このクラスは実体化できません。\r
+ * コンストラクタです。\r
+ * クラスの実体化を禁止するために宣言しています。\r
+ * 継承クラスから呼び出してください。\r
* @throws NyARException\r
*/\r
protected NyARPointerStack() throws NyARException\r
}\r
\r
/**\r
- * スタックのメンバ変数を初期化します。この関数は、このクラスを継承したクラスを公開するときに、コンストラクタから呼び出します。\r
+ * この関数は、インスタンスを初期化します。\r
+ * この関数は、このクラスを継承したクラスのコンストラクタから呼び出します。\r
* @param i_length\r
+ * 配列の最大長さ\r
* @param i_element_type\r
+ * 配列型を示すクラスタイプ\r
* @throws NyARException\r
*/\r
@SuppressWarnings("unchecked")\r
}\r
\r
/**\r
- * スタックに参照を積みます。\r
+ * この関数は、配列の最後尾にオブジェクトを追加します。\r
+ * @param i_object\r
+ * 追加するオブジェクト\r
* @return\r
- * 失敗するとnull\r
+ * 追加したオブジェクト。失敗するとnullを返します。\r
*/\r
public T push(T i_object)\r
{\r
return i_object;\r
}\r
/**\r
- * スタックに参照を積みます。pushとの違いは、失敗した場合にassertすることです。\r
+ * この関数は、配列の最後尾にオブジェクトを追加します。\r
+ * {@link #push}との違いは、失敗したときにASSERT、または例外を発生することです。\r
+ * 確実に成功することがわっかっていない場合は、{@link #push}を使ってください。\r
* @param i_object\r
+ * 追加するオブジェクト\r
* @return\r
+ * 追加したオブジェクト。\r
*/\r
public T pushAssert(T i_object)\r
{\r
}\r
\r
/** \r
- * 見かけ上の要素数を1減らして、そのオブジェクトを返します。\r
+ * この関数は、配列の最後尾の要素を取り除いて返します。\r
* @return\r
+ * 最後尾のオブジェクト。\r
*/\r
public T pop()\r
{\r
return this._items[this._length];\r
}\r
/**\r
- * 見かけ上の要素数をi_count個減らします。\r
+ * この関数は、配列の最後尾から指定個数の要素を取り除きます。\r
* @param i_count\r
- * @return\r
+ * 取り除く個数\r
*/\r
public final void pops(int i_count)\r
{\r
return;\r
} \r
/**\r
- * 配列を返します。\r
- * \r
+ * この関数は、配列全体を返します。\r
+ * 有効な要素の数は、先頭から{@link #getLength}個です。\r
* @return\r
+ * 配列の参照ポインタ\r
*/\r
public final T[] getArray()\r
{\r
return this._items;\r
}\r
+ /**\r
+ * この関数は、指定したインデクスの配列要素を返します。\r
+ * @param i_index\r
+ * 要素のインデクス番号。\r
+ * 有効な値は、0から{@link #getLength}-1です。\r
+ * @return\r
+ * 配列要素の参照値\r
+ */\r
public final T getItem(int i_index)\r
{\r
return this._items[i_index];\r
}\r
/**\r
- * 配列の見かけ上の要素数を返却します。\r
+ * この関数は、配列の有効な要素数返します。\r
* @return\r
+ * 有効な要素数\r
*/\r
public final int getLength()\r
{\r
return this._length;\r
}\r
/**\r
- * 指定した要素を削除します。\r
- * 削除した要素は前方詰めで詰められます。\r
+ * この関数は、指定したインデクスの要素を配列から取り除きます。\r
+ * 要素は、前方詰めで詰められます。\r
+ * @param i_index\r
+ * 削除する要素のインデクス\r
*/\r
public void remove(int i_index)\r
{\r
this._length--;\r
}\r
/**\r
- * 指定した要素を順序を無視して削除します。\r
+ * この関数は、指定したインデクスの要素を配列から取り除きます。\r
+ * 要素の順番は、削除したインデクス以降が不定になります。\r
+ * このAPIは、最後尾の有効要素と、削除対象の要素を交換することで、削除を実現します。\r
+ * {@link #remove}より高速ですが、要素の順序が重要な処理では注意して使ってください。\r
* @param i_index\r
+ * 削除する要素のインデクス\r
*/\r
public void removeIgnoreOrder(int i_index)\r
{\r
this._length--;\r
}\r
/**\r
- * 見かけ上の要素数をリセットします。\r
+ * この関数は、配列の長さを0にリセットします。\r
*/\r
public void clear()\r
{\r
import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;\r
\r
/**\r
- * 2つの点集合同士を比較して、集合の各点同士の距離が最も近くになる組み合わせを計算\r
- * するためのクラスです。\r
- * 点集合の2次元距離マップを作成して、そこから最適な組み合わせを計算します。\r
+ * このクラスは、距離マップを利用した、頂点集合同士のマッチング処理機能を提供します。\r
+ * 2つの点集合同士を比較して、集合の各点同士の距離が最も近くになる組み合わせを計算します。\r
+ * <p>アルゴリズム - \r
+ * 2つの点集合の総当たりの距離マップを作り、その距離が小さいのものから順に抽出することで、\r
+ * 其々の点の移動距離が最小になる組み合わせを計算します。\r
+ * </p>\r
+ * <p>使い方 -\r
+ * このクラスは、まず距離マップを作るために距離値をセットして、次に組み合わせを得る手順で使います。\r
+ * 距離マップには行と列があります。列を基準値、行を比較値として、その距離値を格納します。\r
+ * 行と列の距離マップを作り終えたら、組合せを計算します。\r
+ * <ol>\r
+ * <li>{@link setMapSize}関数で、マップサイズ(比較する頂点数)を設定する。\r
+ * <li>{@link #setDist},または{@link #setPointDists}で、距離マップに全ての値を書き込む。\r
+ * <li>\r
+ * </ol>\r
+ * </p>\r
*/\r
public class NyARDistMap\r
{\r
+ /** 処理用のデータ型*/\r
protected class DistItem\r
{\r
public int row;\r
public int col;\r
public int dist;\r
}\r
+ /** 距離マップ用の配列*/\r
protected DistItem[] _map;\r
-\r
+ /** ワーク変数*/\r
protected int _min_dist;\r
+ /** ワーク変数*/\r
protected int _min_dist_index;\r
+ /** ワーク変数*/\r
protected int _size_row;\r
+ /** ワーク変数*/\r
protected int _size_col;\r
-\r
+ /**\r
+ * コンストラクタです。\r
+ * マップの最大サイズを指定して、インスタンスを作成します。\r
+ * @param i_max_col\r
+ * マップの最大列数\r
+ * @param i_max_row\r
+ * マップの最大行数\r
+ */\r
public NyARDistMap(int i_max_col,int i_max_row)\r
{\r
this._min_dist=Integer.MAX_VALUE;\r
}\r
}\r
/**\r
- * マップのサイズを再設定します。内容は不定になり、距離マップの再設定が必要です。\r
+ * この関数は、マップのサイズを指定します。\r
+ * 値は初期化されません。\r
* @param i_col\r
- * 列数\r
+ * 新しい列数。\r
* @param i_row\r
+ * 新しい行数。\r
*/\r
public void setMapSize(int i_col,int i_row)\r
{\r
this._size_col=i_col;\r
}\r
/**\r
- * 列と行を指定して、距離値をマップに値をセットします。\r
- * このAPIは低速です。setPointsDistsを参考に、マップに直接距離値を置く関数を検討してください。\r
+ * この関数は、列と行を指定して、距離値1個をマップにセットします。\r
+ * <p>注意 -\r
+ * このAPIは低速です。性能が必要な時は、{@link #setPointsDists}を参考に、一括書込みする関数を検討してください。\r
+ * </p>\r
* @param i_col\r
+ * 列のインデクスを指定します。\r
* @param i_row\r
+ * 行のインデクスを指定します。\r
* @param i_dist\r
+ * その行と列の距離値を指定します。\r
*/\r
public void setDist(int i_col,int i_row,int i_dist)\r
{\r
return;\r
}\r
/**\r
- * 2つの点集合同士の距離を計算して、距離マップに値をセットします。\r
- * 点の座標が他の表現で実装されている場合は、この関数をオーバーロードして実装してください。\r
+ * この関数は、2つの座標点配列同士の距離値を一括してマップにセットします。\r
+ * <p>\r
+ * 実装メモ - \r
+ * 点のフォーマットが合わない実装されている場合は、この関数参考にオーバーロードしてください。\r
+ * </p>\r
* @param i_vertex_r\r
+ * 比較する頂点群を格納した配列。\r
* @param i_row_len\r
+ * i_vertex_rの有効な要素数\r
* @param i_vertex_c\r
+ * 基準となる頂点群を格納した配列\r
* @param i_col_len\r
- * @param o_rowindex\r
+ * i_vertex_cの有効な要素数\r
*/\r
public void setPointDists(NyARIntPoint2d[] i_vertex_r,int i_row_len,NyARIntPoint2d[] i_vertex_c,int i_col_len)\r
{\r
return;\r
}\r
/**\r
- * 現在の距離マップから、colに対するrowの組み合わせを計算します。\r
- * colに対して最適なものが無い場合は、o_rowindexの値に-1がセットされます。\r
+ * この関数は、現在の距離マップから、col要素に対するrow要素の組合せを計算します。\r
+ * colに対して適したrow要素が見つからない場合は、o_rowindexの該当要素に-1を設定します。\r
* この関数は内部データを不可逆に変更します。計算後は、距離マップの再セットが必要です。\r
* @param o_rowindex\r
+ * 組合せを受け取る配列です。\r
+ * col[n]に対するrow[m]のインデクス番号mを、o_rowindex[n]に返します。\r
*/\r
public void getMinimumPair(int[] o_rowindex)\r
{\r
package jp.nyatla.nyartoolkit.core.utils;\r
\r
import jp.nyatla.nyartoolkit.*;\r
+\r
/**\r
- * 方程式を解く関数を定義します。\r
- *\r
+ * このクラスには、方程式を解く関数を定義します。\r
*/\r
public class NyAREquationSolver\r
{\r
+ /**\r
+ * この関数は、 二次方程式(ax^2+bx+c=0)を解いて、実根のみを返します。\r
+ * @param i_a\r
+ * 係数aの値\r
+ * @param i_b\r
+ * 係数bの値\r
+ * @param i_c\r
+ * 係数cの値\r
+ * @param o_result\r
+ * 解を受け取る配列。2要素以上である事。\r
+ * @return\r
+ * o_resultに格納した実根の数。\r
+ */\r
public static int solve2Equation(double i_a, double i_b, double i_c,double[] o_result)\r
{\r
assert i_a!=0;\r
return solve2Equation(i_b/i_a,i_c/i_a,o_result,0);\r
}\r
- \r
+ /**\r
+ * この関数は、 二次方程式(x^2+bx+c=0)を解いて、実根のみを返します。\r
+ * @param i_b\r
+ * 係数bの値\r
+ * @param i_c\r
+ * 係数cの値\r
+ * @param o_result\r
+ * 解を受け取る配列。2要素以上である事。\r
+ * @return\r
+ * o_resultに格納した実根の数。\r
+ */\r
public static int solve2Equation(double i_b, double i_c,double[] o_result)\r
{\r
return solve2Equation(i_b,i_c,o_result,0);\r
}\r
- \r
+ /**\r
+ * この関数は、 二次方程式(x^2+bx+c=0)を解いて、実根のみを返します。\r
+ * @param i_b\r
+ * 係数bの値\r
+ * @param i_c\r
+ * 係数cの値\r
+ * @param o_result\r
+ * 解を受け取る配列。\r
+ * @param i_result_st\r
+ * o_resultの格納を開始するインデクス番号\r
+ * @return\r
+ * o_resultに格納した実根の数。\r
+ */ \r
public static int solve2Equation(double i_b, double i_c,double[] o_result,int i_result_st)\r
{\r
double t=i_b*i_b-4*i_c;\r
}\r
\r
/**\r
- * 3次方程式 a*x^3+b*x^2+c*x+d=0の実根を求める。 \r
- * http://aoki2.si.gunma-u.ac.jp/JavaScript/src/3jisiki.html\r
- * のコードを基にしてます。\r
+ * この関数は、3次方程式(a*x^3+b*x^2+c*x+d=0)の実根を計算します。 \r
+ * このコードは、http://aoki2.si.gunma-u.ac.jp/JavaScript/src/3jisiki.htmlを元にしています。\r
* @param i_a\r
* X^3の係数\r
* @param i_b\r
* @param o_result\r
* 実根。double[3]を指定すること。\r
* @return\r
+ * 返却した実根の数。\r
*/\r
public static int solve3Equation(double i_a, double i_b, double i_c, double i_d,double[] o_result)\r
{\r
assert (i_a != 0);\r
return solve3Equation(i_b/i_a,i_c/i_a,i_d/i_a,o_result);\r
}\r
- \r
/**\r
- * 3次方程式 x^3+b*x^2+c*x+d=0の実根を求める。\r
- * だけを求める。\r
- * http://aoki2.si.gunma-u.ac.jp/JavaScript/src/3jisiki.html\r
- * のコードを基にしてます。\r
+ * この関数は、3次方程式(x^3+b*x^2+c*x+d=0)の実根を計算します。 \r
+ * このコードは、http://aoki2.si.gunma-u.ac.jp/JavaScript/src/3jisiki.htmlを元にしています。\r
* @param i_b\r
* X^2の係数\r
* @param i_c\r
* @param i_d\r
* X^0の係数\r
* @param o_result\r
- * 実根。double[1]以上を指定すること。\r
+ * 実根。double[3]を指定すること。\r
* @return\r
- */\r
+ * 返却した実根の数。\r
+ */ \r
public static int solve3Equation(double i_b, double i_c, double i_d,double[] o_result)\r
{\r
double tmp,b, p, q;\r
\r
\r
/**\r
- * 4次方程式の実根だけを求める。\r
+ * この関数は、4次方程式(ax^4+bx^3+b*cx^2+d*x+e=0)の実根を計算します。 \r
* @param i_a\r
- * X^3の係数\r
+ * X^4の係数\r
* @param i_b\r
- * X^2の係数\r
+ * X^3の係数\r
* @param i_c\r
- * X^1の係数\r
+ * X^2の係数\r
* @param i_d\r
+ * X^1の係数\r
+ * @param i_e\r
* X^0の係数\r
* @param o_result\r
- * 実根。double[3]を指定すること。\r
+ * 実根。double[4]を指定すること。\r
* @return\r
+ * 返却した実根の数。\r
*/\r
public static int solve4Equation(double i_a, double i_b, double i_c, double i_d,double i_e,double[] o_result) throws NyARException\r
{\r
package jp.nyatla.nyartoolkit.core.utils;\r
\r
/**\r
- * NyARManagedObjectPoolの要素クラスです。\r
- *\r
+ * このクラスは、{@link NyARManagedObjectPool}の要素の基本クラスです。\r
+ * オブジェクトの有効性を判断するための、参照カウンタをもちます。\r
+ * {@link NyARManagedObjectPool}に対して、オブジェクトの操作インタフェイスを提供します。\r
*/\r
public class NyARManagedObject\r
{\r
/**\r
- * このインタフェイスは、NyARManagedObjectがPoolを操作するために使います。\r
- */ \r
+ * このインタフェイスは、{@link NyARManagedObject}が{@link NyARManagedObjectPool}を\r
+ * 所有される操作する関数を定義します。\r
+ */\r
public interface INyARManagedObjectPoolOperater\r
{\r
+ /**\r
+ * この関数は、指定したオブジェクトを、割り当て済みから未割り当てにします。\r
+ * @param i_object\r
+ * 未割当にするオブジェクト。\r
+ */\r
public void deleteObject(NyARManagedObject i_object); \r
}\r
- /**\r
- * オブジェクトの参照カウンタ\r
- */\r
+ \r
+ /** オブジェクトの参照カウンタ*/\r
private int _count;\r
- /**\r
- * オブジェクトの解放関数へのポインタ\r
- */\r
+\r
+ /** 所有されるオブジェクトプールの操作インタフェイスのポインタ*/\r
private INyARManagedObjectPoolOperater _pool_operater;\r
+ \r
/**\r
- * NyARManagedObjectPoolのcreateElement関数が呼び出すコンストラクタです。\r
+ * コンストラクタです。\r
+ * 所有される{@link NyARManagedObjectPool}を指定して、インスタンスを作成します。\r
+ * この関数は、{@link NyARManagedObjectPool#createElement}関数が呼び出します。ユーザが使うことはありません。\r
* @param i_ref_pool_operator\r
- * Pool操作の為のインタフェイス\r
+ * このオブジェクトの所有者の持つ、操作インタフェイス\r
*/\r
protected NyARManagedObject(INyARManagedObjectPoolOperater i_ref_pool_operator)\r
{\r
this._count=0;\r
this._pool_operater=i_ref_pool_operator;\r
}\r
+ /**\r
+ * この関数は、オブジェクトを初期状態にします。\r
+ * この関数は、{@link NyARManagedObjectPool}が呼び出します。ユーザが呼び出すことはありません。\r
+ * @return\r
+ * このオブジェクトを初期化したオブジェクト。\r
+ */\r
public final NyARManagedObject initObject()\r
{\r
assert(this._count==0);\r
return this;\r
}\r
/**\r
- * このオブジェクトに対する、新しい参照オブジェクトを返します。\r
+ * この関数は、オブジェクトの参照カウンタを1加算します。\r
* @return\r
+ * このオブジェクトの参照値。\r
*/\r
public final NyARManagedObject refObject()\r
{\r
return this;\r
}\r
/**\r
- * 参照オブジェクトを開放します。\r
+ * この関数は、オブジェクトの参照カウンタを1減算します。\r
+ * 参照カウンタが0になると、オブジェクトは未参照状態となり、自動的に{@link NyARManagedObjectPool}へ返却されます。\r
* @return\r
+ * 減算後の参照カウンタ\r
*/\r
public int releaseObject()\r
{\r
return this._count;\r
}\r
/**\r
- * 現在の参照カウンタを返します。\r
+ * この関数は、現在のインスタンスの参照カウンタ値を返します。\r
* @return\r
+ * 参照カウンタ値\r
*/\r
public final int getCount()\r
{\r
\r
\r
\r
-\r
-\r
/**\r
- * 参照カウンタ付きのobjectPoolです。NyARManagedObjectから派生したオブジェクトを管理します。\r
- * このクラスは、参照カウンタ付きのオブジェクト型Tのオブジェクトプールを実現します。\r
+ * このクラスは、参照カウンタ付きのObjectPoolの基本クラスです。\r
+ * {@link NyARManagedObject}から派生したオブジェクト型Tのオブジェクトプールを実現します。\r
+ * \r
+ * オブジェクトプールは、未割当リストを使って、オブジェクト要素を管理します。\r
+ * はじめ、全てのオブジェクト要素は未割当リストにあります。オブジェクト要素の生成要求があると、オブジェクトプール\r
+ * は未割当リストにあるオブジェクト要素の参照カウンタを1加算して、未割当リストから削除します。\r
+ * 逆に、オブジェクト要素の解放を要求があると、オブジェクト要素の参照カウンタを1減算して、その数が 0になったら、\r
+ * オブジェクト要素を未割当リストへ加えます。\r
+ * <br/>\r
+ * このクラスは、NyARManagedObjectと密接に関係して動作することに注意してください。\r
+ * 割り当て関数はオブジェクトプールの{@link NyARManagedObjectPool#newObject}、解放関数にはオブジェクト要素の\r
+ * {@link NyARManagedObject#releaseObject()}を使います。\r
+ * <br/>\r
+ * また、このクラスは{@link NyARManagedObject}に対して、特殊な関数を持つインタフェイスを提供します。\r
+ * このインタフェイスは、{@link NyARManagedObject}が{@link NyARManagedObjectPool}のリストを操作するために使います。\r
+ * <p>継承クラスの実装について - \r
+ * このクラスは、そのまま実体化できません。継承クラスを実装する必要があります。\r
+ * 実装するには、{@link #createElement}をオーバライドして、コンストラクタから{@link #initInstance}を呼び出します。\r
+ * {@link #initInstance}には2種類の関数があります。要素生成パラメータの有無で、どちらかを選択して呼び出してください。\r
+ * </p>\r
* \r
- * このクラスは、NyARManagedObjectと密接に関連して動作することに注意してください。\r
- * 要素の作成関数はこのクラスで公開しますが、要素の解放関数は要素側に公開します。\r
* @param <T>\r
*/\r
public class NyARManagedObjectPool<T extends NyARManagedObject>\r
{\r
/**\r
+ * このクラスは、{@link NyARManagedObject}へ提供する操作インタフェイスの実体です。\r
+ * 未割当リストを操作する関数を定義します。\r
* Javaの都合でバッファを所有させていますが、別にこの形で実装しなくてもかまいません。\r
*/\r
public class Operator implements NyARManagedObject.INyARManagedObjectPoolOperater\r
{\r
+ /** 要素の実体の保管用リスト*/\r
public NyARManagedObject[] _buffer;\r
+ /** 未割当オブジェクトのリスト*/\r
public NyARManagedObject[] _pool;\r
public int _pool_stock;\r
public void deleteObject(NyARManagedObject i_object)\r
}\r
}\r
/**\r
- * 公開するオペレータオブジェクトです。\r
- * このプールに所属する要素以外からは参照しないでください。\r
+ * オブジェクト要素から参照する操作インタフェイス。ユーザが使用することはありません。\r
+ * @bug このスコープはprotectedではないか?\r
*/\r
public Operator _op_interface=new Operator();\r
\r
/**\r
- * ã\83\97ã\83¼ã\83«ã\81\8bã\82\89å\9e\8bTã\81®ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\82\92割り当てて返します。\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81æ\96°ã\81\97ã\81\84ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\82\92ï¼\91å\80\8b割り当てて返します。\r
* @return\r
- * 新しいオブジェクト\r
+ * 新しいオブジェクト。失敗した場合はnull\r
*/\r
@SuppressWarnings("unchecked")\r
public T newObject() throws NyARException\r
return (T)(pool._pool[pool._pool_stock].initObject());\r
}\r
/**\r
- * 実体化の拒否の為に、コンストラクタを隠蔽します。\r
- * 継承クラスを作成して、初期化処理を実装してください。\r
+ * コンストラクタです。\r
+ * 生成拒否の為に、コンストラクタを隠蔽します。\r
+ * 継承クラスを作成してください。\r
*/\r
protected NyARManagedObjectPool()\r
{\r
}\r
/**\r
- * オブジェクトを初期化します。この関数は、このクラスを継承したクラスを公開するときに、コンストラクタから呼び出します。\r
+ * この関数は、インスタンスを初期化します。\r
+ * 継承クラスのコンストラクタから呼び出します。\r
+ * {@link #initInstance(int, Class, Object)}との違いは、オブジェクトの生成に引数を渡すかどうかです。\r
+ * 引数が必要な時は、こちらの関数を使って、{@link #createElement()}をオーバライドします。\r
* @param i_length\r
+ * 配列の最大長さ\r
* @param i_element_type\r
+ * 配列型を示すクラスタイプ\r
* @throws NyARException\r
*/\r
@SuppressWarnings("unchecked")\r
}\r
return; \r
}\r
-\r
+ /**\r
+ * この関数は、インスタンスを初期化します。\r
+ * 継承クラスのコンストラクタから呼び出します。\r
+ * {@link #initInstance(int, Class)}との違いは、オブジェクトの生成に引数を渡すかどうかです。\r
+ * 引数が必要な時は、こちらの関数を使って、{@link #createElement(Object)}をオーバライドします。\r
+ * @param i_length\r
+ * 配列の最大長さ\r
+ * @param i_element_type\r
+ * 配列型を示すクラスタイプ\r
+ * @param i_param\r
+ * 配列要素を生成するときに渡すパラメータ\r
+ * @throws NyARException\r
+ */\r
@SuppressWarnings("unchecked")\r
protected void initInstance(int i_length,Class<T> i_element_type,Object i_param) throws NyARException\r
{\r
return; \r
}\r
/**\r
- * オブジェクトを作成します。継承クラス内で、型Tのオブジェクトを作成して下さい。\r
+ * この関数は、配列要素のオブジェクトを1個作ります。\r
+ * {@link #initInstance(int, Class)}から呼び出されます。\r
+ * 継承クラスでオーバライドして、要素オブジェクトを1個生成して返す処理を実装してください。\r
* @return\r
+ * 新しいオブジェクトを返してください。\r
* @throws NyARException\r
*/\r
protected T createElement() throws NyARException\r
{\r
throw new NyARException();\r
}\r
+ /**\r
+ * この関数は、配列要素のオブジェクトを(引数付きで)1個作ります。\r
+ * {@link #initInstance(int, Class, Object)}から呼び出されます。\r
+ * 継承クラスでオーバライドして、要素オブジェクトを1個生成して返す処理を実装してください。\r
+ * @return\r
+ * 新しいオブジェクトを返してください。\r
+ * @throws NyARException\r
+ */ \r
protected T createElement(Object i_param) throws NyARException\r
{\r
throw new NyARException();\r
\r
\r
/**\r
- * 数学関数を定義します。\r
- *\r
+ * このクラスには、数学関数、数学定数を定義します。\r
*/\r
public class NyARMath\r
{\r
+ /** 定数値。40^2*/\r
public final static int SQ_40=40*40;\r
+ /** 定数値。20^2*/\r
public final static int SQ_20=20*20;\r
+ /** 定数値。10^2*/\r
public final static int SQ_10=10*10;\r
+ /** 定数値。8^2*/\r
public final static int SQ_8=8*8;\r
+ /** 定数値。5^2*/\r
public final static int SQ_5=5*5;\r
+ /** 定数値。2^2*/\r
public final static int SQ_2=2*2;\r
\r
- \r
+ /** 定数値。cos(30)の近似値*/ \r
public final static double COS_DEG_30=0.8660;\r
+ /** 定数値。cos(25)の近似値*/ \r
public final static double COS_DEG_25=0.9063;\r
+ /** 定数値。cos(20)の近似値*/\r
public final static double COS_DEG_20=0.9396;\r
+ /** 定数値。cos(15)の近似値*/\r
public final static double COS_DEG_15=0.9395;\r
+ /** 定数値。cos(10)の近似値*/\r
public final static double COS_DEG_10=0.9848;\r
+ /** 定数値。cos(8)の近似値*/\r
public final static double COS_DEG_8 =0.9902;\r
+ /** 定数値。cos(5)の近似値*/\r
public final static double COS_DEG_5 =0.9961;\r
+ /**\r
+ * この関数は、点p1と点p2の距離の二乗値を返します。\r
+ * @param i_p1x\r
+ * 点1のX座標\r
+ * @param i_p1y\r
+ * 点1のY座標\r
+ * @param i_p2x\r
+ * 点2のX座標\r
+ * @param i_p2y\r
+ * 点2のY座標\r
+ * @return\r
+ * 二乗距離値\r
+ */\r
public static final double sqNorm(double i_p1x,double i_p1y,double i_p2x,double i_p2y)\r
{\r
double x,y;\r
y=i_p2y-i_p1y;\r
return x*x+y*y;\r
}\r
-\r
- \r
- \r
+ /**\r
+ * この関数は、点1と点2の距離値を返します。\r
+ * @param i_x1\r
+ * 点1のX座標\r
+ * @param i_y1\r
+ * 点1のY座標\r
+ * @param i_x2\r
+ * 点2のX座標\r
+ * @param i_y2\r
+ * 点2のY座標\r
+ * @return\r
+ * 距離値\r
+ */\r
public static final double dist(double i_x1,double i_y1,double i_x2,double i_y2)\r
{\r
return Math.sqrt(i_x1*i_y1+i_x2+i_y2);\r
}\r
-\r
- \r
- \r
- \r
/**\r
- * 3乗根を求められないシステムで、3乗根を求めます。\r
- * http://aoki2.si.gunma-u.ac.jp/JavaScript/src/3jisiki.html\r
+ * この関数は、3乗根を求めます。\r
+ * 出典 http://aoki2.si.gunma-u.ac.jp/JavaScript/src/3jisiki.html\r
* @param i_in\r
+ * 3乗根を求める数値\r
* @return\r
+ * 三乗根の値\r
*/\r
public static double cubeRoot(double i_in)\r
{\r
return (i_in >= 0) ? res : -res;\r
}\r
/**\r
- * ã\83¦ã\83¼ã\82¯ã\83ªã\83\83ã\83\89ã\81®äº\92é\99¤æ³\95ã\81«ã\82\88ã\82\8aã\80\812å¤\89æ\95°ã\81®æ\9c\80大å\85¬ç´\84æ\95°ã\82\92æ±\82ã\82\81ã\82\8b。\r
- * http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81ã\83¦ã\83¼ã\82¯ã\83ªã\83\83ã\83\89ã\81®äº\92é\99¤æ³\95ã\81«ã\82\88ã\82\8aã\80\81æ\9c\80大å\85¬ç´\84æ\95°ã\82\92æ±\82ã\82\81ã\81¾ã\81\99。\r
+ * 出典 http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95\r
* @param i_x\r
+ * 最大公約数を求める数1\r
* @param i_y\r
+ * 最大公約数を求める数2\r
* @return\r
+ * 最大公約数\r
*/\r
public static int gcd(int i_x,int i_y)\r
{\r
\r
\r
/**\r
- * このクラスは、型Tのオブジェクトプールを提供します。\r
- *\r
+ * このクラスは、シンプルなオブジェクトプールの基本クラスです。\r
+ * 生成済のオブジェクトを複数所有して、他のオブジェクトに貸付る機能を提供します。\r
+ * 参照カウンタを持つ管理されたオブジェクトプールが必要な時には、{@link NyARManagedObjectPool}クラスを使用します。\r
* @param <T>\r
+ * 要素のオブジェクト型\r
*/\r
public class NyARObjectPool<T extends Object>\r
{\r
+ /** 要素の保管リスト*/\r
protected T[] _buffer;\r
+ /** 未割当の要素トリスト*/\r
protected T[] _pool;\r
+ /** 未割当の要素の数*/\r
protected int _pool_stock;\r
\r
/**\r
- * ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\83\97ã\83¼ã\83«ã\81\8bã\82\89ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\82\92å\8f\96ã\82\8aå\87ºします。\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81æ\96°ã\81\97ã\81\84ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\82\92ï¼\91å\80\8bå\89²ã\82\8aå½\93ã\81¦ã\81¦è¿\94します。\r
* @return\r
+ * 新しいオブジェクト。失敗した場合はnull\r
*/\r
public T newObject()\r
{\r
\r
}\r
/**\r
- * オブジェクトプールへオブジェクトを返却します。\r
- * @return\r
+ * この関数は、オブジェクトプールへオブジェクトを返却します。\r
+ * @param i_object\r
+ * {@link #newObject}で割り当てたオブジェクトを指定します。\r
+ * 必ず同じインスタンスで割り当てたオブジェクトを指定してください。\r
*/\r
public void deleteObject(T i_object)\r
{\r
}\r
\r
/**\r
- * このクラスは実体化できません。\r
- * @throws NyARException\r
+ * コンストラクタです。\r
+ * 生成拒否の為に、コンストラクタを隠蔽します。\r
+ * 継承クラスを作成してください。\r
*/\r
public NyARObjectPool() throws NyARException\r
{\r
}\r
/**\r
- * オブジェクトを初期化します。この関数は、このクラスを継承したクラスを公開するときに、コンストラクタから呼び出します。\r
+ * この関数は、インスタンスを初期化します。\r
+ * 継承クラスのコンストラクタから呼び出します。\r
* @param i_length\r
+ * 配列の最大長さ\r
* @param i_element_type\r
+ * 配列型を示すクラスタイプ\r
* @throws NyARException\r
*/\r
@SuppressWarnings("unchecked")\r
return; \r
}\r
/**\r
- * オブジェクトを作成します。\r
+ * この関数は、配列要素のオブジェクトを1個作ります。\r
+ * {@link #initInstance(int, Class)}から呼び出されます。\r
+ * 継承クラスでオーバライドして、要素オブジェクトを1個生成して返す処理を実装してください。\r
* @return\r
+ * 新しいオブジェクトを返してください。\r
* @throws NyARException\r
*/\r
protected T createElement() throws NyARException\r
import jp.nyatla.nyartoolkit.core.types.*;\r
\r
/**\r
- * 遠近法を用いたPerspectiveパラメータを計算するクラスのテンプレートです。\r
- * 任意頂点四角系と矩形から、遠近法の変形パラメータを計算します。\r
- * このクラスはリファレンス実装のため、パフォーマンスが良くありません。実際にはNyARPerspectiveParamGenerator_O1を使ってください。\r
+ * このクラスは、遠近法を用いたPerspectiveパラメータを計算する抽象クラスです。\r
+ * 任意頂点の四角形と矩形から、遠近法の変形パラメータを計算します。\r
+ * パラメータは、8個の定数値です。配列に返却します。\r
+ * 継承クラスで、{@link #getParam}関数を実装してください。\r
*/\r
public abstract class NyARPerspectiveParamGenerator\r
{\r
+ /** 射影の基点(X)*/\r
protected int _local_x;\r
+ /** 射影の基点(Y)*/\r
protected int _local_y;\r
/**\r
* コンストラクタです。\r
+ * 変換先の基準点を設定してインスタンスを作成します。\r
* @param i_local_x\r
- * パラメータ計算の基準点を指定します。\r
+ * パラメータ計算の基準点を指定します。デフォルト値は1です。\r
* @param i_local_y\r
- * パラメータ計算の基準点を指定します。\r
+ * パラメータ計算の基準点を指定します。デフォルト値は1です。\r
*/\r
public NyARPerspectiveParamGenerator(int i_local_x,int i_local_y)\r
{\r
return;\r
}\r
/**\r
- * 遠近法のパラメータを計算します。\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
* @param i_size\r
* 変換先の矩形のサイズを指定します。\r
* @param i_vertex\r
return this.getParam(i_size.w,i_size.h,i_vertex[0].x,i_vertex[0].y,i_vertex[1].x,i_vertex[1].y,i_vertex[2].x,i_vertex[2].y,i_vertex[3].x,i_vertex[3].y, o_param);\r
}\r
/**\r
- * 遠近法のパラメータを計算します。\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
* @param i_size\r
* 変換先の矩形のサイズを指定します。\r
* @param i_vertex\r
return this.getParam(i_size.w,i_size.h,i_vertex[0].x,i_vertex[0].y,i_vertex[1].x,i_vertex[1].y,i_vertex[2].x,i_vertex[2].y,i_vertex[3].x,i_vertex[3].y, o_param);\r
}\r
/**\r
- * 遠近法のパラメータを計算します。\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
* @param i_width\r
* 変換先の矩形のサイズを指定します。\r
* @param i_height\r
return this.getParam(i_width,i_height,i_vertex[0].x,i_vertex[0].y,i_vertex[1].x,i_vertex[1].y,i_vertex[2].x,i_vertex[2].y,i_vertex[3].x,i_vertex[3].y, o_param);\r
}\r
/**\r
- * 遠近法のパラメータを計算します。\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
* @param i_width\r
* 変換先の矩形のサイズを指定します。\r
* @param i_height\r
return this.getParam(i_width,i_height,i_vertex[0].x,i_vertex[0].y,i_vertex[1].x,i_vertex[1].y,i_vertex[2].x,i_vertex[2].y,i_vertex[3].x,i_vertex[3].y, o_param);\r
}\r
/**\r
- * 遠近法のパラメータを計算します。継承クラスで実装してください。\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
+ * 実装クラスでは、遠近法のパラメータを計算する処理を実装してください。\r
* @param i_dest_w\r
+ * 出力先矩形の幅を指定します。\r
* @param i_dest_h\r
+ * 出力先矩形の高さを指定します。\r
* @param x1\r
+ * 変換元四角形の頂点1のX座標です。\r
* @param y1\r
+ * 変換元四角形の頂点1のY座標です。\r
* @param x2\r
+ * 変換元四角形の頂点2のX座標です。\r
* @param y2\r
+ * 変換元四角形の頂点2のY座標です。\r
* @param x3\r
+ * 変換元四角形の頂点3のX座標です。\r
* @param y3\r
+ * 変換元四角形の頂点3のY座標です。\r
* @param x4\r
+ * 変換元四角形の頂点4のX座標です。\r
* @param y4\r
+ * 変換元四角形の頂点4のY座標です。\r
* @param o_param\r
+ * 結果を受け取る配列を指定します。\r
* @return\r
+ * 計算に成功するとtrueを返します。\r
* @throws NyARException\r
*/\r
public abstract boolean getParam(int i_dest_w,int i_dest_h,double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double[] o_param)throws NyARException;\r
\r
\r
/**\r
- * NyARPerspectiveParamGeneratorを最適化したクラスです。\r
+ * このクラスは、{@link NyARPerspectiveParamGenerator_Reference}を高速化したクラスです。\r
*/\r
public class NyARPerspectiveParamGenerator_O1 extends NyARPerspectiveParamGenerator\r
{\r
return;\r
}\r
\r
- \r
+ /**\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
+ */\r
public final boolean getParam(int i_dest_w,int i_dest_h,double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double[] o_param)throws NyARException\r
{\r
double ltx=this._local_x;\r
import jp.nyatla.nyartoolkit.core.types.matrix.*;\r
\r
/**\r
- * 遠近法を用いたPerspectiveパラメータを計算するクラスです。\r
- * 任意頂点四角系と矩形から、遠近法の変形パラメータを計算します。\r
- * このクラスはリファレンス実装のため、パフォーマンスが良くありません。NyARPerspectiveParamGenerator_O1を使ってください。\r
+ * このクラスは、遠近法を用いてPerspectiveパラメータを計算します。\r
+ * 遠近法を可読性を重視して実装している為、若干低速です。\r
+ * 高速化をした{@link NyARPerspectiveParamGenerator_O1}関数を使用してください。\r
*/\r
public class NyARPerspectiveParamGenerator_Reference extends NyARPerspectiveParamGenerator\r
{\r
return;\r
}\r
\r
- \r
+ /**\r
+ * この関数は、遠近法のパラメータを計算して、返却します。\r
+ */\r
public final boolean getParam(int i_dest_w,int i_dest_h,double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double[] o_param)throws NyARException\r
{\r
double ltx=this._local_x;\r
package jp.nyatla.nyartoolkit.core.utils;\r
\r
/**\r
- * 連立方程式を解くためのプロセッサクラスです。\r
- *\r
+ * このクラスは、連立方程式を解く関数を実装します。\r
*/\r
public class NyARSystemOfLinearEquationsProcessor\r
{\r
return true;\r
}\r
/**\r
- * [i_left_src]=[i_right_src]の式にガウスの消去法を実行して、[x][x]の要素が1になるように基本変形します。\r
- * i_mとi_nが等しくない時は、最終行までの[x][x]要素までを1になるように変形します。\r
+ * この関数は、方程式の係数配列にガウスの消去法を実行します。\r
+ * [i_left_src]=[i_right_src]の式にガウスの消去法を実行して、i_leftの要素を1になるように基本変形します。\r
+ * i_mとi_nが等しくない場合は、最終行の要素が1になるまで基本変形を実行して、終了します。\r
+ * <p>\r
+ * 方程式の係数は、次のように入力します。\r
+ * <pre>\r
+ * <table>\r
+ * <tr><td>i_left[0][0]*X+</td><td>i_left[0][1]*Y+</td><td>i_left[0][2]*Z</td><td>=</td><td>i_right[0]</td></tr>\r
+ * <tr><td>i_left[1][0]*X+</td><td>i_left[1][1]*Y+</td><td>i_left[1][2]*Z</td><td>=</td><td>i_right[1]</td></tr>\r
+ * <tr><td>i_left[2][0]*X+</td><td>i_left[2][1]*Y+</td><td>i_left[2][2]*Z</td><td>=</td><td>i_right[2]</td></tr>\r
+ * </table>\r
+ * </pre>\r
+ * 関数を実行すると、配列は次のようになります。\r
+ * <pre>\r
+ * <table>\r
+ * <tr><td>1</td><td>0</td><td>0</td><td>=</td><td>A</td></tr>\r
+ * <tr><td>0</td><td>1</td><td>0</td><td>=</td><td>B</td></tr>\r
+ * <tr><td>0</td><td>0</td><td>1</td><td>=</td><td>C</td></tr>\r
+ * </table>\r
+ * </pre>\r
+ * </p>\r
* @param i_left\r
* 連立方程式の左辺値を指定します。[i_m][i_n]の配列を指定してください。\r
* @param i_right\r
- * 連立方程式の右辺値を指定します。[i_m][i_n]の配列を指定してください。\r
+ * 連立方程式の右辺値を指定します。[i_m]の配列を指定してください。\r
* @param i_n\r
* 連立方程式の係数の数を指定します。\r
* @param i_m\r
return true; \r
}\r
/**\r
- * i_leftとi_rightの連立方程式を解いて、i_left,i_right内容を更新します。\r
+ * この関数は、i_leftとi_rightで表現された連立方程式を解いて、i_left,i_right内容を更新します。\r
* i_right[n]の内容が、i_left[x][n]番目の係数の解になります。\r
+ * 配列の表現については、{@link #doGaussianElimination}を参照してください。\r
+ * @param i_left\r
+ * 連立方程式の左辺値を指定します。[i_m][i_n]の配列を指定してください。\r
+ * @param i_right\r
+ * 連立方程式の右辺値を指定します。[i_m]の配列を指定してください。\r
+ * @param i_number_of_system\r
+ * 方程式の数を指定します。\r
* @return\r
* 方程式が解ければtrueを返します。\r
*/\r
package jp.nyatla.nyartoolkit.nyidmarker;\r
\r
/**\r
- * [[Strage class]]\r
- * マーカを抽出した時のパラメータを格納するクラスです。\r
- *\r
+ * このクラスは、NyIdマーカを抽出した時の画像処理パラメータを格納します。\r
+ * {@link NyIdMarkerPickup#pickFromRaster}関数の返却値を受け取るために使います。\r
*/\r
public class NyIdMarkerParam\r
{\r
/**\r
- * マーカの方位値です。\r
+ * ARToolKit準拠のマーカの方位値です。\r
*/\r
public int direction;\r
/**\r
- * マーカ周辺のパターン閾値です。\r
+ * マーカから求められたラべリング用閾値です。\r
*/\r
public int threshold; \r
- \r
}\r
* \r
*/\r
package jp.nyatla.nyartoolkit.nyidmarker;\r
+\r
/**\r
- * [[Strage class]]\r
- * IDマーカパターン値を格納するクラスです。\r
- * クラスは、未整形のマーカデータを格納しています。\r
+ * このクラスは、Idマーカのデータ部の値を格納します。\r
+ * Idマーカのデータ仕様については、以下のURLを参照してください。\r
+ * http://sourceforge.jp/projects/nyartoolkit/docs/standards_document0001/ja/2/standards_document0001.pdf\r
*\r
*/\r
public class NyIdMarkerPattern\r
*/\r
public int check;\r
/**\r
- * データパケットの値\r
+ * データパケットの配列。有効長はモデルによって異なります。\r
*/\r
public final int[] data=new int[32];\r
}
\ No newline at end of file
import jp.nyatla.nyartoolkit.core.utils.*;\r
\r
\r
+/**\r
+ * このクラスは、ラスタ画像に定義したの任意矩形から、NyIdパターンのデータを読み取ります。\r
+ * 読み取り結果は、{@link NyARIdMarkerData}クラスのオブジェクト出力します。\r
+ *\r
+ */\r
+public class NyIdMarkerPickup\r
+{\r
+ private PerspectivePixelReader _perspective_reader;\r
+ private final PerspectivePixelReader.TThreshold __pickFromRaster_th=new PerspectivePixelReader.TThreshold();\r
+ private final MarkerPattEncoder __pickFromRaster_encoder=new MarkerPattEncoder();\r
+\r
+ /**\r
+ * コンストラクタです。インスタンスを生成します。\r
+ */\r
+ public NyIdMarkerPickup()\r
+ {\r
+ this._perspective_reader=new PerspectivePixelReader();\r
+ return;\r
+ }\r
+ /**\r
+ * この関数は、ラスタからNyIdマーカの情報を読み出します。\r
+ * @param image\r
+ * NyIdマーカが撮影されている(見込みのある)ラスタ\r
+ * @param i_vertex\r
+ * マーカの頂点位置を示す配列。4要素である事。\r
+ * @param o_data\r
+ * 抽出したパターンデータを格納するオブジェクト。\r
+ * @param o_param\r
+ * 抽出したパターンパラメータを格納するオブジェクト。\r
+ * @return\r
+ * 抽出に成功するとtrue.失敗するとfalseです。\r
+ * @throws NyARException\r
+ */\r
+ public final boolean pickFromRaster(INyARRgbRaster image, NyARDoublePoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
+ {\r
+ //遠近法のパラメータを計算\r
+ if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
+ return false;\r
+ }\r
+ return this._pickFromRaster(image,o_data,o_param);\r
+ }\r
+ /**\r
+ * この関数は、ラスタからNyIdマーカの情報を読み出します。\r
+ * @param image\r
+ * NyIdマーカが撮影されている(見込みのある)ラスタ\r
+ * @param i_vertex\r
+ * マーカの頂点位置を示す配列。4要素である事。\r
+ * @param o_data\r
+ * 抽出したパターンデータを格納するオブジェクト。\r
+ * @param o_param\r
+ * 抽出したパターンパラメータを格納するオブジェクト。\r
+ * @return\r
+ * 抽出に成功するとtrue.失敗するとfalseです。\r
+ * @throws NyARException\r
+ */\r
+ public final boolean pickFromRaster(INyARRgbRaster image, NyARIntPoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
+ {\r
+ if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
+ return false;\r
+ }\r
+ return this._pickFromRaster(image,o_data,o_param);\r
+ }\r
+ \r
+ /**\r
+ * i_imageから、idマーカを読みだします。\r
+ * o_dataにはマーカデータ、o_paramにはマーカのパラメータを返却します。\r
+ * @param image\r
+ * @param i_vertex\r
+ * @param o_data\r
+ * @param o_param\r
+ * @return\r
+ * @throws NyARException\r
+ */\r
+ private final boolean _pickFromRaster(INyARRgbRaster image, NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
+ {\r
+ INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+ NyARIntSize raster_size=image.getSize();\r
+\r
+ final PerspectivePixelReader.TThreshold th=this.__pickFromRaster_th;\r
+ final MarkerPattEncoder encoder=this.__pickFromRaster_encoder;\r
+ //マーカパラメータを取得\r
+ this._perspective_reader.detectThresholdValue(reader,raster_size,th);\r
+\r
+ if(!this._perspective_reader.readDataBits(reader,raster_size,th, encoder)){\r
+ return false;\r
+ }\r
+ final int d=encoder.encode(o_data);\r
+ if(d<0){\r
+ return false;\r
+ }\r
+ o_param.direction=d;\r
+ o_param.threshold=th.th;\r
+ \r
+ return true;\r
+ }\r
+}\r
\r
\r
\r
\r
\r
/**\r
- * NyARColorPatt_NyIdMarkerがラスタからPerspective変換して読みだすためのクラス\r
+ * {@link NyARColorPatt_NyIdMarker}がラスタからPerspective変換して読みだすためのクラス\r
+ * 画像処理全般を担当します。\r
+ * ユーザがこのクラスを使うことはありません。\r
*\r
*/\r
final class PerspectivePixelReader\r
private NyARPerspectiveParamGenerator _param_gen=new NyARPerspectiveParamGenerator_O1(1,1);\r
private double[] _cparam=new double[8];\r
\r
-\r
+ /**\r
+ * コンストラクタです。\r
+ */\r
public PerspectivePixelReader()\r
{\r
return;\r
}\r
-\r
+ /**\r
+ * この関数は、マーカ四角形をインスタンスにセットします。\r
+ * @param i_vertex\r
+ * セットする四角形頂点座標。4要素である必要があります。\r
+ * @return\r
+ * 成功するとtrueです。\r
+ * @throws NyARException\r
+ */\r
public boolean setSourceSquare(NyARIntPoint2d[] i_vertex)throws NyARException\r
{\r
return this._param_gen.getParam(READ_RESOLUTION,READ_RESOLUTION,i_vertex, this._cparam);\r
}\r
+ /**\r
+ * この関数は、マーカ四角形をインスタンスにセットします。\r
+ * @param i_vertex\r
+ * セットする四角形頂点座標。4要素である必要があります。\r
+ * @return\r
+ * 成功するとtrueです。\r
+ * @throws NyARException\r
+ */\r
public boolean setSourceSquare(NyARDoublePoint2d[] i_vertex)throws NyARException\r
{\r
return this._param_gen.getParam(READ_RESOLUTION,READ_RESOLUTION,i_vertex, this._cparam);\r
}\r
+\r
/**\r
- * 矩形からピクセルを切り出します\r
+ * ラスタから射影変換したピクセルを得ます。\r
* @param i_lt_x\r
* @param i_lt_y\r
* @param i_step_x\r
* @param i_width\r
* @param i_height\r
* @param i_out_st\r
- * o_pixelへの格納場所の先頭インデクス\r
+ * 格納バッファo_pixelの先頭のインデクス。\r
* @param o_pixel\r
* @throws NyARException\r
*/\r
return true;\r
}\r
/**\r
+ * パターン分析関数。\r
* i_freqにあるゼロクロス点の周期が、等間隔か調べます。\r
* 次段半周期が、前段の80%より大きく、120%未満であるものを、等間隔周期であるとみなします。\r
* @param i_freq\r
return true;\r
}\r
/**\r
+ * パターン分析関数。\r
* i_freq_count_tableとi_freq_tableの内容を調査し、最も大きな周波数成分を返します。\r
* @param i_freq_count_table\r
* @param i_freq_table\r
private final int[] _freq_table=new int[(MAX_FREQ*2-1)*MAX_FREQ*2/2];\r
\r
/**\r
- * i_y1行目とi_y2行目を平均して、タイミングパターンの周波数を得ます。\r
- * LHLを1周期として、たとえばLHLHLの場合は2を返します。LHLHやHLHL等の始端と終端のレベルが異なるパターンを\r
+ * この関数は、マーカ画像のi_y1行目とi_y2行目を平均して、タイミングパターンの周波数を得ます。\r
+ * L=暗点、H=明点、LHL=1周期として、たとえばLHLHLの場合は2を返します。LHLHやHLHL等の始端と終端のレベルが異なるパターンを\r
* 検出した場合、関数は失敗します。\r
- * \r
* @param i_y1\r
- * @param i_y2\r
+ * ライン1のインデクス\r
* @param i_th_h\r
+ * 明点の敷居値\r
* @param i_th_l\r
+ * 暗点の敷居値\r
* @param o_edge_index\r
- * æ¤\9cå\87ºã\81\97ã\81\9fã\82¨ã\83\83ã\82¸ä½\8dç½®(H->L,L->H)ã\81®ã\82¤ã\83³ã\83\87ã\82¯ã\82¹ã\82\92å\8f\97ã\81\91å\8f\96ã\82\8bé\85\8då\88\97ã\81§ã\81\99ã\80\82\r
- * [FRQ_POINTS]以ä¸\8aã\81®é\85\8då\88\97ã\82\92æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。\r
+ * 検出したエッジ位置(H->L,L->H)のインデクスを受け取る配列。\r
+ * [FRQ_POINTS]以ä¸\8aã\81®é\85\8då\88\97ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bã\81\93ã\81¨。\r
* @return\r
+ * 周波数の値。失敗すると-1\r
* @throws NyARException\r
*/\r
public int getRowFrequency(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,int i_y1,int i_th_h,int i_th_l,int[] o_edge_index)throws NyARException\r
}\r
return getMaxFreq(freq_count_table,freq_table,o_edge_index);\r
}\r
- \r
+ /**\r
+ * この関数は、マーカ画像のi_x1列目とi_x2列目を平均して、タイミングパターンの周波数を得ます。\r
+ * L=暗点、H=明点、LHL=1周期として、たとえばLHLHLの場合は2を返します。LHLHやHLHL等の始端と終端のレベルが異なるパターンを\r
+ * 検出した場合、関数は失敗します。\r
+ * @param i_x1\r
+ * ライン1のインデクス\r
+ * @param i_th_h\r
+ * 明点の敷居値\r
+ * @param i_th_l\r
+ * 暗点の敷居値\r
+ * @param o_edge_index\r
+ * 検出したエッジ位置(H->L,L->H)のインデクスを受け取る配列。\r
+ * [FRQ_POINTS]以上の配列を指定すること。\r
+ * @return\r
+ * 周波数の値。失敗すると-1\r
+ * @throws NyARException\r
+ */\r
public int getColFrequency(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,int i_x1,int i_th_h,int i_th_l,int[] o_edge_index)throws NyARException\r
{\r
final double[] cpara=this._cparam;\r
-// final INyARRgbPixelReader reader=this._raster.getRgbPixelReader();\r
final int[] ref_x=this._ref_x;\r
final int[] ref_y=this._ref_y;\r
final int[] pixcel_temp=this._pixcel_temp;\r
private static final int THRESHOLD_SAMPLE=THRESHOLD_PIXEL*THRESHOLD_PIXEL;\r
private static final int THRESHOLD_SAMPLE_LT=THRESHOLD_EDGE;\r
private static final int THRESHOLD_SAMPLE_RB=100-THRESHOLD_WIDTH-THRESHOLD_EDGE;\r
- \r
+ /**\r
+ * 敷居値の保持型\r
+ */\r
public static class TThreshold{\r
public int th_h;\r
public int th_l;\r
public int rb_x;\r
public int rb_y;\r
} \r
-\r
- class THighAndLow{\r
+ /**\r
+ * H/Lの保持型\r
+ */\r
+ class THighAndLow\r
+ {\r
public int h;\r
public int l;\r
}\r
private NyARIntPoint2d __detectThresholdValue_tpt=new NyARIntPoint2d();\r
private int[] _th_pixels=new int[THRESHOLD_SAMPLE*4];\r
/**\r
- * 指定した場所のピクセル値を調査して、閾値を計算して返します。\r
+ * この関数はマーカパターンから、敷居値を決定します。\r
* @param i_reader\r
- * @param i_x\r
- * @param i_y\r
- * @return\r
+ * ラスタリーダオブジェクト\r
+ * @param i_raster_size\r
+ * ラスのタのサイズ\r
+ * @param o_threshold\r
+ * 敷居値を受け取るオブジェクト\r
* @throws NyARException\r
*/\r
public void detectThresholdValue(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,TThreshold o_threshold)throws NyARException\r
}\r
private double[] __readDataBits_index_bit_x=new double[MAX_DATA_BITS*2];\r
private double[] __readDataBits_index_bit_y=new double[MAX_DATA_BITS*2];\r
- \r
+ /**\r
+ * この関数は、マーカパターンからデータを読み取ります。\r
+ * @param i_reader\r
+ * ラスタリーダ\r
+ * @param i_raster_size\r
+ * ラスタのサイズ\r
+ * @param i_th\r
+ * 敷居値情報\r
+ * @param o_bitbuffer\r
+ * データビットの出力先\r
+ * @return\r
+ * 成功するとtrue\r
+ * @throws NyARException\r
+ */\r
public boolean readDataBits(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,PerspectivePixelReader.TThreshold i_th,MarkerPattEncoder o_bitbuffer)throws NyARException\r
{\r
final int raster_width=i_raster_size.w;\r
}\r
return true;\r
}\r
- public boolean setSquare(NyARIntPoint2d[] i_vertex) throws NyARException\r
- {\r
- if (!this._param_gen.getParam(READ_RESOLUTION,READ_RESOLUTION,i_vertex,this._cparam)) {\r
- return false;\r
- }\r
- return true;\r
- }\r
+\r
\r
}\r
+\r
class MarkerPattDecoder\r
{\r
public void decode(int model,int domain,int mask)\r
}\r
}\r
/**\r
- * マーカパターンのエンコーダです。\r
- *\r
+ * このクラスは、マーカパターンのエンコーダです。{@link PerspectivePixelReader}から使います。\r
+ * ピクセルセットから、マーカーデータへエンコードする処理を定義します。\r
+ * 暫定として、5x5と、7x7のマーカについて定義します。\r
*/\r
class MarkerPattEncoder\r
{\r
private int[] _bits=new int[16];\r
private int[] _work=new int[16];\r
private int _model;\r
+ /**\r
+ * この関数は、\r
+ * @param i_index_no\r
+ * @param i_value\r
+ */\r
public void setBitByBitIndex(int i_index_no,int i_value)\r
{\r
assert i_value==0 || i_value==1;\r
}\r
return;\r
}\r
- \r
+ /**\r
+ * この関数は、ビットイメージ{@link #_bits}のnビット目に、値をセットします。\r
+ * @param i_bit_no\r
+ * ビットイメージのインデクス\r
+ * @param i_value\r
+ * セットする値。\r
+ */\r
public void setBit(int i_bit_no,int i_value)\r
{\r
assert i_value==0 || i_value==1;\r
}\r
return;\r
}\r
+ /**\r
+ * この関数は、ビットイメージ{@link #_bits}のnビット目から、値を得ます。\r
+ * @param i_bit_no\r
+ * ビットイメージのインデクス\r
+ * @return\r
+ * ビット値\r
+ */\r
public int getBit(int i_bit_no)\r
{\r
if(i_bit_no==0){\r
return (this._bits[bidx]>>(sidx))&(0x01);\r
}\r
}\r
+ /**\r
+ * この関数は、現在セットされているモデル番号を返します。\r
+ * @return\r
+ * 現在のモデル番号\r
+ */\r
public int getModel()\r
{\r
return this._model;\r
}\r
return -1;\r
}\r
- public static int getCheckValue(int i_model,int[] i_data)\r
+ /**\r
+ * この関数は、チェックドットの値を返します。\r
+ * @param i_model\r
+ * モデル番号\r
+ * @param i_data\r
+ * データ配列\r
+ * @return\r
+ */\r
+ private static int getCheckValue(int i_model,int[] i_data)\r
{\r
int v;\r
switch(i_model){\r
}\r
return -1;\r
}\r
+ /**\r
+ * この関数は、インスタンスの状態を、指定モデル向けにセットします。\r
+ * @param i_model\r
+ * モデル番号\r
+ * @return\r
+ * 成功するとtrueを返します。\r
+ */\r
public boolean initEncoder(int i_model)\r
{\r
if(i_model>3 || i_model<2){\r
/**\r
* 格納しているマーカパターンをエンコードして、マーカデータを返します。\r
* @param o_out\r
+ * マーカデータを受け取るオブジェクト。\r
* @return\r
* 成功すればマーカの方位を返却します。失敗すると-1を返します。\r
*/\r
-\r
public int encode(NyIdMarkerPattern o_out)\r
{\r
final int d=getDirection();\r
// }\r
return;\r
}\r
+ /**\r
+ * この関数は、ビットパックi_packを指定ビットだけ左シフトします。\r
+ * 現在未使用です。\r
+ * @param i_pack\r
+ * 操作する配列\r
+ * @param i_start\r
+ * シフトの開始アドレス\r
+ * @param i_length\r
+ * シフトする配列の長さ\r
+ * @param i_ls\r
+ * シフト量\r
+ */\r
public void shiftLeft(int[] i_pack,int i_start,int i_length,int i_ls)\r
{\r
int[] work=this._work;\r
return;\r
} \r
}\r
-/**\r
- * ラスタ画像の任意矩形から、NyARIdMarkerDataを抽出します。\r
- *\r
- */\r
-public class NyIdMarkerPickup\r
-{\r
- private PerspectivePixelReader _perspective_reader;\r
- private final PerspectivePixelReader.TThreshold __pickFromRaster_th=new PerspectivePixelReader.TThreshold();\r
- private final MarkerPattEncoder __pickFromRaster_encoder=new MarkerPattEncoder();\r
-\r
-\r
- public NyIdMarkerPickup()\r
- {\r
- this._perspective_reader=new PerspectivePixelReader();\r
- return;\r
- }\r
- /**\r
- * imageの4頂点で囲まれた矩形からidマーカを読みだします。\r
- * @param image\r
- * @param i_vertex\r
- * @param o_data\r
- * @param o_param\r
- * @return\r
- * @throws NyARException\r
- */\r
- public final boolean pickFromRaster(INyARRgbRaster image, NyARDoublePoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
- {\r
- //遠近法のパラメータを計算\r
- if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
- return false;\r
- }\r
- return this._pickFromRaster(image,o_data,o_param);\r
- }\r
- /**\r
- * imageの4頂点で囲まれた矩形からidマーカを読みだします。\r
- * @param image\r
- * @param i_vertex\r
- * @param o_data\r
- * @param o_param\r
- * @return\r
- * @throws NyARException\r
- */\r
- public final boolean pickFromRaster(INyARRgbRaster image, NyARIntPoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
- {\r
- if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
- return false;\r
- }\r
- return this._pickFromRaster(image,o_data,o_param);\r
- }\r
- \r
- /**\r
- * i_imageから、idマーカを読みだします。\r
- * o_dataにはマーカデータ、o_paramにはマーカのパラメータを返却します。\r
- * @param image\r
- * @param i_vertex\r
- * @param o_data\r
- * @param o_param\r
- * @return\r
- * @throws NyARException\r
- */\r
- private final boolean _pickFromRaster(INyARRgbRaster image, NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
- {\r
- INyARRgbPixelReader reader=image.getRgbPixelReader();\r
- NyARIntSize raster_size=image.getSize();\r
-\r
- final PerspectivePixelReader.TThreshold th=this.__pickFromRaster_th;\r
- final MarkerPattEncoder encoder=this.__pickFromRaster_encoder;\r
- //マーカパラメータを取得\r
- this._perspective_reader.detectThresholdValue(reader,raster_size,th);\r
-\r
- if(!this._perspective_reader.readDataBits(reader,raster_size,th, encoder)){\r
- return false;\r
- }\r
- final int d=encoder.encode(o_data);\r
- if(d<0){\r
- return false;\r
- }\r
- o_param.direction=d;\r
- o_param.threshold=th.th;\r
- \r
- return true;\r
- }\r
-}\r
package jp.nyatla.nyartoolkit.nyidmarker.data;\r
\r
/**\r
- * \r
- * [[Strage class]]\r
- *\r
+ * このインタフェイスは、エンコード済みマーカデータ格納クラスの共通関数を定義します。\r
*/\r
public interface INyIdMarkerData\r
{\r
/**\r
- * i_targetのマーカデータと自身のデータが等しいかを返します。\r
+ * この関数は、i_targetのマーカデータとインスタンスのデータを比較します。\r
* @param i_target\r
* 比較するマーカオブジェクト\r
* @return\r
- * 等しいかの真偽値\r
+ * 内容が等しいかの真偽値。等しければtrue\r
*/\r
public boolean isEqual(INyIdMarkerData i_target);\r
/**\r
- * i_sourceからマーカデータをコピーします。\r
+ * この関数は、i_sourceからインスタンスにマーカデータをコピーします。\r
* @param i_source\r
+ * コピー元のオブジェクト。\r
*/\r
public void copyFrom(INyIdMarkerData i_source);\r
}\r
\r
import jp.nyatla.nyartoolkit.nyidmarker.NyIdMarkerPattern;\r
\r
-\r
+/**\r
+ * このインタフェイスは、マーカパターンデータのエンコーダに共通な関数を定義します。\r
+ * NyIdのマーカデータを、利用可能な他形式のデータに変換します。\r
+ */\r
public interface INyIdMarkerDataEncoder\r
{\r
+ /**\r
+ * この関数は、マーカパターンデータを他形式のデータに変換します。\r
+ * 実装クラスでは、{@link NyIdMarkerPattern}に格納されるデータを変換する処理を実装してください。\r
+ * @param i_data\r
+ * 変換元のデータ\r
+ * @param o_dest\r
+ * 変換先のデータ\r
+ * @return\r
+ * 変換に成功するとtrueを返します。\r
+ */\r
public boolean encode(NyIdMarkerPattern i_data,INyIdMarkerData o_dest);\r
+ /**\r
+ * この関数は、このエンコーダの出力形式のオブジェクトを生成して返します。\r
+ * 実装クラスでは、そのクラスの{@link #encode}に入力できるオブジェクトを生成してください。\r
+ * @return\r
+ * 新しいオブジェクト\r
+ */\r
public INyIdMarkerData createDataInstance();\r
}\r
package jp.nyatla.nyartoolkit.nyidmarker.data;\r
\r
import jp.nyatla.nyartoolkit.nyidmarker.*;\r
-\r
-\r
+/**\r
+ * このクラスは、マーカパターンを{@link NyIdMarkerData_RawBit}型のデータに変換します。\r
+ */\r
public class NyIdMarkerDataEncoder_RawBit implements INyIdMarkerDataEncoder\r
{ \r
private final static int _DOMAIN_ID=0;\r
private final static int[] _mod_data={7,31,127,511,2047,4095};\r
+ /**\r
+ * この関数は、マーカパターンデータを{@link NyIdMarkerData_RawBit}型のデータに変換します。\r
+ * o_destには、{@link NyIdMarkerData_RawBit}型のオブジェクトを指定してください。\r
+ */\r
public boolean encode(NyIdMarkerPattern i_data,INyIdMarkerData o_dest)\r
{\r
final NyIdMarkerData_RawBit dest=(NyIdMarkerData_RawBit)o_dest;\r
dest.length=packet_length;\r
return true;\r
}\r
+ /**\r
+ * この関数は、{@link NyIdMarkerData_RawBit}型のオブジェクトを生成して返します。\r
+ */\r
public INyIdMarkerData createDataInstance()\r
{\r
return new NyIdMarkerData_RawBit();\r
package jp.nyatla.nyartoolkit.nyidmarker.data;\r
\r
/**\r
- * [[Strage class]]\r
- *\r
+ * このクラスは、RawBitタイプのデータを格納します。\r
+ * RawBitタイプのデータは、NyIdマーカのデータパケットをそのまま配列にするだけです。\r
*/\r
public class NyIdMarkerData_RawBit implements INyIdMarkerData\r
{\r
+ /** パケットデータを格納した配列です。0から{@link #length}-1番目までの要素が有効です。*/\r
public final int[] packet=new int[22];\r
+ /** 有効なデータ長です。*/\r
public int length;\r
+ /**\r
+ * この関数は、i_targetのマーカデータとインスタンスのデータを比較します。\r
+ * 引数には、{@link NyIdMarkerData_RawBit}型のオブジェクトを指定してください。\r
+ */\r
public boolean isEqual(INyIdMarkerData i_target)\r
{\r
NyIdMarkerData_RawBit s=(NyIdMarkerData_RawBit)i_target;\r
}\r
return true;\r
}\r
+ /**\r
+ * この関数は、i_sourceからインスタンスにマーカデータをコピーします。\r
+ * 引数には、{@link NyIdMarkerData_RawBit}型のオブジェクトを指定してください。\r
+ */ \r
public void copyFrom(INyIdMarkerData i_source)\r
{\r
final NyIdMarkerData_RawBit s=(NyIdMarkerData_RawBit)i_source;\r
import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;\r
\r
/**\r
- * マーカの周辺領域からビットマップを取得する方法を提供します。\r
- * 比較的負荷が大きいので、連続してパターンを取得し続ける用途には向いていません。\r
- *\r
+ * このクラスは、姿勢変換行列を使用してマーカの周辺領域からパターンを取得する機能を持つラスタです。\r
+ * 画像の画素フォーマットは、{@link NyARBufferType#INT1D_X8R8G8B8_32}形式のです。\r
+ * このクラスは試験的であり、異なる解像度のパターンを取得することや、異なる画素フォーマットへ画像を出力する事ができません。\r
+ * {@link NyARPerspectiveRasterReader}クラスの使用を検討してください。\r
*/\r
class TransformedBitmapPickup extends NyARColorPatt_Perspective_O2\r
{\r
private NyARIntPoint2d[] _work_points = NyARIntPoint2d.createArray(4);\r
-\r
private NyARPerspectiveProjectionMatrix _ref_perspective;\r
-\r
/**\r
- * \r
+ * コンストラクタです。\r
+ * 射影変換パラメータ、ラスタサイズ、サンプリング解像度からインスタンスを生成します。\r
+ * @param i_ref_cparam\r
+ * 射影変換パラメータの参照値\r
* @param i_width\r
- * 取得するビットマップの幅\r
+ * ラスタの幅\r
* @param i_height\r
- * 取得するビットマップの解像度\r
+ * ラスタの高さ\r
* @param i_resolution\r
- * resolution of reading pixel per point. ---- 取得時の解像度。高解像度のときは1を指定してください。低解像度のときは2以上を指定します。\r
+ * ピクセルあたりのサンプリング解像度。1なら出力1ピクセルにつき1ピクセル、2なら1ピクセルにつき4ピクセル(2x2)をサンプリングします。\r
+ * 小さい画像では数値が大きいほど良い結果が得られますが、時間がかかります。\r
*/\r
public TransformedBitmapPickup(NyARPerspectiveProjectionMatrix i_ref_cparam, int i_width, int i_height, int i_resolution)\r
{\r
}\r
\r
/**\r
- * This function retrieves bitmap from the area defined by RECT(i_l,i_t,i_r,i_b) above transform matrix i_base_mat. \r
- * ----\r
- * この関数は、basementで示される平面のAで定義される領域から、ビットマップを読み出します。\r
+ * この関数は、姿勢変換行列i_base_matで示される平面の矩形(i_l,i_t,i_r,i_b)から、ビットマップを読み出します。\r
* 例えば、8cmマーカでRECT(i_l,i_t,i_r,i_b)に-40,0,0,-40.0を指定すると、マーカの左下部分の画像を抽出します。\r
- * \r
* マーカから離れた場所になるほど、また、マーカの鉛直方向から外れるほど誤差が大きくなります。\r
+ * ----\r
+ * This function gets bitmap from the area defined by RECT(i_l,i_t,i_r,i_b) above transform matrix i_base_mat. \r
* @param i_src_imege\r
* 詠み出し元の画像を指定します。\r
* @param i_l\r
* @param i_b\r
* 基準点からの右下の相対座標(y)を指定します。\r
* @param i_base_mat\r
- * @return 画像の取得の成否を返す。\r
+ * 平面の姿勢を示す行列です。マーカ姿勢を指定することで、マーカの表面を指定することができます。\r
+ * @return\r
+ * 画像の取得に成功するとtrueを返します。\r
*/\r
public boolean pickupImage2d(INyARRgbRaster i_src_imege, double i_l, double i_t, double i_r, double i_b, NyARTransMatResult i_base_mat) throws NyARException\r
{\r