public void Resynchronize(T xe, T ye, uint len) { // Assume x1,y1 are equal to the ones at the previous end point int x1 = m_coord_x.Y; int y1 = m_coord_y.Y; int sx1 = m_scale_x.Y; int sy1 = m_scale_y.Y; // Calculate transformed coordinates at x2,y2 T xt = xe; T yt = ye; //m_trans_dir.Transform(ref xt, ref yt); IVector <T> v1 = m_trans_dir.TransformVector(MatrixFactory <T> .CreateVector2D(xt, yt)); xt = v1[0]; yt = v1[1]; int x2 = Basics.RoundInt(xt.Multiply((double)subpixel_scale)); int y2 = Basics.RoundInt(yt.Multiply((double)subpixel_scale)); double delta = 1 / (double)subpixel_scale; T dx; T dy; // Calculate scale by X at x2,y2 dx = xt.Add(delta); dy = yt; //m_trans_inv.Transform(ref dx, ref dy); IVector <T> v2 = m_trans_inv.TransformVector(MatrixFactory <T> .CreateVector2D(dx, dy)); dx = v2[0]; dy = v2[1]; dx.SubtractEquals(xe); dy.SubtractEquals(ye); int sx2 = (int)Basics.RoundUint(M.New <T>((double)subpixel_scale).Divide(M.Length(dx, dy)).ToInt()) >> subpixel_shift; // Calculate scale by Y at x2,y2 dx = xt; dy = yt.Add(delta); //m_trans_inv.Transform(ref dx, ref dy); IVector <T> v3 = m_trans_inv.TransformVector(MatrixFactory <T> .CreateVector2D(dx, dy)); dx = v3[0]; dy = v3[1]; dx.SubtractEquals(xe); dy.SubtractEquals(ye); int sy2 = (int)Basics.RoundUint(M.New <T>((double)subpixel_scale).Divide(M.Length(dx, dy)).ToInt()) >> subpixel_shift; // Initialize the interpolators m_coord_x = new Dda2LineInterpolator(x1, x2, (int)len); m_coord_y = new Dda2LineInterpolator(y1, y2, (int)len); m_scale_x = new Dda2LineInterpolator(sx1, sx2, (int)len); m_scale_y = new Dda2LineInterpolator(sy1, sy2, (int)len); }
//---------------------------------------------------------------- public void Begin(T x, T y, uint len) { T tx; T ty; tx = x; ty = y; m_trans.Transform(ref tx, ref ty); int x1 = Basics.RoundInt(tx.Multiply((double)subpixel_scale_e.subpixel_scale)); int y1 = Basics.RoundInt(ty.Multiply((double)subpixel_scale_e.subpixel_scale)); tx = x.Add(len); ty = y; m_trans.Transform(ref tx, ref ty); int x2 = Basics.RoundInt(tx.Multiply((double)subpixel_scale_e.subpixel_scale)); int y2 = Basics.RoundInt(ty.Multiply((double)subpixel_scale_e.subpixel_scale)); m_li_x = new Dda2LineInterpolator(x1, x2, (int)len); m_li_y = new Dda2LineInterpolator(y1, y2, (int)len); }
//-------------------------------------------------------------------- public LineBresenhamInterpolator(int x1, int y1, int x2, int y2) { m_x1_lr = (LineLr(x1)); m_y1_lr = (LineLr(y1)); m_x2_lr = (LineLr(x2)); m_y2_lr = (LineLr(y2)); m_ver = (Math.Abs(m_x2_lr - m_x1_lr) < Math.Abs(m_y2_lr - m_y1_lr)); if (m_ver) { m_len = (uint)Math.Abs(m_y2_lr - m_y1_lr); } else { m_len = (uint)Math.Abs(m_x2_lr - m_x1_lr); } m_inc = (m_ver ? ((y2 > y1) ? 1 : -1) : ((x2 > x1) ? 1 : -1)); m_interpolator = new Dda2LineInterpolator(m_ver ? x1 : y1, m_ver ? x2 : y2, (int)m_len); }
public void Begin(T x, T y, uint len) { // Calculate transformed coordinates at x1,y1 //double xt = x; //double yt = y; //m_trans_dir.Transform(ref xt, ref yt); IVector <T> v1 = m_trans_dir.TransformVector(MatrixFactory <T> .CreateVector2D(x, y)); T xt = v1[0], yt = v1[1]; int x1 = Basics.RoundInt(xt.Multiply((double)subpixel_scale)); int y1 = Basics.RoundInt(yt.Multiply((double)subpixel_scale)); T dx; T dy; double delta = 1 / (double)subpixel_scale; // Calculate scale by X at x1,y1 dx = xt.Add(delta); dy = yt; //m_trans_inv.Transform(ref dx, ref dy); IVector <T> v2 = m_trans_inv.TransformVector(MatrixFactory <T> .CreateVector2D(dx, dy)); dx = v2[0]; dy = v2[1]; dx.SubtractEquals(x); dy.SubtractEquals(y); int sx1 = (int)Basics.RoundUint(M.New <T>(subpixel_scale).Divide(M.Length(dx, dy)).ToInt()) >> subpixel_shift; // Calculate scale by Y at x1,y1 dx = xt; dy = yt.Add(delta); // m_trans_inv.Transform(ref dx, ref dy); IVector <T> v3 = m_trans_inv.TransformVector(MatrixFactory <T> .CreateVector2D(dx, dy)); dx = v3[0]; dy = v3[1]; dx.SubtractEquals(x); dy.SubtractEquals(y); int sy1 = (int)Basics.RoundUint(M.New <T>((double)subpixel_scale).Divide(M.Length(dx, dy)).ToInt()) >> subpixel_shift; // Calculate transformed coordinates at x2,y2 x.AddEquals(len); xt = x; yt = y; //m_trans_dir.Transform(ref xt, ref yt); IVector <T> v4 = m_trans_dir.TransformVector(MatrixFactory <T> .CreateVector2D(xt, yt)); xt = v4[0]; yt = v4[1]; int x2 = Basics.RoundInt(xt.Multiply((double)subpixel_scale)); int y2 = Basics.RoundInt(yt.Multiply((double)subpixel_scale)); // Calculate scale by X at x2,y2 dx = xt.Add(delta); dy = yt; //m_trans_inv.Transform(ref dx, ref dy); IVector <T> v5 = m_trans_inv.TransformVector(MatrixFactory <T> .CreateVector2D(dx, dy)); dx = v5[0]; dy = v5[1]; dx.SubtractEquals(x); dy.SubtractEquals(y); int sx2 = (int)Basics.RoundUint(M.New <T>((double)subpixel_scale).Divide(M.Length(dx, dy)).ToInt()) >> subpixel_shift; // Calculate scale by Y at x2,y2 dx = xt; dy = yt.Add(delta); //m_trans_inv.Transform(ref dx, ref dy); IVector <T> v6 = m_trans_inv.TransformVector(MatrixFactory <T> .CreateVector2D(dx, dy)); dx = v6[0]; dy = v6[1]; dx.SubtractEquals(x); dy.SubtractEquals(y); int sy2 = (int)Basics.RoundUint(M.New <T>((double)subpixel_scale).Divide(M.Length(dx, dy)).ToInt()) >> subpixel_shift; // Initialize the interpolators m_coord_x = new Dda2LineInterpolator(x1, x2, (int)len); m_coord_y = new Dda2LineInterpolator(y1, y2, (int)len); m_scale_x = new Dda2LineInterpolator(sx1, sx2, (int)len); m_scale_y = new Dda2LineInterpolator(sy1, sy2, (int)len); }
//---------------------------------------------------------------- public void Resynchronize(T xe, T ye, uint len) { m_trans.Transform(ref xe, ref ye); m_li_x = new Dda2LineInterpolator(m_li_x.Y, Basics.RoundInt(xe.Multiply((double)subpixel_scale_e.subpixel_scale)), (int)len); m_li_y = new Dda2LineInterpolator(m_li_y.Y, Basics.RoundInt(ye.Multiply((double)subpixel_scale_e.subpixel_scale)), (int)len); }
//-------------------------------------------------------------------- public LineBresenhamInterpolator(int x1, int y1, int x2, int y2) { m_x1_lr = (LineLr(x1)); m_y1_lr = (LineLr(y1)); m_x2_lr = (LineLr(x2)); m_y2_lr = (LineLr(y2)); m_ver = (Math.Abs(m_x2_lr - m_x1_lr) < Math.Abs(m_y2_lr - m_y1_lr)); if (m_ver) { m_len = (uint)Math.Abs(m_y2_lr - m_y1_lr); } else { m_len = (uint)Math.Abs(m_x2_lr - m_x1_lr); } m_inc = (m_ver ? ((y2 > y1) ? 1 : -1) : ((x2 > x1) ? 1 : -1)); m_interpolator = new Dda2LineInterpolator(m_ver ? x1 : y1, m_ver ? x2 : y2, (int)m_len); }