如何制作类似分散的效果?

How do I make a disperse-like effect?

我正在 Visual Studio 2015 年创建一个项目,其中我有一个行星图片框和一个星星图片框。行星在计时器中围绕恒星旋转,每 100 毫秒更新一次。这是代码。

public partial class Form1 : Form
{
    float angle = 0;
    float rotSpeed = 1;
    Point point = new Point(253, 151);
    int distance = 200;

 private void timer1_Tick(object sender, EventArgs e) {
       if (star.Visible) { // star is a picturebox
        angle += rotSpeed;
        int x = (int)(point.X + distance * Math.Sin(angle * Math.PI / 180));
        int y = (int)(point.Y + distance * Math.Cos(angle * Math.PI / 180));
        planet.Location = new Point(x, y);
       }
         else {
        // What do i put here so that when the star disappears, the planet
        // infinitely drifts off in the direction it was going?
       }
   }

所以行星围绕恒星运行,我想模拟当恒星消失时行星漂移到 space。

差不多吧,如果现实生活中一颗星星消失了会怎样。

一旦恒星消失,牛顿第一定律就起作用了,它说速度是恒定的。那么,什么是速度?有一个很好的'trick'你可以使用,即速度是位置相对于时间的导数,所以

vx = distance * Math.Cos(angle * Math.PI / 180) * rotSpeed * Math.PI / 180
vy = -distance * Math.Sin(angle * Math.PI / 180) * rotSpeed * Math.PI / 180

我们在哪里使用 d/dt angle = rotSpeed

因此,我们只需要根据它的恒定速度更新它的位置:

x0 = point.X + distance * Math.Sin(angle * Math.PI / 180)
y0 = point.Y + distance * Math.Cos(angle * Math.PI / 180)
x = x0 + driftTicks * vx
y = y0 + driftTicks * vy

其中 driftTicks 是 'ticks' 的次数,即当太阳消失时 timer1_Tick 被调用的次数。它从 0 开始,每次触发 else 子句时增加 1


注意:如果你想以更灵活和可扩展的方式做到这一点,通常的做法是在太阳消失的那一刻保存xy位置,而不是重新计算每次,并将这些保存的值用于 x0y0.