OSDN Git Service

[update]NyARToolKit
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Sat, 24 Apr 2010 07:36:12 +0000 (07:36 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Sat, 24 Apr 2010 07:36:12 +0000 (07:36 +0000)
+NyARPerspecttiveParamGeneratorの不具合を修正
+静止画向けサンプルのjpegsimpleLiteを追加

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit@439 7cac0a50-4618-4814-88d0-24b83990f816

trunk/Data/staticimage_sample.png [new file with mode: 0644]
trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JpegSimpleLite.java [new file with mode: 0644]
trunk/src/jp/nyatla/nyartoolkit/core/pickup/NyARColorPatt_Perspective_O2.java
trunk/src/jp/nyatla/nyartoolkit/core/utils/NyARPerspectiveParamGenerator.java
trunk/src/jp/nyatla/nyartoolkit/core/utils/NyARPerspectiveParamGenerator_O1.java

diff --git a/trunk/Data/staticimage_sample.png b/trunk/Data/staticimage_sample.png
new file mode 100644 (file)
index 0000000..366bec5
Binary files /dev/null and b/trunk/Data/staticimage_sample.png differ
diff --git a/trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JpegSimpleLite.java b/trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JpegSimpleLite.java
new file mode 100644 (file)
index 0000000..1b1cfd5
--- /dev/null
@@ -0,0 +1,241 @@
+/* \r
+ * PROJECT: NyARToolkit JOGL sample program.\r
+ * --------------------------------------------------------------------------------\r
+ * The MIT License\r
+ * Copyright (c) 2008 nyatla\r
+ * airmail(at)ebony.plala.or.jp\r
+ * http://nyatla.jp/nyartoolkit/\r
+ * \r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy\r
+ * of this software and associated documentation files (the "Software"), to deal\r
+ * in the Software without restriction, including without limitation the rights\r
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+ * copies of the Software, and to permit persons to whom the Software is\r
+ * furnished to do so, subject to the following conditions:\r
+ * The above copyright notice and this permission notice shall be included in\r
+ * all copies or substantial portions of the Software.\r
+ * \r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+ * THE SOFTWARE.\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.jogl.sample;\r
+\r
+import java.awt.event.*;\r
+import java.awt.*;\r
+import javax.media.Buffer;\r
+import javax.media.opengl.*;\r
+import com.sun.opengl.util.*;\r
+import jp.nyatla.nyartoolkit.*;\r
+import jp.nyatla.nyartoolkit.core.*;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.detector.*;\r
+import jp.nyatla.nyartoolkit.jogl.utils.*;\r
+import javax.imageio.*;\r
+import java.awt.image.*;\r
+import java.io.*;\r
+import jp.nyatla.nyartoolkit.utils.j2se.*;\r
+\r
+/**\r
+ * simpleLiteと同じようなテストプログラム 出来る限りARToolKitのサンプルと似せて作ってあります。 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
+ * \r
+ */\r
+public class JpegSimpleLite implements GLEventListener\r
+{\r
+       private Animator _animator;\r
+\r
+       private NyARRgbRaster_RGB _src_image;\r
+\r
+       private GL _gl;\r
+\r
+       private NyARGLUtil _glnya;\r
+\r
+       // NyARToolkit関係\r
+       private NyARSingleDetectMarker _nya;\r
+\r
+       private NyARParam _ar_param;\r
+\r
+       private Object _sync_object=new Object();\r
+       private double[] _camera_projection = new double[16];\r
+\r
+       /**\r
+        * 立方体を書く\r
+        * \r
+        */\r
+       void drawCube()\r
+       {\r
+               // Colour cube data.\r
+               int polyList = 0;\r
+               float fSize = 0.5f;// マーカーサイズに対して0.5倍なので、4cmの立方体\r
+               int f, i;\r
+               float[][] cube_vertices = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, -1.0f, 1.0f }, { -1.0f, -1.0f, 1.0f }, { -1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, -1.0f }, { 1.0f, -1.0f, -1.0f }, { -1.0f, -1.0f, -1.0f }, { -1.0f, 1.0f, -1.0f } };\r
+               float[][] cube_vertex_colors = new float[][] { { 1.0f, 1.0f, 1.0f }, { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 1.0f }, { 1.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } };\r
+               int cube_num_faces = 6;\r
+               short[][] cube_faces = new short[][] { { 3, 2, 1, 0 }, { 2, 3, 7, 6 }, { 0, 1, 5, 4 }, { 3, 0, 4, 7 }, { 1, 2, 6, 5 }, { 4, 5, 6, 7 } };\r
+\r
+               if (polyList == 0) {\r
+                       polyList = _gl.glGenLists(1);\r
+                       _gl.glNewList(polyList, GL.GL_COMPILE);\r
+                       _gl.glBegin(GL.GL_QUADS);\r
+                       for (f = 0; f < cube_num_faces; f++)\r
+                               for (i = 0; i < 4; i++) {\r
+                                       _gl.glColor3f(cube_vertex_colors[cube_faces[f][i]][0], cube_vertex_colors[cube_faces[f][i]][1], cube_vertex_colors[cube_faces[f][i]][2]);\r
+                                       _gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);\r
+                               }\r
+                       _gl.glEnd();\r
+                       _gl.glColor3f(0.0f, 0.0f, 0.0f);\r
+                       for (f = 0; f < cube_num_faces; f++) {\r
+                               _gl.glBegin(GL.GL_LINE_LOOP);\r
+                               for (i = 0; i < 4; i++)\r
+                                       _gl.glVertex3f(cube_vertices[cube_faces[f][i]][0] * fSize, cube_vertices[cube_faces[f][i]][1] * fSize, cube_vertices[cube_faces[f][i]][2] * fSize);\r
+                               _gl.glEnd();\r
+                       }\r
+                       _gl.glEndList();\r
+               }\r
+\r
+               _gl.glPushMatrix(); // Save world coordinate system.\r
+               _gl.glTranslatef(0.0f, 0.0f, 0.5f); // Place base of cube on marker surface.\r
+               _gl.glRotatef(0.0f, 0.0f, 0.0f, 1.0f); // Rotate about z axis.\r
+               _gl.glDisable(GL.GL_LIGHTING); // Just use colours.\r
+               _gl.glCallList(polyList); // Draw the cube.\r
+               _gl.glPopMatrix(); // Restore world coordinate system.\r
+\r
+       }\r
+\r
+       public JpegSimpleLite(NyARParam i_param, NyARCode i_ar_code,BufferedImage i_image) throws NyARException,IOException\r
+       {\r
+               this._ar_param = i_param;\r
+\r
+               Frame frame = new Frame("Jpeg reader demo");\r
+               // GL対応のRGBラスタオブジェクト\r
+               this._src_image = new NyARRgbRaster_RGB(i_image.getWidth(),i_image.getHeight(),true);\r
+               NyARRasterImageIO.copy(i_image, this._src_image);\r
+               \r
+               \r
+               // NyARToolkitの準備\r
+               this._ar_param.changeScreenSize(i_image.getWidth(),i_image.getHeight());\r
+               this._nya = new NyARSingleDetectMarker(this._ar_param, i_ar_code, 80.0,this._src_image.getBufferType());\r
+               this._nya.setContinueMode(false);// ここをtrueにすると、transMatContinueモード(History計算)になります。\r
+               \r
+               // 3Dを描画するコンポーネント\r
+               GLCanvas canvas = new GLCanvas();\r
+               frame.add(canvas);\r
+               canvas.addGLEventListener(this);\r
+               frame.addWindowListener(new WindowAdapter() {\r
+                       public void windowClosing(WindowEvent e)\r
+                       {\r
+                               System.exit(0);\r
+                       }\r
+               });\r
+\r
+               frame.setVisible(true);\r
+               Insets ins = frame.getInsets();\r
+               frame.setSize(i_image.getWidth() + ins.left + ins.right, i_image.getHeight() + ins.top + ins.bottom);\r
+               canvas.setBounds(ins.left, ins.top, i_image.getWidth(), i_image.getHeight());\r
+       }\r
+\r
+       public void init(GLAutoDrawable drawable)\r
+       {\r
+               this._gl = drawable.getGL();\r
+               this._gl.glEnable(GL.GL_DEPTH_TEST);\r
+               this._gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
+               // NyARToolkitの準備\r
+               try {\r
+                       // NyARToolkit用の支援クラス\r
+                       _glnya = new NyARGLUtil(_gl);\r
+                       // キャプチャ開始\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+               // カメラパラメータの計算\r
+               this._glnya.toCameraFrustumRH(this._ar_param,this._camera_projection);\r
+               this._animator = new Animator(drawable);\r
+               this._animator.start();\r
+               return;\r
+       }\r
+\r
+       public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)\r
+       {\r
+               _gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);\r
+               _gl.glViewport(0, 0, width, height);\r
+\r
+               // 視体積の設定\r
+               _gl.glMatrixMode(GL.GL_PROJECTION);\r
+               _gl.glLoadIdentity();\r
+               // 見る位置\r
+               _gl.glMatrixMode(GL.GL_MODELVIEW);\r
+               _gl.glLoadIdentity();\r
+       }\r
+\r
+       private boolean _is_marker_exist=false;\r
+       private NyARTransMatResult __display_transmat_result = new NyARTransMatResult();\r
+\r
+       private double[] __display_wk = new double[16];\r
+\r
+       public void display(GLAutoDrawable drawable)\r
+       {\r
+               NyARTransMatResult transmat_result = __display_transmat_result;\r
+               // 背景を書く\r
+               this._gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.\r
+               try{\r
+                       this._is_marker_exist=this._nya.detectMarkerLite(this._src_image);\r
+                       this._glnya.drawBackGround(this._src_image, 1.0);\r
+                       synchronized(this._sync_object){\r
+                               // マーカーがあれば、立方体を描画\r
+                               if (this._is_marker_exist){\r
+                                       System.out.println(this._nya.getConfidence());\r
+                                       // マーカーの一致度を調査するならば、ここでnya.getConfidence()で一致度を調べて下さい。\r
+                                       // Projection transformation.\r
+                                       _gl.glMatrixMode(GL.GL_PROJECTION);\r
+                                       _gl.glLoadMatrixd(_camera_projection, 0);\r
+                                       _gl.glMatrixMode(GL.GL_MODELVIEW);\r
+                                       // Viewing transformation.\r
+                                       _gl.glLoadIdentity();\r
+                                       // 変換行列を取得\r
+                                       _nya.getTransmationMatrix(transmat_result);\r
+                                       // 変換行列をOpenGL形式に変換\r
+                                       _glnya.toCameraViewRH(transmat_result, __display_wk);\r
+                                       _gl.glLoadMatrixd(__display_wk, 0);\r
+               \r
+                                       // All other lighting and geometry goes here.\r
+                                       drawCube();\r
+                               }\r
+                       }\r
+                       Thread.sleep(1);// タスク実行権限を一旦渡す\r
+               }catch(Exception e){\r
+                       e.printStackTrace();\r
+               }\r
+\r
+       }\r
+       public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)\r
+       {\r
+       }\r
+\r
+       private final static String CARCODE_FILE = "../../Data/patt.hiro";\r
+\r
+       private final static String PARAM_FILE = "../../Data/camera_para.dat";\r
+       private final static String SAMPLE_FILES = "../../Data/staticimage_sample.png";\r
+\r
+       public static void main(String[] args)\r
+       {\r
+               try {\r
+                       NyARParam param = new NyARParam();\r
+                       param.loadARParamFromFile(PARAM_FILE);\r
+                       NyARCode code = new NyARCode(16, 16);\r
+                       code.loadARPattFromFile(CARCODE_FILE);\r
+                       BufferedImage src_image = ImageIO.read(new File(SAMPLE_FILES));\r
+\r
+                       new JpegSimpleLite(param, code,src_image);\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+               return;\r
+       }\r
+}\r
index dd51085..08621fa 100644 (file)
@@ -676,10 +676,10 @@ public class NyARColorPatt_Perspective_O2 extends NyARColorPatt_Perspective
        public boolean pickFromRaster(INyARRgbRaster image,NyARIntPoint2d[] i_vertexs)throws NyARException\r
        {\r
                //遠近法のパラメータを計算\r
-               final double[] cpara = this.__pickFromRaster_cpara;\r
-               if (!this._perspective_gen.getParam(i_vertexs, cpara)) {\r
+               final double[] cpara = this.__pickFromRaster_cpara;             \r
+               if (!this._perspective_gen.getParam(i_vertexs, cpara)) {\r
                        return false;\r
-               }               \r
+               }\r
                this._pickup.pickFromRaster(cpara, image,this._patdata);\r
                return true;\r
        }\r
