NewTOAPIA.Graphics.Perspective.square_to_quad C# (CSharp) Method

square_to_quad() public method

public square_to_quad ( double q ) : bool
q double
return bool
        public bool square_to_quad(double[] q)
        {
            double dx = q[0] - q[2] + q[4] - q[6];
            double dy = q[1] - q[3] + q[5] - q[7];
            if (dx == 0.0 && dy == 0.0)
            {
                // Affine case (parallelogram)
                //---------------
                sx = q[2] - q[0];
                shy = q[3] - q[1];
                w0 = 0.0;
                shx = q[4] - q[2];
                sy = q[5] - q[3];
                w1 = 0.0;
                tx = q[0];
                ty = q[1];
                w2 = 1.0;
            }
            else
            {
                double dx1 = q[2] - q[4];
                double dy1 = q[3] - q[5];
                double dx2 = q[6] - q[4];
                double dy2 = q[7] - q[5];
                double den = dx1 * dy2 - dx2 * dy1;
                if (den == 0.0)
                {
                    // Singular case
                    //---------------
                    sx = shy = w0 = shx = sy = w1 = tx = ty = w2 = 0.0;
                    return false;
                }
                // General case
                //---------------
                double u = (dx * dy2 - dy * dx2) / den;
                double v = (dy * dx1 - dx * dy1) / den;
                sx = q[2] - q[0] + u * q[2];
                shy = q[3] - q[1] + u * q[3];
                w0 = u;
                shx = q[6] - q[0] + v * q[6];
                sy = q[7] - q[1] + v * q[7];
                w1 = v;
                tx = q[0];
                ty = q[1];
                w2 = 1.0;
            }
            return true;
        }

Usage Example

Ejemplo n.º 1
0
 //-------------------------------------- Quadrilateral transformations
 // The arguments are double[8] that are mapped to quadrilaterals:
 // x1,y1, x2,y2, x3,y3, x4,y4
 public bool quad_to_quad(double[] qs, double[] qd)
 {
     Perspective p = new Perspective();
     if (!quad_to_square(qs)) 
         return false;
     
     if (!p.square_to_quad(qd)) 
         return false;
     
     multiply(p);
     
     return true;
 }