ftp.nice.ch/pub/next/unix/graphics/urt.3.0.s.tar.gz#/urt.3.0.s/tools/rlemandl.c

This is rlemandl.c in view mode; [Download] [Up]

/* 
 * rlemandl.c - Compute images of the Mandelbrot set in RLE format
 * 
 * Author:	John W. Peterson
 * 		Computer Science Dept.
 * 		University of Utah
 * Date:	Mon Nov  9 1987
 * Copyright (c) 1987, University of Utah
 */

#include <stdio.h>
#include <math.h>
#include "rle.h"

void
main( argc, argv )
int argc;
char **argv;
{
    char *out_fname = NULL;
    float real, imaginary, width, step;
    float ypos, xpos;
    rle_pixel ** rows;
    int xsize = 256, ysize = 256;
    int x_pixel, y_pixel;
    int oflag = 0, junk, verbose = 0;
    register int iter;
    /* May want to use floats...whatever's fastest */
    register double z_r, z_i, z_rs, z_is;
    
    if (! scanargs(argc, argv,
	         "% v%- s%-xsize!dysize!d o%-outfile!s real!f image!f width!f",
		   &verbose, 
		   &junk, &xsize, &ysize, &oflag, &out_fname,
		   &real, &imaginary, &width ))
	exit( -2 );

    step = width / (float) xsize;

    xpos = real - width / 2.0;
    ypos = imaginary - (step / 2.0) * (float) ysize;

    /* Re-use real as left margin */
    real = xpos;

    /* Change the default rle_dflt_hdr struct to match what we need */
    rle_dflt_hdr.rle_file = rle_open_f("rlemandl", out_fname, "w");
   
    rle_dflt_hdr.xmax = xsize - 1;
    rle_dflt_hdr.ymax = ysize - 1;
    rle_dflt_hdr.ncolors = 1;	/* One output channel */
    rle_dflt_hdr.alpha = 0;	/* No coverage (alpha) */

    rle_addhist( argv, (rle_hdr *)0, &rle_dflt_hdr );

    /* Allocate storage for the output row */
    if (rle_row_alloc( &rle_dflt_hdr, &rows ))
    {
	fprintf( stderr, "rlemandl: malloc failed\n" );
	exit( -2 );
    }

    /* Create the header in the output file */
    rle_put_setup( &rle_dflt_hdr );

    for (y_pixel = 0; y_pixel < ysize; y_pixel++)
    {
	xpos = real;
	for (x_pixel = 0; x_pixel < xsize; x_pixel++)
	{
	    z_r = 0;
	    z_i = 0;
	    iter = 0;
	    while (iter < 255 && ((z_rs = z_r * z_r) + (z_is = z_i * z_i)) < 4)
	    {
		z_i = 2 * z_r*z_i + ypos;
		z_r = z_rs - z_is + xpos;
		iter++;
	    }
	    rows[0][x_pixel] = (rle_pixel) iter == 1 ? 0 : iter;
	    xpos += step;
	}
	rle_putrow( rows, xsize + 1, &rle_dflt_hdr );
	if (verbose)
	    if ((y_pixel % 50) == 0)
		fprintf(stderr, "line %d...\n", y_pixel);
	ypos += step;
    }
    rle_puteof( &rle_dflt_hdr );
    exit( 0 );
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.