2015-11-08 24 views
0

我正在將一個分形渲染器從Java轉換爲C#作業,我想我已經設置了一切,但分形本身不會渲染。分形渲染器根本不顯示圖像?

這是當我運行程序的照片:

enter image description here

這裏是我的文件是如何包含項目本身的文件夾中的佈局:

enter image description here

這是我用於實際渲染本身的代碼,我認爲它沒有錯誤,但是如果我錯過了一些非常明顯的事情,那麼我很抱歉浪費你所有的時間:

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

回答

0

更改您Form1的()代碼到這些

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

     this.pictureBox1.Image = bitmap; 

你拿出InitializeComponent調用(應該自動生成),你永遠不設置所生成位圖的圖片框的圖像。此外,您可能想將圖片框尺寸模式設置爲放大並放大。

+0

謝謝你幫我在兩個網站:) – James