Nadesłany przez Tomasz Lubiński, 19 stycznia 2009 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Fraktale Newtona - C#/Form1.cs:
// Fraktale Newtona // www.algorytm.org // Tomasz Lubinski (c) 2009 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace Newton { /// <summary> /// Fraktale Newtona /// www.algorytm.org /// Tomasz Lubinski (c) 2006 /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox maxy; private System.Windows.Forms.TextBox miny; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox maxx; private System.Windows.Forms.TextBox minx; private System.Windows.Forms.PictureBox Fractal; private Graphics graph; //Describes places to render private double ratioX; private double ratioY; private double minX; private double minY; private double maxX; private double maxY; private int downX; private int downY; //Describes sets to color private complex_t [] results = new complex_t[10]; private int resultsCnt; private bool cSet; private Pen [] penColors = new Pen[100]; private System.Windows.Forms.Panel Selection; private System.Windows.Forms.Button button2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.TextBox aIm; private System.Windows.Forms.TextBox aRe; private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label8; private System.Windows.Forms.Label label9; private System.Windows.Forms.Label label10; private System.Windows.Forms.Label label11; private System.Windows.Forms.Label label12; private System.Windows.Forms.Label label13; private System.Windows.Forms.Label label14; private System.Windows.Forms.RadioButton colorSpeed; private System.Windows.Forms.RadioButton colorSet; private System.Windows.Forms.TextBox pr0; private System.Windows.Forms.TextBox pi0; private System.Windows.Forms.TextBox pi1; private System.Windows.Forms.TextBox pr1; private System.Windows.Forms.TextBox pi2; private System.Windows.Forms.TextBox pr2; private System.Windows.Forms.TextBox pi3; private System.Windows.Forms.TextBox pr3; private System.Windows.Forms.TextBox pi4; private System.Windows.Forms.TextBox pr4; private System.Windows.Forms.TextBox pi5; private System.Windows.Forms.TextBox pr5; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Required for Windows Form Designer support // InitializeComponent(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.label2 = new System.Windows.Forms.Label(); this.maxy = new System.Windows.Forms.TextBox(); this.miny = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.maxx = new System.Windows.Forms.TextBox(); this.minx = new System.Windows.Forms.TextBox(); this.Fractal = new System.Windows.Forms.PictureBox(); this.Selection = new System.Windows.Forms.Panel(); this.button2 = new System.Windows.Forms.Button(); this.label3 = new System.Windows.Forms.Label(); this.aIm = new System.Windows.Forms.TextBox(); this.aRe = new System.Windows.Forms.TextBox(); this.label4 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label(); this.pr0 = new System.Windows.Forms.TextBox(); this.pi0 = new System.Windows.Forms.TextBox(); this.pi1 = new System.Windows.Forms.TextBox(); this.pr1 = new System.Windows.Forms.TextBox(); this.pi2 = new System.Windows.Forms.TextBox(); this.pr2 = new System.Windows.Forms.TextBox(); this.pi3 = new System.Windows.Forms.TextBox(); this.pr3 = new System.Windows.Forms.TextBox(); this.pi4 = new System.Windows.Forms.TextBox(); this.pr4 = new System.Windows.Forms.TextBox(); this.pi5 = new System.Windows.Forms.TextBox(); this.pr5 = new System.Windows.Forms.TextBox(); this.label9 = new System.Windows.Forms.Label(); this.label10 = new System.Windows.Forms.Label(); this.label11 = new System.Windows.Forms.Label(); this.label12 = new System.Windows.Forms.Label(); this.label13 = new System.Windows.Forms.Label(); this.label14 = new System.Windows.Forms.Label(); this.colorSpeed = new System.Windows.Forms.RadioButton(); this.colorSet = new System.Windows.Forms.RadioButton(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(392, 408); this.button1.Name = "button1"; this.button1.TabIndex = 15; this.button1.Text = "Generuj"; this.button1.Click += new System.EventHandler(this.button1_Click); // // label2 // this.label2.Location = new System.Drawing.Point(376, 72); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(64, 23); this.label2.TabIndex = 14; this.label2.Text = "Zakres Y"; // // maxy // this.maxy.Location = new System.Drawing.Point(440, 96); this.maxy.Name = "maxy"; this.maxy.Size = new System.Drawing.Size(120, 20); this.maxy.TabIndex = 13; this.maxy.Text = "textBox3"; // // miny // this.miny.Location = new System.Drawing.Point(440, 72); this.miny.Name = "miny"; this.miny.Size = new System.Drawing.Size(120, 20); this.miny.TabIndex = 12; this.miny.Text = "textBox4"; // // label1 // this.label1.Location = new System.Drawing.Point(376, 17); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(64, 23); this.label1.TabIndex = 11; this.label1.Text = "Zakres X"; // // maxx // this.maxx.Location = new System.Drawing.Point(440, 41); this.maxx.Name = "maxx"; this.maxx.Size = new System.Drawing.Size(120, 20); this.maxx.TabIndex = 10; this.maxx.Text = "textBox2"; // // minx // this.minx.Location = new System.Drawing.Point(440, 17); this.minx.Name = "minx"; this.minx.Size = new System.Drawing.Size(120, 20); this.minx.TabIndex = 9; this.minx.Text = "textBox1"; // // Fractal // this.Fractal.Cursor = System.Windows.Forms.Cursors.Cross; this.Fractal.Location = new System.Drawing.Point(8, 8); this.Fractal.Name = "Fractal"; this.Fractal.Size = new System.Drawing.Size(352, 352); this.Fractal.TabIndex = 8; this.Fractal.TabStop = false; this.Fractal.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Fractal_MouseUp); this.Fractal.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Fractal_MouseMove); this.Fractal.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Fractal_MouseDown); // // Selection // this.Selection.BackColor = System.Drawing.SystemColors.HighlightText; this.Selection.Location = new System.Drawing.Point(160, 160); this.Selection.Name = "Selection"; this.Selection.Size = new System.Drawing.Size(48, 40); this.Selection.TabIndex = 16; this.Selection.Visible = false; // // button2 // this.button2.Location = new System.Drawing.Point(480, 408); this.button2.Name = "button2"; this.button2.TabIndex = 17; this.button2.Text = "Reset"; this.button2.Click += new System.EventHandler(this.Form1_Load); // // label3 // this.label3.Location = new System.Drawing.Point(16, 368); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(184, 48); this.label3.TabIndex = 18; this.label3.Text = "W oknie po lewej zaznacz fragment do powiekszenia, badz wpisz zakres recznie i n" + "acisnij \"Generuj\""; // // aIm // this.aIm.Location = new System.Drawing.Point(440, 152); this.aIm.Name = "aIm"; this.aIm.Size = new System.Drawing.Size(120, 20); this.aIm.TabIndex = 20; this.aIm.Text = "textBox3"; // // aRe // this.aRe.Location = new System.Drawing.Point(440, 128); this.aRe.Name = "aRe"; this.aRe.Size = new System.Drawing.Size(120, 20); this.aRe.TabIndex = 19; this.aRe.Text = "textBox4"; // // label4 // this.label4.Location = new System.Drawing.Point(400, 136); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(40, 23); this.label4.TabIndex = 21; this.label4.Text = "a (Re)"; // // label5 // this.label5.Location = new System.Drawing.Point(400, 160); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(40, 23); this.label5.TabIndex = 22; this.label5.Text = "a (Im)"; // // label6 // this.label6.Location = new System.Drawing.Point(376, 184); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(40, 23); this.label6.TabIndex = 23; this.label6.Text = "n"; // // label7 // this.label7.Location = new System.Drawing.Point(424, 184); this.label7.Name = "label7"; this.label7.Size = new System.Drawing.Size(48, 23); this.label7.TabIndex = 24; this.label7.Text = "p(Re)^n"; // // label8 // this.label8.Location = new System.Drawing.Point(496, 184); this.label8.Name = "label8"; this.label8.Size = new System.Drawing.Size(56, 23); this.label8.TabIndex = 25; this.label8.Text = "p(Im)^n"; // // pr0 // this.pr0.Location = new System.Drawing.Point(408, 208); this.pr0.Name = "pr0"; this.pr0.Size = new System.Drawing.Size(72, 20); this.pr0.TabIndex = 26; this.pr0.Text = "textBox3"; // // pi0 // this.pi0.Location = new System.Drawing.Point(488, 208); this.pi0.Name = "pi0"; this.pi0.Size = new System.Drawing.Size(72, 20); this.pi0.TabIndex = 27; this.pi0.Text = "textBox3"; // // pi1 // this.pi1.Location = new System.Drawing.Point(488, 232); this.pi1.Name = "pi1"; this.pi1.Size = new System.Drawing.Size(72, 20); this.pi1.TabIndex = 29; this.pi1.Text = "textBox3"; // // pr1 // this.pr1.Location = new System.Drawing.Point(408, 232); this.pr1.Name = "pr1"; this.pr1.Size = new System.Drawing.Size(72, 20); this.pr1.TabIndex = 28; this.pr1.Text = "textBox3"; // // pi2 // this.pi2.Location = new System.Drawing.Point(488, 256); this.pi2.Name = "pi2"; this.pi2.Size = new System.Drawing.Size(72, 20); this.pi2.TabIndex = 31; this.pi2.Text = "textBox3"; // // pr2 // this.pr2.Location = new System.Drawing.Point(408, 256); this.pr2.Name = "pr2"; this.pr2.Size = new System.Drawing.Size(72, 20); this.pr2.TabIndex = 30; this.pr2.Text = "textBox3"; // // pi3 // this.pi3.Location = new System.Drawing.Point(488, 280); this.pi3.Name = "pi3"; this.pi3.Size = new System.Drawing.Size(72, 20); this.pi3.TabIndex = 33; this.pi3.Text = "textBox3"; // // pr3 // this.pr3.Location = new System.Drawing.Point(408, 280); this.pr3.Name = "pr3"; this.pr3.Size = new System.Drawing.Size(72, 20); this.pr3.TabIndex = 32; this.pr3.Text = "textBox3"; // // pi4 // this.pi4.Location = new System.Drawing.Point(488, 304); this.pi4.Name = "pi4"; this.pi4.Size = new System.Drawing.Size(72, 20); this.pi4.TabIndex = 35; this.pi4.Text = "textBox3"; // // pr4 // this.pr4.Location = new System.Drawing.Point(408, 304); this.pr4.Name = "pr4"; this.pr4.Size = new System.Drawing.Size(72, 20); this.pr4.TabIndex = 34; this.pr4.Text = "textBox3"; // // pi5 // this.pi5.Location = new System.Drawing.Point(488, 328); this.pi5.Name = "pi5"; this.pi5.Size = new System.Drawing.Size(72, 20); this.pi5.TabIndex = 37; this.pi5.Text = "textBox3"; // // pr5 // this.pr5.Location = new System.Drawing.Point(408, 328); this.pr5.Name = "pr5"; this.pr5.Size = new System.Drawing.Size(72, 20); this.pr5.TabIndex = 36; this.pr5.Text = "textBox3"; // // label9 // this.label9.Location = new System.Drawing.Point(376, 210); this.label9.Name = "label9"; this.label9.Size = new System.Drawing.Size(16, 23); this.label9.TabIndex = 38; this.label9.Text = "0"; // // label10 // this.label10.Location = new System.Drawing.Point(376, 232); this.label10.Name = "label10"; this.label10.Size = new System.Drawing.Size(16, 23); this.label10.TabIndex = 39; this.label10.Text = "1"; // // label11 // this.label11.Location = new System.Drawing.Point(376, 256); this.label11.Name = "label11"; this.label11.Size = new System.Drawing.Size(16, 23); this.label11.TabIndex = 40; this.label11.Text = "2"; // // label12 // this.label12.Location = new System.Drawing.Point(376, 280); this.label12.Name = "label12"; this.label12.Size = new System.Drawing.Size(16, 23); this.label12.TabIndex = 41; this.label12.Text = "3"; // // label13 // this.label13.Location = new System.Drawing.Point(376, 304); this.label13.Name = "label13"; this.label13.Size = new System.Drawing.Size(16, 23); this.label13.TabIndex = 42; this.label13.Text = "4"; // // label14 // this.label14.Location = new System.Drawing.Point(376, 328); this.label14.Name = "label14"; this.label14.Size = new System.Drawing.Size(16, 23); this.label14.TabIndex = 43; this.label14.Text = "5"; // // colorSpeed // this.colorSpeed.Checked = true; this.colorSpeed.Location = new System.Drawing.Point(384, 360); this.colorSpeed.Name = "colorSpeed"; this.colorSpeed.Size = new System.Drawing.Size(176, 16); this.colorSpeed.TabIndex = 44; this.colorSpeed.TabStop = true; this.colorSpeed.Text = "Koloruj szybkosc przyciagania"; // // colorSet // this.colorSet.Location = new System.Drawing.Point(384, 384); this.colorSet.Name = "colorSet"; this.colorSet.Size = new System.Drawing.Size(176, 16); this.colorSet.TabIndex = 45; this.colorSet.Text = "Koloruj zbior rozwiazania"; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(568, 443); this.Controls.Add(this.colorSet); this.Controls.Add(this.colorSpeed); this.Controls.Add(this.label14); this.Controls.Add(this.label13); this.Controls.Add(this.label12); this.Controls.Add(this.label11); this.Controls.Add(this.label10); this.Controls.Add(this.label9); this.Controls.Add(this.pi5); this.Controls.Add(this.pr5); this.Controls.Add(this.pi4); this.Controls.Add(this.pr4); this.Controls.Add(this.pi3); this.Controls.Add(this.pr3); this.Controls.Add(this.pi2); this.Controls.Add(this.pr2); this.Controls.Add(this.pi1); this.Controls.Add(this.pr1); this.Controls.Add(this.pi0); this.Controls.Add(this.pr0); this.Controls.Add(this.label8); this.Controls.Add(this.label7); this.Controls.Add(this.label6); this.Controls.Add(this.label5); this.Controls.Add(this.label4); this.Controls.Add(this.aIm); this.Controls.Add(this.aRe); this.Controls.Add(this.label3); this.Controls.Add(this.button2); this.Controls.Add(this.Selection); this.Controls.Add(this.button1); this.Controls.Add(this.label2); this.Controls.Add(this.maxy); this.Controls.Add(this.miny); this.Controls.Add(this.label1); this.Controls.Add(this.maxx); this.Controls.Add(this.minx); this.Controls.Add(this.Fractal); this.Name = "Form1"; this.Text = "Fraktale Newtona - www.algorytm.org (c) 2009 by Tomasz Lubinski"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } //for HSV colors private void HSV2RGB(float hue, float sat, float val, out float red, out float grn, out float blu) { int i; float f, p, q, t; red=0; grn=0; blu=0; if(val==0) {return;} else { hue/=60; i = (int)(hue); f = hue-i; p = val*(1-sat); q = val*(1-(sat*f)); t = val*(1-(sat*(1-f))); if (i==0) {red=val; grn=t; blu=p;} else if (i==1) {red=q; grn=val; blu=p;} else if (i==2) {red=p; grn=val; blu=t;} else if (i==3) {red=p; grn=q; blu=val;} else if (i==4) {red=t; grn=p; blu=val;} else if (i==5) {red=val; grn=p; blu=q;} } } //initialize color pens private void initializeColors() { float r, g, b; for (int i=0; i<penColors.Length-1; i++) { HSV2RGB((float)2.5*i, (float)0.85, (float)0.8, out r, out g, out b); penColors[i] = new Pen(Color.FromArgb((int)(r*255), (int)(g*255), (int)(b*255))); } penColors[penColors.Length-1] = new Pen(Color.FromArgb(0, 0, 0)); } //complex addition private complex_t add(complex_t a, complex_t b) { complex_t result = new complex_t(); result.real = a.real + b.real; result.imaginary = a.imaginary + b.imaginary; return result; } //complex substraction private complex_t sub(complex_t a, complex_t b) { complex_t result = new complex_t(); result.real = a.real - b.real; result.imaginary = a.imaginary - b.imaginary; return result; } //complex multiplication private complex_t mul(complex_t a, complex_t b) { complex_t result = new complex_t(); result.real = a.real*b.real - a.imaginary*b.imaginary; result.imaginary = a.real*b.imaginary + a.imaginary*b.real; return result; } //complex divide private complex_t div(complex_t a, complex_t b) { complex_t result = new complex_t(); double x = b.real*b.real + b.imaginary*b.imaginary; result.real = (a.real*b.real + a.imaginary*b.imaginary) / x; result.imaginary = (a.imaginary*b.real - a.real*b.imaginary) / x; return result; } //func = a[0] + a[1]*z^1 + a[2]*z^2 + ... a[n]*z^2 private complex_t func(complex_t z, complex_t [] a) { int i; complex_t result = new complex_t(); result.real = 0; result.imaginary = 0; for (i=a.Length-1; i>=0; i--) { result = add(a[i], mul(result, z)); } return result; } private int findResult(complex_t a) { int i; for (i=0; i<resultsCnt; i++) { if (sub(a, results[i]).complexModSq() < 0.1) { return i+1; } } results[resultsCnt] = a; resultsCnt++; return resultsCnt; } /// <summary> /// Generates newton's fractal /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, System.EventArgs e) { int i, j, level; complex_t p = new complex_t(); complex_t a = new complex_t(); complex_t []w = new complex_t[6]; complex_t []d = new complex_t[5]; Fractal.Image = new Bitmap(Fractal.Width, Fractal.Height); Graphics graph = Graphics.FromImage(Fractal.Image); graph.FillRectangle(new SolidBrush(Color.White), 0, 0, Fractal.Width, Fractal.Height); minX = double.Parse(minx.Text); minY = double.Parse(miny.Text); maxX = double.Parse(maxx.Text); maxY = double.Parse(maxy.Text); for (i=0; i<w.Length; i++) { w[i] = new complex_t(); } for (i=0; i<d.Length; i++) { d[i] = new complex_t(); } w[0].real = double.Parse(pr0.Text); w[0].imaginary = double.Parse(pi0.Text); w[1].real = double.Parse(pr1.Text); w[1].imaginary = double.Parse(pi1.Text); w[2].real = double.Parse(pr2.Text); w[2].imaginary = double.Parse(pi2.Text); w[3].real = double.Parse(pr3.Text); w[3].imaginary = double.Parse(pi3.Text); w[4].real = double.Parse(pr4.Text); w[4].imaginary = double.Parse(pi4.Text); w[5].real = double.Parse(pr5.Text); w[5].imaginary = double.Parse(pi5.Text); d[0].real = double.Parse(pr1.Text); d[0].imaginary = double.Parse(pi1.Text); d[1].real = 2.0*double.Parse(pr2.Text); d[1].imaginary = 2.0*double.Parse(pi2.Text); d[2].real = 3.0*double.Parse(pr3.Text); d[2].imaginary = 3.0*double.Parse(pi3.Text); d[3].real = 4.0*double.Parse(pr4.Text); d[3].imaginary = 4.0*double.Parse(pi4.Text); d[4].real = 5.0*double.Parse(pr5.Text); d[4].imaginary = 5.0*double.Parse(pi5.Text); a.real = double.Parse(aRe.Text); a.imaginary = double.Parse(aIm.Text); ratioX = (maxX - minX) / Fractal.Width; ratioY = (maxY - minY) / Fractal.Height; resultsCnt = 0; cSet = colorSet.Checked; for (i=0; i<Fractal.Height; i++) { p.imaginary = i*ratioY + minY; for (j=0; j<Fractal.Width; j++) { p.real = j*ratioX + minX; level = levelSet(a, p, w, d); graph.DrawRectangle(penColors[level-1], j, i, 1, 1); } } Fractal.Invalidate(); } //value is inside set in the returned level private int levelSet(complex_t a, complex_t p, complex_t [] w, complex_t [] d) { complex_t z = new complex_t(); complex_t z_prev = new complex_t(); int iteration; iteration = 0; z = p; do { z_prev = z; z = sub(z, mul(a, div(func(z, w), func(z, d)))); iteration++; } while (sub(z_prev,z).complexModSq() > 0.0001 && iteration < 100); if (cSet == true) { if (iteration < 100) { return 10*findResult(z); } } return iteration; } //intialize form private void Form1_Load(object sender, System.EventArgs e) { minx.Text = ((double)-1.5).ToString(); maxx.Text = ((double)1.5).ToString(); miny.Text = ((double)-1.5).ToString(); maxy.Text = ((double)1.5).ToString(); aRe.Text = ((double)1.0).ToString(); aIm.Text = ((double)0.0).ToString(); pr0.Text = ((double)-1.0).ToString(); pr1.Text = ((double)0.0).ToString(); pr2.Text = ((double)0.0).ToString(); pr3.Text = ((double)1.0).ToString(); pr4.Text = ((double)0.0).ToString(); pr5.Text = ((double)0.0).ToString(); pi0.Text = ((double)0.0).ToString(); pi1.Text = ((double)0.0).ToString(); pi2.Text = ((double)0.0).ToString(); pi3.Text = ((double)0.0).ToString(); pi4.Text = ((double)0.0).ToString(); pi5.Text = ((double)0.0).ToString(); minX = double.Parse(minx.Text); minY = double.Parse(miny.Text); maxX = double.Parse(maxx.Text); maxY = double.Parse(maxy.Text); ratioX = (maxX - minX) / Fractal.Width; ratioY = (maxY - minY) / Fractal.Height; initializeColors(); Fractal.Image = new Bitmap(Fractal.Width, Fractal.Height); graph = Graphics.FromImage(Fractal.Image); //render new fractal button1_Click(sender, e); } //draw selection private void Fractal_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Left) { downX = e.X; downY = e.Y; Selection.Width = 0; Selection.Height = 0; Selection.Visible = true; } } //redraw selection private void Fractal_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Selection.Width = Math.Abs(downX - e.X); Selection.Height = Math.Abs(downY - e.Y); Selection.Left = Fractal.Left + Math.Min(downX, e.X); Selection.Top = Fractal.Top + Math.Min(downY, e.Y); } } //clear selection - render new fractal for given selection private void Fractal_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { //remove selection Selection.Visible = false; //get new range to render minx.Text = (Math.Min(downX, e.X)*ratioX + minX).ToString(); maxx.Text = (Math.Max(downX, e.X)*ratioX + minX).ToString(); miny.Text = (Math.Min(downY, e.Y)*ratioY + minY).ToString(); maxy.Text = (Math.Max(downY, e.Y)*ratioY + minY).ToString(); minX = double.Parse(minx.Text); minY = double.Parse(miny.Text); maxX = double.Parse(maxx.Text); maxY = double.Parse(maxy.Text); //render new fractal button1_Click(sender, e); } } /// <summary> /// Class for complex numbers x = x.real + i*x.imaginary /// </summary> public class complex_t { public double real; public double imaginary; //calculate squared modus of given complex c public double complexModSq() { return (real*real + imaginary*imaginary); } } }