Mandelbrot程序未输出正确的数据

时间:2018-12-03 21:18:16

标签: c# mandelbrot

我已经为我的课堂分配了一个程序,该程序绘制了Mandelbrot的图形。
我们必须从根本上让程序绘制结果的位图。

事实是,我的CalcMBF函数仅输出2作为Mandelbrot编号。
我绝对不知道为什么。有人可以帮我吗?

这是我的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Mandelbrot_Figure
{
    class PreMainClass
    {
        static void main (String[] args)
        {
            Form1 screen;
            screen = new Form1();
            Application.Run(screen);
        }
    }

    public partial class Form1 : Form
    {
        Label xInputLabel = new Label();
        Label yInputLabel = new Label();
        Label maxInputLabel = new Label();
        Label scaleInputLabel = new Label();
        TextBox xInput = new TextBox();
        TextBox yInput = new TextBox();
        TextBox maxInput = new TextBox();
        TextBox scaleInput = new TextBox();
        Button okButton = new Button();
        double xValue = 0;
        double yValue = 0;
        double maxValue = 0;
        double scaleValue = 0;
        double pixVal = 0;
        double xCalc = 0;
        double yCalc = 0;
        double[,,] mArray = new double[400, 400, 1];

        public Form1()
        {
            InitializeComponent();
            BackColor = Color.FromArgb(255, 255, 255);
            Text = "Mandelbrot Figure";
            Size = new System.Drawing.Size(700, 950);
                //Messing with the xInput Box and Label
            xInput.Location = new Point(50, 50);
            xInput.Size = new Size(210, 50);
            xInput.Text = ("Please input desired X coordinate.");
            Controls.Add(xInput);
            xInputLabel.Location = new Point(46, 20);
            xInputLabel.Size = new Size(100, 40);
            xInputLabel.Text = "Middle X:";
            Controls.Add(xInputLabel);
                //Messing with the yInput Box and Label
            yInput.Location = new Point(320, 50);
            yInput.Size = new Size(210, 50);
            yInput.Text = ("Please input desired Y coordinate.");
            Controls.Add(yInput);
            yInputLabel.Location = new Point(316, 20);
            yInputLabel.Size = new Size(100, 40);
            yInputLabel.Text = "Middle Y:";
            Controls.Add(yInputLabel);
                //Messing with the maxInput Box and Label
            maxInput.Location = new Point(50, 126);
            maxInput.Size = new Size(210, 100);
            maxInput.Text = ("Please input desired max value.");
            Controls.Add(maxInput);
            maxInputLabel.Location = new Point(46, 100);
            maxInputLabel.Size = new Size(50, 40);
            maxInputLabel.Text = "Max:";
            Controls.Add(maxInputLabel);
                //Messing with the scaleInput Box and Label
            scaleInput.Location = new Point(320, 126);
            scaleInput.Size = new Size(210, 100);
            scaleInput.Text = ("Please input desired scale value.");
            Controls.Add(scaleInput);
            scaleInputLabel.Location = new Point(316, 100);
            scaleInputLabel.Size = new Size(80, 40);
            scaleInputLabel.Text = "Scale:";
            Controls.Add(scaleInputLabel);
                //Messing with the okButton
            okButton.Location = new Point(560, 49);
            okButton.Size = new Size(100, 100);
            okButton.Text = ("Start");
            Controls.Add(okButton);
            okButton.Click += CalcMandelbrot;
        }

        //Grabs data and drops it into an array
        public void CalcMandelbrot(object sender, EventArgs e)
        {
            xValue = Convert.ToDouble(xInput.Text);
            yValue = Convert.ToDouble(yInput.Text);
            maxValue = Convert.ToDouble(maxInput.Text);
            scaleValue = Convert.ToDouble(scaleInput.Text);
            pixVal = scaleValue * 0.01;
            for (double yCounter = 0; yCounter < 400; yCounter++)
            {
                yCalc = yValue + (200 * pixVal) + (yCounter * pixVal);
                for (double xCounter = 0; xCounter < 400; xCounter++)
                {
                    xCalc = xValue - (200 * pixVal) + (xCounter * pixVal);
                    mArray[Convert.ToInt32(xCounter), Convert.ToInt32(yCounter), 0] = CalcMBF(xCalc, yCalc, maxValue);
                    Console.WriteLine(xCounter + " " + yCounter + " " + " " + xCalc + " " + yCalc + " " + CalcMBF(xCalc, yCalc, maxValue));
                }
            }
        }

        public double CalcMBF(double aOut, double bOut, double maxValue)
        {
            double aWork = aOut;
            double bWork = bOut;
            double maxWork = maxValue;
            double distanceXY = 0;
            int mandelbrotNum = 0;
            for (int loopCounter = 1; loopCounter < maxWork; loopCounter++)
            {
                if (distanceXY <= 2)
                {
                    distanceXY = Math.Sqrt(Math.Pow((aWork), 2) + Math.Pow((bWork), 2));
                    mandelbrotNum = loopCounter;
                    aWork = (aWork * aWork) - (bWork * bWork) + xCalc;
                    bWork = (2 * aWork * bWork) + yCalc;
                }
                else
                {
                    aWork = 0;
                    bWork = 0;
                    break;
                }
            }
            return mandelbrotNum;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

计算精美。只有您弄乱了实例变量和参数。

CalcMBF中,它应该是:

var originala = aWork;
aWork = (aWork * aWork) - (bWork * bWork) + aOut;
bWork = (2 * originala * bWork) + bOut;

您有xCalcyCalc不在CalcMBF本地的位置。此外,虚部需要使用aWork的初始值来计算。有趣的是,它仍然可以解决该错误,但是它是different fractal吸引子。

mandelbrot集在复平面上的有趣区域为-2 <= cr <= 1和-1 <= ci <= 1,因此迭代2进行的持续纾困可以表明您选择的c值位于或之外。在一些无聊的地区,如湖中央。

如果需要更高的速度,请去除平方根,然后比较distanceXY <= 4