示例#1
0
        protected internal override IEnumerable<Star> Generate(Random random)
        {
            var density = Math.Max(0, random.NormallyDistributedSingle(_densityDeviation, _densityMean));
            var countMax = Math.Max(0, (int)(_size * _size * _size * density));
            if (countMax <= 0)
                yield break;

            var count = random.Next(countMax);

            for (int i = 0; i < count; i++)
            {
                var pos = new Vector3(
                    random.NormallyDistributedSingle(_deviationX * _size, 0),
                    random.NormallyDistributedSingle(_deviationY * _size, 0),
                    random.NormallyDistributedSingle(_deviationZ * _size, 0)
                );
                var d = pos.Length() / _size;
                var m = d * 2000 + (1 - d) * 15000;
                var t = random.NormallyDistributedSingle(4000, m, 1000, 40000);

                yield return new Star(
                    pos,
                    StarName.Generate(random),
                    t
                );
            }
        }
        protected internal override IEnumerable<Star> Generate(Random random)
        {
            var count = Math.Max(0, random.NormallyDistributedSingle(_countDeviation, _countMean));
            if (count <= 0)
                yield break;

            for (int i = 0; i < count; i++)
            {
                Vector3 center = new Vector3(
                    random.NormallyDistributedSingle(_deviationX, 0),
                    random.NormallyDistributedSingle(_deviationY, 0),
                    random.NormallyDistributedSingle(_deviationZ, 0)
                );

                foreach (var star in _basis.Generate(random))
                    yield return star.Offset(center);
            }
        }
示例#3
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 Sphere(cSize, densityMean: 0.00025f, deviationX: 1, deviationY: 1, deviationZ: 1).Generate(random);
                    foreach (var star in stars)
                        yield return star.Offset(center).Swirl(Vector3.UnitY, Swirl);
                }
            }
        }
示例#4
0
        protected internal override IEnumerable<Star> Generate(Random random)
        {
            var centralVoidSize = random.NormallyDistributedSingle(CentralVoidSizeDeviation, CentralVoidSizeMean);
            if (centralVoidSize < 0)
                centralVoidSize = 0;
            var centralVoidSizeSqr = centralVoidSize * centralVoidSize;

            foreach (var star in GenerateArms(random))
                if (star.Position.LengthSquared() > centralVoidSizeSqr)
                    yield return star;

            foreach (var star in GenerateCenter(random))
                if (star.Position.LengthSquared() > centralVoidSizeSqr)
                    yield return star;

            foreach (var star in GenerateBackgroundStars(random))
                if (star.Position.LengthSquared() > centralVoidSizeSqr)
                    yield return star;
        }
        public static Vector3 GenerateStarColor(Random random)
        {
            var temp = random.NormallyDistributedSingle(7000, 6000, 1000, 40000);

            return ConvertTemperature(temp);
        }