Пример #1
0
        void Crossover(IGenerateRandom rnd, UniverseRunner crossoverParent1,
                       UniverseRunner crossoverParent2)
        {
            double[] parent1 = crossoverParent1.PhysicsRules.Data;
            double[] parent2 = crossoverParent2.PhysicsRules.Data;
            double[] child   = PhysicsRules.Data;
            int      len     = parent1.Length;
            var      p1      = (int)(rnd.NextDouble() * len);
            var      p2      = (int)(rnd.NextDouble() * len);

            for (int i = 0; i < PhysicsRules.Data.Length; i++)
            {
                if (i < p1)
                {
                    child[i] = parent1[i];
                }
                else if (i >= p1 && i <= p2)
                {
                    child[i] = parent2[i];
                }
                else if (i > p2)
                {
                    child[i] = parent1[i];
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Display a single CA.
 /// </summary>
 /// <param name="universeRunner">The runner to use physics from.</param>
 public DisplaySingle(UniverseRunner universeRunner)
 {
     InitializeComponent();
     int len = universeRunner.PhysicsRules.Data.Length;
     _physics = new double[len];
     Array.Copy(universeRunner.PhysicsRules.Data, _physics, len);
 }
Пример #3
0
        /// <summary>
        ///     The constructor.
        /// </summary>
        public UniverseDisplayCell(int paneWidth, int paneHeight, Label label)
        {
            int width = paneWidth
                        /Settings.Default.Zoom;
            int height = paneHeight
                         /Settings.Default.Zoom;

            _label = label;

            var universe = new UniverseHolder(height, width, 3);
            var physics = new MergePhysics(universe);

            universe.Randomize(_rnd);
            physics.Randomize();

            _universeRunner = new UniverseRunner(universe, physics);
            _visualizer = new UniverseVisualizer(universe,
                Settings.Default.Zoom);

            _bitmap = new WriteableBitmap(
                paneWidth,
                paneHeight,
                96,
                96,
                PixelFormats.Bgr32,
                null);
        }
Пример #4
0
        /// <summary>
        /// The mouse was pressed.
        /// </summary>
        /// <param name="sender">The sending object.</param>
        /// <param name="e">The event.</param>
        private void CanvasOutput_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // update selected cell
            Point pt = Mouse.GetPosition(CanvasOutput);

            int univWidth = Settings.Default.PaneWidth;
            int univHeight = Settings.Default.PaneHeight;

            _selectedRow = (int) (pt.Y/univWidth);
            _selectedCol = (int) (pt.X/univHeight);

            _selectedCell = _multiverse[_selectedRow][_selectedCol];

            // if left-click then perform correct operation (if any)
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                if (_copySource != null)
                {
                    UniverseRunner target = _selectedCell
                        .UniverseRunner;
                    target.PhysicsRules.CopyData(
                        _copySource.PhysicsRules.Data);
                    target.Randomize(_rnd);
                }
                else if (_crossoverParent1 != null
                         && _crossoverParent2 == null)
                {
                    _crossoverParent2 = _selectedCell.UniverseRunner;
                }
                else
                {
                    UniverseRunner target = _selectedCell.UniverseRunner;
                    target.Crossover(_rnd, _crossoverParent1, _crossoverParent2);
                    target.Randomize(_rnd);
                }
            }
        }
Пример #5
0
 /// <summary>
 /// The copy popup menu was clicked.
 /// </summary>
 /// <param name="sender">The sending object.</param>
 /// <param name="e">The event.</param>
 private void MenuCopyPane_Click(object sender, RoutedEventArgs e)
 {
     _copySource = _selectedCell.UniverseRunner;
     _crossoverParent1 = null;
     _crossoverParent2 = null;
     BtnDeselect.IsEnabled = true;
 }
Пример #6
0
 /// <summary>
 /// The deselect button was clicked.
 /// </summary>
 /// <param name="sender">The sending object.</param>
 /// <param name="e">The event.</param>
 private void BtnDeselect_Click(object sender, RoutedEventArgs e)
 {
     _copySource = null;
     _crossoverParent1 = _crossoverParent2 = null;
     BtnDeselect.IsEnabled = false;
 }
Пример #7
0
            void Crossover(IGenerateRandom rnd, UniverseRunner crossoverParent1,
                UniverseRunner crossoverParent2)
        {
            double[] parent1 = crossoverParent1.PhysicsRules.Data;
            double[] parent2 = crossoverParent2.PhysicsRules.Data;
            double[] child = PhysicsRules.Data;
            int len = parent1.Length;
            var p1 = (int) (rnd.NextDouble()*len);
            var p2 = (int) (rnd.NextDouble()*len);

            for (int i = 0; i < PhysicsRules.Data.Length; i++)
            {
                if (i < p1)
                {
                    child[i] = parent1[i];
                }
                else if (i >= p1 && i <= p2)
                {
                    child[i] = parent2[i];
                }
                else if (i > p2)
                {
                    child[i] = parent1[i];
                }
            }
        }