CALC.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:2k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                         mandel Example
  5.     FILE:       calc.c
  6.     PURPOSE:    Server side of the RPC distributed application Mandel
  7.     FUNCTIONS:  MandelCalc() - Do the calculations for the Windows
  8.                                Mandelbrot Set distributed drawing program.
  9. ****************************************************************************/
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <windows.h>
  13. #ifdef RPC
  14. #include "mdlrpc.h"
  15. #endif
  16. #include "mandel.h"
  17. short calcmand(double, double, short);
  18. void MandelCalc(PCPOINT    pcptLL,
  19.                 PLONGRECT  prcDraw,
  20.                 double     precision,
  21.                 DWORD      ulThreshold,
  22.                 LINEBUF *  pbBuf)
  23. {
  24.     DWORD   h, height, width;
  25.     double  dreal, dimag, dimag2;
  26.     short   maxit = 0;
  27.     short * pbPtr;
  28.     pbPtr = *pbBuf;   // LINEBUF is an array of shorts
  29.     dreal = pcptLL->real + ((double)prcDraw->xLeft * precision);
  30.     dimag = pcptLL->imag + ((double)prcDraw->yBottom * precision);
  31.     maxit = (short) ulThreshold;
  32.     height = (prcDraw->yTop - prcDraw->yBottom) + 1;
  33.     width = (prcDraw->xRight - prcDraw->xLeft) + 1;
  34.     for ( ; width > 0; --width, dreal += precision) {
  35.         for (dimag2 = dimag, h = height; h > 0; --h, dimag2 += precision) {
  36.             if ((dreal > 4.0) || (dreal < -4.0) ||
  37.                 (dimag2 > 4.0) || (dimag2 < -4.0))
  38.                 *(pbPtr++) = 0;
  39.             else
  40.                 *(pbPtr++) = calcmand(dreal, dimag2, maxit);
  41.         }
  42.     }
  43. }
  44. /* C version of the assembly language program */
  45. short calcmand(double dreal,
  46.                double dimag,
  47.                short  maxit)
  48. {
  49.     double x, y, xsq, ysq;
  50.     short k;
  51.     k = maxit;
  52.     x = dreal;
  53.     y = dimag;
  54.     while (1) {
  55.         xsq = x * x;
  56.         ysq = y * y;
  57.         y = 2.0 * x * y + dimag;
  58.         x = (xsq - ysq) + dreal;
  59.         if (--k == 0)
  60.             return((short) (maxit - k));
  61.         if ((xsq + ysq) > 4.0)
  62.             return((short) (maxit - k));
  63.     }
  64. }