Exemple #1
0
        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);
        }
Exemple #2
0
        //----------------------------------------------------------------
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
 //----------------------------------------------------------------
 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);
        }