Beispiel #1
0
        private IEnumerable <Star> GenerateArms(Random random)
        {
            int   arms     = random.Next(MinimumArms, MaximumArms);
            float armAngle = (float)((Math.PI * 2) / arms);

            int maxClusters = (Size / Spacing) / arms;

            for (int arm = 0; arm < arms; arm++)
            {
                int clusters = (int)Math.Round(random.NormallyDistributedSingle(maxClusters * ClusterCountDeviation, maxClusters));
                for (int i = 0; i < clusters; i++)
                {
                    //Angle from center of this arm
                    float angle = random.NormallyDistributedSingle(0.5f * armAngle * ClusterCenterDeviation, 0) + armAngle * arm;

                    //Distance along this arm
                    float dist = Math.Abs(random.NormallyDistributedSingle(Size * 0.4f, 0));

                    //Center of the cluster
                    var center = Vector3.Transform(new Vector3(0, 0, dist), Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), angle));

                    //Size of the cluster
                    var clsScaleDev = ArmClusterScaleDeviation * Size;
                    var clsScaleMin = MinArmClusterScale * Size;
                    var clsScaleMax = MaxArmClusterScale * Size;
                    var cSize       = random.NormallyDistributedSingle(clsScaleDev, clsScaleMin * 0.5f + clsScaleMax * 0.5f, clsScaleMin, clsScaleMax);

                    var stars = new SphereGalaxy(cSize, densityMean: 0.00025f, deviationX: 2, deviationY: 1, deviationZ: 2).Generate(random);
                    foreach (var star in stars)
                    {
                        yield return(star.Offset(center).Swirl(Vector3.UnitY, Swirl));
                    }
                }
            }
        }
Beispiel #2
0
        private IEnumerable <Star> GenerateCenter(Random random)
        {
            //Add a single central cluster
            var sphere = new SphereGalaxy(
                size: Size * CenterClusterScale,
                densityMean: CenterClusterDensityMean,
                densityDeviation: CenterClusterDensityDeviation,
                deviationX: CenterClusterScale,
                deviationY: CenterClusterScale,
                deviationZ: CenterClusterScale
                );

            var cluster = new ClusterGalaxy(sphere,
                                            CenterClusterCountMean, CenterClusterCountDeviation, Size * CenterClusterPositionDeviation, Size * CenterClusterPositionDeviation, Size * CenterClusterPositionDeviation
                                            );

            foreach (var star in cluster.Generate(random))
            {
                yield return(star.Swirl(Vector3.UnitY, Swirl * 5));
            }
        }