public void AddCelestrialBody(CelestrialBody body) { CelestrialBodies.Add(body); main.cbbCenteredBody.Items.Add(body.Name); main.cbbSelectedBody.Items.Add(body.Name); CalcForceForeachBody(); }
//Gibt die quadrierte Distanz zweier Körper zurück (da sie im nächsten rechenschritt ebenfalls als Quadrat gebraucht wird. public double getRadiusSquared(CelestrialBody celestrialBody1, CelestrialBody celestrialBody2) { double Radius; Radius = (Math.Pow(celestrialBody1.Position.X - celestrialBody2.Position.X, 2) + Math.Pow(celestrialBody1.Position.Y - celestrialBody2.Position.Y, 2) + Math.Pow(celestrialBody1.Position.Z - celestrialBody2.Position.Z, 2)); return(Radius); }
private void AddNumberToArray(CelestrialBody body) { int index = GetIndexToInsert(body.Position.Z); MoveNumbers(index); CurrentCelestrielBodyOrder[index] = body; }
//sucht den Körper mit der grössten Masse und gibt diesen zurück private CelestrialBody FindBiggestMassBody() { CelestrialBody BiggestMass = CelestrialBodies[0]; foreach (CelestrialBody body in CelestrialBodies) { if (body.Mass > BiggestMass.Mass) { BiggestMass = body; } } return(BiggestMass); }
//Die Funktion berechnet die Kraft, die zwischen den beiden Körper (1 und 2) wirken public Vector3D getForce(CelestrialBody celestrialBody1, CelestrialBody celestrialBody2) { double doubleForce; Vector3D vectorForce; Vector3D Einheitsvector; double RadiusSquared = getRadiusSquared(celestrialBody1, celestrialBody2); double Radius = Math.Sqrt(RadiusSquared); doubleForce = celestrialBody1.Mass * celestrialBody2.Mass / RadiusSquared * 6.67f * Math.Pow(10, -11); //Berechnet die Kraft Einheitsvector = new Vector3D((celestrialBody1.Position.X - celestrialBody2.Position.X) / Radius, (celestrialBody1.Position.Y - celestrialBody2.Position.Y) / Radius, (celestrialBody1.Position.Z - celestrialBody2.Position.Z) / Radius); //Zeigt die Richtung der Kraft (mit länge 1) vectorForce = new Vector3D((Einheitsvector.X * doubleForce), (Einheitsvector.Y * doubleForce), (Einheitsvector.Z * doubleForce)); return(vectorForce); }
//Die folgende Funktion zeichnet den einzelnen Körper auf den Hintergrund (surface) //Auf die Position des Körpers hat die folgende Funktion keinen Einfluss. Nur die Bildkoordinate wird verändert public void DrawSingleBody(WriteableBitmap surface, int width, int height, double ZoomFaktor, CelestrialBody CenteredBody, int RadiusMultiplicator, int RadiusSummand) { //Diese Region regelt die Grössenänderung, falls die Z-Koordinate benutzt wird. //Sie ändert den Zoomfaktor jedes einzelnen Körpers. So kann die Z-Koordinate dargestellt werden. #region Z-Komponente (grössenänderung) double RadiusZKomponent = 1; double RadiusZKomponentCenteredBody = 1; if (Position.Z != 0) { RadiusZKomponent = 1 + (Position.Z * ZoomFaktor / 500); //regelt die Z-Darstellung der Z-Koordinate des jeweiligen Körpers if (RadiusZKomponent < 0) { RadiusZKomponent = 0.0000001; } } if (CenteredBody.Position.Z != 0) { RadiusZKomponentCenteredBody = 1 + (CenteredBody.Position.Z * ZoomFaktor / 500); //regelt die Z-Darstellung, falls ein Körper in der zentriert wurde. if (RadiusZKomponentCenteredBody < 0) { RadiusZKomponentCenteredBody = 0.0000001; } } ZoomFaktor = RadiusZKomponentCenteredBody / RadiusZKomponent * ZoomFaktor; #endregion //Die folgenden 2 Code-Zeilen berechnen den Bildpunkt (X und Y Koordinate) an welchem der Körper gezeichnet werden soll //Dabei wird mit dem Zoomfaktor die Eigentliche Position "verkleinert" DrawPosition.X = (float)((width / 2f) - ((width / 2f - (Position.X - CenteredBody.Position.X)) * ZoomFaktor)); DrawPosition.Y = (float)((height / 2f) - ((height / 2f - (Position.Y - CenteredBody.Position.Y)) * ZoomFaktor)); //Der Körper wird an den berechneten BildKoordinaten gezeichnet. //Der Radius wird, neben dem Zoomfaktor, ebenfalls durch die Radienveränderung beeinflusst. Der Benutzer steuert es über die Einstellungen. "1" wird addiert, um zu gewährleisten, dass jeder Körper mit mind. 1 Pixelgrösse gezeichnet wird. //Die Farbe ist über die Farb-Property des Körpers definiert surface.FillEllipseCentered((int)DrawPosition.X, (int)DrawPosition.Y, (int)((Radius + RadiusSummand) * RadiusMultiplicator * ZoomFaktor) + 1, (int)((Radius + RadiusSummand) * RadiusMultiplicator * ZoomFaktor) + 1, BodyColor); }