Mandelbrot程序未输出正确的数据 [英] Mandelbrot program isn't outputting correct data

查看:70
本文介绍了Mandelbrot程序未输出正确的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经为我的课堂分配了一个绘制Mandelbrot人物的程序.
我们必须从根本上使该程序绘制结果的位图.

I've been given an assignment for my class to make a program that draws Mandelbrot figures.
We have to basically get the program to draw a bitmap of the result.

事实是,我的CalcMBF函数仅将2作为Mandelbrot编号输出.
我完全不知道为什么会这样.有人可以帮我吗?

Thing is, my CalcMBF function only outputs 2 as the Mandelbrot number.
I have absolutely no idea why that is. Can anyone help me out?

这是我的代码:

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;
        }
    }
}

推荐答案

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

It computes beautifully. Only you made a mess of instance variables and arguments.

CalcMBF中,它应该是:

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

您有xCalcyCalc的位置,它们不是CalcMBF本地的.此外,虚部需要使用aWork的初始值进行计算.有趣的是,它仍然可以解决该错误,但它是不同的分形吸引子.

where you had xCalc and yCalc, which are not local to CalcMBF. Furthermore, the imaginary part needs to be computed with the initial value of aWork. Interestingly, it still works with that bug, but it is a different fractal attractor.

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

The mandelbrot set has its interesting regions in the complex plane at -2<=cr<=1 and -1<=ci<=1, so a constant bailout at iteration 2 can indicate that you chose your c value outside or in some boring region like the middle of the lake.

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

If you need more speed, remove the square root and compare distanceXY <= 4 instead.

这篇关于Mandelbrot程序未输出正确的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