分形渲染器根本不显示图像?

Fractal renderer not displaying image at all?

我正在将分形渲染器从 Java 转换为 C# 以进行分配,我认为我已设置好所有内容,但分形本身不会渲染。

这是我运行程序时的照片:

下面是我的文件在包含项目本身的文件夹中的布局方式:

这是我用于实际渲染本身的代码,我认为它没有错误,但如果我错过了一些非常明显的东西,那么很抱歉浪费了你所有的时间:

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            init();
            start();
            this.DoubleBuffered = true;
        }

        //code to convert HSB to RGB from HSB.cs. All your code so i made it take up less space. 
        public struct HSBColor
        {
            float h;
            float s;
            float b;
            int a;
            public HSBColor(float h, float s, float b) { this.a = 0xff; this.h = Math.Min(Math.Max(h, 0), 255); this.s = Math.Min(Math.Max(s, 0), 255); this.b = Math.Min(Math.Max(b, 0), 255); }
            public HSBColor(int a, float h, float s, float b) { this.a = a; this.h = Math.Min(Math.Max(h, 0), 255); this.s = Math.Min(Math.Max(s, 0), 255); this.b = Math.Min(Math.Max(b, 0), 255); }
            public float H { get { return h; } }
            public float S { get { return s; } }
            public float B { get { return b; } }
            public int A { get { return a; } }
            public Color Color { get { return FromHSB(this); } }
            public static Color FromHSB(HSBColor hsbColor)
            {
                float r = hsbColor.b;
                float g = hsbColor.b;
                float b = hsbColor.b;
                if (hsbColor.s != 0)
                {
                    float max = hsbColor.b; float dif = hsbColor.b * hsbColor.s / 255f; float min = hsbColor.b - dif; float h = hsbColor.h * 360f / 255f;
                    if (h < 60f) { r = max; g = h * dif / 60f + min; b = min; }
                    else if (h < 120f) { r = -(h - 120f) * dif / 60f + min; g = max; b = min; }
                    else if (h < 180f) { r = min; g = max; b = (h - 120f) * dif / 60f + min; }
                    else if (h < 240f) { r = min; g = -(h - 240f) * dif / 60f + min; b = max; }
                    else if (h < 300f) { r = (h - 240f) * dif / 60f + min; g = min; b = max; }
                    else if (h <= 360f) { r = max; g = min; b = -(h - 360f) * dif / 60 + min; }
                    else { r = 0; g = 0; b = 0; }
                }
                return Color.FromArgb(hsbColor.a, (int)Math.Round(Math.Min(Math.Max(r, 0), 255)), (int)Math.Round(Math.Min(Math.Max(g, 0), 255)), (int)Math.Round(Math.Min(Math.Max(b, 0), 255)));
            }
        }
        private const int MAX = 256;      // max iterations
        private const double SX = -2.025; // start value real
        private const double SY = -1.125; // start value imaginary
        private const double EX = 0.6;    // end value real
        private const double EY = 1.125;  // end value imaginary
        private static int x1, y1, xs, ys, xe, ye;
        private static double xstart, ystart, xende, yende, xzoom, yzoom;
        private static float xy;
        private int c = 0;
        //private Image picture; Taken out, not needed
        // create rectangle variable JGB
        Rectangle rec;
        private Graphics g1;
        //private Cursor c1, c2; Taken out, not needed
        private System.Drawing.Bitmap bitmap;
        public void init()
        {
            //setSize(640, 480); changed this code to JGB:
            this.Size = new Size(640, 480);
            // Taken all lines out below. Not needed.
            /*finished = false; 
            addMouseListener(this);
            addMouseMotionListener(this);
            c1 = new Cursor(Cursor.WAIT_CURSOR);
            c2 = new Cursor(Cursor.CROSSHAIR_CURSOR); */
            x1 = 640;
            y1 = 480;
            xy = (float)x1 / (float)y1;
            //picture = createImage(x1, y1); Taken out and replaced with JGB:
            bitmap = new Bitmap(x1, y1);
            //g1 = picture.getGraphics(); changed to get my bitmap 
            g1 = Graphics.FromImage(bitmap);
            //finished = true; Finished variable deleted so not needed
        }
        //Code below didnt appear to do anything so i deleted it
        /*public void destroy() // delete all instances 
        {
            if (finished)
            {
                removeMouseListener(this);
                removeMouseMotionListener(this);
                picture = null;
                g1 = null;
                c1 = null;
                c2 = null;
                System.gc(); // garbage collection
            }
        } */

        public void start()
        {
            //action = false;
            //rectangle = false;

            initvalues();

            // added dialog box for instance loading and save varaibles needed for position and zoom to text file
            DialogResult dialog = MessageBox.Show("Would You Like to Load Your Last Instance?", "Load Instance?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
            if (dialog == DialogResult.Yes)
            {
                string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Public\Writelines.txt");
                xzoom = System.Convert.ToDouble(lines[0]);
                yzoom = System.Convert.ToDouble(lines[1]);
                xstart = System.Convert.ToDouble(lines[2]);
                ystart = System.Convert.ToDouble(lines[3]);
            }
            else
            {
                xzoom = (xende - xstart) / (double)x1;
                yzoom = (yende - ystart) / (double)y1;
            }

            mandelbrot();
        }
        public void stop()
        {
        }
        /*public void paint(Graphics g, PaintEventArgs e)
        {
            update(g);
        }
       public void update(Graphics g)
        {
            //g.DrawImage(picture, 0, 0);

        }*/
        private void mandelbrot()
        {
            int x, y;
            float h, b, alt = 0.0f;
            Color color;

            Pen pen = new Pen(Color.Black);
            for (x = 0; x < x1; x += 2)
                for (y = 0; y < y1; y++)
                {
                    h = pointcolour(xstart + xzoom * (double)x, ystart + yzoom * (double)y, c);
                    if (h != alt)
                    {
                        b = 1.0f - h * h;

                        color = HSBColor.FromHSB(new HSBColor(h * 255, 0.8f * 255, b * 255));
                        pen = new Pen(color);
                        alt = h;
                    }
                    g1.DrawLine(pen, x, y, x + 1, y);
                }
        }

        private float pointcolour(double xwert, double ywert, int j)
        {
            double r = 0.0, i = 0.0, m = 0.0;

            // int j = 0;

            while ((j < MAX) && (m < 4.0))
            {
                j++;
                m = r * r - i * i;
                i = 2.0 * r * i + ywert;
                r = m + xwert;
            }
            return (float)j / (float)MAX;
        }
        private void initvalues()
        {
            xstart = SX;
            ystart = SY;
            xende = EX;
            yende = EY;
            if ((float)((xende - xstart) / (yende - ystart)) != xy)
                xstart = xende - (yende - ystart) * (double)xy;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g1 = e.Graphics;
            g1.DrawImage(bitmap, 0, 0, x1, y1);
            using (Pen pen = new Pen(Color.White, 2))
            {
                e.Graphics.DrawRectangle(pen, rec);
            }
            Invalidate();


        }
        //added load method

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                xe = e.X;
                ye = e.Y;
                if (xs < xe)
                {
                    if (ys < ye) rec = new Rectangle(xs, ys, (xe - xs), (ye - ys));
                    else rec = new Rectangle(xs, ye, (xe - xs), (ys - ye));
                }
                else
                {
                    if (ys < ye) rec = new Rectangle(xe, ys, (xs - xe), (ye - ys));
                    else rec = new Rectangle(xe, ye, (xs - xe), (ys - ye));
                }
                this.Invalidate();
            }
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {

            if (e.Button == MouseButtons.Left)
            {
                // e.consume();  
                xs = e.X;
                ys = e.Y; // starting point y
                this.Invalidate();
            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            rec = new Rectangle(0, 0, 0, 0);
            if (e.Button == MouseButtons.Left)
            {
                int z, w;
                //e.consume();

                //xe = e.X;
                //ye = e.Y;
                if (xs > xe)
                {
                    z = xs;
                    xs = xe;
                    xe = z;
                }
                if (ys > ye)
                {
                    z = ys;
                    ys = ye;
                    ye = z;
                }
                w = (xe - xs);
                z = (ye - ys);
                if ((w < 2) && (z < 2)) initvalues();
                else
                {
                    if (((float)w > (float)z * xy)) ye = (int)((float)ys + (float)w / xy);
                    else xe = (int)((float)xs + (float)z * xy);
                    xende = xstart + xzoom * (double)xe;
                    yende = ystart + yzoom * (double)ye;
                    xstart += xzoom * (double)xs;
                    ystart += yzoom * (double)ys;
                }
                xzoom = (xende - xstart) / (double)x1;
                yzoom = (yende - ystart) / (double)y1;

                mandelbrot();

                string stringxzoom = xzoom.ToString();
                string stringyzoom = yzoom.ToString();
                string stringystart = ystart.ToString();
                string stringxstart = xstart.ToString();
                string[] lines = { stringxzoom, stringyzoom, stringxstart, stringystart };

                System.IO.File.WriteAllLines(@"C:\Users\Public\Writelines.txt", lines);
                this.Invalidate();
                //Repaint();
            }
        }

        private void restartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Restart();
        }
        private void exitToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void menuToolStripMenuItem_Click(object sender, EventArgs e)
        {
        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
        }
    }
}

将您的 Form1() 代码更改为这些

        InitializeComponent();
        init();
        start();
        this.DoubleBuffered = true;

        this.pictureBox1.Image = bitmap;

你取出了 InitializeComponent 调用(它应该是自动生成的)并且你从未将生成的位图设置为 pictureBox 的图像。另外,您可能想将图片框大小模式设置为缩放并放大它。