Mandelbrot - 多而不是单色

时间:2015-05-01 19:53:52

标签: c mandelbrot

我有一个类的以下代码:

#include <stdio.h>
#include <math.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>

void destroy(void) {
  gtk_main_quit();
}

static void
put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green, guchar blue, guchar alpha);


typedef
struct complex{
   double re;
   double im;
} Complex;



int main(int argc, char** argv ){

gtk_init (&argc, &argv);

  gint width  = 256;
  gint height = 256;
  GdkColorspace cs = GDK_COLORSPACE_RGB;
  GdkPixbuf* pixbuf = gdk_pixbuf_new( cs, 1, 8, width, height);
  if (pixbuf == NULL ) {
     fprintf( stderr, "Not able to create gdkimage object\n");
     return -1;
  }

   /*
    * Lower left and upper right corners of complex plane
    */
   const Complex ll = {-2.5, -1.0};
   const Complex ur = { 1.0,  1.0};

   /*
    * Resolution: Nx by Ny pixels in complex plane
    */
   const int Nx = 256;
   const int Ny = 256;

   const double dx = (ur.re - ll.re)/(double)(Nx-1);
   const double dy = (ur.im - ll.im)/(double)(Ny-1);


   Complex z[Nx][Ny];
   Complex c[Nx][Ny];
   unsigned int pixel[Nx][Ny];

   /*
    * Number of iterations
    */
   const int number_of_iterations = 1024;
   /*
    * Once the real or imaginary parts go beyond the max
    *  values, they have "escaped"
    */
   const double Max = 4.0;

   /*
    * Initialize z and c
    */
   printf("Initializing ... \n");
   int i=0;
   for (i=0; i<Nx; i++) {
      int j=0;
      for (j=0; j<Ny; j++) {
        z[i][j].re = z[i][j].im = 0.;

        c[i][j].re = ll.re + i * dx;
        c[i][j].im = ll.im + j * dy;

    pixel[i][j] = 1; // close to black
    }
  }

   /*
    * Iterate for number of iterations
    */
   printf("Starting iterations ... \n");
   int k=0;
   unsigned int color;
   for(k=0; k<number_of_iterations; k++){
      /*
       * Figure out the color for this iteration
       */
      color = (unsigned int) ((k * 255 * 256 * 256 ) / number_of_iterations);

      for (i=0; i<Nx; i++) {
         int j=0;
         for (j=0; j<Ny; j++) {
        /*
             * if pixel value is 0, no need to compute anything.
             */
            Complex t = z[i][j];
            /*
             * check magnitude
             */
            if (t.re * t.re + t.im*t.im < Max) {
        /*
         * Compute z_n+1 = z_n * z_n + c
         */
        Complex znp1;
        znp1.re = t.re * t.re - t.im * t.im + c[i][j].re;
        znp1.im = 2.0 * t.re * t.im         + c[i][j].im;

        z[i][j] = znp1;

        pixel[i][j] = color;

        } else {
        pixel[i][j] = 0; // black

        }

//put draw part here
       guchar red   =  pixel[i][j] & 0xff;
       guchar green =  pixel[i][j] & 0xff00;
       guchar blue  =  pixel[i][j] & 0xff0000;
       guchar alpha = 255; //opacity
       put_pixel( pixbuf, i, j, red, green, blue, alpha);


     }
      }

   }
  printf("Done with iterations \n");


  GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  GtkWidget* image  = gtk_image_new();
  gtk_image_set_from_pixbuf((GtkImage*) image, pixbuf);

   /*
   * The next 7 lines of code are NOW used to end the program if x button
   */
  GdkScreen* screen = gtk_widget_get_screen (GTK_WIDGET (window));
  GdkVisual* visual = gdk_screen_get_rgba_visual (screen);
  if (visual == NULL)
     visual = gdk_screen_get_system_visual (screen);

  g_signal_connect(G_OBJECT (window), "destroy",
                        G_CALLBACK (destroy), NULL);

  gtk_container_add(GTK_CONTAINER (window), image);
  gtk_widget_show_all(window);
  gtk_widget_queue_draw(image);
  gtk_main();

  return 0;


}//end of main

/*
 * put_pixel - from: https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html
 */
static void
put_pixel (GdkPixbuf *pixbuf,
                int x, int y,
                guchar red, guchar green,
                guchar blue, guchar alpha) {

  int n_channels = gdk_pixbuf_get_n_channels (pixbuf);

  g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
  g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
  g_assert (gdk_pixbuf_get_has_alpha (pixbuf));
  g_assert (n_channels == 4);

  int width = gdk_pixbuf_get_width (pixbuf);
  int height = gdk_pixbuf_get_height (pixbuf);

  g_assert (x >= 0 && x < width);
  g_assert (y >= 0 && y < height);

  int rowstride = gdk_pixbuf_get_rowstride (pixbuf);
  guchar* pixels = gdk_pixbuf_get_pixels (pixbuf);

  guchar* p = pixels + y * rowstride + x * n_channels;
  p[0] = red;
  p[1] = green;
  p[2] = blue;
  p[3] = alpha;
}

我正试图将颜色变成多色。目前它只输出1种颜色。 我认为这可能与迭代有关。并且颜色不会从迭代变为迭代。 任何帮助都会很棒。

0 个答案:

没有答案