Inheritance: ICoordTransformer
        //------------------------------------------------------------------------
        Perspective premultiply(Perspective b)
        {
            Perspective a = new Perspective(this);

            sx  = a.sx * b.sx + a.shx * b.shy + a.tx * b.w0;
            shx = a.sx * b.shx + a.shx * b.sy + a.tx * b.w1;
            tx  = a.sx * b.tx + a.shx * b.ty + a.tx * b.w2;
            shy = a.shy * b.sx + a.sy * b.shy + a.ty * b.w0;
            sy  = a.shy * b.shx + a.sy * b.sy + a.ty * b.w1;
            ty  = a.shy * b.tx + a.sy * b.ty + a.ty * b.w2;
            w0  = a.w0 * b.sx + a.w1 * b.shy + a.w2 * b.w0;
            w1  = a.w0 * b.shx + a.w1 * b.sy + a.w2 * b.w1;
            w2  = a.w0 * b.tx + a.w1 * b.ty + a.w2 * b.w2;
            return(this);
        }
        unsafe bool InternalGenerateQuadToQuad(double *qs_h, double *qdHead)
        {
            Perspective p = new Perspective();

            if (!square_to_quad(qs_h))
            {
                return(false);
            }

            invert();
            //---------------------------------
            if (!p.square_to_quad(qdHead))
            {
                return(false);
            }
            multiply(p);
            return(true);
        }
Beispiel #3
0
 //--------------------------------------------------------------------
 public SpanInterpolatorPerspectiveLerp()
 {
     m_trans_dir = new Perspective();
     m_trans_inv = new Perspective();
 }
Beispiel #4
0
 void scaling(out double x, out double y)
 {
     double x1 = 0.0;
     double y1 = 0.0;
     double x2 = 1.0;
     double y2 = 1.0;
     Perspective t = new Perspective(this);
     t *= Affine.NewRotation(-rotation());
     t.Transform(ref x1, ref y1);
     t.Transform(ref x2, ref y2);
     x = x2 - x1;
     y = y2 - y1;
 }
Beispiel #5
0
 // From trans_perspective
 public Perspective(Perspective a)
 {
     sx = a.sx; shy = a.shy; w0 = a.w0;
     shx = a.shx; sy = a.sy; w1 = a.w1;
     tx = a.tx; ty = a.ty; w2 = a.w2;
 }
Beispiel #6
0
 // Inverse transformation of x and y. It works slow because
 // it explicitly inverts the matrix on every call. For massive 
 // operations it's better to invert() the matrix and then use 
 // direct transformations. 
 void inverse_transform(ref double x, ref double y)
 {
     Perspective t = new Perspective(this);
     if (t.invert()) t.Transform(ref x, ref y);
 }
Beispiel #7
0
 // Multiply inverse of "m" by "this" and assign the result to "this"
 Perspective premultiply_inv(Affine m)
 {
     Perspective t = new Perspective(m);
     t.invert();
     Set(t.multiply(this));
     return this;
 }
Beispiel #8
0
 //------------------------------------------------------------------------
 Perspective premultiply_inv(Perspective m)
 {
     Perspective t = m;
     t.invert();
     Set(t.multiply(this));
     return this;
 }
Beispiel #9
0
        //------------------------------------------------------------------------
        //Perspective premultiply(Affine b)
        //{
        //    //copy this to a
        //    Perspective a = new Perspective(this);

        //    sx = a.sx * b.sx + a.shx * b.shy;
        //    shx = a.sx * b.shx + a.shx * b.sy;
        //    tx = a.sx * b.tx + a.shx * b.ty + a.tx;
        //    shy = a.shy * b.sx + a.sy * b.shy;
        //    sy = a.shy * b.shx + a.sy * b.sy;
        //    ty = a.shy * b.tx + a.sy * b.ty + a.ty;
        //    w0 = a.w0 * b.sx + a.w1 * b.shy;
        //    w1 = a.w0 * b.shx + a.w1 * b.sy;
        //    w2 = a.w0 * b.tx + a.w1 * b.ty + a.w2;

        //    return this;
        //}

        //------------------------------------------------------------------------
        Perspective multiply_inv(Perspective m)
        {
            Perspective t = m;
            t.invert();
            return multiply(t);
        }
