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;using System.Drawing.Drawing2D;using System.Design;namespace Assignment_Attempt_3{ public partial class Form1 : Form { public Form1() { InitializeComponent(); Image bp = new Bitmap(this.pictureBox1.Height,this.pictureBox1.Width); Graphics g1 = Graphics.FromImage(bp); pictureBox1.Image = bp; } 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 bool action, rectangle, finished; private static float xy; private Image bp; private Graphics g1; //private HSB HSBcol=new HSB(); public void init() // all instances will be prepared { //HSBcol = new HSB(); this.Size = new Size(640, 480); finished = false; x1 = this.Width; y1 = this.Height; xy = (float)x1 / (float)y1; //?JAVA? picture = createImage(x1, y1); //?JAVA? g1 = picture.getGraphics(); finished = true; mandelbrot(); } public void destroy() // delete all instances { if (finished) { bp = null; g1 = 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() { } 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; } 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; } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { //e.consume(); if (action) { xs = e.X; ys = e.Y; } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { int z, w; //e.consume(); if (action) { 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(); rectangle = false; Refresh(); } } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { //e.consume(); if (action) { xe = e.X; ye = e.Y; rectangle = true; Refresh(); } } }}