Exemple #1
0
        public virtual void SetFurcationPoints()
        {
            furcationPoints.Clear();
            decimal fy = seed;

            setCount = 0;
            Xs       = new decimal[maxIterations];
            for (int it = 0; it < maxIterations; it++)
            {
                decimal x = fy;
                fy = FValue(fy);
                if (Math.Abs(fy) <= 256)
                {
                    decimal normY = (xMax - fy) / (xMax - XMin);
                    furcationPoints.Add(new DiagramSet(x, normY));
                    if (Parameter >= 3 && Parameter <= 3.567m)
                    {
                        CheckSet();
                    }
                    Xs[it] = x;
                    if (setCount > 0)
                    {
                        for (int s = 0; s < setCount; s++)
                        {
                            furcationPoints.RemoveAt(furcationPoints.Count - 1);
                        }
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            if (setCount == 0)
            {
                int        mid    = furcationPoints.Count / 2;
                DiagramSet middle = furcationPoints[furcationPoints.Count / 2];
                for (int s = furcationPoints.Count / 2 + 1; s < furcationPoints.Count; s++)
                {
                    middle.setPoints.Add(furcationPoints[s].setPoints[0]);
                }
                while (furcationPoints.Count > mid + 1)
                {
                    furcationPoints.RemoveAt(furcationPoints.Count - 1);
                }
            }
        }
        private void CalcDiagram()
        {
            gifCreater.images.Clear();

            int startIter = maxGIFIterations - 1;

            if (diagramDrawer.CreateGif)
            {
                startIter = 1;
            }

            int s = 2;
            int d = MaxFunctionIterations / maxGIFIterations;

            if (maxGIFIterations > 2)
            {
                d = MaxFunctionIterations / (maxGIFIterations - 2);
            }

            for (int m = startIter; m < maxGIFIterations; m++)
            {
                decimal start = DiagramStartParameter;
                decimal stop  = DiagramStopParameter;
                if (DiagramStartParameter > DiagramStopParameter)
                {
                    start = DiagramStopParameter;
                    stop  = DiagramStartParameter;
                }
                int     tempMax = CurrentFunction.MaxIterations;
                decimal tempP   = CurrentFunction.Parameter;
                decimal delta   = 1.0M * (stop - start) / BSize;
                diagramPoints.Clear();
                try {
                    for (int i = 0; i < BSize; i++)
                    {
                        report.PercentageComplete = i;
                        if (progressHandler is IProgress <ProgressReportModel> progress)
                        {
                            progress.Report(report);
                        }
                        if (token.IsCancellationRequested)
                        {
                            break;
                        }

                        decimal      p = start + i * delta;
                        BaseFunction diagramFunction = CurrentFunction;
                        diagramFunction.Parameter = p;
                        if (diagramDrawer.CreateGif)
                        {
                            diagramFunction.MaxIterations = s;
                        }
                        else
                        {
                            diagramFunction.MaxIterations = MaxFunctionIterations;
                        }
                        diagramFunction.SetFurcationPoints();
                        if (diagramFunction.furcationPoints.Count > 0)
                        {
                            if (CurrentFunction is HenonFunction)
                            {
                                for (int dp = diagramFunction.furcationPoints.Count - 1; dp > diagramFunction.furcationPoints.Count - 250 && dp >= 0; dp--)
                                {
                                    DiagramSet ds = diagramFunction.furcationPoints[dp];
                                    diagramPoints.Add(new DiagramSet(i, ds));
                                }
                            }
                            else
                            {
                                int last = diagramFunction.furcationPoints.Count - 1;
                                diagramPoints.Add(new DiagramSet(i, diagramFunction.furcationPoints[last]));
                            }
                        }
                        else
                        {
                            diagramPoints.Add(new DiagramSet(i, 2));
                        }
                    }
                    CurrentFunction.MaxIterations = tempMax;
                    CurrentFunction.Parameter     = tempP;
                    PlotDiagram();
                    if (diagramDrawer.CreateGif)
                    {
                        gifCreater.images.Add(diagramDrawer.Copy4GIF);
                        Thread.Sleep(1);
                    }
                    PlotForm.SetCurrentIteration(m);
                    if (s < 100)
                    {
                        s += 10;
                    }
                    else
                    if (s < 1000)
                    {
                        s += 100;
                    }
                    else
                    {
                        s += d;
                    }
                }
                catch {}
            }
            int mSec = 40 / maxGIFIterations;

            if (mSec == 0)
            {
                mSec = 1;
            }
            if (diagramDrawer.CreateGif)
            {
                gifCreater.Create(mSec, DiagramGifFileName);
            }
            ParamChoice2Form(DiagramStopParameter);
            diagramDrawer.CreateGif = false;
        }
Exemple #3
0
 public DiagramSet(decimal px, DiagramSet set)
 {
     X = px;
     Y = set.setPoints[0].Y;
     setPoints.AddRange(set.setPoints);
 }