// This program draws n x n sets of squares, arranged as on a chess board.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#include <errno.h>

#include "grsys.h"

int setOfSquares(float64 xA, float64 yA, int m, float64 p, float64 a) {
  float64 xB = xA + a;
  float64 yB = yA;
  float64 xC = xB;
  float64 yC = yA + a;
  float64 xD = xA;
  float64 yD = yC;
  float64 q = 1.0 - p;

  for (int i = 0; i < m; i++ ) {
    grsys_Move(xA, yA);
    grsys_Draw(xB, yB);
    grsys_Draw(xC, yC);
    grsys_Draw(xD, yD);
    grsys_Draw(xA, yA);

    float64 xT = xA;
    float64 yT = yA;

    xA = p*xA + q*xB;
    yA = p*yA + q*yB;
    xB = p*xB + q*xC;
    yB = p*yB + q*yC;
    xC = p*xC + q*xD;
    yC = p*yC + q*yD;
    xD = p*xD + q*xT;
    yD = p*yD + q*yT;
  }
}

int main(int argc, char **argv) {
  fprintf(stderr, "There will be n x n sets of squares.\n");
  fprintf(stderr, "Enter n (eg. 8 for (a chess board): ");
  int n ;
  int rc = fscanf(stdin, "%d", &n);
  if (rc != 1) {
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }
  float64 halfn = (float64)(n) / 2;
  fprintf(stderr, "How many squares in each set? (eg. 10): ");
  int m;
  rc = fscanf(stdin, "%d", &m);
  if (rc != 1) {
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "Enter interpolation factor between 0 and 1 (eg. 0.2): ");
  float64 lambda ;
  rc = fscanf(stdin, "%lf", &lambda);
  if (rc != 1) {
    fprintf(stderr, "%s\n", strerror(errno));
    exit(EXIT_FAILURE);
  }
  grsys_InitGr("manysq.hpg");
  float64 a = 1.9 * grsys_RMax / (float64)(n); // length of side of largest square
  for (int i = 0; i < n; i++ ) {
    for (int j = 0; j < n; j++ ) {
      float64 f ;
      if ((i+j)%2 == 1 ) {
        f = lambda;
      } else {
        f = 1 - lambda;
      }
      setOfSquares(grsys_XCenter+((float64)(i)-halfn)*a,
                   grsys_YCenter+((float64)(j)-halfn)*a,
        m, f, a);
    }
  }
  grsys_EndGr();
  exit(EXIT_SUCCESS);
  return EXIT_FAILURE;
}
