将对象沿直线移动到另一个点

时间:2014-07-07 13:16:57

标签: c# winforms

我正在努力做到这一点。 我想要做的是将面板(10px×10px)移动到另一个相同尺寸的面板。

我想知道它是如何移动到另一个面板的...我用计时器实现了这一点。

我的代码有效,但我确实有一个问题我无法过去......

大多数情况下,正在移动的面板首先到达x或y坐标,然后在水平或垂直线上移动到另一个面板。

当移动速度非常快时看起来不错......但是当慢慢移动时我可以看到它看起来非常错误。

这只是我创建的一个小油漆工作,以向您展示我的想法: enter image description here

我希望B点直线移动到A点。

CODE:

        private void timer_Tick(object sender, EventArgs e)
        {
            smallX = pnlTo.Location.X;
            smallY = pnlTo.Location.Y;
            largeX = pnlFrom.Location.X;
            largeY = pnlFrom.Location.Y;

            //Should we find the ratio??

            // ####### X #######
            if (largeX != smallX)
            {
                int xRatio;
                if (largeX > smallX)
                {
                    //If 'large' is to the right.
                    //Find ratio.
                    xRatio = largeX / smallX;
                    pnlFrom.Left -= xRatio;
                }
                else
                {
                    //If 'large' is to the left.
                    //Find ratio.
                    xRatio = smallX / largeX;
                    pnlFrom.Left += xRatio;
                }
            }

            // ####### Y #######
            if (largeY != smallY)
            {
                int yRatio;
                if (largeY > smallY)
                {
                    //If 'large' is to the bottom.
                    yRatio = largeY / smallY;
                    pnlFrom.Top -= yRatio;

                    //pnlFrom.Top -= pixelsToMove;
                }
                else
                {
                    //If 'large' is to the top.
                    yRatio = smallY / largeY;
                    pnlFrom.Top += yRatio;

                    //pnlFrom.Top += pixelsToMove;

                }
            }

            lblLargeX.Text = pnlFrom.Location.X.ToString();
            lblLargeY.Text = pnlFrom.Location.Y.ToString();

            if (largeX == smallX && largeY == smallY)
            {
                timer.Stop();
            }
        }

我知道如何实现这一目标我是错误的...但有人可以帮助我朝着正确的方向前进吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

我不知道你的算法应该如何运作以及哪些错误(无论是逻辑还是实现),但从(x1;y1)转移到(x2;y2)很简单:

int steps = 10; // how many steps animation/timer will have
int x = x1 + (x2 - x1) * step / steps;
int y = y1 + (y2 - y1) * step / steps;

注意:

  • (x,y)是给定步骤的坐标
  • step是范围内的当前步骤:从1到steps
  • 先乘,然后分开!
  • 您必须存储初始/最终位置才能发挥作用(与经典delta算法不同,您必须使用float / double并且只存储deltasteps);

答案 1 :(得分:0)

您可能会发现一种更平滑的方法是在开始之前检查X和Y之间的差异,然后使用除以您想要作为“速度”的步数来划分。因此,如果要移动10个刻度,计算LargeY和SmallY,然后将其除以刻度并将类级变量设置为该量。每个滴答都按该数量递增。