如何制作类似分散的效果?
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
。
注意:如果你想以更灵活和可扩展的方式做到这一点,通常的做法是在太阳消失的那一刻保存x
和y
位置,而不是重新计算每次,并将这些保存的值用于 x0
和 y0
.
我正在 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
。
注意:如果你想以更灵活和可扩展的方式做到这一点,通常的做法是在太阳消失的那一刻保存x
和y
位置,而不是重新计算每次,并将这些保存的值用于 x0
和 y0
.