C#动画 - 将对象从A移动到B或按角度移动

时间:2010-06-17 16:28:18

标签: c# animation

你好我正在做一个小动画,它将一个物体从a点移动到b点或角度/弧度。

我现在拥有的是这个

Point CalcMove(Point pt, double angle, int speed)
    {
        Point ret = pt;

        ret.X = (int)(ret.X + speed * Math.Sin(DegToRad(angle)));
        ret.Y = (int)(ret.Y + speed * Math.Cos(DegToRad(angle)));

        return ret;
    }

但它看起来不像我的预期。

请帮帮忙?

更新:
哦,我正在使用 NETCF


CalcMove(Point pt,double angle,int speed)
“Point pt”是当前对象的位置。 “角度”是物体应该去的地方。 “速度”是迈出的一步。


经过几天的工作后...... 这就是我的工作...... Neko for Windows Mobile 6.5

3 个答案:

答案 0 :(得分:1)

使用旋转矩阵。此代码将从点(x,y)移动θ弧度到新点(px,px)

Point Rotate(x, y, theta)
    int px = (x * Math.Cos(theta)) - (y * Math.Sin(theta));
    int py = (y * Math.Cos(theta)) + (x * Math.Sin(theta));
    return new Point(px, py);
end

上面使用的矩阵,

[cosθ - sinθ][x]
[cosθ + sinθ][y]

使用图形坐标时,将顺时针绕圆圈移动一个点。

我上周完成了同样的事情。您可以通过查找要移动的总theta然后将其除以帧数(或步数)来对此进行动画处理。现在,在某个任意点开始每次移动(例如,(0,半径))并递增一些计数器totalSteps并移动始终从该初始点开始。如果你只是每帧移动一个点,你将累积一些错误,但如果你总是从初始点移动当前的增量,当增量= = totalTheta时停止,它将是完美的。如果这是有道理的,请告诉我。

也许我应该多说一点。假设你有一个方法“BeginMove”:

double totalTheta = 0;
double increment = 0;
double currentTheta = 0;
bool moving = false;
void BeginMove()
{
    totalTheta = (2 * Math.PI) / numObjects;
    increment = totalTheta / steps;
    currentTheta = 0;
    moving = true;
}

现在你有一个方法可以每帧更新一次移动:

void Update
{
    if (!moving) return;
    // do a min/max to ensure that you never pass totalTheta when incrementing.
    // there will be more error handling, but this is the basic idea.
    currentTheta += increment;
    SomeObject.Location = Rotate(0, radius, currentTheta);
    moving = (currentTheta < totalTheta);
}

根据你的具体情况,这里显然会有更多的逻辑,但这个想法是:

  1. 找出要移动的总theta。
  2. 查找增量(totalTheta / steps)
  3. 保持已经移动的总数。
  4. 在每次移动之前将运行总计增加角度增量。
  5. 从圆圈上的相同(任意)点开始每次移动,并按运行总计旋转。
  6. 重复直到运行总计==总theta。

答案 1 :(得分:0)

是的,你的公式有点不对:

让我们调用实际角度α,你想要旋转的角度是β d是该行的长度:d = sqrt(x x + y y)

要计算我们需要的新坐标:

  

sin(α+β)=cosβsinα+sinβcosα

     

cos(α+β)=cosαcosβ - sinαsinβ

cosα= x / d sinα= y / d

新的coords将是: x = sin(α+β)* d y = cos(α+β)* d

所有在一起:

double d = Math.Sqrt(x*x + y*y);
double sina = pt.Y / d;
double cosa = pt.X / d;
double sinb = Math.Sin(DegToRad(angle));
double cosb = Math.Cos(DegToRad(angle));

ret.X = (int)(cosb*sina + sinb*cosa);
ret.Y = (int)(cosa*cosb - sina*sinb);

答案 2 :(得分:0)

在这些建议代码的每次测试失败后(对我来说都很羞耻)。我刚刚提出了一个非常古老的解决方案。

每个xypixel画一个圆圈,这是我在回到TurboBasic(dos)之前做的一种方式

x = xcenter + radius * Cos(radian)<br/>
y = ycenter + radius * Sin(radian)

我通过将xy center作为对象位置来应用相同的想法,radius只是一个增量(每步)的值,而弧度是从最后一个xy对象位置和目标xy计算的

现在我的对象从A点移动到B点