www.pudn.com > CG2Programs.rar > selfSquare.c
/* selfSquare, Chapter 10, pp. 380-381 */ #include#include /* EXAMPLE STARTS HERE */ #include #include #include "graphics.h" typedef struct { float x, y; } Complex; void calculatePoint (Complex lambda, Complex * z) { float lambdaMagSq, discrMag; Complex discr; static Complex fourOverLambda = { 0, 0 }; static firstPoint = TRUE; if (firstPoint) { /* Compute 4 divided by lambda */ lambdaMagSq = lambda.x * lambda.x + lambda.y * lambda.y; fourOverLambda.x = 4 * lambda.x / lambdaMagSq; fourOverLambda.y = -4 * lambda.y / lambdaMagSq; firstPoint = FALSE; } discr.x = 1.0 - (z->x * fourOverLambda.x - z->y * fourOverLambda.y); discr.y = z->x * fourOverLambda.y + z->y * fourOverLambda.x; discrMag = sqrt (discr.x * discr.x + discr.y * discr.y); /* Update z, checking to avoid the sqrt of a negative number */ if (discrMag + discr.x < 0) z->x = 0; else z->x = sqrt ((discrMag + discr.x) / 2.0); if (discrMag - discr.x < 0) z->y = 0; else z->y = 0.5 * sqrt ((discrMag - discr.x) / 2.0); /* For half the points, use negative root, placing point in quadrant 3 */ if (random() < MAXINT/2) { z->x = -z->x; z->y = -z->y; } /* When imaginary part of discriminant is negative, point should lie in quadrant 2 or 4, so reverse sign of x */ if (discr.y < 0) z->x = -z->x; /* Finish up calculation for the real part of z */ z->x = 0.5 * (1 - z->x); } void selfSquare (Complex lambda, Complex z, int count) { int k; /* Skip the first few points */ for (k=0; k<10; k++) calculatePoint (lambda, &z); for (k=0; k