Hi all :)
I'm having a few problems with this assignment I'm working on. Its a Java - C# conversion of a Mandelbrot program.
What I'm trying to do, is draw the Mandelbrot to a Bitmap, and then print it onto the Windows form. So far I've been able to just draw aqua lines on the bitmap/ellipses etc if I've wanted too, I just can't seem to get the mandelbrot on there!
Code is here:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Assignment
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
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 Boolean action, rectangle, finished;
private static float xy;
//private Image picture;
private System.Drawing.Bitmap myBitmap;
private Graphics g1;
private Cursor c1, c2;
//private HSB HSBcol = new HSB();
private void Form1_Paint(object sender, PaintEventArgs e)
{
//Paint bitmap on load
g1 = e.Graphics;
g1.DrawImage(myBitmap, 0, 0, x1, y1);
g1.Dispose();
}
private void Form1_Load(object sender, EventArgs e)
{
//Paint to bitmap on load
init();
mandelbrot();
}
public void init() // all instances will be prepared
{
//HSBcol = new HSB();
//setSize(640, 480);
finished = false;
//addMouseListener(this);
//addMouseMotionListener(this);
//c1 = new Cursor(Cursor.WAIT_CURSOR);
//c2 = new Cursor(Cursor.CROSSHAIR_CURSOR);
//x1 = getSize().width;
x1 = 640;
//y1 = getSize().height;
y1 = 480;
xy = (float)x1 / (float)y1;
//picture = createImage(x1, y1);
myBitmap = new Bitmap(x1, y1);
g1 = Graphics.FromImage(myBitmap);
//g1 = picture.getGraphics();
finished = true;
}
public void destroy() // delete all instances
{
if (finished)
{
// removeMouseListener(this);
// removeMouseMotionListener(this);
//picture = null;
g1 = null;
c1 = null;
c2 = null;
GC.Collect(); // garbage collection
}
}
public void start()
{
action = false;
rectangle = false;
initvalues();
xzoom = (xende - xstart) / (double)x1;
yzoom = (yende - ystart) / (double)y1;
mandelbrot();
}
public void stop()
{
}
public void paint(Graphics g)
{
update(g);
}
public void update(Graphics g)
{
/* g.drawImage(picture, 0, 0, this);
if (rectangle)
{
g.setColor(Color.white);
if (xs < xe)
{
if (ys < ye) g.drawRect(xs, ys, (xe - xs), (ye - ys));
else g.drawRect(xs, ye, (xe - xs), (ys - ye));
}
else
{
if (ys < ye) g.drawRect(xe, ys, (xs - xe), (ye - ys));
else g.drawRect(xe, ye, (xs - xe), (ys - ye));
}
}*/
}
private void mandelbrot() // calculate all points
{
int x, y;
float h, b, alt = 0.0f;
action = false;
//setCursor(c1);
//showStatus("Mandelbrot-Set will be produced - please wait...");
for (x = 0; x < x1; x += 2)
for (y = 0; y < y1; y++)
{
h = pointcolour(xstart + xzoom * (double)x, ystart + yzoom * (double)y); // color value
if (h != alt)
{
b = 1.0f - h * h; // brightnes
///djm added
//HSBcol.fromHSB(h,0.8f,b); //convert hsb to rgb then make a Java Color
// Color col = new Color(0,HSBcol.rChan,HSBcol.gChan,HSBcol.bChan);
// g1.setColor(col);
//djm end
//djm added to convert to RGB from HSB
// g1.setColor(Color.getHSBColor(h, 0.8f, b));
//djm test
// Color col = Color.getHSBColor(h, 0.8f, b);
// int red = col.getRed();
// int green = col.getGreen();
// int blue = col.getBlue();
//djm
alt = h;
}
Pen mypen = new Pen(System.Drawing.Color.Aqua);
g1.DrawLine(mypen, x, y, x + 1, y);
}
//showStatus("Mandelbrot-Set ready - please select zoom area with pressed mouse.");
//setCursor(c2);
action = true;
}
private float pointcolour(double xwert, double ywert) // color value from 0.0 to 1.0 by iterations
{
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() // reset start values
{
xstart = SX;
ystart = SY;
xende = EX;
yende = EY;
if ((float)((xende - xstart) / (yende - ystart)) != xy)
xstart = xende - (yende - ystart) * (double)xy;
}
}
}
Now that code will just produce an Aqua box, which was a test I put in to see if I'm writing to the bitmap.
Also: Some of the variables aren't being used yet, there's some extra functionality I need to add once I have this working!
I found this Mandelbrot method online, it helps by converting the colours (I'm British, that's how we spell color :P) So they work, I just can't get it to write to the Bitmap.
private void mandelbrot() // calculate all points
{
int x, y;
float h, b, alt = 0.0f;
action = false;
for (x = 0; x < x1; x += 2)
for (y = 0; y < y1; y++)
{
h = pointcolour(xstart + xzoom * (double)x, ystart + yzoom * (double)y); // color value
if (h != alt)
{
b = 1.0f - h * h; // brightnes
Color color = HSBColor.FromHSB(new HSBColor(h * 255, 0.8f * 255, b * 255)); // VERY IMPORTANT
//djm
alt = h;
Pen pen = new Pen(color);
g1.DrawLine(pen, x, y, x + 1, y);
}
}
action = true;
}
Does anyone have any suggestions as to how I can get this Mandelbrot onto my Bitmap?
-Erslich
There is no longer "real life" - only AFK