/*
 * File: testgen.c
 * Author: Andrew Salo
 * Date: 16.03.03
 */


#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#define TESTS 50 /* Кол-во тестов */
#define TESTPATH "tests/" /* Путь к тестам */
#define INIT_POINTS 10 /* Исходные точки */
#define LEN_MAX 100 /* Макс. и мин.     */ 
#define LEN_MIN 10  /*     длина дороги */


struct POINT {
  float x;
  float y;
  float length;
  float alpha;
} pts[INIT_POINTS];

/* Прототипы функций */
void randomize (void);
int gen_init_points (const char *);


/*
 * int main (int, char **) ---
 * главная процедура
 */
int main (int argc, char **argv)
{
  int i, ln;
  char test[30];

  strcpy (test, TESTPATH "test\0");
  ln = strlen (test);

  randomize ();

  for (i = 0; i < TESTS; i++)
    {
      /* Номер теста */
      sprintf (&test[ln], "%d\0", i);

      /* Генерация исходных точек */
      if (gen_init_points (test) != 0)
	exit (1);

      /* Генерация случайных точек */
      if (gen_rand_points (test) != 0)
	exit (1);
    }

  exit (0);
}


/*
 * void randomize (void) ---
 * инициализация генератора случайных чисел
 */
void randomize (void)
{
  srand ((unsigned int) getpid ());
}


/*
 * int gen_init_points (const char*) ---
 * генерация исходных точек
 */
int gen_init_points (const char *name)
{
  FILE *fout;
  int i;
  float l, alpha;
  char fout_name[30];

  /*  Имя выходного файла */
  strcpy (fout_name, name);
  strcat (fout_name, ".in\0");

  if ((fout = fopen (fout_name, "w")) == NULL)
    {
      perror (fout_name);
      return -1;
    }

  /* Случ. угол поворота */
  alpha = rand () / (RAND_MAX + 1.0) * 2 * M_PI;

  /* Случ. длина пути */
  l = rand () / (RAND_MAX + 1.0)* (LEN_MAX - LEN_MIN) + LEN_MIN;

  /* Первая точка */
  pts[0].x = l * (float) cos (alpha * M_PI);
  pts[0].y = l * (float) sin (alpha * M_PI);

  /* Запомнить точку */
  fprintf (fout, "%.3f %.3f\n", pts[0].x, pts[0].y);

  /* Получить исходные точки */
  for (i = 1; i < INIT_POINTS; i++)
    {
      /* Случ. угол поворота */
      alpha = rand () / (RAND_MAX + 1.0)* 2 * M_PI;

      /* Случ. длина пути */
      l = rand () / (RAND_MAX + 1.0) * (LEN_MAX - LEN_MIN) + LEN_MIN;

      /* Следующая точка */
      pts[i].x = pts[i-1].x + l * (float) cos (alpha);
      pts[i].y = pts[i-1].y + l * (float) sin (alpha);
      pts[i].length = l;
      pts[i].alpha = alpha;

      /* Запомнить точку */
      fprintf (fout, "%.3f %.3f\n", pts[i].x, pts[i].y);
    }

  fclose (fout);

  return 0;
}


/*
 * int gen_rand_points (const char*) ---
 * генерация случайных точек
 */
int gen_rand_points (const char *name)
{
  FILE *fout;
  float x, y, h, l;
  int i;

  /* Открыть файл */
  if ((fout = fopen (name, "w")) == NULL)
    {
      perror (name);
      return -1;
    }


  for (i = 1; i < INIT_POINTS; i++)
    {
      h = 0;

      /* Приближение ломаной */
      while (h < pts[i].length)
	{
	  h += rand () / (RAND_MAX + 1.0) * LEN_MIN / 2;

	  x = pts[i-1].x + h * cos (pts[i].alpha);
	  y = pts[i-1].y + h * sin (pts[i].alpha);

	  l = rand () / (RAND_MAX + 1.0) - 0.5;

 	  x += l * cos (pts[i].alpha - M_PI_2);
	  y += l * sin (pts[i].alpha - M_PI_2);

	  fprintf (fout, "%.3f %.3f\n", x, y);
	}
    }

  /* Закрыть файл */
  fclose (fout);
  return 0;
}
