2016-04-06 8 views
0

私のシミュレーションでは、惑星の色はランダムに選択されます。残されたトレイルは、その惑星と同じ色になっているはずです。これは唯一の惑星がある場合にはうまくいきますが、新しい惑星が追加されると、すべての惑星の軌跡は新しい惑星の軌跡と同じ色になります。 https://imgur.com/a/EVh5oVB.netの重力シミュレーション - 惑星の後ろに軌跡を残すことに問題がある

私はそれぞれの惑星がそれ自体が同じ色をしていることが理にかなっています。ここに私のコードの関連部分は以下のとおりです。

Public Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles picSpace.Paint 
    For Each sun In sunsList 
     e.Graphics.FillEllipse(Brushes.Yellow, CInt(sun.positionX - 10), CInt(sun.positionY - 30), 20, 20) 
    Next 
    For Each planet In planetsList 
     Dim planetFill As Brush = New SolidBrush(planet.colour) 
     Dim trailColour As Pen = New Pen(planet.colour) 
     e.Graphics.FillEllipse(planetFill, planet.displayX - 5, planet.displayY - 5, 10, 10) 
     For count As Integer = 0 To counter 
      e.Graphics.DrawEllipse(trailColour, trail(0, count), trail(1, count), 1, 1) 
     Next 
    Next 
End Sub 

Sub Position() 
    planet.displayX = Math.Round(planet.positionX) 
    planet.displayY = Math.Round(planet.positionY) 
    trail(0, counter) = planet.displayX 
    trail(1, counter) = planet.displayY 
    counter += 1 
    ReDim Preserve trail(1, counter) 
End Sub 

Private Sub space_Click(sender As Object, e As EventArgs) Handles picSpace.Click 
    If hsbSimulationSpeed.Value > 0 Then 
     Timer1.Enabled = True 
    End If 
    If chkAddPlanets.Checked = True Then 
     planet = New Body 
     numberOfPlanets += 1 
     planet.colour = GetRandomColour() 
     planet.positionX = MousePosition.X 
     planet.positionY = MousePosition.Y - 25 
     planet.velocityX = txtVelocityX.Text * 1000 
     planet.velocityY = txtVelocityY.Text * 1000 
     planetsList.Add(planet) 
    ElseIf chkAddSuns.Checked = True Then 
     sun = New Body 
     numberOfSuns += 1 
     sun.positionX = MousePosition.X 
     sun.positionY = MousePosition.Y 
     sun.mass = hsbSunMass.Value * 5 * (10^29) 
     sunsList.Add(sun) 
    End If 
End Sub 

Function GetRandomColour() As Color 
    Dim rand As New Random 
    Return Color.FromArgb(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 
    256)) 
End Function 

この問題を解決する簡単な方法はありますか、私は完全にトレイルが生成される方法を変更する必要がありますか?

+0

forループが何をしているのかわかりません –

答えて

0

問題は、すべての惑星で使用されるtrail()リストが1つしかないことです。あなたのペインティングループでは、惑星ループが各惑星のために異なるペンを選択しますが、それらはすべて同じ座標で描画しています。最後の惑星は最初の惑星を上書きします。おそらくtrail()には、すべての惑星の座標が含まれています。

惑星オブジェクトの一部として、惑星ごとに1つの軌跡リストが必要です。

+0

trail()は動的配列であり、リストではありません。私はそれを惑星のプロパティにしようとしましたが、Visual Studioでは「自動実装されたプロパティはパラメータを持つことができません」と述べています。何か提案はありますか? – Lee

+0

トレイルはあなたのシステムのロジックを得るためには惑星の中にいる必要があります。 _How_は別の質問です。あなたが立ち往生した場合は別の質問をする必要があります。あなたが持っていたエラーには2つの明白な解決策があります: 'property'という単語を削除して、それが単に惑星クラス内のpublic変数になるようにしてください。または、自動実装されないようにしてください。新しい問題を尋ねるために最善を尽くしていれば、それを 'get'と' set'で記入してください。確かに既に尋ねられました。 –

関連する問題