Beispiel #10
0
 //------------------------------------------------------------------------
 Perspective premultiply(Perspective b)
 {
     Perspective a = new Perspective(this);
     sx = a.sx * b.sx + a.shx * b.shy + a.tx * b.w0;
     shx = a.sx * b.shx + a.shx * b.sy + a.tx * b.w1;
     tx = a.sx * b.tx + a.shx * b.ty + a.tx * b.w2;
     shy = a.shy * b.sx + a.sy * b.shy + a.ty * b.w0;
     sy = a.shy * b.shx + a.sy * b.sy + a.ty * b.w1;
     ty = a.shy * b.tx + a.sy * b.ty + a.ty * b.w2;
     w0 = a.w0 * b.sx + a.w1 * b.shy + a.w2 * b.w0;
     w1 = a.w0 * b.shx + a.w1 * b.sy + a.w2 * b.w1;
     w2 = a.w0 * b.tx + a.w1 * b.ty + a.w2 * b.w2;
     return this;
 }
Beispiel #11
0
 //------------------------------------------------------------------------
 Perspective multiply(Affine a)
 {
     Perspective b = new Perspective(this);
     sx = a.sx * b.sx + a.shx * b.shy + a.tx * b.w0;
     shx = a.sx * b.shx + a.shx * b.sy + a.tx * b.w1;
     tx = a.sx * b.tx + a.shx * b.ty + a.tx * b.w2;
     shy = a.shy * b.sx + a.sy * b.shy + a.ty * b.w0;
     sy = a.shy * b.shx + a.sy * b.sy + a.ty * b.w1;
     ty = a.shy * b.tx + a.sy * b.ty + a.ty * b.w2;
     return this;
 }
Beispiel #12
0
 // Invert matrix. Returns false in degenerate case
 bool invert()
 {
     double d0 = sy * w2 - w1 * ty;
     double d1 = w0 * ty - shy * w2;
     double d2 = shy * w1 - w0 * sy;
     double d = sx * d0 + shx * d1 + tx * d2;
     if (d == 0.0)
     {
         sx = shy = w0 = shx = sy = w1 = tx = ty = w2 = 0.0;
         return false;
     }
     d = 1.0 / d;
     Perspective a = new Perspective(this);
     sx = d * d0;
     shy = d * d1;
     w0 = d * d2;
     shx = d * (a.w1 * a.tx - a.shx * a.w2);
     sy = d * (a.sx * a.w2 - a.w0 * a.tx);
     w1 = d * (a.w0 * a.shx - a.sx * a.w1);
     tx = d * (a.shx * a.ty - a.sy * a.tx);
     ty = d * (a.shy * a.tx - a.sx * a.ty);
     w2 = d * (a.sx * a.sy - a.shy * a.shx);
     return true;
 }
Beispiel #13
0
        unsafe bool InternalGenerateQuadToQuad(double* qs_h, double* qdHead)
        {
            Perspective p = new Perspective();
            if (!square_to_quad(qs_h))
            {
                return false;
            }

            invert();
            //---------------------------------
            if (!p.square_to_quad(qdHead))
            {
                return false;
            }
            multiply(p);
            return true;
        }
Beispiel #14
0
 void Set(Perspective Other)
 {
     sx = Other.sx;
     shy = Other.shy;
     w0 = Other.w0;
     shx = Other.shx;
     sy = Other.sy;
     w1 = Other.w1;
     tx = Other.tx;
     ty = Other.ty;
     w2 = Other.w2;
 }
Beispiel #15
0
 // From trans_perspective
 public Perspective(Perspective a)
 {
     sx  = a.sx; shy = a.shy; w0 = a.w0;
     shx = a.shx; sy = a.sy; w1 = a.w1;
     tx  = a.tx; ty = a.ty; w2 = a.w2;
 }
 //--------------------------------------------------------------------
 public SpanInterpolatorPerspectiveLerp()
 {
     m_trans_dir = new Perspective();
     m_trans_inv = new Perspective();
 }