/** * @param i_width * @param i_height */ public NyARColorPatt_PseudoAffine(int i_width, int i_height) { this._size = new NyARIntSize(i_width, i_height); this._patdata = new int[i_height * i_width]; this._pixelreader = new NyARRgbPixelReader_INT1D_X8R8G8B8_32(this._patdata, this._size); //疑似アフィン変換のパラメタマトリクスを計算します。 //長方形から計算すると、有効要素がm00,m01,m02,m03,m10,m11,m20,m23,m30になります。 NyARDoubleMatrix44 mat = this._invmat; mat.m00 = 0; mat.m01 = 0; mat.m02 = 0; mat.m03 = 1.0; mat.m10 = 0; mat.m11 = i_width - 1; mat.m12 = 0; mat.m13 = 1.0; mat.m20 = (i_width - 1) * (i_height - 1); mat.m21 = i_width - 1; mat.m22 = i_height - 1; mat.m23 = 1.0; mat.m30 = 0; mat.m31 = 0; mat.m32 = i_height - 1; mat.m33 = 1.0; mat.inverse(mat); return; }
/** * コンストラクタです。 * @param i_width * このラスタの幅 * @param i_height * このラスタの高さ * @ */ public NyARColorPatt_PseudoAffine(int i_width, int i_height) : base(i_width, i_height, true) { //疑似アフィン変換のパラメタマトリクスを計算します。 //長方形から計算すると、有効要素がm00,m01,m02,m03,m10,m11,m20,m23,m30になります。 NyARDoubleMatrix44 mat = this._invmat; mat.m00 = 0; mat.m01 = 0; mat.m02 = 0; mat.m03 = 1.0; mat.m10 = 0; mat.m11 = i_width - 1; mat.m12 = 0; mat.m13 = 1.0; mat.m20 = (i_width - 1) * (i_height - 1); mat.m21 = i_width - 1; mat.m22 = i_height - 1; mat.m23 = 1.0; mat.m30 = 0; mat.m31 = 0; mat.m32 = i_height - 1; mat.m33 = 1.0; mat.inverse(mat); return; }
/** * 画面上の点と原点を結ぶ直線と任意姿勢の平面の交差点を、平面の座標系で取得します。 * ARToolKitの本P175周辺の実装と同じです。 * <p> * このAPIは繰り返し使用には最適化されていません。同一なi_matに繰り返しアクセスするときは、展開してください。 * </p> * @param ix * スクリーン上の座標 * @param iy * スクリーン上の座標 * @param i_mat * 平面の姿勢行列です。 * @param o_pos * 結果を受け取るオブジェクトです。 * @return * 計算に成功すると、trueを返します。 */ public bool unProjectOnMatrix(double ix, double iy, NyARDoubleMatrix44 i_mat, NyARDoublePoint3d o_pos) { //交点をカメラ座標系で計算 unProjectOnCamera(ix, iy, i_mat, o_pos); //座標系の変換 NyARDoubleMatrix44 m = new NyARDoubleMatrix44(); if (!m.inverse(i_mat)) { return(false); } m.transform3d(o_pos, o_pos); return(true); }
/** * 画面上の点と原点を結ぶ直線と任意姿勢の平面の交差点を、平面の座標系で取得します。 * ARToolKitの本P175周辺の実装と同じです。 * <p> * このAPIは繰り返し使用には最適化されていません。同一なi_matに繰り返しアクセスするときは、展開してください。 * </p> * @param ix * スクリーン上の座標 * @param iy * スクリーン上の座標 * @param i_mat * 平面の姿勢行列です。 * @param o_pos * 結果を受け取るオブジェクトです。 * @return * 計算に成功すると、trueを返します。 */ public bool unProjectOnMatrix(double ix, double iy, NyARDoubleMatrix44 i_mat, NyARDoublePoint3d o_pos) { //交点をカメラ座標系で計算 unProjectOnCamera(ix, iy, i_mat, o_pos); //座標系の変換 NyARDoubleMatrix44 m = new NyARDoubleMatrix44(); if (!m.inverse(i_mat)) { return false; } m.transform3d(o_pos, o_pos); return true; }
public virtual bool getParam(NyARIntPoint2d[] i_vertex, double[] o_param) { double ltx = this._local_x; double lty = this._local_y; double rbx = ltx + this._width; double rby = lty + this._height; double x1, x2, x3, x4; double y1, y2, y3, y4; x1 = i_vertex[0].x; x2 = i_vertex[1].x; x3 = i_vertex[2].x; x4 = i_vertex[3].x; y1 = i_vertex[0].y; y2 = i_vertex[1].y; y3 = i_vertex[2].y; y4 = i_vertex[3].y; NyARDoubleMatrix44 mat_x = new NyARDoubleMatrix44(); mat_x.m00 = ltx; mat_x.m01 = lty; mat_x.m02 = -ltx * x1; mat_x.m03 = -lty * x1; mat_x.m10 = rbx; mat_x.m11 = lty; mat_x.m12 = -rbx * x2; mat_x.m13 = -lty * x2; mat_x.m20 = rbx; mat_x.m21 = rby; mat_x.m22 = -rbx * x3; mat_x.m23 = -rby * x3; mat_x.m30 = ltx; mat_x.m31 = rby; mat_x.m32 = -ltx * x4; mat_x.m33 = -rby * x4; mat_x.inverse(mat_x); NyARDoubleMatrix44 mat_y = new NyARDoubleMatrix44(); mat_y.m00 = ltx; mat_y.m01 = lty; mat_y.m02 = -ltx * y1; mat_y.m03 = -lty * y1; mat_y.m10 = rbx; mat_y.m11 = lty; mat_y.m12 = -rbx * y2; mat_y.m13 = -lty * y2; mat_y.m20 = rbx; mat_y.m21 = rby; mat_y.m22 = -rbx * y3; mat_y.m23 = -rby * y3; mat_y.m30 = ltx; mat_y.m31 = rby; mat_y.m32 = -ltx * y4; mat_y.m33 = -rby * y4; mat_y.inverse(mat_y); double a = mat_x.m20 * x1 + mat_x.m21 * x2 + mat_x.m22 * x3 + mat_x.m23 * x4; double b = mat_x.m20 + mat_x.m21 + mat_x.m22 + mat_x.m23; double d = mat_x.m30 * x1 + mat_x.m31 * x2 + mat_x.m32 * x3 + mat_x.m33 * x4; double f = mat_x.m30 + mat_x.m31 + mat_x.m32 + mat_x.m33; double g = mat_y.m20 * y1 + mat_y.m21 * y2 + mat_y.m22 * y3 + mat_y.m23 * y4; double h = mat_y.m20 + mat_y.m21 + mat_y.m22 + mat_y.m23; double i = mat_y.m30 * y1 + mat_y.m31 * y2 + mat_y.m32 * y3 + mat_y.m33 * y4; double j = mat_y.m30 + mat_y.m31 + mat_y.m32 + mat_y.m33; NyARDoubleMatrix22 tm = new NyARDoubleMatrix22(); tm.m00 = b; tm.m01 = -h; tm.m10 = f; tm.m11 = -j; tm.inverse(tm); double A, B, C, D, E, F, G, H; C = tm.m00 * (a - g) + tm.m01 * (d - i); //C F = tm.m10 * (a - g) + tm.m11 * (d - i); //F G = a - C * b; H = d - C * f; A = (mat_x.m00 * x1 + mat_x.m01 * x2 + mat_x.m02 * x3 + mat_x.m03 * x4) - C * (mat_x.m00 + mat_x.m01 + mat_x.m02 + mat_x.m03); B = (mat_x.m10 * x1 + mat_x.m11 * x2 + mat_x.m12 * x3 + mat_x.m13 * x4) - C * (mat_x.m10 + mat_x.m11 + mat_x.m12 + mat_x.m13); D = (mat_y.m00 * y1 + mat_y.m01 * y2 + mat_y.m02 * y3 + mat_y.m03 * y4) - F * (mat_y.m00 + mat_y.m01 + mat_y.m02 + mat_y.m03); E = (mat_y.m10 * y1 + mat_y.m11 * y2 + mat_y.m12 * y3 + mat_y.m13 * y4) - F * (mat_y.m10 + mat_y.m11 + mat_y.m12 + mat_y.m13); o_param[0] = A; o_param[1] = B; o_param[2] = C; o_param[3] = D; o_param[4] = E; o_param[5] = F; o_param[6] = G; o_param[7] = H; return true; }
public virtual bool getParam(NyARIntPoint2d[] i_vertex, double[] o_param) { double ltx = this._local_x; double lty = this._local_y; double rbx = ltx + this._width; double rby = lty + this._height; double x1, x2, x3, x4; double y1, y2, y3, y4; x1 = i_vertex[0].x; x2 = i_vertex[1].x; x3 = i_vertex[2].x; x4 = i_vertex[3].x; y1 = i_vertex[0].y; y2 = i_vertex[1].y; y3 = i_vertex[2].y; y4 = i_vertex[3].y; NyARDoubleMatrix44 mat_x = new NyARDoubleMatrix44(); mat_x.m00 = ltx; mat_x.m01 = lty; mat_x.m02 = -ltx * x1; mat_x.m03 = -lty * x1; mat_x.m10 = rbx; mat_x.m11 = lty; mat_x.m12 = -rbx * x2; mat_x.m13 = -lty * x2; mat_x.m20 = rbx; mat_x.m21 = rby; mat_x.m22 = -rbx * x3; mat_x.m23 = -rby * x3; mat_x.m30 = ltx; mat_x.m31 = rby; mat_x.m32 = -ltx * x4; mat_x.m33 = -rby * x4; mat_x.inverse(mat_x); NyARDoubleMatrix44 mat_y = new NyARDoubleMatrix44(); mat_y.m00 = ltx; mat_y.m01 = lty; mat_y.m02 = -ltx * y1; mat_y.m03 = -lty * y1; mat_y.m10 = rbx; mat_y.m11 = lty; mat_y.m12 = -rbx * y2; mat_y.m13 = -lty * y2; mat_y.m20 = rbx; mat_y.m21 = rby; mat_y.m22 = -rbx * y3; mat_y.m23 = -rby * y3; mat_y.m30 = ltx; mat_y.m31 = rby; mat_y.m32 = -ltx * y4; mat_y.m33 = -rby * y4; mat_y.inverse(mat_y); double a = mat_x.m20 * x1 + mat_x.m21 * x2 + mat_x.m22 * x3 + mat_x.m23 * x4; double b = mat_x.m20 + mat_x.m21 + mat_x.m22 + mat_x.m23; double d = mat_x.m30 * x1 + mat_x.m31 * x2 + mat_x.m32 * x3 + mat_x.m33 * x4; double f = mat_x.m30 + mat_x.m31 + mat_x.m32 + mat_x.m33; double g = mat_y.m20 * y1 + mat_y.m21 * y2 + mat_y.m22 * y3 + mat_y.m23 * y4; double h = mat_y.m20 + mat_y.m21 + mat_y.m22 + mat_y.m23; double i = mat_y.m30 * y1 + mat_y.m31 * y2 + mat_y.m32 * y3 + mat_y.m33 * y4; double j = mat_y.m30 + mat_y.m31 + mat_y.m32 + mat_y.m33; NyARDoubleMatrix22 tm = new NyARDoubleMatrix22(); tm.m00 = b; tm.m01 = -h; tm.m10 = f; tm.m11 = -j; tm.inverse(tm); double A, B, C, D, E, F, G, H; C = tm.m00 * (a - g) + tm.m01 * (d - i); //C F = tm.m10 * (a - g) + tm.m11 * (d - i); //F G = a - C * b; H = d - C * f; A = (mat_x.m00 * x1 + mat_x.m01 * x2 + mat_x.m02 * x3 + mat_x.m03 * x4) - C * (mat_x.m00 + mat_x.m01 + mat_x.m02 + mat_x.m03); B = (mat_x.m10 * x1 + mat_x.m11 * x2 + mat_x.m12 * x3 + mat_x.m13 * x4) - C * (mat_x.m10 + mat_x.m11 + mat_x.m12 + mat_x.m13); D = (mat_y.m00 * y1 + mat_y.m01 * y2 + mat_y.m02 * y3 + mat_y.m03 * y4) - F * (mat_y.m00 + mat_y.m01 + mat_y.m02 + mat_y.m03); E = (mat_y.m10 * y1 + mat_y.m11 * y2 + mat_y.m12 * y3 + mat_y.m13 * y4) - F * (mat_y.m10 + mat_y.m11 + mat_y.m12 + mat_y.m13); o_param[0] = A; o_param[1] = B; o_param[2] = C; o_param[3] = D; o_param[4] = E; o_param[5] = F; o_param[6] = G; o_param[7] = H; return(true); }