private radian RotationAtDistance(Distance distance, long massAtCenter) { // at 147 billion, take 365 days var year = 31557600; // one year in ticks var earthOrbitDist = new Distance(147 * BILLION); radian earthOrbitSpeed = radian.FromDegree(360.0d / year); var distInEarthOrbits = distance / earthOrbitDist; var baseStarMass = (5000.0d * MILLION); var ratio = (double)(massAtCenter / baseStarMass); var massModifier = Math.Sqrt(ratio); double dir = (turnsClockwise) ? 1.0d : -1.0d; return(new radian(massModifier * dir * (earthOrbitSpeed.toDouble() / (distInEarthOrbits * distInEarthOrbits)))); }
private Distance GeneratePlanet(Star star, int relativePosition, Distance currentOutermost) { long mass = 0; Direction startingDirection = Direction.Zero; Distance startingDistance = Distance.Zero; int numMoons = 0; if (relativePosition < 5) { mass = rnd.Next(5000, 20000) * THOUSAND; numMoons = rnd.Next(1, 2) + rnd.Next(-2, 1); if (numMoons < 0) { numMoons = 0; } } else { mass = rnd.Next(100, 200) * MILLION; numMoons = rnd.Next(1, 6) + rnd.Next(1, 6) + rnd.Next(1, 6); } startingDistance = currentOutermost + new Distance(rnd.Next(300, 600) * BILLION); startingDirection = Direction.FromCirclePortion(rnd.NextDouble()); radian rotationPerTick = RotationAtDistance(startingDistance, star.Mass); var planet = star.AddPlanet("planet" + relativePosition, mass, startingDirection, startingDistance, rotationPerTick); var currentOutermostMoon = new Distance(10000 * MILLION); for (int n = 0; n < numMoons; n++) { currentOutermostMoon = GenerateMoon(planet, n, mass, currentOutermostMoon); } return(startingDistance); }
public void GenerateAsteroids(int number, string namePrefix, radian orbitSpeed) { Distance rangeDepth = OuterRange - InnerRange; Random rnd = new Random(); Parallel.For(0, number, n => { var ratio = rnd.NextDouble(); var angle = Direction.FromCirclePortion(rnd.NextDouble()); var orbitDistance = new Distance(ratio * rangeDepth + InnerRange); var asteroid = new Asteroid( name: string.Format("{0}_{1}", namePrefix, n), location: new OrbitLocation(Center, angle, orbitDistance, orbitSpeed), mass: 100000, parent: this); AddMember(asteroid); }); }
public Planet AddPlanet(string name, long mass, Direction startingDirection, Distance startingDistance, radian rotationPerTick) { var planet = new Planet(this, name, new OrbitLocation(this, startingDirection, startingDistance, rotationPerTick), mass); return(AddPlanet(planet)); }
public Planet AddMoon(string name, long mass, Direction startingDirection, Distance startingDistance, radian rotationPerTick) { var moon = new Planet(this, name, new OrbitLocation(this, startingDirection, startingDistance, rotationPerTick), mass); AddMember(moon); return(moon); }