index 46e8b57..2927d61 100644 (file)
@@ -107,7 +107,6 @@ public class NyARPerspectiveParamGenerator
                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);\r
                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);\r
 \r
-\r
                o_param[0]=A;\r
                o_param[1]=B;\r
                o_param[2]=C;\r
index 3922868..08f3fc2 100644 (file)
@@ -32,60 +32,197 @@ import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;
  */\r
 public class NyARPerspectiveParamGenerator_O1 extends NyARPerspectiveParamGenerator\r
 {\r
-       public NyARPerspectiveParamGenerator_O1(int i_local_x,int i_local_y,int i_width, int i_height)\r
+       public NyARPerspectiveParamGenerator_O1(int i_local_x, int i_local_y, int i_width, int i_height)\r
        {\r
-               super(i_local_x,i_local_y,i_width,i_height);\r
+               super(1, 1, i_width, i_height);\r
                return;\r
-       }/*\r
-       final public boolean getParam(final NyARIntPoint2d[] i_vertex,double[] o_param)throws NyARException\r
+       }\r
+\r
+\r
+       final public boolean getParam(final NyARIntPoint2d[] i_vertex, double[] o_param) throws NyARException\r
        {\r
-               double G,H;\r
-               double w1,w2,w3,w4;\r
-               final double x0=i_vertex[0].x;\r
-               final double x1=i_vertex[1].x;\r
-               final double x2=i_vertex[2].x;\r
-               final double x3=i_vertex[3].x;\r
-               final double y0=i_vertex[0].y;\r
-               final double y1=i_vertex[1].y;\r
-               final double y2=i_vertex[2].y;\r
-               final double y3=i_vertex[3].y;\r
-               final double ltx=this._local_x;\r
-               final double lty=this._local_y;\r
-               final double rbx=ltx+this._width;\r
-               final double rby=lty+this._height;\r
-\r
-               \r
-               w1=-y3+y0;\r
-               w2= y2-y1;\r
-               final double la2_33=ltx*w1+rbx*w2;//これが0になるのはまずい。\r
-               final double la2_34=(rby*(-y3+y2)+lty*(y0-y1))/la2_33;\r
-               final double ra2_3 =(-w1-w2)/la2_33;\r
-               \r
-               w1=-x3+x0;\r
-               w2=x2-x1;\r
-               final double la1_33=ltx*w1+rbx*w2;//これが0になるのはまずい。\r
-               \r
-               //GHを計算\r
-               H=(ra2_3-((-w1-w2)/la1_33))/(la2_34-((rby*(-x3+x2)+lty*(x0-x1))/la1_33));\r
-               G=ra2_3-la2_34*H;\r
-               o_param[7]=H;\r
-               o_param[6]=G;\r
-\r
-               //残りを計算\r
-               w3=rby-lty;\r
-               w4=rbx-ltx;\r
-               w1=(y2-y1-H*(-rby*y2+lty*y1)-G*(-rbx*y2+rbx*y1))/w3;\r
-               w2=(y1-y0-H*(-lty*y1+lty*y0)-G*(-rbx*y1+ltx*y0))/w4;\r
-               o_param[5]=y0*(1+H*lty+G*ltx)-w1*lty-w2*ltx;\r
-               o_param[4]=w1;\r
-               o_param[3]=w2;\r
-               \r
-               \r
-               w1=(x2-x1-H*(-rby*x2+lty*x1)-G*(-rbx*x2+rbx*x1))/w3;\r
-               w2=(x1-x0-H*(-lty*x1+lty*x0)-G*(-rbx*x1+ltx*x0))/w4;\r
-               o_param[2]=x0*(1+H*lty+G*ltx)-w1*lty-w2*ltx;\r
-               o_param[1]=w1;\r
-               o_param[0]=w2;\r
+               final double ltx = this._local_x;\r
+               final double lty = this._local_y;\r
+               final double rbx = ltx + this._width;\r
+               final double rby = lty + this._height;\r
+\r
+               double det_1;\r
+               double a13, a14, a23, a24, a33, a34, a43, a44;\r
+               double b11, b12, b13, b14, b21, b22, b23, b24, b31, b32, b33, b34, b41, b42, b43, b44;\r
+               double t1, t2, t3, t4, t5, t6;\r
+               double v1, v2, v3, v4;\r
+               double kx0, kx1, kx2, kx3, kx4, kx5, kx6, kx7;\r
+               double ky0, ky1, ky2, ky3, ky4, ky5, ky6, ky7;\r
+               {\r
+                       v1 = i_vertex[0].x;\r
+                       v2 = i_vertex[1].x;\r
+                       v3 = i_vertex[2].x;\r
+                       v4 = i_vertex[3].x;\r
+                       a13 = -ltx * v1;\r
+                       a14 = -lty * v1;\r
+                       a23 = -rbx * v2;\r
+                       a24 = -lty * v2;\r
+                       a33 = -rbx * v3;\r
+                       a34 = -rby * v3;\r
+                       a43 = -ltx * v4;\r
+                       a44 = -rby * v4;\r
+\r
+                       t1 = a33 * a44 - a34 * a43;\r
+                       t4 = a34 * ltx - rbx * a44;\r
+                       t5 = rbx * a43 - a33 * ltx;\r
+                       t2 = rby * (a34 - a44);\r
+                       t3 = rby * (a43 - a33);\r
+                       t6 = rby * (rbx - ltx);\r
+\r
+                       b21 = -a23 * t4 - a24 * t5 - rbx * t1;\r
+                       b11 = (a23 * t2 + a24 * t3) + lty * t1;\r
+                       b31 = (a24 * t6 - rbx * t2) + lty * t4;\r
+                       b41 = (-rbx * t3 - a23 * t6) + lty * t5;\r
+\r
+                       t1 = a43 * a14 - a44 * a13;\r
+                       t2 = a44 * lty - rby * a14;\r
+                       t3 = rby * a13 - a43 * lty;\r
+                       t4 = ltx * (a44 - a14);\r
+                       t5 = ltx * (a13 - a43);\r
+                       t6 = ltx * (lty - rby);\r
+\r
+                       b12 = -rby * t1 - a33 * t2 - a34 * t3;\r
+                       b22 = (a33 * t4 + a34 * t5) + rbx * t1;\r
+                       b32 = (-a34 * t6 - rby * t4) + rbx * t2;\r
+                       b42 = (-rby * t5 + a33 * t6) + rbx * t3;\r
+\r
+                       t1 = a13 * a24 - a14 * a23;\r
+                       t4 = a14 * rbx - ltx * a24;\r
+                       t5 = ltx * a23 - a13 * rbx;\r
+                       t2 = lty * (a14 - a24);\r
+                       t3 = lty * (a23 - a13);\r
+                       t6 = lty * (ltx - rbx);\r
+\r
+                       b23 = -a43 * t4 - a44 * t5 - ltx * t1;\r
+                       b13 = (a43 * t2 + a44 * t3) + rby * t1;\r
+                       b33 = (a44 * t6 - ltx * t2) + rby * t4;\r
+                       b43 = (-ltx * t3 - a43 * t6) + rby * t5;\r
+\r
+                       t1 = a23 * a34 - a24 * a33;\r
+                       t2 = a24 * rby - lty * a34;\r
+                       t3 = lty * a33 - a23 * rby;\r
+                       t4 = rbx * (a24 - a34);\r
+                       t5 = rbx * (a33 - a23);\r
+                       t6 = rbx * (rby - lty);\r
+\r
+                       b14 = -lty * t1 - a13 * t2 - a14 * t3;\r
+                       b24 = a13 * t4 + a14 * t5 + ltx * t1;\r
+                       b34 = -a14 * t6 - lty * t4 + ltx * t2;\r
+                       b44 = -lty * t5 + a13 * t6 + ltx * t3;\r
+\r
+                       det_1 = (ltx * (b11 + b14) + rbx * (b12 + b13));\r
+                       if (det_1 == 0) {\r
+                               return false;\r
+                       }\r
+                       det_1 = 1 / det_1;\r
+\r
+                       kx0 = (b11 * v1 + b12 * v2 + b13 * v3 + b14 * v4) * det_1;\r
+                       kx1 = (b11 + b12 + b13 + b14) * det_1;\r
+                       kx2 = (b21 * v1 + b22 * v2 + b23 * v3 + b24 * v4) * det_1;\r
+                       kx3 = (b21 + b22 + b23 + b24) * det_1;\r
+                       kx4 = (b31 * v1 + b32 * v2 + b33 * v3 + b34 * v4) * det_1;\r
+                       kx5 = (b31 + b32 + b33 + b34) * det_1;\r
+                       kx6 = (b41 * v1 + b42 * v2 + b43 * v3 + b44 * v4) * det_1;\r
+                       kx7 = (b41 + b42 + b43 + b44) * det_1;\r
+               }\r
+               {\r
+                       v1 = i_vertex[0].y;\r
+                       v2 = i_vertex[1].y;\r
+                       v3 = i_vertex[2].y;\r
+                       v4 = i_vertex[3].y;\r
+                       a13 = -ltx * v1;\r
+                       a14 = -lty * v1;\r
+                       a23 = -rbx * v2;\r
+                       a24 = -lty * v2;\r
+                       a33 = -rbx * v3;\r
+                       a34 = -rby * v3;\r
+                       a43 = -ltx * v4;\r
+                       a44 = -rby * v4;\r
+\r
+                       t1 = a33 * a44 - a34 * a43;\r
+                       t4 = a34 * ltx - rbx * a44;\r
+                       t5 = rbx * a43 - a33 * ltx;\r
+                       t2 = rby * (a34 - a44);\r
+                       t3 = rby * (a43 - a33);\r
+                       t6 = rby * (rbx - ltx);\r
+\r
+                       b21 = -a23 * t4 - a24 * t5 - rbx * t1;\r
+                       b11 = (a23 * t2 + a24 * t3) + lty * t1;\r
+                       b31 = (a24 * t6 - rbx * t2) + lty * t4;\r
+                       b41 = (-rbx * t3 - a23 * t6) + lty * t5;\r
+\r
+                       t1 = a43 * a14 - a44 * a13;\r
+                       t2 = a44 * lty - rby * a14;\r
+                       t3 = rby * a13 - a43 * lty;\r
+                       t4 = ltx * (a44 - a14);\r
+                       t5 = ltx * (a13 - a43);\r
+                       t6 = ltx * (lty - rby);\r
+\r
+                       b12 = -rby * t1 - a33 * t2 - a34 * t3;\r
+                       b22 = (a33 * t4 + a34 * t5) + rbx * t1;\r
+                       b32 = (-a34 * t6 - rby * t4) + rbx * t2;\r
+                       b42 = (-rby * t5 + a33 * t6) + rbx * t3;\r
+\r
+                       t1 = a13 * a24 - a14 * a23;\r
+                       t4 = a14 * rbx - ltx * a24;\r
+                       t5 = ltx * a23 - a13 * rbx;\r
+                       t2 = lty * (a14 - a24);\r
+                       t3 = lty * (a23 - a13);\r
+                       t6 = lty * (ltx - rbx);\r
+\r
+                       b23 = -a43 * t4 - a44 * t5 - ltx * t1;\r
+                       b13 = (a43 * t2 + a44 * t3) + rby * t1;\r
+                       b33 = (a44 * t6 - ltx * t2) + rby * t4;\r
+                       b43 = (-ltx * t3 - a43 * t6) + rby * t5;\r
+\r
+                       t1 = a23 * a34 - a24 * a33;\r
+                       t2 = a24 * rby - lty * a34;\r
+                       t3 = lty * a33 - a23 * rby;\r
+                       t4 = rbx * (a24 - a34);\r
+                       t5 = rbx * (a33 - a23);\r
+                       t6 = rbx * (rby - lty);\r
+\r
+                       b14 = -lty * t1 - a13 * t2 - a14 * t3;\r
+                       b24 = a13 * t4 + a14 * t5 + ltx * t1;\r
+                       b34 = -a14 * t6 - lty * t4 + ltx * t2;\r
+                       b44 = -lty * t5 + a13 * t6 + ltx * t3;\r
+\r
+                       det_1 = (ltx * (b11 + b14) + rbx * (b12 + b13));\r
+                       if (det_1 == 0) {\r
+                               return false;\r
+                       }\r
+                       det_1 = 1 / det_1;\r
+\r
+                       ky0 = (b11 * v1 + b12 * v2 + b13 * v3 + b14 * v4) * det_1;\r
+                       ky1 = (b11 + b12 + b13 + b14) * det_1;\r
+                       ky2 = (b21 * v1 + b22 * v2 + b23 * v3 + b24 * v4) * det_1;\r
+                       ky3 = (b21 + b22 + b23 + b24) * det_1;\r
+                       ky4 = (b31 * v1 + b32 * v2 + b33 * v3 + b34 * v4) * det_1;\r
+                       ky5 = (b31 + b32 + b33 + b34) * det_1;\r
+                       ky6 = (b41 * v1 + b42 * v2 + b43 * v3 + b44 * v4) * det_1;\r
+                       ky7 = (b41 + b42 + b43 + b44) * det_1;\r
+               }\r
+\r
+               det_1 = kx5 * (-ky7) - (-ky5) * kx7;\r
+               if (det_1 == 0) {\r
+                       return false;\r
+               }\r
+               det_1 = 1 / det_1;\r
+\r
+               double C, F;\r
+               o_param[2] = C = (-ky7 * det_1) * (kx4 - ky4) + (ky5 * det_1) * (kx6 - ky6); // C\r
+               o_param[5] = F = (-kx7 * det_1) * (kx4 - ky4) + (kx5 * det_1) * (kx6 - ky6); // F\r
+               o_param[6] = kx4 - C * kx5;\r
+               o_param[7] = kx6 - C * kx7;\r
+               o_param[0] = kx0 - C * kx1;\r
+               o_param[1] = kx2 - C * kx3;\r
+               o_param[3] = ky0 - F * ky1;\r
+               o_param[4] = ky2 - F * ky3;\r
                return true;\r
-       }*/\r
+       }\r
 }\r