/*
Sequential Mandelbrot program mandelbrot.c */
#include
<X11/Xlib.h>
#include
<X11/Xutil.h>
#include
<X11/Xos.h>
#include
<stdio.h>
#include
<string.h>
#include
<math.h>
#define X_RESN 800 /* x
resolution */
#define Y_RESN 800 /* y resolution */
typedef
struct complextype
{ float
real, imag;
}
Compl;
int
main (int argc, char *argv[])
{ Window
win; /* window
initialization */
unsigned
int
width, height, /* window
size */
x, y, /* window
position */
border_width, /* border width in pixels */
display_width,
display_height, /* size of screen */
screen; /* which screen */
char
*window_name = "Mandelbrot Set", *display_name = NULL;
GC
gc;
unsigned
long valuemask = 0;
XGCValues
values;
Display
*display;
XSizeHints size_hints;
Pixmap
bitmap;
XPoint
points[800];
FILE *fp, *fopen ();
char str[100];
XSetWindowAttributes attr[1];
/*
Mandlebrot variables */
int i, j, k;
Compl z,
c;
float lengthsq,
temp;
/*
connect to Xserver */
if (
(display = XOpenDisplay (display_name)) == NULL )
{
fprintf (stderr, "drawon: cannot connect to X server %s\n",
XDisplayName
(display_name) );
exit (-1);
}
/* get
screen size */
screen = DefaultScreen (display);
display_width = DisplayWidth (display,
screen);
display_height = DisplayHeight (display,
screen);
/* set
window size */
width = X_RESN;
height = Y_RESN;
/* set
window position */
x = 0;
y = 0;
/*
create opaque window */
border_width = 4;
win = XCreateSimpleWindow(display,
RootWindow (display, screen),
x, y, width, height, border_width,
BlackPixel (display, screen), WhitePixel (display, screen));
size_hints.flags = USPosition|USSize;
size_hints.x = x;
size_hints.y = y;
size_hints.width = width;
size_hints.height = height;
size_hints.min_width = 300;
size_hints.min_height = 300;
XSetNormalHints (display, win,
&size_hints);
XStoreName(display, win, window_name);
/*
create graphics context */
gc = XCreateGC (display, win, valuemask,
&values);
XSetBackground (display, gc, WhitePixel
(display, screen));
XSetForeground (display, gc, BlackPixel
(display, screen));
XSetLineAttributes
(display,gc,1,LineSolid,CapRound,JoinRound);
attr[0].backing_store = Always;
attr[0].backing_planes = 1;
attr[0].backing_pixel = BlackPixel(display,
screen);
XChangeWindowAttributes(display, win,
CWBackingStore | CWBackingPlanes |
CWBackingPixel, attr);
XMapWindow (display, win);
XSync(display, 0);
/*
Calculate and draw points */
for(i=0; i < X_RESN; i++)
{
for(j=0; j < Y_RESN; j++)
{
z.real = z.imag = 0.0; /* 800x800 scale factors */
c.real = ((float) j -
400.0)/200.0;
c.imag = ((float) i - 400.0)/200.0;
k = 0;
do
{ /* iterate for pixel color */
temp = z.real*z.real -
z.imag*z.imag + c.real;
z.imag = 2.0*z.real*z.imag +
c.imag;
z.real = temp;
lengthsq = z.real*z.real+z.imag*z.imag;
k++;
} while (lengthsq < 4.0 &&
k < 100);
if (k == 100) XDrawPoint (display,
win, gc, j, i);
} }
XFlush (display);
sleep (30);
/*
Program Finished */
}