/***************************************************************************************/
//
// THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
/***************************************************************************************/

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include "Svga256.h"
 
int huge DetectVGA256()
{
  int Vid=4;
  return Vid;
}
 
void main(int argc, char *argv[])
{
      register double xmin, xmax, ymin, ymax, fact=1.0;
      register double ypy, x, y, x0, y0, xp, yp, const_scr=1.0;
      register double deltax, deltay, p, q, ya, r, xkp1, ykp1;
      register int npix=1024, npiy=768, kcolor;
      register int k, np, nq, ipen;
      char *endptr;
      int graphdriver=DETECT;
      int graphmode;
 
      p = strtod(argv[1],&endptr);
      q = strtod(argv[2],&endptr);
      xmin = strtod(argv[3],&endptr);
      xmax = strtod(argv[4],&endptr);
      ymin = strtod(argv[5],&endptr);
      ymax = strtod(argv[6],&endptr);
      kcolor = atoi(argv[7]);
      if(kcolor == 0) kcolor = 256;
 
      installuserdriver("Svga256",DetectVGA256);
      initgraph(&graphdriver, &graphmode, "c:\\borlandc\\bgi");
      if(fact>=1.0 || fact <=0.0)
        fact = 1.0;
      else {
        npix = (int)(npix*fact);
        npiy = (int)(npiy*fact);
      }
      deltax = (xmax-xmin)/(double)(npix-1);
      deltay = (ymax-ymin)/(double)(npiy-1);
 
      cleardevice();
      for (np=0; np<=npix-1; np++) {
        x0 = xmin + (double)np*deltax;
        for (nq=0; nq<=npiy-1; nq++) {
          y0 = ymin + (double)nq*deltay;
          x = x0;
          y = y0;
          k  = 0;
 
          do {
            xkp1 = (x+y)*(x-y) + p;
            ya   = x*y;
            ykp1 = ya + ya + q;
            r    = xkp1*xkp1 + ykp1*ykp1;
            k++;
 
            if (r >= kcolor) {
              ipen = 30 + k;
              xp = const_scr*(double)np;
              yp = (double)nq;
              putpixel(xp,yp,ipen);
            }
 
            if (k == kcolor) {
              ipen = 1;
              xp = const_scr*(double)np;
              yp = (double)nq;
              putpixel(xp,yp,ipen);
            }
 
            x = xkp1;
            y = ykp1;
          } while (r <= kcolor && k<=kcolor);
        }
          if(kbhit()) break;
      }
 
      getch();
      closegraph();
}
