private static void ChangeMask(BinaryParticleCloud p)
 {
     var c = RandomColorMask();
     if (p.ColorMask.HasFlag(c))
     {
         p.ColorMask &= ~c;
     }
     else
     {
         p.ColorMask |= c;
     }
 }
        private BinaryParticleCloud SpawnColorChild()
        {
            var p = new BinaryParticleCloud();
            p.Location.Copy(Location);
            p.Velocity.Copy(Velocity);
            p.Acceleration.Copy(Acceleration);
            p.SplitCounter = SplitCounter;
            p.ColorMask = ColorMask;
            p.ParticleColor = ParticleColor;
            p.SplitChance = SplitChance;
            p.ColorIncrement = ColorIncrement;
            p.ColorDecrement = ColorDecrement;
            p.ChildLocationVariation = ChildLocationVariation;
            p.ChildVelocityVariation = ChildVelocityVariation;
            p.EmitPeriod = EmitPeriod;
            p.SplitPeriod = SplitPeriod;

            //p.ParticleColor = Color.FromRgb((byte)((ParticleColor.R + p.ParticleColor.R) / 2), (byte)((ParticleColor.G + p.ParticleColor.G) / 2), (byte)((ParticleColor.B + p.ParticleColor.B) / 2));

            var R = p.ParticleColor.R;
            var G = p.ParticleColor.G;
            var B = p.ParticleColor.B;

            //Convert RGB to CYMK

            var C = 1 - ((double)R / 255);
            var M = 1 - ((double)G / 255);
            var Y = 1 - ((double)B / 255);
            var K = (double)1;

            if (C < K)
                K = C;
            if (M < K)
                K = M;
            if (Y < K)
                K = Y;
            if (K == 1)
            { //Black
                C = 0;
                M = 0;
                Y = 0;
            }
            else
            {
                C = (C - K) / (1 - K);
                M = (M - K) / (1 - K);
                Y = (Y - K) / (1 - K);
            }

            //if (Y > 0.9)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Yellow);
            //}
            //if (M > 0.9)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Magenta);
            //}
            //if (C > 0.9)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Cyan);
            //}
            //if (K > 0.5)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Black);
            //    K = 0.1;
            //}
            //if (R > 230)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Red);
            //}
            //if (G > 230)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Green);
            //}
            //if (B > 230)
            //{
            //    p.ColorMask &= ~(ColorEvolutionMask.Blue);
            //}
            if (p.ColorMask == 0)
            {
                ChangeMask(p);
            }
            else
            {
                ColorEvolutionMask mask;
                while (!p.ColorMask.HasFlag(mask = RandomColorMask()))
                {

                }

                switch (mask)
                {
                    //RGB we reduce
                    case ColorEvolutionMask.Red:
                        R = (byte)Math.Max(R + (byte)ColorDecrement, R); //Max is for possible overflow
                        p.ParticleColor = Color.FromRgb(R, G, B);
                        break;
                    case ColorEvolutionMask.Green:
                        G = (byte)Math.Max(G + (byte)ColorDecrement, G);
                        p.ParticleColor = Color.FromRgb(R, G, B);
                        break;
                    case ColorEvolutionMask.Blue:
                        B = (byte)Math.Max(B + (byte)ColorDecrement, B);
                        p.ParticleColor = Color.FromRgb(R, G, B);
                        break;

                    //CYMK we increase
                    case ColorEvolutionMask.Cyan:
                        C = Math.Min(1, C + ColorIncrement);
                        p.ParticleColor = CymkToColor(C, Y, M, K);
                        break;
                    case ColorEvolutionMask.Yellow:
                        Y = Math.Min(1, Y + ColorIncrement);
                        p.ParticleColor = CymkToColor(C, Y, M, K);
                        break;
                    case ColorEvolutionMask.Magenta:
                        M = Math.Min(1, M + ColorIncrement);
                        p.ParticleColor = CymkToColor(C, Y, M, K);
                        break;
                }
            }
            return p;
        }