Search code examples
c#fractals

Fractal renderer not displaying image at all?


I'm converting a fractal renderer from Java to C# for an assignment and I think I have everything set up but the fractal itself won't render.

This is a photo of when I run the program:

enter image description here

And here is how my files are laid out in the folder that contains the project itself:

enter image description here

This is the code that I am using for the actually rendering itself which I think has no errors but if I've missed something extremely obvious then I'm sorry for wasting all of your time:

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)
        {
        }
    }
}

Solution

  • Change your Form1() code into these

            InitializeComponent();
            init();
            start();
            this.DoubleBuffered = true;
    
            this.pictureBox1.Image = bitmap;
    

    You took out the InitializeComponent call (which should be automatically generated) and you never set the resulting bitmap as the image of the pictureBox. Also, you might wanna set the picturebox Size mode to Zoom and enlarge it.