2016-05-09 14 views
2

私は、Visual Studio 2015で、私は惑星の絵の箱と星の絵の箱のプロジェクトを作成しています。惑星は、100msごとに更新され、タイマーで星を中心に回転しています。ここにコードがあります。分散効果のような効果を作り出すにはどうすればいいですか?

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? 
     } 
    } 

だから、惑星が星を周回して、私は星が消えたときに惑星が宇宙に漂うオフシミュレーションを作りたいです。

実際に星が消えた場合、どうなるでしょうか。

答えて

2

星が消えると、ニュートンの最初の法則が始まり、速度は一定であると言います。では、速度は何ですか?あなたが使用できる素敵な「トリック」、すなわち速度は、時間に対する位置の誘導体であるので、我々はそのd/dt angle = rotSpeedを使用

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

があります。

したがって、我々は単にその一定の速度に基づいて、その位置を更新する必要があります。

太陽があるとき driftTicksが、それは時間 timer1_Tickの数は、「チック」の数と呼ばれているされて
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 

行った。 0で始まり、句がトリガーするたびに1だけ増加します。


注:あなたがより柔軟かつ拡張可能な方法でこれを行うにしたい場合は、通常の頼みの綱は、むしろそれを毎回再計算するよりも、太陽が消えた瞬間にxy位置を保存することで、使用x0y0の保存された値。