import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
\r
/**\r
- * 並進ベクトル[T]を3次元座標[b]と基点の回転済行列[M]から計算するインタフェイスです。\r
- * [M][T]=[b]\r
- *\r
+ * このインタフェイスは、姿勢変換行列の並進ベクトルを計算する関数を定義します。\r
+ * 並進ベクトルは、3次元座標と、射影後の二次元座標を元に計算します。\r
*/\r
public interface INyARTransportVectorSolver\r
{\r
+ /**\r
+ * この関数は、射影変換後の2次元頂点座標をセットします。\r
+ * 実装クラスでは、射影変換後の2次元座標を元にしたパラメータを、インスタンスに記録する処理を書いてください。\r
+ * @param i_ref_vertex_2d\r
+ * 射影変換後の頂点座標配列。\r
+ * @param i_number_of_vertex\r
+ * 頂点座標配列の要素数\r
+ * @throws NyARException\r
+ */\r
public void set2dVertex(NyARDoublePoint2d[] i_ref_vertex_2d,int i_number_of_vertex) throws NyARException;\r
/**\r
* 画面座標群と3次元座標群から、平行移動量を計算します。\r
- * 2d座標系は、直前に実行したset2dVertexのものを使用します。\r
- * @param i_vertex_2d\r
- * 直前のset2dVertexコールで指定したものと同じものを指定してください。\r
+ * 2d座標系は、直前に実行した{@link #set2dVertex}のものを使用します。\r
+ * 実装クラスでは、並進ベクトルを計算して返却する処理を書いてください。\r
* @param i_vertex3d\r
* 3次元空間の座標群を設定します。頂点の順番は、画面座標群と同じ順序で格納してください。\r
* @param o_transfer\r
+ * 並進ベクトルを受け取るオブジェクトを指定します。\r
* @throws NyARException\r
*/\r
public void solveTransportVector(NyARDoublePoint3d[] i_vertex3d,NyARDoublePoint3d o_transfer) throws NyARException;\r
import jp.nyatla.nyartoolkit.core.types.*;\r
\r
/**\r
- * 並進ベクトル[T]を3次元座標[b]と基点の回転済行列[M]から計算します。\r
- * \r
+ * このクラスは、ARToolKitと同じアルゴリズムを、異なる演算手順で処理して、並進ベクトルを求めます。\r
* アルゴリズムは、ARToolKit 拡張現実プログラミング入門 の、P207のものです。\r
- * \r
- * 計算手順\r
+ * <p>計算手順\r
+ * <pre>\r
* [A]*[T]=bを、[A]T*[A]*[T]=[A]T*[b]にする。\r
* set2dVertexで[A]T*[A]=[M]を計算して、Aの3列目の情報だけ保存しておく。\r
* getTransportVectorで[M]*[T]=[A]T*[b]を連立方程式で解いて、[T]を得る。\r
+ * </pre>\r
+ * </p>\r
*/\r
public class NyARTransportVectorSolver implements INyARTransportVectorSolver\r
{\r
private double[] _cy; \r
private final NyARPerspectiveProjectionMatrix _projection_mat;\r
private int _nmber_of_vertex;\r
+ /**\r
+ * コンストラクタです。\r
+ * 射影変換オブジェクトの参照値と、取り扱う頂点の最大数を指定して、インスタンスを生成します。\r
+ * @param i_projection_mat_ref\r
+ * 射影変換オブジェクトの参照値です。\r
+ * @param i_max_vertex\r
+ * 取り扱う頂点の最大数。\r
+ */\r
public NyARTransportVectorSolver(NyARPerspectiveProjectionMatrix i_projection_mat_ref,int i_max_vertex)\r
{\r
this._projection_mat=i_projection_mat_ref;\r
}\r
private double _a00,_a01_10,_a02_20,_a11,_a12_21,_a22;\r
/**\r
- * 平行移動量計算のための、画面上の頂点群を指定します。\r
- * @param i_ref_vertex_2d\r
- * 入力パラメータ。歪み矯正済の画面上の頂点座標群への参照値を指定します。\r
- * @param i_number_of_vertex\r
- * i_ref_vertex_2dのデータ数を指定します。\r
- * @throws NyARException\r
- * \r
+ * この関数は、射影変換後の2次元頂点座標をセットします。\r
+ * i_number_of_vertexは、コンストラクタで指定した最大数以下である必要があります。\r
*/\r
public void set2dVertex(NyARDoublePoint2d[] i_ref_vertex_2d,int i_number_of_vertex) throws NyARException\r
{\r
}\r
\r
/**\r
- * 先にセットした2次元座標群と3次元座標群から、平行移動量を計算します。\r
- * 2d座標系は、直前に実行したset2dVertexのものを使用します。\r
- * @param i_vertex3d\r
- * 3次元空間の座標群を設定します。頂点の順番は、画面座標群と同じ順序で格納してください。\r
- * @param o_transfer\r
- * @throws NyARException\r
+ * 画面座標群と3次元座標群から、平行移動量を計算します。\r
+ * 2d座標系は、直前に実行した{@link #set2dVertex}のものを使用します。\r
*/\r
public void solveTransportVector(NyARDoublePoint3d[] i_vertex3d,NyARDoublePoint3d o_transfer) throws NyARException\r
{\r
import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
\r
/**\r
- * 並進ベクトル[T]を3次元座標[b]と基点の回転済行列[M]から計算します。\r
- * ARToolKit互換の数値を計算します。\r
- *\r
+ * このクラスは、ARToolKitと同じ計算手順で並進ベクトルを求めます。\r
*/\r
public class NyARTransportVectorSolver_ARToolKit implements INyARTransportVectorSolver\r
{\r
private double[] _cy=new double[4];\r
\r
private final NyARPerspectiveProjectionMatrix _projection_mat;\r
- public NyARTransportVectorSolver_ARToolKit(final NyARPerspectiveProjectionMatrix i_projection_mat_ref)\r
+ /**\r
+ * コンストラクタです。\r
+ * 射影変換オブジェクトの参照値を指定して、インスタンスを生成します。\r
+ * @param i_projection_mat_ref\r
+ * 射影変換オブジェクトの参照値です。\r
+ */\r
+ public NyARTransportVectorSolver_ARToolKit(NyARPerspectiveProjectionMatrix i_projection_mat_ref)\r
{\r
this._projection_mat=i_projection_mat_ref;\r
//aとb(aの転置行列)の固定部分を設定。\r
}\r
return;\r
}\r
+ /**\r
+ * この関数は、射影変換後の2次元頂点座標をセットします。\r
+ * i_number_of_vertexは4である必要があります。\r
+ */\r
public void set2dVertex(NyARDoublePoint2d[] i_ref_vertex_2d,int i_number_of_vertex) throws NyARException\r
{ \r
assert(i_number_of_vertex==4);\r
}\r
/**\r
* 画面座標群と3次元座標群から、平行移動量を計算します。\r
- * 2d座標系は、直前に実行したset2dVertexのものを使用します。\r
- * @param i_vertex_2d\r
- * 直前のset2dVertexコールで指定したものと同じものを指定してください。\r
- * @param i_vertex3d\r
- * 3次元空間の座標群を設定します。頂点の順番は、画面座標群と同じ順序で格納してください。\r
- * @param o_transfer\r
- * @throws NyARException\r
+ * 2d座標系は、直前に実行した{@link #set2dVertex}のものを使用します。\r
*/\r
public void solveTransportVector(NyARDoublePoint3d[] i_vertex3d,NyARDoublePoint3d o_transfer) throws NyARException\r
{\r
*/\r
package jp.nyatla.nyartoolkit.core.types;\r
\r
+/**\r
+ * このクラスは、主に{@link INyARRaster}で使用する、バッファ形式定数を定義します。\r
+ * バッファ形式定数は32bitの値で、フィールドの組合せで定義しています。\r
+ * アプリケーションは、定数からバッファの構造を知ることができます。\r
+ * <pre>\r
+ * <table>\r
+ * <tr><td>ビットイールド(ビット幅)</td><td>カテゴリ</td><td>備考</td></tr>\r
+ * <tr><td>24-31(8)</td><td>予約</td><td></td></tr>\r
+ * <tr><td>16-27(8)</td><td>型ID</td><td>00:無効/01:byte[]/02:int[][]/03:short[]</td></tr>\r
+ * <tr><td>08-15(8)</td><td>ビットフォーマットID</td><td>00:24bit/01:32bit/02:16bit</td></tr>\r
+ * <tr><td>00-07(8)</td><td>型番号</td><td></td></tr>\r
+ * </table>\r
+ * </pre>\r
+ */\r
public class NyARBufferType\r
{\r
private static final int T_BYTE1D =0x00010000;\r
private static final int T_INT1D =0x00040000;\r
private static final int T_OBJECT =0x00100000;\r
private static final int T_USER =0x00FF0000;\r
- // 24-31(8)予約\r
- // 16-27(8)型ID\r
- // 00:無効/01:byte[]/02:int[][]/03:short[]\r
- // 08-15(8)ビットフォーマットID\r
- // 00:24bit/01:32bit/02:16bit\r
- // 00-07(8)型番号\r
//\r
- /**\r
- * RGB24フォーマットで、全ての画素が0\r
+ \r
+ //\r
+ //特殊な定数\r
+ //\r
+ \r
+ /** 全ての画素が0。バッファオブジェクトは常にNULL。\r
*/\r
public static final int NULL_ALLZERO = 0x00000001;\r
- /**\r
- * USER - USER+0xFFFFはユーザー定義型。実験用に。\r
+ \r
+ /** ユーザ定義のバッファ型。USER_DEFINE + (0x0000~0xFFFF)\r
+ * 実験等に使ってください。\r
*/\r
public static final int USER_DEFINE = T_USER;\r
+ \r
+ //\r
+ //byte形式\r
+ //\r
\r
- /**\r
- * byte[]で、R8G8B8の24ビットで画素が格納されている。\r
+ /** RGB形式。byte[3]で、R8G8B8の24ビットで画素が格納されている。\r
*/\r
public static final int BYTE1D_R8G8B8_24 = T_BYTE1D|0x0001;\r
- /**\r
- * byte[]で、B8G8R8の24ビットで画素が格納されている。\r
+ /** RGB形式。 byte[3]で、B8G8R8の24ビットの画素フォーマット。\r
*/\r
public static final int BYTE1D_B8G8R8_24 = T_BYTE1D|0x0002;\r
- /**\r
- * byte[]で、R8G8B8X8の32ビットで画素が格納されている。\r
+ /** RGB形式。byte[4]で、R8G8B8X8の32ビットの画素フォーマット。\r
*/\r
public static final int BYTE1D_B8G8R8X8_32 = T_BYTE1D|0x0101;\r
- /**\r
- * byte[]で、X8R8G8B8の32ビットで画素が格納されている。\r
+ /** RGB形式。byte[4]で、X8R8G8B8の32ビットの画素フォーマット。\r
*/\r
public static final int BYTE1D_X8R8G8B8_32 = T_BYTE1D|0x0102;\r
\r
- /**\r
- * byte[]で、RGB565の16ビット(little/big endian)で画素が格納されている。\r
+ /** RGB形式。byte[2]で、RGB565の16ビット(little endian)の画素フォーマット。\r
*/\r
public static final int BYTE1D_R5G6B5_16LE = T_BYTE1D|0x0201;\r
+ /** RGB形式。byte[2]で、RGB565の16ビット(big endian)の画素フォーマット。\r
+ */\r
public static final int BYTE1D_R5G6B5_16BE = T_BYTE1D|0x0202;\r
- /**\r
- * short[]で、RGB565の16ビット(little/big endian)で画素が格納されている。\r
+ /** RGB形式。short[1]で、RGB565の16ビット(little endian)の画素フォーマット。\r
*/ \r
public static final int WORD1D_R5G6B5_16LE = T_SHORT1D|0x0201;\r
+ /** RGB形式。short[1]で、RGB565の16ビット(big endian)の画素フォーマット。\r
+ */\r
public static final int WORD1D_R5G6B5_16BE = T_SHORT1D|0x0202;\r
\r
+ //\r
+ //int[][]形式\r
+ //\r
\r
- /**\r
- * int[][]で特に値範囲を定めない\r
+ /** int値形式。int[1][1]で、1pixel=1画素のフォーマット。\r
*/\r
public static final int INT2D = T_INT2D|0x0000;\r
- /**\r
- * int[][]で0-255のグレイスケール画像\r
+ /** フレースケール形式。int[1][1]で8itの(0-255)のグレイスケール画像\r
*/\r
public static final int INT2D_GRAY_8 = T_INT2D|0x0001;\r
- /**\r
- * int[][]で0/1の2値画像\r
- * これは、階調値1bitのBUFFERFORMAT_INT2D_GRAY_1と同じです。\r
+ /** 二値形式。int[1][1]で、0 or 1の2値画像\r
*/\r
public static final int INT2D_BIN_8 = T_INT2D|0x0002;\r
\r
- /**\r
- * int[]で特に値範囲を定めない\r
+ //\r
+ //int[]形式\r
+ //\r
+ \r
+ /** int値形式。int[1]で、1pixel=1画素のフォーマット。\r
*/\r
public static final int INT1D = T_INT1D|0x0000;\r
- /**\r
- * int[]で0-255のグレイスケール画像\r
+ /** フレースケール形式。int[1]で8itの(0-255)のグレイスケール画像\r
*/\r
public static final int INT1D_GRAY_8 = T_INT1D|0x0001;\r
- /**\r
- * int[]で0/1の2値画像\r
- * これは、階調1bitのINT1D_GRAY_1と同じです。\r
+ /** 二値形式。int[1]で、0 or 1の2値画像\r
*/\r
public static final int INT1D_BIN_8 = T_INT1D|0x0002;\r
\r
- \r
- /**\r
- * int[]で、XRGB32の32ビットで画素が格納されている。\r
- */ \r
+ /** RGB形式。int[1]で、XRGB32の32ビットの画素フォーマット。\r
+ * (エンディアンはプラットフォーム依存。)\r
+ */\r
public static final int INT1D_X8R8G8B8_32=T_INT1D|0x0102;\r
\r
- /**\r
- * H:9bit(0-359),S:8bit(0-255),V(0-255)\r
+ /** HSV形式。int[1]で、H:9bit(0-359),S:8bit(0-255),V(0-255)の画素フォーマット\r
*/\r
public static final int INT1D_X7H9S8V8_32=T_INT1D|0x0103;\r
\r
+ //\r
+ //プラットフォーム固有形式\r
+ //\r
\r
- /**\r
- * プラットフォーム固有オブジェクト\r
- */\r
+ /** Javaプラットフォーム固有オブジェクトのドメインです。*/\r
public static final int OBJECT_Java= T_OBJECT|0x0100;\r
+ /** C#プラットフォーム固有オブジェクトのドメインです。*/\r
public static final int OBJECT_CS = T_OBJECT|0x0200;\r
+ /** AS3プラットフォーム固有オブジェクトのドメインです。*/\r
public static final int OBJECT_AS3 = T_OBJECT|0x0300;\r
\r
/**\r
- * JavaのBufferedImageを格納するラスタ\r
+ * RGB形式。バッファは、JavaのBufferedImage型オブジェクト\r
*/\r
public static final int OBJECT_Java_BufferedImage= OBJECT_Java|0x01;\r
\r
\r
/**\r
- * ActionScript3のBitmapDataを格納するラスタ\r
+ * RGB形式。バッファは、ActionScript3のBitmapData型オブジェクト\r
*/\r
public static final int OBJECT_AS3_BitmapData= OBJECT_AS3|0x01;\r
\r
package jp.nyatla.nyartoolkit.core.types;\r
\r
\r
-\r
/**\r
- * データ型です。\r
- * 2次元の浮動小数点方の点を格納します。\r
+ * ã\81\93ã\81®ã\82¯ã\83©ã\82¹ã\81¯ã\83\87ã\83¼ã\82¿å\9e\8bã\81§ã\81\99ã\80\82\r
+ * 2次元の浮動小数点座標を格納します。\r
*/\r
public class NyARDoublePoint2d\r
{\r
+ /** X座標の値です。*/\r
public double x;\r
+ /** Y座標の値です。*/\r
public double y;\r
/**\r
- * 配列ファクトリ\r
+ * この関数は、オブジェクトの一次元配列を作ります。\r
* @param i_number\r
+ * 作成する配列の長さ\r
* @return\r
+ * 新しい配列。\r
*/\r
public static NyARDoublePoint2d[] createArray(int i_number)\r
{\r
}\r
return ret;\r
}\r
+ /**\r
+ * この関数は、オブジェクトの二次元配列を作ります。\r
+ * @param i_length_x\r
+ * 作成する配列の列数\r
+ * @param i_length_y\r
+ * 作成する配列の行数\r
+ * @return\r
+ * 新しい配列。\r
+ */ \r
public static NyARDoublePoint2d[][] create2dArray(int i_length_x,int i_length_y)\r
{\r
NyARDoublePoint2d[][] ret=new NyARDoublePoint2d[i_length_y][i_length_x];\r
return ret;\r
}\r
/**\r
- * p1->p2と、p2->p3の直線の外積を計算します。\r
+ * この関数は、3点で定義される直線から、外積を計算します。\r
+ * 外積は、p1->p2と、p2->p3で定義する直線の外積です。\r
* @param p1\r
+ * 点1\r
* @param p2\r
+ * 点2\r
* @param p3\r
+ * 点3\r
* @return\r
+ * 外積の値\r
*/\r
public final static double crossProduct3Point(NyARDoublePoint2d p1,NyARDoublePoint2d p2,NyARDoublePoint2d p3)\r
{\r
return (p2.x-p1.x)*(p3.y-p2.y)-(p2.y-p1.y)*(p3.x-p2.x);\r
}\r
/**\r
- * p1->p2と、p2->p3の直線の外積を計算します。\r
+ * この関数は、3点で定義される直線から、外積を計算します。\r
+ * 外積は、p1->p2と、p2->p3で定義する直線の外積です。\r
* @param p1\r
+ * 点1\r
* @param p2\r
+ * 点2\r
* @param p3\r
+ * 点3\r
* @return\r
+ * 外積の値\r
*/\r
public final static double crossProduct3Point(NyARDoublePoint2d p1,NyARDoublePoint2d p2,double p3_x,double p3_y)\r
{\r
return (p2.x-p1.x)*(p3_y-p2.y)-(p2.y-p1.y)*(p3_x-p2.x);\r
}\r
-\r
- \r
- \r
/**\r
- * 頂点配列の中央値を求めます。\r
+ * この関数は、頂点集合から、中央値(Σp[n]/n)を求めます。\r
* @param i_points\r
+ * 頂点集合を格納した配列です。\r
* @param i_number_of_data\r
* 配列中の有効な頂点数です。\r
* @param o_out\r
+ * 中央値を受け取るオブジェクトです。\r
*/\r
public final static void makeCenter(NyARDoublePoint2d[] i_points,int i_number_of_data,NyARDoublePoint2d o_out)\r
{\r
o_out.x=y/i_number_of_data;\r
}\r
/**\r
- * {@link #makeCenter}の出力型違いの関数です。\r
+ * この関数は、頂点集合から、中央値(Σp[n]/n)を求めます。\r
* @param i_points\r
+ * 頂点集合を格納した配列です。\r
* @param i_number_of_data\r
+ * 配列中の有効な頂点数です。\r
* @param o_out\r
+ * 中央値を受け取るオブジェクトです。\r
*/\r
public final static void makeCenter(NyARDoublePoint2d[] i_points,int i_number_of_data,NyARIntPoint2d o_out)\r
{\r
o_out.x=(int)(lx/i_number_of_data);\r
o_out.y=(int)(ly/i_number_of_data);\r
}\r
- \r
/**\r
* コンストラクタです。\r
+ * 初期値を格納したインスタンスを生成します。\r
*/\r
public NyARDoublePoint2d()\r
{\r
return;\r
}\r
/**\r
- * i_srcの値をthisへセットします。\r
- * @param i_src\r
+ * コンストラクタです。\r
+ * 初期値を指定してインスタンスを生成します。\r
+ * @param i_x\r
+ * {@link #x}の初期値\r
+ * @param i_y\r
+ * {@link #y}の初期値\r
*/\r
public NyARDoublePoint2d(double i_x,double i_y)\r
{\r
return;\r
}\r
/**\r
- * i_srcの値をthisへセットします。\r
+ * コンストラクタです。\r
+ * i_srcの値で初期化したインスタンスを生成します。\r
* @param i_src\r
+ * 初期値とするオブジェクト\r
*/\r
public NyARDoublePoint2d(NyARDoublePoint2d i_src)\r
{\r
return;\r
}\r
/**\r
- * i_srcの値をthisへセットします。\r
+ * コンストラクタです。\r
+ * i_srcの値で初期化したインスタンスを生成します。\r
* @param i_src\r
+ * 初期値とするオブジェクト\r
*/\r
public NyARDoublePoint2d(NyARIntPoint2d i_src)\r
{\r
return;\r
}\r
/**\r
- * p2-p1間の距離の二乗値を計算します。\r
+ * この関数は、インスタンスの座標と、指定点との距離の2乗値を返します。\r
* @param i_p1\r
- * @param i_p2\r
+ * 点の座標\r
* @return\r
+ * i_p1との距離の二乗値\r
*/ \r
public final double sqDist(NyARDoublePoint2d i_p1)\r
{\r
y=this.y-i_p1.y;\r
return x*x+y*y;\r
}\r
+ /**\r
+ * この関数は、インスタンスの座標と、指定点との距離の2乗値を返します。\r
+ * @param i_p1\r
+ * 点の座標\r
+ * @return\r
+ * i_p1との距離の二乗値\r
+ */ \r
public final double sqDist(NyARIntPoint2d i_p1)\r
{\r
double x,y;\r
x=this.x-i_p1.x;\r
y=this.y-i_p1.y;\r
return x*x+y*y;\r
- } \r
+ }\r
/**\r
- * i_srcの値をthisへセットします。\r
+ * この関数は、オブジェクトからインスタンスに値をセットします。\r
* @param i_src\r
+ * コピー元のオブジェクト。\r
*/\r
public final void setValue(NyARDoublePoint2d i_src)\r
{\r
return;\r
}\r
/**\r
- * i_srcの値をthisへセットします。\r
+ * この関数は、オブジェクトからインスタンスに値をセットします。\r
* @param i_src\r
+ * コピー元のオブジェクト。\r
*/\r
public final void setValue(NyARIntPoint2d i_src)\r
{\r
this.y=(double)i_src.y;\r
return;\r
}\r
- public final void setValue(double x,double y)\r
+ /**\r
+ * この関数は、インスタンスに値をセットします。\r
+ * @param i_x\r
+ * {@link #x}にセットする値\r
+ * @param i_y\r
+ * {@link #y}にセットする値\r
+ */\r
+ public final void setValue(double i_x,double i_y)\r
{\r
- this.x=x;\r
- this.y=y;\r
+ this.x=i_x;\r
+ this.y=i_y;\r
return;\r
}\r
\r
* \r
*/\r
package jp.nyatla.nyartoolkit.core.types;\r
-\r
+/**\r
+ * このクラスはデータ型です。\r
+ * 3次元の浮動小数点座標を格納します。\r
+ */\r
public class NyARDoublePoint3d\r
{\r
+ /** X座標の値です。*/\r
public double x;\r
+ /** Y座標の値です。*/\r
public double y;\r
+ /** Z座標の値です。*/ \r
public double z;\r
/**\r
- * 配列ファクトリ\r
+ * この関数は、オブジェクトの一次配列を作ります。\r
* @param i_number\r
+ * 作成する配列の長さ\r
* @return\r
+ * 新しい配列。\r
*/\r
public static NyARDoublePoint3d[] createArray(int i_number)\r
{\r
}\r
return ret;\r
}\r
+ /**\r
+ * この関数は、オブジェクトからインスタンスに値をセットします。\r
+ * @param i_in\r
+ * コピー元のオブジェクト。\r
+ */ \r
public final void setValue(NyARDoublePoint3d i_in)\r
{\r
this.x=i_in.x;\r
return;\r
}\r
/**\r
- * p2-p1間の距離の二乗値を計算します。\r
+ * この関数は、インスタンスの座標と、指定点との距離の2乗値を返します。\r
* @param i_p1\r
+ * 点の座標\r
* @return\r
- */ \r
+ * i_p1との距離の二乗値\r
+ */ \r
public final double sqDist(NyARDoublePoint3d i_p1)\r
{\r
double x,y,z;\r
*/\r
package jp.nyatla.nyartoolkit.core.types;\r
\r
+\r
/**\r
- * ã\83\92ã\82¹ã\83\88ã\82°ã\83©ã\83 ã\82\92æ ¼ç´\8dã\81\99ã\82\8bã\82¯ã\83©ã\82¹ã\81§ã\81\99ã\80\82\r
+ * ã\81\93ã\81®ã\82¯ã\83©ã\82¹ã\81¯ã\80\81ã\83\92ã\82¹ã\83\88ã\82°ã\83©ã\83 ã\82\92æ ¼ç´\8dã\81\99ã\82\8bã\83\87ã\83¼ã\82¿å\9e\8b\r
*/\r
public class NyARHistogram\r
{\r
- /**\r
- * サンプリング値の格納変数\r
+ /** ヒストグラムを格納する配列です。\r
+ * <p>注意 - 配列の長さ({@link #data})と{@link #length}の意味は異なります。\r
+ * ヒストグラムの解像度に、この配列の長さを使わないでください。</p>\r
*/\r
public final int[] data;\r
- /**\r
- * 有効なサンプリング値の範囲。[0-data.length-1]\r
+ /** ヒストグラムの解像度です。\r
+ * {@link #data}配列の0から{@link #length}-1までの要素が、アクセス可能な要素です。\r
*/\r
public int length;\r
/**\r
- * 有効なサンプルの総数 data[i]\r
+ * ヒストグラムの合計値です。\r
+ * ヒストグラム分析器は、ここにヒストグラム要素の合計値を書込みます。\r
*/\r
public int total_of_data;\r
\r
\r
- \r
+ /**\r
+ * コンストラクタです。\r
+ * ヒストグラムの解像度を指定してインスタンスを作ります。\r
+ * @param i_length\r
+ * ヒストグラムの解像度値。通常は256を指定してください。\r
+ */\r
public NyARHistogram(int i_length)\r
{\r
this.data=new int[i_length];\r
this.total_of_data=0;\r
}\r
/**\r
- * 区間i_stからi_edまでの総データ数を返します。\r
+ * この関数は、ヒストグラム要素の、i_stからi_edまでの区間の、合計値を返します。\r
* @param i_st\r
+ * 集計開始点のインデクス\r
* @param i_ed\r
+ * 集計終了点のインデクス\r
* @return\r
+ * ヒストグラムの合計値\r
*/\r
public final int getTotal(int i_st,int i_ed)\r
{\r
return result;\r
}\r
/**\r
- * 指定したi_pos未満サンプルを0にします。\r
+ * この関数は、指定したインデクス以下のヒストグラム要素を0にします。\r
+ * 実行結果は、{@link #total_of_data}に反映されます。\r
* @param i_pos\r
+ * 操作するヒストグラム要素のインデクス値。\r
*/\r
public void lowCut(int i_pos)\r
{\r
this.total_of_data-=s;\r
}\r
/**\r
- * 指定したi_pos以上のサンプルを0にします。\r
+ * この関数は、指定したインデクス以上のヒストグラム要素を0にします。\r
+ * 実行結果は、{@link #total_of_data}に反映されます。\r
* @param i_pos\r
+ * 操作するヒストグラム要素のインデクス値。\r
*/\r
public void highCut(int i_pos)\r
{\r
this.total_of_data-=s;\r
}\r
/**\r
- * 最小の値が格納されているサンプル番号を返します。\r
+ * この関数は、ヒストグラム要素の中で最小の要素のインデクス番号を返します。\r
+ * @return\r
+ * 最小要素のインデクス番号\r
*/\r
public int getMinSample()\r
{\r
return ret;\r
}\r
/**\r
- * ã\82µã\83³ã\83\97ã\83«ã\81®ä¸ã\81§æ\9c\80å°\8fã\81®値を返します。\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81ã\83\92ã\82¹ã\83\88ã\82°ã\83©ã\83 è¦\81ç´ ã\81®ä¸ã\81§æ\9c\80å°\8fã\81®è¦\81ç´ 値を返します。\r
* @return\r
+ * 最小要素の値\r
*/\r
public int getMinData()\r
{\r
return this.data[this.getMinSample()];\r
}\r
/**\r
- * 平均値を計算します。\r
+ * この関数は、ヒストグラム要素全体の平均値を計算します。\r
* @return\r
+ * ヒストグラム要素の平均値\r
*/\r
public int getAverage()\r
{\r
* \r
*/\r
package jp.nyatla.nyartoolkit.core.types;\r
+\r
/**\r
- * 座標点配列を定義します。\r
- * 座標点配列は、輪郭線やパスの定義に使用します。\r
+ * このクラスは、整数型の2次元輪郭線を格納します。\r
+ * 輪郭線は、2次元座標{@link NyARIntPoint2d}の集合です。\r
*/\r
public class NyARIntCoordinates\r
{\r
- /**\r
- * 点を格納する配列です。\r
- */\r
+ /** 点を格納する配列です。*/\r
public NyARIntPoint2d[] items;\r
+ /** 有効な要素の長さです。この値の最大値は、{@link #items#length}と同じです。*/\r
+ public int length;\r
/**\r
- * 配列の有効な長さです。0から、items.length-1までの数を取ります。\r
+ * コンストラクタです。\r
+ * 最大長さを指定して、有効要素数0のインスタンスを作ります。\r
+ * @param i_length\r
+ * 輪郭の最大長\r
*/\r
- public int length;\r
public NyARIntCoordinates(int i_length)\r
{\r
this.items=NyARIntPoint2d.createArray(i_length);\r
this.length=0;\r
}\r
/**\r
- * 指定した点を結ぶ直線を計算して、輪郭に保存します。\r
- * 動作チェックはしたけど、多分動くレベル。\r
+ * この関数は2点を結ぶ直線を計算して、輪郭線を保存します。\r
+ * 輪郭線は、Bresenhamのアルゴリズムで計算します。\r
+ * 2点間の距離が、格納可能な最大長さ以下になるように注意してください。\r
* @param i_x0\r
+ * 点1のX座標\r
* @param i_y0\r
+ * 点1のY座標\r
* @param i_x1\r
+ * 点2のX座標\r
* @param i_y1\r
- * @param o_coord\r
+ * 点2のY座標\r
* @return\r
* 成功するとtrueを返します。\r
*/\r
package jp.nyatla.nyartoolkit.core.types;\r
\r
/**\r
- * int型の二次元の点を格納します。\r
+ * このクラスは、int型の二次元の点を格納します。\r
*\r
*/\r
public class NyARIntPoint2d\r
{\r
+ /** X座標の値です。*/\r
public int x;\r
-\r
+ /** Y座標の値です。*/\r
public int y;\r
/**\r
- * 配列ファクトリ\r
+ * この関数は、指定サイズのオブジェクト配列を作ります。\r
* @param i_number\r
+ * 作成する配列の長さ\r
* @return\r
+ * 新しい配列。\r
*/\r
public static NyARIntPoint2d[] createArray(int i_number)\r
{\r
return ret;\r
}\r
/**\r
- * i_fromからi_toへ配列をコピーします。\r
+ * この関数は、配列の値をコピーします。\r
+ * 配列の長さは、同じである必要があります。\r
* @param i_from\r
+ * コピー元の配列\r
* @param i_to\r
+ * コピー先の配列\r
*/\r
public static void copyArray(final NyARIntPoint2d[] i_from,NyARIntPoint2d[] i_to)\r
{\r
return;\r
}\r
/**\r
- * p2-p1間の距離の二乗値を計算します。\r
+ * この関数は、インスタンスの座標と、指定点との距離の2乗値を返します。\r
* @param i_p1\r
- * @param i_p2\r
+ * 点の座標\r
* @return\r
+ * i_p1との距離の二乗値\r
*/ \r
public final int sqDist(NyARIntPoint2d i_p1)\r
{\r
int y=this.y-i_p1.y;\r
return x*x+y*y;\r
}\r
- \r
/**\r
- * 中心位置を計算して設定する。\r
- * @param i_point\r
- * @param i_number_of_vertex\r
- */\r
+ * この関数は、頂点集合から、中央値(Σp[n]/n)を求めて、インスタンスにセットします。\r
+ * @param i_points\r
+ * 頂点集合を格納した配列です。\r
+ * @param i_number_of_data\r
+ * 配列中の有効な頂点数です。\r
+ */ \r
public final void setCenterPos(NyARIntPoint2d[] i_point,int i_number_of_vertex)\r
{\r
int cx,cy;\r
this.y=cy/i_number_of_vertex;\r
}\r
/**\r
- * i_sourceの値を、thisへセットします。\r
+ * この関数は、オブジェクトからインスタンスに値をセットします。\r
* @param i_source\r
+ * コピー元のオブジェクト。\r
*/\r
public final void setValue(NyARIntPoint2d i_source)\r
{\r
this.x=i_source.x;\r
this.y=i_source.y;\r
}\r
+ /**\r
+ * この関数は、オブジェクトからインスタンスに値をセットします。\r
+ * @param i_source\r
+ * コピー元のオブジェクト。\r
+ */ \r
public final void setValue(NyARDoublePoint2d i_source)\r
{\r
this.x=(int)i_source.x;\r
this.y=(int)i_source.y;\r
}\r
+ /**\r
+ * この関数は、インスタンスに値をセットします。\r
+ * @param i_x\r
+ * {@link #x}にセットする値\r
+ * @param i_y\r
+ * {@link #y}にセットする値\r
+ */ \r
public final void setValue(int i_x,int i_y)\r
{\r
this.x=i_x;\r
package jp.nyatla.nyartoolkit.core.types;\r
\r
/**\r
- * 基点x,yと、幅、高さで矩形を定義します。\r
- *\r
+ * このクラスは、基点x,yと、幅、高さで矩形を定義します。\r
*/\r
public class NyARIntRect\r
{\r
+ /** 矩形の左上の点(X)*/\r
public int x;\r
-\r
+ /** 矩形の左上の点(Y)*/\r
public int y;\r
-\r
+ /** 矩形の幅(X)*/\r
public int w;\r
-\r
+ /** 矩形の高さ(Y)*/\r
public int h;\r
/**\r
- * 頂点を包括するRECTを計算します。\r
+ * この関数は、頂点集合を包括する矩形を計算して、インスタンスにセットします。\r
* @param i_vertex\r
+ * 頂点集合を格納した配列\r
* @param i_num_of_vertex\r
- * @param o_rect\r
+ * 計算対象とする要素の数\r
*/\r
public final void setAreaRect(NyARDoublePoint2d[] i_vertex,int i_num_of_vertex)\r
{\r
this.w=xmax-xmin+1;\r
this.y=ymin;\r
}\r
+ /**\r
+ * この関数は、頂点集合を包括する矩形を計算して、インスタンスにセットします。\r
+ * @param i_vertex\r
+ * 頂点集合を格納した配列\r
+ * @param i_num_of_vertex\r
+ * 計算対象とする要素の数\r
+ */\r
public final void setAreaRect(NyARIntPoint2d[] i_vertex,int i_num_of_vertex)\r
{\r
//エリアを求める。\r
}\r
\r
/**\r
- * 矩形を指定した領域内にクリップします。\r
+ * この関数は、矩形を領域内にクリップします。\r
* @param top\r
+ * クリップする上辺\r
* @param bottom\r
+ * クリップする下辺\r
* @param left\r
+ * クリップする左辺\r
* @param right\r
+ * クリップする右辺\r
*/\r
public final void clip(int i_left,int i_top,int i_right,int i_bottom)\r
{\r
}\r
\r
/**\r
- * 点がRECTの範囲内であるか判定します。\r
+ * この関数は、点が矩形の範囲内にあるか判定します。\r
* @param i_x\r
+ * 調査する座標(X)\r
* @param i_y\r
+ * 調査する座標(Y)\r
* @return\r
+ * 点が矩形の中にあれば、trueを返します。\r
*/\r
public final boolean isInnerPoint(int i_x,int i_y)\r
{\r
\r
return (0<=x && x<this.w && 0<=y && y<this.h);\r
}\r
+ /**\r
+ * この関数は、点が矩形の範囲内にあるか判定します。\r
+ * @param i_pos\r
+ * 調査する座標\r
+ * @return\r
+ * 点が矩形の中にあれば、trueを返します。\r
+ */\r
public final boolean isInnerPoint(NyARDoublePoint2d i_pos)\r
{\r
int x=(int)i_pos.x-this.x;\r
int y=(int)i_pos.y-this.y;\r
return (0<=x && x<this.w && 0<=y && y<this.h);\r
}\r
+ /**\r
+ * この関数は、点が矩形の範囲内にあるか判定します。\r
+ * @param i_pos\r
+ * 調査する座標\r
+ * @return\r
+ * 点が矩形の中にあれば、trueを返します。\r
+ */\r
public final boolean isInnerPoint(NyARIntPoint2d i_pos)\r
{\r
int x=i_pos.x-this.x;\r
return (0<=x && x<this.w && 0<=y && y<this.h);\r
}\r
/**\r
- * RECTがこのRECTの範囲内であるか判定します。\r
+ * この関数は、引数の矩形が、この矩形内にあるか判定します。\r
* @param i_rect\r
- * @param i_y\r
+ * 内側にあるか調べる矩形\r
* @return\r
+ * 矩形が内側にあれば、trueを返します。\r
*/\r
public final boolean isInnerRect(NyARIntRect i_rect)\r
{\r
int lh=ly+i_rect.h;\r
return (0<=lx && lx<this.w && 0<=ly && ly<this.h && lw<=this.w && lh<=this.h);\r
}\r
+ /**\r
+ * この関数は、引数で定義される矩形が、この矩形内にあるか判定します。\r
+ * @param i_x\r
+ * 内側にあるか調べる矩形の左上座標(X)\r
+ * @param i_y\r
+ * 内側にあるか調べる矩形の左上座標(Y)\r
+ * @param i_w\r
+ * 内側にあるか調べる矩形の幅\r
+ * @param i_h\r
+ * 内側にあるか調べる矩形の高さ\r
+ * @return\r
+ * 矩形が内側にあれば、trueを返します。\r
+ */\r
public final boolean isInnerRect(int i_x,int i_y,int i_w,int i_h)\r
{\r
assert(i_w>=0 && i_h>=0);\r
return (0<=lx && lx<this.w && 0<=ly && ly<this.h && lw<=this.w && lh<=this.h);\r
}\r
/**\r
- * RECT1とRECT2の差分値を計算します。\r
- * 差分値は、矩形同士の対角点2点(左上,右下)の距離の二乗の合計値です。\r
- * @param i_rect1\r
+ * この関数は、2つの矩形の対角点同士の距離の二乗値を計算します。\r
* @param i_rect2\r
+ * 比較する矩形\r
* @return\r
+ * 左上、右下の点同士の距離の二乗値\r
*/\r
public final int sqDiagonalPointDiff(NyARIntRect i_rect2)\r
{\r
return ret;\r
}\r
/**\r
- * 対角線の二乗距離を返します。\r
+ * この関数は、矩形の対角距離の二乗距離を返します。\r
* @return\r
+ * 矩形の対角距離の二乗値。\r
*/\r
public final int getDiagonalSqDist()\r
{\r
}\r
\r
/**\r
- * i_sourceの値をthisにセットします。\r
+ * この関数は、オブジェクトの値をインスタンスにセットします。\r
* @param i_source\r
+ * セットする値を格納したオブジェクト。\r
*/\r
public final void setValue(NyARIntRect i_source)\r
{\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
\r
+/**\r
+ * このクラスは、整数型の距離値を格納します。\r
+ *\r
+ */\r
public class NyARIntSize\r
{\r
+ /** Y軸方向のサイズ値*/\r
public int h;\r
+ /** X軸方向のサイズ値*/\r
public int w;\r
+ /**\r
+ * コンストラクタです。\r
+ * 初期値を格納したインスタンスを生成します。\r
+ */\r
public NyARIntSize()\r
{\r
this.w=0;\r
this.h=0;\r
return; \r
}\r
+ /**\r
+ * コンストラクタです。\r
+ * @param i_ref_object\r
+ * 引数値で初期化したインスタンスを生成します。\r
+ */\r
public NyARIntSize(NyARIntSize i_ref_object)\r
{\r
this.w=i_ref_object.w;\r
this.h=i_ref_object.h;\r
return; \r
}\r
+ /**\r
+ * コンストラクタです。\r
+ * @param i_width\r
+ * {@link #w}に設定する値\r
+ * @param i_height\r
+ * {@link #h}に設定する値\r
+ */\r
public NyARIntSize(int i_width,int i_height)\r
{\r
this.w=i_width;\r
this.h=i_height;\r
return;\r
}\r
+ /**\r
+ * この関数は、引数値をインスタンスにセットします。\r
+ * @param i_width\r
+ * {@link #w}に設定する値\r
+ * @param i_height\r
+ * {@link #h}に設定する値\r
+ */\r
public final void setValue(int i_w,int i_h)\r
{\r
this.w=i_w;\r
return;\r
}\r
/**\r
- * サイズが同一であるかを確認する。\r
- * \r
+ * この関数は、サイズが引数値と同一であるかを確認します。\r
* @param i_width\r
+ * 比較するサイズ値(W)\r
* @param i_height\r
+ * 比較するサイズ値(H)\r
* @return\r
+ * サイズが引数値と同じなら、trueを返します。\r
* @throws NyARException\r
*/\r
public final boolean isEqualSize(int i_width, int i_height)\r
}\r
\r
/**\r
- * サイズが同一であるかを確認する。\r
- * \r
- * @param i_width\r
- * @param i_height\r
+ * この関数は、サイズが引数値と同一であるかを確認します。\r
+ * @param i_size\r
+ * 比較するサイズ値\r
* @return\r
+ * サイズが引数値と同じなら、trueを返します。\r
* @throws NyARException\r
*/\r
public final boolean isEqualSize(NyARIntSize i_size)\r
return false;\r
}\r
/**\r
- * ã\82µã\82¤ã\82ºã\81\8cã\82µã\82¤ã\82ºå\80¤ã\81®ç¯\84å\9b²ã\81§ã\81\82ã\82\8bã\81\8bå\88¤å®\9aします。\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81å¼\95æ\95°å\80¤ã\81\8cã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\81®ã\82µã\82¤ã\82ºã\82\88ã\82\8aã\82\82å°\8fã\81\95ã\81\84ã\81\8bã\82\92è¿\94します。\r
* @param i_x\r
+ * 比較するサイズ値(W)\r
* @param i_y\r
+ * 比較するサイズ値(H)\r
* @return\r
+ * 引数値がインスタンスのサイズよりも小さければ、trueを返します。\r
+ * @throws NyARException\r
*/\r
public final boolean isInnerSize(int i_x,int i_y)\r
{\r
return (i_x<=this.w && i_y<=this.h);\r
}\r
/**\r
- * ã\82µã\82¤ã\82ºå\80¤ã\81\8cã\80\81ã\81\93ã\81®ã\82µã\82¤ã\82ºã\81®ç¯\84å\9b²å\86\85ã\81§ã\81\82ã\82\8bã\81\8bå\88¤å®\9aします。\r
+ * ã\81\93ã\81®é\96¢æ\95°ã\81¯ã\80\81å¼\95æ\95°å\80¤ã\81\8cã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹ã\81®ã\82µã\82¤ã\82ºã\82\88ã\82\8aã\82\82å°\8fã\81\95ã\81\84ã\81\8bã\82\92è¿\94します。\r
* @param i_size\r
+ * 比較するサイズ値\r
* @return\r
+ * 引数値がインスタンスのサイズよりも小さければ、trueを返します。\r
+ * @throws NyARException\r
*/\r
public final boolean isInnerSize(NyARIntSize i_size)\r
{\r
return (i_size.w<=this.w && i_size.h<=this.h);\r
}\r
/**\r
- * 点が、サイズの内部にあるか判定します。\r
+ * この関数は、座標がサイズの範囲内(0,0基点)よりも小さいかを返します。\r
* @param i_point\r
+ * 調査する座標点\r
* @return\r
+ * 引数値が範囲内ならば、trueを返します。\r
+ * @throws NyARException\r
*/\r
public final boolean isInnerSize(NyARDoublePoint2d i_point)\r
{\r
return (i_point.x<this.w && i_point.y<this.h && 0<=i_point.x && 0<=i_point.y);\r
}\r
/**\r
- * 点が、サイズの内部にあるか判定します。\r
+ * この関数は、座標がサイズの範囲内(0,0-w,hの矩形)にあるかを返します。\r
* @param i_x\r
+ * 調査する座標点\r
* @param i_y\r
+ * 調査する座標点\r
* @return\r
+ * 引数値が範囲内ならば、trueを返します。\r
+ * @throws NyARException\r
*/\r
public final boolean isInnerPoint(int i_x,int i_y)\r
{\r
return (i_x<this.w && i_y<this.h && 0<=i_x && 0<=i_y);\r
}\r
/**\r
- * 点が、サイズの内部にあるか判定します。\r
- * @param i_x\r
- * @param i_y\r
+ * この関数は、座標がサイズの範囲内(0,0-w,hの矩形)にあるかを返します。\r
+ * @param i_pos\r
+ * 調査する座標点\r
* @return\r
+ * 引数値が範囲内ならば、trueを返します。\r
+ * @throws NyARException\r
*/\r
public final boolean isInnerPoint(NyARDoublePoint2d i_pos)\r
{\r
return (i_pos.x<this.w && i_pos.y<this.h && 0<=i_pos.x && 0<=i_pos.y);\r
}\r
/**\r
- * 点が、サイズの内部にあるか判定します。\r
- * @param i_x\r
- * @param i_y\r
+ * この関数は、座標がサイズの範囲内(0,0-w,hの矩形)にあるかを返します。\r
+ * @param i_pos\r
+ * 調査する座標点\r
* @return\r
- */ \r
+ * 引数値が範囲内ならば、trueを返します。\r
+ * @throws NyARException\r
+ */\r
public final boolean isInnerPoint(NyARIntPoint2d i_pos)\r
{\r
return (i_pos.x<this.w && i_pos.y<this.h && 0<=i_pos.x && 0<=i_pos.y);\r
}\r
/**\r
- * 頂点セットの広がりを計算して格納する。\r
- * この関数は、頂点セットを全て包括するサイズを計算します。\r
+ * この関数は、頂点集合を包括する矩形のサイズ値(幅、高さ)を計算して、インスタンスにセットします。\r
* @param i_vertex\r
+ * 頂点集合を格納した配列\r
* @param i_num_of_vertex\r
+ * 計算対象とする要素の数\r
*/\r
public final void setAreaRect(NyARDoublePoint2d[] i_vertex,int i_num_of_vertex)\r
{\r
this.h=ymax-ymin+1;\r
this.w=xmax-xmin+1;\r
}\r
+ /**\r
+ * この関数は、頂点集合を包括する矩形のサイズ値(幅、高さ)を計算して、インスタンスにセットします。\r
+ * @param i_vertex\r
+ * 頂点集合を格納した配列\r
+ * @param i_num_of_vertex\r
+ * 計算対象とする要素の数\r
+ */ \r
public final void setAreaRect(NyARIntPoint2d[] i_vertex,int i_num_of_vertex)\r
{\r
//エリアを求める。\r
\r
\r
/**\r
- * 0=a*x+b*y+cのパラメータを格納します。\r
+ * このクラスは、0=a*x+b*y+cのパラメータを格納します。\r
* x,yの増加方向は、x=L→R,y=B→Tです。 y軸が反転しているので注意してください。\r
*\r
*/\r
public class NyARLinear\r
{\r
- public double b;//係数b\r
- public double a;//係数a\r
- public double c;//切片\r
+ /** 直線式の係数 b*/\r
+ public double b;\r
+ /** 直線式の係数 a*/\r
+ public double a;\r
+ /** 直線式の係数 c*/\r
+ public double c;\r
+ \r
+ /**\r
+ * この関数は、指定サイズのオブジェクト配列を作ります。\r
+ * @param i_number\r
+ * 作成する配列の長さ\r
+ * @return\r
+ * 新しい配列。\r
+ */ \r
public static NyARLinear[] createArray(int i_number)\r
{\r
NyARLinear[] ret=new NyARLinear[i_number];\r
ret[i]=new NyARLinear();\r
}\r
return ret;\r
- } \r
+ }\r
+ /**\r
+ * この関数は、引数値からパラメータをインスタンスへコピーします。\r
+ * @param i_source\r
+ * コピー元のオブジェクト\r
+ */\r
public final void copyFrom(NyARLinear i_source)\r
{\r
this.b=i_source.b;\r
return;\r
}\r
/**\r
- * 2直線の交点を計算します。\r
+ * この関数は、直線の交点を計算します。\r
* @param l_line_2\r
+ * 交点を計算する直線式\r
* @param o_point\r
+ * 交点座標を格納するオブジェクト\r
* @return\r
+ * 交点が求まればtrue\r
*/\r
public final boolean crossPos(NyARLinear l_line_2,NyARDoublePoint2d o_point)\r
{\r
return true;\r
}\r
/**\r
- * 指定したパラメータの式との交点を得る。\r
+ * この関数は、直線の交点を計算します。\r
* @param i_a\r
+ * 交点を求める直線式の係数a\r
* @param i_b\r
+ * 交点を求める直線式の係数b\r
* @param i_c\r
+ * 交点を求める直線式の係数c\r
* @param o_point\r
+ * 交点座標を格納するオブジェクト\r
* @return\r
+ * 交点が求まればtrue\r
*/\r
public final boolean crossPos(double i_a,double i_b,double i_c,NyARDoublePoint2d o_point)\r
{\r
o_point.y = (i_a * this.c - this.a * i_c) / w1;\r
return true;\r
}\r
+ /**\r
+ * この関数は、直線の交点を計算します。\r
+ * @param i_a\r
+ * 交点を求める直線式の係数a\r
+ * @param i_b\r
+ * 交点を求める直線式の係数b\r
+ * @param i_c\r
+ * 交点を求める直線式の係数c\r
+ * @param o_point\r
+ * 交点座標を格納するオブジェクト\r
+ * @return\r
+ * 交点が求まればtrue\r
+ */\r
public final boolean crossPos(double i_a,double i_b,double i_c,NyARIntPoint2d o_point)\r
{\r
final double w1 = this.a * i_b - i_a * this.b;\r
return true;\r
}\r
/**\r
- * 2直線が交差しているかを返します。\r
+ * この関数は、2直線が交差しているかを返します。\r
* @param l_line_2\r
+ * 交差しているか確認するオブジェクト\r
* @return\r
+ * 交差していればtrue\r
*/\r
public final boolean isCross(NyARLinear l_line_2)\r
{\r
}\r
\r
/**\r
- * 2点を結ぶ直線の式を得る。この式は正規化されている。\r
+ * この関数は、2点を結ぶ直線式を計算して、インスタンスに格納します。\r
+ * 式の係数値は、正規化されます。\r
* @param i_point1\r
+ * 点1\r
* @param i_point2\r
+ * 点2\r
* @return\r
+ * 直線式が求まれば、true\r
*/\r
public final boolean makeLinearWithNormalize(NyARIntPoint2d i_point1,NyARIntPoint2d i_point2)\r
{\r
return makeLinearWithNormalize(i_point1.x,i_point1.y,i_point2.x,i_point2.y);\r
}\r
/**\r
- * 2点を結ぶ直線の式を得る。この式は正規化されている。\r
+ * この関数は、2点を結ぶ直線式を計算して、インスタンスに格納します。\r
+ * 式の係数値は、正規化されます。\r
* @param i_point1\r
+ * 点1\r
* @param i_point2\r
+ * 点2\r
* @return\r
+ * 直線式が求まれば、true\r
*/\r
public final boolean makeLinearWithNormalize(NyARDoublePoint2d i_point1,NyARDoublePoint2d i_point2)\r
{\r
return makeLinearWithNormalize(i_point1.x,i_point1.y,i_point2.x,i_point2.y);\r
}\r
/**\r
- * 2点を結ぶ直線の式を得る。この式は正規化されている。\r
+ * この関数は、2点を結ぶ直線式を計算して、インスタンスに格納します。\r
+ * 式の係数値は、正規化されます。\r
* @param i_point1\r
+ * 点1\r
* @param i_point2\r
+ * 点2\r
* @return\r
- */ \r
+ * 直線式が求まれば、true\r
+ */\r
public final boolean makeLinearWithNormalize(double x1,double y1,double x2,double y2)\r
{\r
double dx=y2-y1;\r
return true;\r
}\r
/**\r
- * 傾きと通過点を入力して、その直線式をセットする。\r
+ * この関数は、傾きと通過点から直線式を計算して、インスタンスへセットします。\r
* @param i_dx\r
+ * Xの傾き\r
* @param i_dy\r
+ * Yの傾き\r
* @param i_x\r
+ * 通過点の座標X\r
* @param i_y\r
+ * 通過点の座標Y\r
*/\r
public final void setVector(double i_dx,double i_dy,double i_x,double i_y)\r
{\r
this.c=(i_dx*i_y-i_dy*i_x);\r
return;\r
}\r
+ /**\r
+ * この関数は、{@link NyARVecLinear2d}を直線式に変換して、インスタンスへセットします。\r
+ * @param i_vector\r
+ * セットするオブジェクト\r
+ */\r
public final void setVector(NyARVecLinear2d i_vector)\r
{\r
this.a= i_vector.dy;\r
this.c=(i_vector.dx*i_vector.y-i_vector.dy*i_vector.x);\r
return; \r
}\r
+ /**\r
+ * この関数は、{@link NyARVecLinear2d}を正規化された直線式に変換して、インスタンスへセットします。\r
+ * @param i_vector\r
+ * セットするオブジェクト\r
+ */\r
public final boolean setVectorWithNormalize(NyARVecLinear2d i_vector)\r
{\r
double dx=i_vector.dx;\r
return true;\r
}\r
/**\r
- * i_x,i_yを通過する、i_linearの法線を計算して、格納します。\r
+ * この関数は、i_x,i_yを通過する、i_linearの法線を計算して、インスタンスへ格納します。\r
+ * @param i_x\r
+ * 通過点X\r
+ * @param i_y\r
+ * 通過点Y\r
+ * @param i_linear\r
+ * 法線を計算する直線式(この引数にはthisを指定できます。)\r
*/\r
public final void normalLine(double i_x,double i_y,NyARLinear i_linear)\r
{\r
this.c=-(lb*i_x-la*i_y);\r
}\r
/**\r
- * i_x,i_yを通るこの直線の法線と、i_linearが交わる点を返します。\r
+ * この関数は、i_x,i_yを通るこの直線の法線と、i_linearが交わる点を返します。\r
* @param i_x\r
+ * 法線が通過する点X\r
* @param i_y\r
+ * 法線が通過する点Y\r
* @param i_linear\r
+ * 交点を計算する直線式\r
* @param o_point\r
+ * 交点を返却するオブジェクト\r
* @return\r
+ * 交点が求まれば、trueを返します。\r
*/\r
public final boolean normalLineCrossPos(double i_x,double i_y,NyARLinear i_linear,NyARDoublePoint2d o_point)\r
{\r
o_point.y = ((la * i_linear.c - i_linear.a * lc) / w1);\r
return true;\r
}\r
- /**\r
- * i_x,i_yを通るこの直線の法線上での、この直線とi_linearの距離の二乗値を返します。\r
- * i_x,i_yに直線上の点を指定すると、この直線の垂線上での、もう一方の直線との距離の二乗値が得られます。\r
- * @param i_linear\r
- * @param i_x\r
- * @param i_y\r
- * @param o_point\r
- * @return\r
- * 交点が無い場合、無限大を返します。\r
- *//*\r
- public final double sqDistWithLinear(NyARLinear i_linear, double i_x,double i_y)\r
- {\r
- //thisを法線に変換\r
- double la=this.b;\r
- double lb=-this.a;\r
- double lc=-(la*i_x+lb*i_y);\r
- //交点を計算\r
- final double w1 = i_linear.a * lb - la * i_linear.b;\r
- if (w1 == 0.0) {\r
- return Double.POSITIVE_INFINITY;\r
- }\r
- double x=i_x-((i_linear.b * lc - lb * i_linear.c) / w1);\r
- double y=i_y-((la * i_linear.c - i_linear.a * lc) / w1);\r
- return x*x+y*y;\r
- }*/\r
+// /**\r
+// * i_x,i_yを通るこの直線の法線上での、この直線とi_linearの距離の二乗値を返します。\r
+// * i_x,i_yに直線上の点を指定すると、この直線の垂線上での、もう一方の直線との距離の二乗値が得られます。\r
+// * @param i_linear\r
+// * @param i_x\r
+// * @param i_y\r
+// * @param o_point\r
+// * @return\r
+// * 交点が無い場合、無限大を返します。\r
+// */\r
+// public final double sqDistWithLinear(NyARLinear i_linear, double i_x,double i_y)\r
+// {\r
+// //thisを法線に変換\r
+// double la=this.b;\r
+// double lb=-this.a;\r
+// double lc=-(la*i_x+lb*i_y);\r
+// //交点を計算\r
+// final double w1 = i_linear.a * lb - la * i_linear.b;\r
+// if (w1 == 0.0) {\r
+// return Double.POSITIVE_INFINITY;\r
+// }\r
+// double x=i_x-((i_linear.b * lc - lb * i_linear.c) / w1);\r
+// double y=i_y-((la * i_linear.c - i_linear.a * lc) / w1);\r
+// return x*x+y*y;\r
+// }\r
\r
/**\r
- * この矩形を任意の範囲でクリッピングしたときの2頂点を返します。\r
+ * この関数は、直線を0,0基点(左上)の矩形でクリッピングしたときの、端点を計算します。\r
* @param i_width\r
+ * 矩形の幅\r
* @param i_height\r
+ * 矩形の高さ\r
* @param o_point\r
+ * 端点を返すオブジェクト配列。2要素である必要があります。\r
* @return\r
+ * 端点が求まればtrue\r
*/\r
public final boolean makeSegmentLine(int i_width,int i_height,NyARIntPoint2d[] o_point)\r
{ \r
}\r
}\r
return false;\r
- } \r
+ }\r
/**\r
- * この直線を、任意の矩形でクリッピングしたときに得られる線分の2頂点を返します。\r
+ * この関数は、直線を矩形でクリッピングしたときの、端点を計算します。\r
* @param i_left\r
+ * 矩形の左上座標(X)\r
* @param i_top\r
+ * 矩形の左上座標(Y)\r
* @param i_width\r
+ * 矩形の幅\r
* @param i_height\r
+ * 矩形の高さ\r
* @param o_point\r
+ * 端点を返すオブジェクト配列。2要素である必要があります。\r
* @return\r
+ * 端点が求まればtrue\r
*/\r
public final boolean makeSegmentLine(int i_left,int i_top,int i_width,int i_height,NyARIntPoint2d[] o_point)\r
{ \r
return false;\r
}\r
/**\r
- * 直線と、i_sp1とi_sp2の作る線分との二乗距離値の合計を返します。計算方法は、線分の2端点を通過する直線の法線上での、2端点と直線の距離の合計です。\r
+ * この関数は、この直線と、i_sp1とi_sp2の作る線分との、二乗距離値の合計を返します。\r
+ * 計算方法は、線分の端点を通過する直線の法線上での、端点と直線の距離の合計です。\r
* 線分と直線の類似度を判定する数値になります。\r
* @param i_sp1\r
+ * 線分の端点1\r
* @param i_sp2\r
- * @param o_point\r
+ * 線分の端点2\r
* @return\r
- * 距離が取れないときは無限大です。\r
+ * 二乗距離値の合計。距離が取れないときは無限大です。\r
*/\r
public final double sqDistBySegmentLineEdge(NyARDoublePoint2d i_sp1,NyARDoublePoint2d i_sp2)\r
{\r
y = ((la * this.c - this.a * lc) / w1)-i_sp2.y;\r
\r
return sqdist+x*x+y*y;\r
- } \r
+ }\r
/**\r
- * 最小二乗法を使用して直線を計算します。\r
+ * この関数は、頂点群から最小二乗法を使用して直線を計算します。\r
* @param i_points\r
+ * 頂点群を格納した配列。\r
* @param i_number_of_data\r
+ * 計算対象の頂点群の数\r
* @return\r
+ * 計算に成功すると、trueを返します。\r
*/\r
public boolean leastSquares(NyARDoublePoint2d[] i_points,int i_number_of_data)\r
{\r
\r
\r
/**\r
- * 定点と傾きのパラメータで、直線を表現します。\r
- *\r
+ * このクラスは、通過点とX,Yの変化量で、直線を定義します。\r
*/\r
public class NyARVecLinear2d\r
{\r
+ /** 直線の通過点(X)*/\r
public double x;\r
+ /** 直線の通過点(Y)*/\r
public double y;\r
+ /** x方向の直線の変化量*/\r
public double dx;\r
+ /** y方向の直線の変化量*/\r
public double dy;\r
+ \r
+ /**\r
+ * この関数は、指定サイズのオブジェクト配列を作ります。\r
+ * @param i_number\r
+ * 作成する配列の長さ\r
+ * @return\r
+ * 新しい配列。\r
+ */ \r
public static NyARVecLinear2d[] createArray(int i_length)\r
{\r
NyARVecLinear2d[] r=new NyARVecLinear2d[i_length];\r
return r;\r
}\r
/**\r
- * 法線ベクトルを計算します。\r
+ * この関数は、法線を計算します。\r
+ * 通過点は変更しません。\r
* @param i_src\r
- * å\85\83ã\81®ã\83\99ã\82¯ã\83\88ã\83«を指定します。この値には、thisを指定できます。\r
+ * å\85\83ã\81®ã\82¤ã\83³ã\82¹ã\82¿ã\83³ã\82¹を指定します。この値には、thisを指定できます。\r
*/\r
public final void normalVec(NyARVecLinear2d i_src)\r
{\r
this.dx=i_src.dy;\r
this.dy=-w;\r
}\r
+ /**\r
+ * この関数は、オブジェクトの値をインスタンスにセットします。\r
+ * @param i_value\r
+ * コピー元のオブジェクト\r
+ */\r
public final void setValue(NyARVecLinear2d i_value)\r
{\r
this.dx=i_value.dx;\r
this.y=i_value.y;\r
}\r
/**\r
- * このベクトルと指定した直線が作るCos値を返します。\r
+ * この関数は、この直線と引数の直線とが作るCos値を返します。\r
* @param i_v1\r
+ * 直線を格納したオブジェクト\r
* @return\r
+ * 2直線のCOS値(radian)\r
*/\r
public final double getVecCos(NyARVecLinear2d i_v1)\r
{\r
double d=(x1*x2+y1*y2)/Math.sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2));\r
return d;\r
}\r
+ /**\r
+ * この関数は、この直線と引数の直線とが作るCos値の絶対値を返します。\r
+ * @param i_v1\r
+ * 直線を格納したオブジェクト\r
+ * @return\r
+ * 2直線のCOS値の絶対値(radian)\r
+ */\r
public final double getAbsVecCos(NyARVecLinear2d i_v1)\r
{\r
- double x1=i_v1.dx;\r
- double y1=i_v1.dy;\r
- double x2=this.dx;\r
- double y2=this.dy;\r
- double d=(x1*x2+y1*y2)/Math.sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2));\r
+ double d=getVecCos(i_v1);\r
return d>=0?d:-d;\r
}\r
/**\r
- * このベクトルと指定したベクトルが作るCos値を返します。\r
+ * この関数は、この直線とベクトルが作るCos値を返します。\r
* @param i_dx\r
+ * ベクトルのX成分\r
* @param i_dy\r
+ * ベクトルのY成分\r
* @return\r
+ * 2直線のCOS値(radian)\r
*/\r
public final double getVecCos(double i_dx,double i_dy)\r
{\r
double x1=this.dx;\r
double y1=this.dy;\r
- double d=(x1*i_dx+y1*i_dy)/Math.sqrt((x1*x1+y1*y1)*(i_dx*i_dx+i_dy*i_dy));\r
- return d;\r
+ return (x1*i_dx+y1*i_dy)/Math.sqrt((x1*x1+y1*y1)*(i_dx*i_dx+i_dy*i_dy));\r
}\r
- public final double getVecCos(NyARDoublePoint2d i_pos1,NyARDoublePoint2d i_pos2)\r
+ /**\r
+ * この関数は、この直線とベクトルが作るCos値の絶対値を返します。\r
+ * @param i_v2_x\r
+ * ベクトルのX成分\r
+ * @param i_v2_y\r
+ * ベクトルのY成分\r
+ * @return\r
+ * 2直線のCOS値の絶対値(radian)\r
+ */\r
+ public final double getAbsVecCos(double i_v2_x,double i_v2_y)\r
{\r
- double d=getAbsVecCos(i_pos2.x-i_pos1.x,i_pos2.y-i_pos1.y);\r
+ double d=getVecCos(i_v2_x,i_v2_y);\r
return d>=0?d:-d;\r
} \r
- public final double getAbsVecCos(double i_v2_x,double i_v2_y)\r
+ /**\r
+ * この関数は、この直線と線分が作るCos値を返します。\r
+ * @param i_pos1\r
+ * 線分の端点1\r
+ * @param i_pos2\r
+ * 線分の端点2\r
+ * @return\r
+ * 2直線のCOS値(radian)\r
+ */\r
+ public final double getVecCos(NyARDoublePoint2d i_pos1,NyARDoublePoint2d i_pos2)\r
{\r
- double x1=this.dx;\r
- double y1=this.dy;\r
- double d=(x1*i_v2_x+y1*i_v2_y)/Math.sqrt((x1*x1+y1*y1)*(i_v2_x*i_v2_x+i_v2_y*i_v2_y));\r
- return d>=0?d:-d;\r
- }\r
+ return getVecCos(i_pos2.x-i_pos1.x,i_pos2.y-i_pos1.y);\r
+ } \r
+\r
/**\r
- * このベクトルと、i_pos1-<i_pos2を結ぶ線分が作るcos値の絶対値を返します。\r
+ * この関数は、この直線と線分が作るCos値の絶対値を返します。\r
* @param i_pos1\r
+ * 線分の端点1\r
* @param i_pos2\r
+ * 線分の端点2\r
* @return\r
+ * 2直線のCOS値の絶対値(radian)\r
*/\r
public final double getAbsVecCos(NyARDoublePoint2d i_pos1,NyARDoublePoint2d i_pos2)\r
{\r
- double d=getAbsVecCos(i_pos2.x-i_pos1.x,i_pos2.y-i_pos1.y);\r
- return d>=0?d:-d;\r
+ return getAbsVecCos(i_pos2.x-i_pos1.x,i_pos2.y-i_pos1.y);\r
}\r
\r
/**\r
- * 交点を求めます。\r
+ * この関数は、直線との交点を求めます。\r
* @param i_vector1\r
- * @param i_vector2\r
+ * 交点を求める直線\r
* @param o_point\r
+ * 交点座標を得るオブジェクト。\r
* @return\r
+ * 交点が求まると、trueを返します。\r
*/\r
public final boolean crossPos(NyARVecLinear2d i_vector1,NyARDoublePoint2d o_point)\r
{\r
return true;\r
}\r
/**\r
- * 直線と、i_sp1とi_sp2の作る線分との二乗距離値の合計を返します。\r
- * 線分と直線の類似度を\r
+ * この関数は、この直線と、i_sp1とi_sp2の作る線分との、二乗距離値の合計を返します。\r
+ * 計算方法は、線分の端点を通過する直線の法線上での、端点と直線の距離の合計です。\r
+ * 線分と直線の類似度を判定する数値になります。\r
* @param i_sp1\r
+ * 線分の端点1\r
* @param i_sp2\r
- * @param o_point\r
+ * 線分の端点2\r
* @return\r
- * 距離が取れないときは無限大です。\r
+ * 二乗距離値の合計。距離が取れないときは無限大です。\r
*/\r
public final double sqDistBySegmentLineEdge(NyARDoublePoint2d i_sp1,NyARDoublePoint2d i_sp2)\r
{\r
}\r
\r
/**\r
- * i_lineの直線をセットします。x,yの値は、(i_x,i_y)を通過するi_lineの法線とi_lineの交点をセットします。\r
+ * この関数は、i_lineの直線を、インスタンスにセットします。\r
+ * {@link #x},{@link #y}の値は、(i_x,i_y)を通過するi_lineの法線とi_lineの交点をセットします。\r
* @param i_line\r
+ * セットする直線式\r
* @param i_x\r
+ * {@link #x},{@link #y}を確定するための、法線の通過点\r
* @param i_y\r
+ * {@link #x},{@link #y}を確定するための、法線の通過点\r
+ * @return\r
+ * セットに成功すると、trueを返します。\r
*/\r
public boolean setLinear(NyARLinear i_line,double i_x,double i_y)\r
{\r
return true;\r
}\r
/**\r
- * 点群から最小二乗法で直線を計算してセットします。\r
- * 通過点x,yは、点群の中央値を通過する、算出された直線の法線との交点です。\r
+ * この関数は、頂点群から最小二乗法を使用して直線を計算します。\r
* @param i_points\r
+ * 頂点群を格納した配列。\r
* @param i_number_of_data\r
+ * 計算対象の頂点群の数\r
* @return\r
+ * 計算に成功すると、trueを返します。\r
*/\r
public final boolean leastSquares(NyARDoublePoint2d[] i_points,int i_number_of_data)\r
{\r
return true;\r
}\r
/**\r
- * 正規化したベクトルを出力する{@link #leastSquares}です。\r
+ * この関数は、正規化したベクトルを出力する、{@link #leastSquares}です。\r
* @param i_points\r
+ * 頂点群を格納した配列。\r
* @param i_number_of_data\r
+ * 計算対象の頂点群の数\r
* @return\r
+ * 計算に成功すると、trueを返します。\r
*/\r
public final boolean leastSquaresWithNormalize(NyARDoublePoint2d[] i_points,int i_number_of_data)\r
{\r
* \r
*/\r
package jp.nyatla.nyartoolkit.core.types.matrix;\r
-\r
+/**\r
+ * このインタフェイスは、行列クラスに共通な関数を定義します。\r
+ */\r
public interface INyARDoubleMatrix\r
{\r
/**\r
- * 配列の内容を行列に設定する。\r
- * 遅いので余り使わないでね。\r
+ * この関数は、配列の内容を行列にセットします。\r
+ * 実装クラスでは、配列の内容をインスタンスにセットする処理を実装してください。\r
* @param o_value\r
+ * セットする配列。\r
*/\r
public void setValue(double[] i_value);\r
/**\r
- * 行列の内容を配列に返す。\r
- * 遅いので余り使わないでね。\r
+ * この関数は、配列の内容を行列に返します。\r
+ * 実装クラスでは、インスタンスの内容を配列に返す処理を実装してください。\r
* @param o_value\r
+ * 値を受け取る配列\r
*/\r
public void getValue(double[] o_value);\r
\r
* \r
*/\r
package jp.nyatla.nyartoolkit.core.types.matrix;\r
-\r
+/**\r
+ * このクラスは、2x2行列を格納します。\r
+ */\r
public class NyARDoubleMatrix22 implements INyARDoubleMatrix\r
{\r
+ /** 行列の要素値です。*/\r
public double m00;\r
+ /** 行列の要素値です。*/\r
public double m01;\r
+ /** 行列の要素値です。*/\r
public double m10;\r
+ /** 行列の要素値です。*/\r
public double m11;\r
/**\r
- * 遅いからあんまり使わないでね。\r
+ * この関数は、要素数4の配列を、行列にセットします。\r
*/\r
public void setValue(double[] i_value)\r
{\r
return;\r
}\r
/**\r
- * 遅いからあんまり使わないでね。\r
+ * この関数は、要素数4の配列に、行列の内容をコピーします。\r
*/\r
public void getValue(double[] o_value)\r
{\r
o_value[4]=this.m11;\r
return;\r
}\r
+ /**\r
+ * この関数は、逆行列を計算して、インスタンスにセットします。\r
+ * @param i_src\r
+ * 逆行列を計算するオブジェクト。thisを指定できます。\r
+ * @return\r
+ * 逆行列を得られると、trueを返します。\r
+ */\r
public boolean inverse(NyARDoubleMatrix22 i_src)\r
{\r
final double a11,a12,a21,a22;\r
*/\r
package jp.nyatla.nyartoolkit.core.types.matrix;\r
\r
-import jp.nyatla.nyartoolkit.*;\r
import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
-\r
+/**\r
+ * このクラスは、3x3行列を格納します。\r
+ */\r
public class NyARDoubleMatrix33 implements INyARDoubleMatrix\r
{\r
+ /** 行列の要素値です。*/\r
public double m00;\r
+ /** 行列の要素値です。*/\r
public double m01;\r
+ /** 行列の要素値です。*/\r
public double m02;\r
+ /** 行列の要素値です。*/\r
public double m10;\r
+ /** 行列の要素値です。*/\r
public double m11;\r
+ /** 行列の要素値です。*/\r
public double m12;\r
+ /** 行列の要素値です。*/\r
public double m20;\r
+ /** 行列の要素値です。*/\r
public double m21;\r
+ /** 行列の要素値です。*/\r
public double m22;\r
+ /**\r
+ * この関数は、オブジェクトの配列を生成して返します。\r
+ * @param i_number\r
+ * 配列の長さ\r
+ * @return\r
+ * 新しいオブジェクト配列\r
+ */\r
public static NyARDoubleMatrix33[] createArray(int i_number)\r
{\r
NyARDoubleMatrix33[] ret=new NyARDoubleMatrix33[i_number];\r
return ret;\r
}\r
/**\r
- * 遅いからあんまり使わないでね。\r
- */\r
+ * この関数は、要素数9の配列を、行列にセットします。\r
+ */ \r
public void setValue(double[] i_value)\r
{\r
this.m00=i_value[0];\r
this.m22=i_value[8];\r
return;\r
}\r
+ /**\r
+ * この関数は、オブジェクトの内容をインスタンスにコピーします。\r
+ * @param i_value\r
+ * コピー元のオブジェクト\r
+ */\r
public void setValue(NyARDoubleMatrix33 i_value)\r
{\r
this.m00=i_value.m00;\r
return;\r
} \r
/**\r
- * 遅いからあんまり使わないでね。\r
+ * この関数は、要素数9の配列に、行列の内容をコピーします。\r
*/\r
public void getValue(double[] o_value)\r
{\r
o_value[8]=this.m22;\r
return;\r
}\r
+ /**\r
+ * この関数は、逆行列を計算して、インスタンスにセットします。\r
+ * @param i_src\r
+ * 逆行列を計算するオブジェクト。thisを指定できます。\r
+ * @return\r
+ * 逆行列を得られると、trueを返します。\r
+ */ \r
public boolean inverse(NyARDoubleMatrix33 i_src)\r
{\r
final double a11,a12,a13,a21,a22,a23,a31,a32,a33;\r
return true;\r
}\r
/**\r
- * この関数は、0-PIの間で値を返します。\r
+ * この関数は、行列を回転行列として、ZXY系の角度値を計算します。\r
* @param o_out\r
+ * 角度値を受け取るオブジェクトです。\r
+ * 角度値の範囲は、0-PIです。\r
*/\r
public final void getZXYAngle(NyARDoublePoint3d o_out)\r
{\r
o_out.y = Math.atan2(-this.m20, this.m22);\r
}\r
}\r
+ /**\r
+ * この関数は、行列を回転行列として、ZXY系の角度値をセットします。\r
+ * @param i_angle\r
+ * セットする角度値です。\r
+ */ \r
public final void setZXYAngle(NyARDoublePoint3d i_angle)\r
{\r
setZXYAngle(i_angle.x,i_angle.y,i_angle.z);\r
return;\r
}\r
+ /**\r
+ * この関数は、行列を回転行列として、ZXY系の角度値をセットします。\r
+ * @param i_x\r
+ * X軸の角度値\r
+ * @param i_y\r
+ * X軸の角度値\r
+ * @param i_z\r
+ * X軸の角度値\r
+ */\r
public final void setZXYAngle(final double i_x, final double i_y, final double i_z)\r
{\r
final double sina = Math.sin(i_x);\r
return;\r
}\r
/**\r
- * 回転行列を適応して座標変換します。\r
- * @param i_angle\r
+ * この関数は、3次元座標を座標変換します。\r
+ * @param i_position\r
+ * 変換する三次元座標\r
* @param o_out\r
+ * 変換後の座標を受け取るオブジェクト\r
*/\r
public final void transformVertex(NyARDoublePoint3d i_position,NyARDoublePoint3d o_out)\r
{\r
transformVertex(i_position.x,i_position.y,i_position.z,o_out);\r
return;\r
}\r
- \r
+ /**\r
+ * この関数は、3次元座標を座標変換します。\r
+ * @param i_x\r
+ * 変換する三次元座標(X)\r
+ * @param i_y\r
+ * 変換する三次元座標(Y)\r
+ * @param i_z\r
+ * 変換する三次元座標(Z)\r
+ * @param o_out\r
+ * 変換後の座標を受け取るオブジェクト\r
+ */\r
public final void transformVertex(double i_x,double i_y,double i_z,NyARDoublePoint3d o_out)\r
{\r
o_out.x=this.m00*i_x+this.m01*i_y+this.m02*i_z;\r
\r
public class NyARDoubleMatrix34 implements INyARDoubleMatrix\r
{\r
+ /** 行列の要素値です。*/\r
public double m00;\r
+ /** 行列の要素値です。*/\r
public double m01;\r
+ /** 行列の要素値です。*/\r
public double m02;\r
+ /** 行列の要素値です。*/\r
public double m03;\r
+ /** 行列の要素値です。*/\r
public double m10;\r
+ /** 行列の要素値です。*/\r
public double m11;\r
+ /** 行列の要素値です。*/\r
public double m12;\r
+ /** 行列の要素値です。*/\r
public double m13;\r
+ /** 行列の要素値です。*/\r
public double m20;\r
+ /** 行列の要素値です。*/\r
public double m21;\r
+ /** 行列の要素値です。*/\r
public double m22;\r
+ /** 行列の要素値です。*/\r
public double m23;\r
+ /**\r
+ * この関数は、要素数12の配列を、行列にセットします。\r
+ */ \r
public void setValue(double[] i_value)\r
{\r
this.m00=i_value[0];\r
this.m23=i_value[11];\r
return;\r
}\r
+ /**\r
+ * この関数は、オブジェクトの内容をインスタンスにコピーします。\r
+ * @param i_value\r
+ * コピー元のオブジェクト\r
+ */ \r
public void setValue(NyARDoubleMatrix34 i_value)\r
{\r
this.m00=i_value.m00;\r
this.m23=i_value.m23;\r
return;\r
}\r
+ /**\r
+ * この関数は、要素数12の配列に、行列の内容をコピーします。\r
+ */ \r
public void getValue(double[] o_value)\r
{\r
o_value[0]=this.m00;\r
\r
public class NyARDoubleMatrix44 implements INyARDoubleMatrix\r
{\r
+ /** 行列の要素値です。*/\r
public double m00;\r
+ /** 行列の要素値です。*/\r
public double m01;\r
+ /** 行列の要素値です。*/\r
public double m02;\r
+ /** 行列の要素値です。*/\r
public double m03;\r
+ /** 行列の要素値です。*/\r
public double m10;\r
+ /** 行列の要素値です。*/\r
public double m11;\r
+ /** 行列の要素値です。*/\r
public double m12;\r
+ /** 行列の要素値です。*/\r
public double m13;\r
+ /** 行列の要素値です。*/\r
public double m20;\r
+ /** 行列の要素値です。*/\r
public double m21;\r
+ /** 行列の要素値です。*/\r
public double m22;\r
+ /** 行列の要素値です。*/\r
public double m23;\r
+ /** 行列の要素値です。*/\r
public double m30;\r
+ /** 行列の要素値です。*/\r
public double m31;\r
+ /** 行列の要素値です。*/\r
public double m32;\r
+ /** 行列の要素値です。*/\r
public double m33;\r
+ /**\r
+ * この関数は、オブジェクトの配列を生成して返します。\r
+ * @param i_number\r
+ * 配列の長さ\r
+ * @return\r
+ * 新しいオブジェクト配列\r
+ */ \r
public static NyARDoubleMatrix44[] createArray(int i_number)\r
{\r
NyARDoubleMatrix44[] ret=new NyARDoubleMatrix44[i_number];\r
return ret;\r
}\r
/**\r
- * 配列の内容をセットします。順番は、00,01,02,03,10...の順です。\r
+ * この関数は、要素数16の配列を、行列にセットします。\r
+ * 00,01,02,03,10...の順です。\r
*/\r
public void setValue(double[] i_value)\r
{\r
return;\r
}\r
/**\r
- * i_valueの内容を、このインスタンスにセットします。\r
+ * この関数は、オブジェクトの内容をインスタンスにコピーします。\r
* @param i_value\r
+ * コピー元のオブジェクト\r
*/\r
public void setValue(NyARDoubleMatrix44 i_value)\r
{\r
return;\r
}\r
/**\r
- * 行列の内容を配列に出力します。順番は、00,01,02,03,10...の順です。\r
- */\r
+ * この関数は、要素数16の配列に、行列の内容をコピーします。\r
+ * 順番は、00,01,02,03,10...の順です。\r
+ */ \r
public void getValue(double[] o_value)\r
{\r
o_value[ 0]=this.m00;\r
return;\r
}\r
/**\r
- * 行列の内容を転置してから配列に出力します。\r
+ * この関数は、要素数16の配列に、行列の内容を転置してからコピーします。\r
* 順番は、00,10,20,30,01...の順です。\r
+ * @param o_value\r
+ * 値を受け取る配列\r
*/ \r
public void getValueT(double[] o_value)\r
{\r
return;\r
}\r
/**\r
- * 逆行列を計算して、i_srcのthisへ格納します。i_srcにはthisも指定可能です。\r
+ * この関数は、逆行列を計算して、インスタンスにセットします。\r
* @param i_src\r
+ * 逆行列を計算するオブジェクト。thisを指定できます。\r
* @return\r
+ * 逆行列を得られると、trueを返します。\r
*/\r
public boolean inverse(NyARDoubleMatrix44 i_src)\r
{\r
\r
return true;\r
}\r
- \r
/**\r
- * 行列を姿勢変換行列として、3次元座標を座標変換します。4列目は1で仮定します。\r
+ * この関数は、3次元座標を座標変換します。\r
+ * 4列目は1と仮定します。\r
* @param i_x\r
+ * 変換する三次元座標(X)\r
* @param i_y\r
+ * 変換する三次元座標(Y)\r
* @param i_z\r
+ * 変換する三次元座標(Z)\r
* @param o_out\r
+ * 変換後の座標を受け取るオブジェクト\r
*/\r
public final void transform3d(double i_x,double i_y,double i_z,NyARDoublePoint3d o_out)\r
{\r
o_out.z=this.m20*i_x+this.m21*i_y+this.m22*i_z+this.m23;\r
return;\r
}\r
- \r
/**\r
- * 行列を姿勢変換行列として、3次元座標を座標変換します。\r
- * i_inとo_outには同一なインスタンスを指定できます。\r
+ * この関数は、3次元座標を座標変換します。\r
+ * 4列目は1と仮定します。\r
* @param i_in\r
+ * 返還前する座標値\r
* @param o_out\r
- */\r
+ * 変換後の座標を受け取るオブジェクト\r
+ */ \r
public final void transform3d(NyARDoublePoint3d i_in,NyARDoublePoint3d o_out)\r
{\r
transform3d(i_in.x,i_in.y,i_in.z,o_out);\r
}\r
/**\r
- * 行列を姿勢行列として、ZXY系の角度値を返します。\r
- * この関数は、0-PIの間で値を返します。\r
+ * この関数は、行列の回転成分から、ZXY系の角度値を計算します。\r
* @param o_out\r
+ * 角度値を受け取るオブジェクトです。\r
+ * 角度値の範囲は、0-PIです。\r
*/\r
public final void getZXYAngle(NyARDoublePoint3d o_out)\r
{\r
}\r
}\r
/**\r
- * 行列の掛け算を実行して、結果を格納します。i_mat_lとi_mat_rには、thisを指定しないでください。\r
+ * この関数は、行列同士の掛け算をして、インスタンスに格納します。\r
+ * i_mat_lとi_mat_rには、thisを指定しないでください。\r
* @param i_mat_l\r
+ * 左成分の行列\r
* @param i_mat_r\r
+ * 右成分の行列\r
*/\r
public final void mul(NyARDoubleMatrix44 i_mat_l,NyARDoubleMatrix44 i_mat_r)\r
{\r
return;\r
}\r
/**\r
- * この行列を単位行列にします。\r
+ * この関数は、行列を単位行列にします。\r
*/\r
public final void identity()\r
{\r
return;\r
}\r
/**\r
- * 行列に、右手系のX軸回転を設定します。\r
+ * この関数は、行列に右手系のX軸回転を設定します。\r
* @param i_radian\r
+ * 設定するX回転角(radian)\r
*/\r
public final void setRotateX(double i_radian)\r
{\r
return;\r
}\r
/**\r
- * 行列に、右手系のY軸回転を設定します。\r
+ * この関数は、行列に右手系のY軸回転を設定します。\r
* @param i_radian\r
+ * 設定するY回転角(radian)\r
*/\r
public final void setRotateY(double i_radian)\r
{\r
this.m22=c;\r
} \r
/**\r
- * 行列に、右手系のZ軸回転を設定します。\r
+ * この関数は、行列に右手系のZ軸回転を設定します。\r
* @param i_radian\r
+ * 設定するZ回転角(radian)\r
*/\r
public final void setRotateZ(double i_radian)\r
{\r
\r
}\r
/**\r
- * 行列に、右手系の並行移動を設定します。\r
- * @param i_radian\r
+ * この関数は、行列に右手系の平行移動量を設定します。\r
+ * @param i_x\r
+ * x軸方向の平行移動量\r
+ * @param i_y\r
+ * y軸方向の平行移動量\r
+ * @param i_z\r
+ * z軸方向の平行移動量\r
*/\r
public final void setTranslate(double i_x,double i_y,double i_z)\r
{\r
this.m23=i_z;\r
}\r
/**\r
- * この行列をX軸回転します。\r
+ * この関数は、現在の行列をX軸で回転します。\r
* @param i_mat_r\r
+ * 回転量(radian)\r
*/\r
public final void rotateX(double i_radian)\r
{\r
this.m32=t1*(-s) + t2*c;\r
}\r
/**\r
- * この行列をY軸回転します。\r
+ * この関数は、現在の行列をY軸で回転します。\r
* @param i_mat_r\r
+ * 回転量(radian)\r
*/\r
public final void rotateY(double i_radian)\r
{\r
this.m32=t1*s + t2*c;\r
}\r
/**\r
- * この姿勢行列をZ軸回転します。\r
- * @i_radian\r
+ * この関数は、現在の行列をZ軸で回転します。\r
+ * @param i_mat_r\r
+ * 回転量(radian)\r
*/\r
public final void rotateZ(double i_radian)\r
{\r
return;\r
}\r
/**\r
- * この姿勢行列を右手系で平行移動します。\r
+ * この関数は、現在の行列を平行移動します。\r
* @param i_x\r
+ * X方向の平行移動量\r
* @param i_y\r
+ * Y方向の平行移動量\r
* @param i_z\r
+ * Z方向の平行移動量\r
*/\r
public final void translate(double i_x,double i_y,double i_z)\r
{\r
this.m33=this.m30*i_x + this.m31*i_y + this.m32*i_z + this.m33;\r
return;\r
}\r
+ /**\r
+ * テストプログラム\r
+ * @param args\r
+ */\r
public static void main(String[] args)\r
{\r
\r