private void btnFuzzyLinkTest2New_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                #region Parse Gui

                int numFrom;
                if (!int.TryParse(txtFuzzyLinkTest2FromCount.Text, out numFrom))
                {
                    MessageBox.Show("Couldn't parse the from count as an integer", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                int numTo;
                if (!int.TryParse(txtFuzzyLinkTest2ToCount.Text, out numTo))
                {
                    MessageBox.Show("Couldn't parse the to count as an integer", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                int maxIntermediate;
                if (!int.TryParse(txtFuzzyLinkTest2MaxIntermediate.Text, out maxIntermediate))
                {
                    MessageBox.Show("Couldn't parse the max intermediate as an integer", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                int maxFinal;
                if (!int.TryParse(txtFuzzyLinkTest2MaxFinal.Text, out maxFinal))
                {
                    MessageBox.Show("Couldn't parse the max final as an integer", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                #endregion

                btnClear_Click(this, new RoutedEventArgs());

                #region Create Neurons

                Point3D fromPoint = new Point3D(-1.1, 0, 0);
                Point3D toPoint = new Point3D(1.1, 0, 0);

                List<INeuron> inNeurons = new List<INeuron>();

                // From
                inNeurons.Add(new Neuron_ZeroPos(fromPoint));		// old from

                Point3D[] fromPositions = new Point3D[numFrom];
                for (int cntr = 0; cntr < numFrom; cntr++)
                {
                    fromPositions[cntr] = fromPoint + Math3D.GetRandomVector_Spherical(1d);
                    inNeurons.Add(new Neuron_NegPos(fromPositions[cntr]));
                }

                // To
                inNeurons.Add(new Neuron_ZeroPos(toPoint));		// old to

                Point3D[] toPositions = new Point3D[numTo];
                for (int cntr = 0; cntr < numTo; cntr++)
                {
                    toPositions[cntr] = toPoint + Math3D.GetRandomVector_Spherical(1d);
                    inNeurons.Add(new Neuron_NegPos(toPositions[cntr]));
                }

                Point3D[] allNew = fromPositions.
                    Concat(toPositions).
                    ToArray();

                // Draw neurons
                List<Tuple<INeuron, SolidColorBrush>> outNeurons;
                ModelVisual3D model;
                BuildNeuronVisuals(out outNeurons, out model, inNeurons, new NeruonContainerShell(new Point3D(0, 0, 0), Quaternion.Identity, null), _colors);

                _debugVisuals.Add(model);
                _viewportNeural.Children.Add(model);

                #endregion

                var existingLinks = new[]
                {
                    Tuple.Create(fromPoint, toPoint, 1d),
                };

                var newLinks = ItemLinker.FuzzyLink(existingLinks, allNew, maxFinal, maxIntermediate);

                #region Draw Links

                // Draw links
                Model3DGroup posLines = null, negLines = null;
                DiffuseMaterial posDiffuse = null, negDiffuse = null;

                // Draw initial results
                BuildLinkVisual(ref posLines, ref posDiffuse, ref negLines, ref negDiffuse, fromPoint, toPoint, -1d, null, _colors);

                // Draw final results
                foreach (var result in newLinks)
                {
                    BuildLinkVisual(ref posLines, ref posDiffuse, ref negLines, ref negDiffuse, allNew[result.Item1], allNew[result.Item2], result.Item3 * 4d, null, _colors);
                }

                model = new ModelVisual3D();
                model.Content = posLines;
                _debugVisuals.Add(model);
                _viewportNeural.Children.Add(model);

                model = new ModelVisual3D();
                model.Content = negLines;
                _debugVisuals.Add(model);
                _viewportNeural.Children.Add(model);

                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }