home *** CD-ROM | disk | FTP | other *** search
-
- /****************************************************************************
- Microsoft RPC Version 2.0
- Copyright Microsoft Corp. 1992, 1993, 1994- 1996
- mandel Example
-
- FILE: calc.c
-
- PURPOSE: Server side of the RPC distributed application Mandel
-
- FUNCTIONS: MandelCalc() - Do the calculations for the Windows
- Mandelbrot Set distributed drawing program.
-
- ****************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <windows.h>
-
- #ifdef RPC
- #include "mdlrpc.h"
- #endif
- #include "mandel.h"
-
-
- short calcmand(double, double, short);
-
-
- void MandelCalc(PCPOINT pcptLL,
- PLONGRECT prcDraw,
- double precision,
- DWORD ulThreshold,
- LINEBUF * pbBuf)
- {
- DWORD h, height, width;
- double dreal, dimag, dimag2;
- short maxit = 0;
- short * pbPtr;
-
- pbPtr = *pbBuf; // LINEBUF is an array of shorts
-
- dreal = pcptLL->real + ((double)prcDraw->xLeft * precision);
- dimag = pcptLL->imag + ((double)prcDraw->yBottom * precision);
-
- maxit = (short) ulThreshold;
-
- height = (prcDraw->yTop - prcDraw->yBottom) + 1;
- width = (prcDraw->xRight - prcDraw->xLeft) + 1;
-
- for ( ; width > 0; --width, dreal += precision) {
- for (dimag2 = dimag, h = height; h > 0; --h, dimag2 += precision) {
- if ((dreal > 4.0) || (dreal < -4.0) ||
- (dimag2 > 4.0) || (dimag2 < -4.0))
- *(pbPtr++) = 0;
- else
- *(pbPtr++) = calcmand(dreal, dimag2, maxit);
- }
- }
- }
-
-
- /* C version of the assembly language program */
- short calcmand(double dreal,
- double dimag,
- short maxit)
- {
- double x, y, xsq, ysq;
- short k;
-
- k = maxit;
- x = dreal;
- y = dimag;
-
- while (1) {
- xsq = x * x;
- ysq = y * y;
- y = 2.0 * x * y + dimag;
- x = (xsq - ysq) + dreal;
- if (--k == 0)
- return((short) (maxit - k));
- if ((xsq + ysq) > 4.0)
- return((short) (maxit - k));
- }
- }
-