public 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; }
//-------------------------------------- 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; }
public 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; }
public iterator_x(double px, double py, double step, Perspective m) { den = (px * m.w0 + py * m.w1 + m.w2); den_step = (m.w0 * step); nom_x = (px * m.sx + py * m.shx + m.tx); nom_x_step = (step * m.sx); nom_y = (px * m.shy + py * m.sy + m.ty); nom_y_step = (step * m.shy); x = (nom_x / den); y = (nom_y / den); }
public bool is_equal(Perspective m) { return is_equal(m, affine_epsilon); }
public bool is_equal(Perspective m, double epsilon) { return agg_basics.is_equal_eps(sx, m.sx, epsilon) && agg_basics.is_equal_eps(shy, m.shy, epsilon) && agg_basics.is_equal_eps(w0, m.w0, epsilon) && agg_basics.is_equal_eps(shx, m.shx, epsilon) && agg_basics.is_equal_eps(sy, m.sy, epsilon) && agg_basics.is_equal_eps(w1, m.w1, epsilon) && agg_basics.is_equal_eps(tx, m.tx, epsilon) && agg_basics.is_equal_eps(ty, m.ty, epsilon) && agg_basics.is_equal_eps(w2, m.w2, epsilon); }
// 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. public void inverse_transform(ref double x, ref double y) { Perspective t = new Perspective(this); if (t.invert()) t.Transform(ref x, ref y); }
// 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 Perspective premultiply_inv(Perspective m) { Perspective t = m; t.invert(); Set(t.multiply(this)); return this; }
// Multiply inverse of "m" by "this" and assign the result to "this" public Perspective premultiply_inv(Affine m) { Perspective t = new Perspective(m); t.invert(); Set(t.multiply(this)); return this; }
//------------------------------------------------------------------------ public Perspective multiply_inv(Perspective m) { Perspective t = m; t.invert(); return multiply(t); }
//------------------------------------------------------------------------ public Perspective premultiply(Affine b) { 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; }
//------------------------------------------------------------------------ public 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; }
//------------------------------------------------------------------------ public 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; }
// Invert matrix. Returns false in degenerate case public 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; }