/* METHODS */
            //we will plot the parameter along the horizontal axis and the orbit values along the vertical.
            public static List <Vector3> GetOrbit(QuadraticFunction quadraticFunction, float muMin, float muMax, int steps, float orbitPoint, int minOrbits, int maxOrbits, float scale)
            {
                List <Vector3> coordinates = new List <Vector3>();

                float dmu = (muMax - muMin) / steps;

                //loop through mu's:
                for (float mu = muMin; mu < muMax; mu += dmu)
                {
                    float orbitValue = orbitPoint;
                    quadraticFunction.mu = mu;

                    //loop through number of orbits to graph:
                    for (int i = 0; i < maxOrbits; i++)
                    {
                        float currentOrbit = quadraticFunction.Image(orbitValue);

                        if (i > minOrbits)
                        {
                            coordinates.Add(new Vector3(scale * mu, scale * currentOrbit, quadraticFunction.position.Z));
                        }

                        orbitValue = currentOrbit;
                    }
                }

                return(coordinates);
            }
        private Environment[] GetScholarsDayEnvironments()
        {
            Environment[] scholarsDayEnvironments = new Environment[23];

            //set environments:
            Vector3 graphicalAnalysisPosition = new Vector3(0, 0, -10);
            Vector3 lorenzPosition            = new Vector3(0, -29, -55);
            Vector3 white             = new Vector3(1, 1, 1);
            Vector3 black             = new Vector3(0, 0, 0);
            int     numberOfNodes     = 1000;
            float   nodeVelocity      = 0.03f;
            int     pointSize         = 0;
            int     functionPointSize = 1;
            float   scale             = 5;

            //first environment: demonstrate how graphical analysis is a great representation of iterating functions.
            CosineFunction cosineFunction = new CosineFunction(-6f, 6f, 1000, scale, graphicalAnalysisPosition, white, functionPointSize, 1);

            scholarsDayEnvironments[0] = LoadGraphicalAnalysis(cosineFunction, scale, 1000, nodeVelocity, false, pointSize);

            //second through ninth environments: quadratic function. change the mu values around.
            //QuadraticFunction quadraticFunction;
            QuadraticFunction       quadraticFunction;
            QuadraticSquareFunction quadraticSquareFunction;
            float startTime = 0;
            float finalTime = 1;
            int   steps     = 1000;

            //change mu around:

            scholarsDayEnvironments[1] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 1f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[2] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 1.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[3] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 2), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[4] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 2.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[5] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[6] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3.2f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[7] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[8] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3.839f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[9] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 4), scale, numberOfNodes, nodeVelocity, false, pointSize);

            scholarsDayEnvironments[14] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 1), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[15] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 1.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[16] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 2), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[17] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 2.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[18] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[19] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3.2f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[20] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[21] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 3.839f), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[22] = LoadGraphicalAnalysis(quadraticSquareFunction = new QuadraticSquareFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 4.5f), scale, numberOfNodes, nodeVelocity, false, pointSize);


            //watch points escape without the chaos tracker:
            scholarsDayEnvironments[10] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 5), scale, 1000, nodeVelocity, false, pointSize);

            //watch points escape with the chaos tracker:
            scholarsDayEnvironments[11] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 5), scale, 10000, nodeVelocity, true, pointSize);

            //Mandelbrot set:
            scholarsDayEnvironments[12] = LoadMandelbrotFractal();

            //Lorenz:
            //scholarsDayEnvironments[13] = LoadLorenzDataSet(lorenzPosition, 10, 10, 10, 0, 100, 30000, 10, 30, 8f / 3f);
            //scholarsDayEnvironments[13] = LoadDoublePendulumDataSet(new Vector3(0, 0, -10), 0.5f, 0.5f, 2, 1, 0, 10, 1000, 1, 1, 2, 2);
            //scholarsDayEnvironments[11] = LoadGraphicalAnalysis(quadraticFunction = new QuadraticFunction(startTime, finalTime, steps, scale, graphicalAnalysisPosition, white, functionPointSize, 4), scale, numberOfNodes, nodeVelocity, false, pointSize);
            scholarsDayEnvironments[13] = LoadBifurcationDiagramDataSet(new Vector3(-3, 0, -1), new Vector3(0, 0, 0), new QuadraticFunction(0, 1, 1000, 5, new Vector3(-3, 0, -1), new Vector3(0, 0, 0), 1, 1), 1f, 4f, 10000, 0.75f, 400, 500, 1);

            return(scholarsDayEnvironments);
        }
 private Environment LoadBifurcationDiagramDataSet(Vector3 position, Vector3 color, QuadraticFunction quadraticFunction, float muMin, float muMax, int steps, float orbitPoint, int minOrbits, int maxOrbits, float scale)
 {
     return(new DataSet(loader, position, color, PrimitiveType.Points, Mathematics.BifurcationDiagram.GetOrbit(quadraticFunction, muMin, muMax, steps, orbitPoint, minOrbits, maxOrbits, scale)));
 }