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]; } } }
/// <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); }
/// <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); }
/// <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); } } }
/// <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; }
/// <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; }
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]; } } }